PHP沒有定時器?

2021-10-07 23:04:21 字數 1771 閱讀 3618

確實,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 ...