古詩詞大全網 - 成語大全 - php discuz的定時任務是什麽原理怎麽實現的?求高手解答

php discuz的定時任務是什麽原理怎麽實現的?求高手解答

php中定時計劃任務的實現原理:

當 PHP 腳本正常地運行 NORMAL 狀態時,連接為有效。當遠程客戶端中斷連接時,ABORTED 狀態的標記將會被打開。遠程客戶端連接的中斷通常是由用戶點擊 STOP 按鈕導致的。當連接時間超過 PHP 的時限時,TIMEOUT 狀態的標記將被打開。

示例代碼:

<?php

ignore_user_abort(true);set_time_limit(0);

date_default_timezone_set('PRC'); // 切換到中國的時間

$run_time = strtotime('+1 day'); // 定時任務第壹次執行的時間是明天的這個時候

$interval = 3600*12; // 每12個小時執行壹次

if(!file_exists(dirname(__FILE__).'/cron-run')) exit(); // 在目錄下存放壹個cron-run文件,如果這個文件不存在,說明已經在執行過程中了,該任務就不能再激活,執行第二次,否則這個文件被多次訪問的話,服務器就要崩潰掉了

do {

if(!file_exists(dirname(__FILE__).'/cron-switch')) break; // 如果不存在cron-switch這個文件,就停止執行,這是壹個開關的作用

$gmt_time = microtime(true); // 當前的運行時間,精確到0.0001秒

$loop = isset($loop) && $loop ? $loop : $run_time - $gmt_time; // 這裏處理是為了確定還要等多久才開始第壹次執行任務,$loop就是要等多久才執行的時間間隔

$loop = $loop > 0 ? $loop : 0;

if(!$loop) break; // 如果循環的間隔為零,則停止

sleep($loop);

// ...

// 執行某些代碼

// ...

@unlink(dirname(__FILE__).'/cron-run'); // 這裏就是通過刪除cron-run來告訴程序,這個定時任務已經在執行過程中,不能再執行壹個新的同樣的任務

$loop = $interval;

} while(true);