今天我們要討論的是PHP中的Daemon Task(守護進程任務),也稱作后臺進程。簡單來說,它是一種能在后臺自動執行的任務程序。這類任務可以輕易地實現許多網站常用的操作,如數據備份、文件傳輸、郵件發送、定時任務等等。我們可以使用PHP編寫出這類任務,并將它們變成守護進程,這樣它們就能在后臺每天、每小時、每分鐘按要求執行指定的任務。
首先,我們需要知道如何讓PHP在后臺運行。通常情況下,PHP腳本在Web服務器上的時候,是需要通過Web瀏覽器來觸發它的。但是我們希望PHP在后臺運行,而不是在前臺。PHP有幾種方法可以實現后臺運行。
1.使用nohup 例如:nohup php your_program.php &,這里的"&"是將運行程序轉移到后臺。 2.通過daemon的方式 $pid = pcntl_fork(); if ($pid == -1) { die('Could not fork'); } else if ($pid) { exit(); } else { posix_setsid(); $pid = pcntl_fork(); if ($pid == -1) { die('Could not fork'); } else if ($pid) { exit(); } }
我們把運行PHP的代碼都放到循環內,這樣就能一直執行下去,而且還可以使用一些奇怪的方法去睡眠或是卡住當前進程, 從而防止耗電。一個例子是定時任務。我們可以把一個能夠執行后又可以持續保持活躍狀態的代碼放進循環內,定時提醒自己進行任務執行。這樣可以避免需要每天手動執行的任務。
$pid=pcntl_fork(); while(true){ sleep(5);//每隔5秒調用函數 callFunction();//調用自己的函數 pcntl_signal_dispatch();//必須放置pcntl_signal_dispatch()函數,否則不能正常發送和接收進程間信號。 }
使用PHP守護進程可以輕松完成許多任務。例如,我們可以使用守護進程來自動備份數據。當數據庫連接成功后,我們可以每隔一段時間就備份數據,并將其保存到服務器上的一個新文件中。讓我們看看如何使用PHP進行自動備份。我們可以使用以下代碼來實現:
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $tables = $db->query('SHOW TABLES'); $result = $tables->fetchAll(PDO::FETCH_COLUMN); $db->exec('USE test'); foreach($result as $table){ $db->exec("CREATE TABLE IF NOT EXISTS `backup_$table` LIKE `$table`"); $db->exec("INSERT INTO `backup_$table` SELECT * FROM `$table`"); } $db = null; return true; } catch (PDOException $e) { echo $e->getMessage(); return false; } } $pid=pcntl_fork(); while(true){ sleep(60);//每隔一分鐘,備份一次 backupDB(); //備份函數 pcntl_signal_dispatch();//必須放置pcntl_signal_dispatch()函數,否則不能正常發送和接收進程間信號。 }
至此,我們已經說明了PHP中的Daemon Task是如何工作的,并且也給出了一些有用的示例。它們可以幫助我們實現一些常用的任務,并將他們變成一種可以自動執行的程序。
上一篇php daemon進程
下一篇css 設置凍結表格頭