我想從PHP腳本觸發eider exec()或system()中的shell命令,但這是一個需要一段時間才能完成的任務,有沒有辦法觸發它,並繼續運行PHP頁面加載沒有延遲?在PHP中執行exec()或system()並且不要等待輸出
編輯:我在CentOS 6,PHP 5.3
我想從PHP腳本觸發eider exec()或system()中的shell命令,但這是一個需要一段時間才能完成的任務,有沒有辦法觸發它,並繼續運行PHP頁面加載沒有延遲?在PHP中執行exec()或system()並且不要等待輸出
編輯:我在CentOS 6,PHP 5.3
取決於您使用的操作系統。
對於Linux:
pclose(popen("php somefile.php &","r"));
通知amperstand末(非常重要)。
對於Windows:
pclose(popen("start php.exe somefile.php","r"));
這裏的start
關鍵字是非常重要的。
希望這會有所幫助。
那麼使用一個Ajax請求激活EXEC部分...然後與其他任務繼續
它可能會工作,但應該有一種更簡單,更可靠的方式,就像在EXEC結束的參數()或系統( ); – adrianTNT 2012-01-18 12:42:17
我沒有得到-1級。蓋伊回答簡短。也許不喜歡,但仍然是一個公平的。 – hummingBird 2012-01-18 12:44:02
我沒有給-1 – adrianTNT 2012-01-18 12:48:07
這應該工作:
shell_exec("nohup yourcommand > /dev/null 2> /dev/null &");
編輯:對不起,不知道爲什麼我排除& 2>將STDOUT和STDERR重定向到/ dev/null。
命令運行,但延遲存在,這是完整的命令:'shell_exec(「ffmpeg -i'videos/sample.mp4'-qmax 1 -vframes 1 -ss 80 videos/images/1.jpg 2>/dev/null「);' – adrianTNT 2012-01-18 12:33:06
try:shell_exec(」nohup ffmpeg -i'videos/sample.mp4'-qmax 1 -vframes 1 -ss 80 videos/images/1.jpg>/dev/null 2>/dev/null「 ) – 2012-01-18 12:35:57
延遲相同,命令執行正常。也許ffmpeg的行爲不同? – adrianTNT 2012-01-18 12:41:23
這並不直接回答你的問題,但你應該考慮在後臺進程中使用cron作業或使用諸如Beanstalkd之類的隊列來完成視頻轉換工作。
這樣你就可以在後臺堆疊你的ffmpeg工作而不會阻塞你的網絡服務器。
我在過去的兩種方法(cron/queue)方面都取得了很大的成功。
有關後臺進程的一些其他職位:
php execute a background process
Run a ffmpeg process in the background
Using ffmpeg, PHP and beanstalk
一些工具可能對您有用:
http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php/
我做什麼:
public function post_create()
{
ob_end_clean();
header("Connection: close");
ignore_user_abort(); // optional
ob_start();
echo "Tell ajax to gtfo!";
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush(); // Strange behaviour, will not work
flush(); // Unless both are called !
// Do processing here
}
我試過'exec(「php video_processor.php &");'和延遲是一樣的,那麼如果我在video_processor.php中設置了'sleep(10)',那麼我的父腳本也會等待10秒 – adrianTNT 2012-01-18 13:00:46
用'pclose (popen(「php video_processor.php」,「r」));''或'pclose(popen(「/ usr/bin/php video_processor.php&」,「r」));'(我假設你的PHP是安裝在默認位置) – 2012-01-18 13:03:05
它與這一個工作:'pclose(popen(「php video_processor.php&」,「r」));'然後我編輯我的工作:'pclose(popen(「ffmpeg - i'videos/sample.mp4'-qmax 1 -vframes 1 -ss 80 videos/images/1.jpg&「,」r「));'Thank you。:party::) – adrianTNT 2012-01-18 13:10:40