確實,php沒有類似於js中的setinterval或者settimeout這樣的原生定時器相關的函式。但是我們可以通過其他方式來實現,比如使用declare。
先來看看是如何實現的,然後我們再好好學習一下declare表示式到底是個什麼東西。
function do_tick($str = '')
register_tick_function('do_tick');
do_tick('--start--');
declare (ticks = 1)
}
很簡單的**,執行起來以後將每秒輸出當前的時間。
declare語法的定義如下:
declare (directive)
statemaent;
這裡,我們只研究ticks的使用。
上述**中,我們使用register_tick_function()註冊了do_tick()方法給ticks,declare指定了ticks=1,也就是每執行一次可計時的低階語句,就會去執行一次register_tick_function()中註冊的方法。當declare**塊中的while每次迴圈時,都有乙個sleep()停頓了一秒,而這個sleep()就是那個可計時的低階語句。
那麼,while()不是可計時的低階語句嘛?當然不是,where、if等條件判斷都不是這種可計時的低階語句。
不是所有語句都可計時。通常條件表示式和引數表示式都不可計時。我們通過下面這個例子再來看看具體到一步步declare是怎樣執行的:
function test_tick()
register_tick_function('test_tick');
test_tick(); // test_tick:0
$j = 0;
declare (ticks = 1)
}// declare使用花括號後面所有**無效果,作用域限定在花括號以內
echo "bbb"; //
echo "ccc"; //
echo "ddd"; //
注釋很詳細了,我們就不用一一說明了。下面我們來看將ticks定為2,並且declare下面的statemaent不用花括號的結果:
function test_tick1()
register_tick_function('test_tick1');
$j = 0; // 此處不計時
declare (ticks = 2);
$j++; // test_tick1:0
$j++;
sleep(1); // 停1秒後 test_tick1:1
$j++;
$j++; // test_tick1:2
if ($j == 4)
// declare沒有使用花括號將對後面所有**起效果,如果是require或者include將不會對父頁面後續內容進行處理
echo "bbb"; // test_tick1:3
echo "ccc";
echo "ddd"; // test_tick1:4
可以看出,我們declare對其定義後續的**都產生了作用,但需要注意的是如果有頁面巢狀,對父頁面的後續**是沒有效果的。而定義了ticks=2之後,將在兩個低階可計時**後執行一次register_tick_function()註冊的函式**。
測試**:
php寫定時器 定時執行
public function dotime while true 可能還有需要改進的地方,後期發現了再補充,嘻嘻。2020.9.5補充 設定定時24小時後執行,只執行了當天一次,以後就不執行了,看日誌定時器也在執行,但是中間的邏輯 不走了,除錯了很長時間,得出的結果有可能是24小時執行一次時間太長...
沒有窗體怎麼使用定時器呢
沒有窗體怎麼使用定時器呢?delphi windows sdk api 做那中簡單的程式的時候 不是控制台程式 想要使用api函式settimer來設定定時器,請問應該怎麼寫 呢,關鍵是那個hwnd應該是什麼呢,我沒有窗體怎麼設定 簡單的方法,就是用乙個隱藏的窗體,好像沒有窗體是不能成為乙個程式的,...
Mysql 檢視定時器 開啟定時器 設定定時器時間
1.檢視是否開啟evevt與開啟evevt。1.1 mysql evevt功能預設是關閉的,可以使用下面的語句來看evevt的狀態,如果是off或者0,表示是關閉的。show variables like sche 1.2 開啟evevt功能 setglobal event scheduler 1 ...