2012-09-09 54 views
3

在apcahe服務器中,我想運行一個PHP腳本作爲cron,它在後臺啓動一個php文件並在文件開始後退出,並且不會等待腳本完成,因爲該腳本將執行大約60分鐘才能完成。這可以做到嗎?PHP中的多線程

+4

爲什麼你需要Apache? – nkr

+1

每分鐘只需在cron上運行腳本。您可以在文件上創建一些「互斥體」的模擬,並檢查前一個實例是否完成。Apache與你的任務無關。 – zysoft

+0

爲什麼你不能「運行」cron?它是一個cron工作 - 所以你不需要等待它完成? – Laurence

回答

1

您需要使用「&」符號作爲後臺進程運行程序。

$ php -f file.php & 

那就是在後臺運行這個命令。

您可能賴特sh腳本

#!/bin/bash 
php -f file.php & 

而且從crontab中運行此腳本。

+0

Cron已經在後臺運行。沒有必要這樣做。 – zysoft

9

你應該知道PHP中沒有線程。 但是如果你在Unix/linux系統上運行,你可以執行程序並輕鬆地將它們分開。

$command = "/usr/bin/php '/path/to/your/php/to/execute.php'"; 
exec("{$command} > /dev/null 2>&1 & echo -n \$!"); 

可以做這項工作。讓我們來解釋一下:

exec($command); 

執行的/ usr/bin中/ PHP的「/path/to/your/php/to/execute.php」:你的腳本啓動,但Apache將等待執行結束前執行下一個代碼。

> /dev/null 

會將標準輸出(即回顯,打印等)重定向到一個虛擬文件(其中寫入的所有輸出都會丟失)。

2>&1 

會將錯誤輸出重定向到標準輸出,寫入相同的虛擬文件和不存在的文件。例如,這可以避免登錄到您的apache2/error.log。

& 

是在你的情況下,最重要的事情:它會脫離您的$命令的執行:所以EXEC()會立刻釋放你的PHP代碼執行。

echo -n \$! 

會給PID你超脫執行作爲迴應:將通過執行exec()返回,使你能夠與它的工作(比如,把這個PID到數據庫中,並經過一段時間後殺死它避免殭屍)。

+0

很好的解釋。 –

1

這可能不是針對您的特定問題的最佳解決方案。但爲了記錄,PHP中有線程。

https://github.com/krakjoe/pthreads

我假設你知道如何使用線程,這是非常年輕的代碼,我寫我自己,但如果你有一個線程和互斥和經驗等等,你應該能夠解決你的問題使用這個擴展名。

這顯然是我自己的項目的無恥插件,如果用戶沒有安裝擴展所需的訪問權限,那麼它不會幫助他,但很多人找到stackoverflow,它將毫無疑問地解決其他問題...