2024 日本 PHP 研討會

time_sleep_until

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

time_sleep_until 讓腳本休眠直到指定的時間

說明

time_sleep_until(浮點數 $timestamp): 布林值

讓腳本休眠,直到指定的 timestamp 時間戳記。

參數

timestamp

腳本應該喚醒的時間戳記。

回傳值

成功時返回 true,失敗時返回 false

錯誤/例外

如果指定的 timestamp 參數值為過去的時間,這個函式會產生 E_WARNING 錯誤。

範例

範例 #1 time_sleep_until() 範例

<?php

// 返回 false 並產生警告
var_dump(time_sleep_until(time()-1));

// 可能只在速度較快的電腦上有效,最多休眠 0.2 秒
var_dump(time_sleep_until(microtime(true)+0.2));

?>

註釋

注意所有信號將在腳本喚醒後傳遞。

參見

新增註釋

使用者貢獻的註釋 3 則註釋

purdue at nc dot rr dot com
13 年前
至少在我的 Windows 電腦上,time_sleep_until 函式似乎是計算從現在到休眠時間的時間戳記之間的微秒數,並且它似乎在這個計算中使用了無符號 32 位元數學。這種捨入導致最大休眠時間略低於 4295 秒(1 小時 11 分 35 秒)。為了獲得更長的休眠時間,同時仍然使用 time_sleep_until 來最小化處理器開銷,以下迴圈可能對您有所幫助

<?php

$sleepuntil
= strtotime("星期二 下午 3 點");

while (
time() < $sleepuntil)
time_sleep_until($sleepuntil);

// 繼續處理日期相關的程序

?>

當然,可以使用類似「cron」的東西來避免腳本進行長時間的休眠。另請注意,time_nanosleep 似乎進行了類似的數學計算,但更直覺的是,秒參數有一個上限。儘管如此,由於捨入誤差,這兩個函式在提前喚醒時都可能會回報警告。
rowan dot collins at cwtdigital dot com
12 年前
我之前沒發現 PHP 有這個函式,所以寫了一個類似的功能,但它額外提供設定最小暫停時間的功能,即使目標時間已到達,例如在處理器密集的迴圈中。

它以秒為單位而不是微秒(它適用於高負載的命令列腳本),但如果需要更高的精度,可以很容易地透過使用 microtime(true) 和 usleep 來修改。

<?php
/**
* 暫停處理直到指定的時間,避免對資料庫或服務造成過大的負載
*
* @param int $target_time 時間戳記
* @param int $min_sleep 最小休眠秒數,即使目標時間戳記已過期。
* 預設值為 0,表示只休眠到目標時間戳記。
*
* @example <code>
while ( ! $finished )
{
$minimum_start_of_next_loop = time() + $min_secs_per_loop;

# 執行可能耗時很久的操作

sleep_until( $minimum_start_of_next_loop, $min_pause_between_loops );
}
</code>
*/
function sleep_until($target_time, $min_sleep = 0)
{
$time_now = time();

$time_to_target = $target_time - $time_now;

// 如果已到達目標時間,則無需再等待
if ( $time_to_target <= $min_sleep )
{
// 如果需要,仍然休眠一段時間
sleep( $min_sleep );
}
else
{
// 休眠直到目標時間
sleep( $time_to_target );
}
}
?>
divinity76 at gmail dot com
5 年前
如果您因為某些原因需要一個執行時間恆定的 realpath() 實作,請嘗試

<?php

function realpath_constant_time(string $path, float $target_seconds, bool &$constant_time_success = null){
$start_time=microtime(true);
$ret=realpath($path);
$constant_time_success = @time_sleep_until($start_time+$target_seconds);
return
$ret;
}
?>

例如,一個總是恰好使用 1 毫秒的即時函式(對於基於 SSD 的伺服器來說應該綽綽有餘,也許基於旋轉硬碟的伺服器可能需要接近 10 毫秒的時間,我不確定)

<?php
realpath_constant_time
("/path/to/../to/file.txt",0.001,$constant_time_success);
?>

您可以使用 $constant_time_success 來查看是否需要更多時間(因此未能以固定時間執行 realpath()),或者是否成功。
To Top