[英]PHP: Run part of code into background
我正在使用Facebook SDK在時間軸上發布一些內容。 問題是API請求通常需要大約2-3秒,這會減慢我的網站速度,特別是因為我有很多ajax請求。
有沒有辦法將PHP代碼的一部分分配到后台? 我希望所有全局,會話等保持不變。
您可以使用PHP exec()
來執行單獨的PHP腳本。
$cmd = "php5 -q /path/to/php/send_fb_request.php";
exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $cmd, $outputfile, $pidfile));
然后,如果要監視進程是否仍在運行:
function isRunning($pid){
try{
$result = shell_exec(sprintf("ps %d", $pid));
if( count(preg_split("/\n/", $result)) > 2){
return true;
}
}catch(Exception $e){}
return false;
}
如果可能的話,我會為它創建一個隊列,並從隊列中執行那些時間成本問題,而不是從生成和處理網站Web請求的http進程執行。
這樣你就可以完全控制,甚至可以將它分離到其他服務器,這是解決此類問題的最常見方法。
您最好使用真正的隊列解決方案,但我也看到許多簡單的MySQL解決方案在項目保持較小時工作。 在這里閱讀更多相關信息: http : //www.engineyard.com/blog/2011/5-subtle-ways-youre-using-mysql-as-a-queue-and-why-itll-bite-you/
檢查了我們的一些隊列,它還允許對幾個API可能發生的速率限制,記錄和測量等事情。 好處是它分離了一個帖子和真正的處理與外部方,它提供了一個中心控制點和代碼分離。
聽起來像是在異步PHP之后。 本文很好地解釋了一種技術: http : //petewarden.typepad.com/searchbrowser/2008/06/how-to-post-an.html
您可以嘗試獨立的Symfony2組件Process
請使用它,它適合我。 它工作得很棒。
$pid = pcntl_fork();
if($pid === -1) die('error: unable to fork.');
else if($pid) exit(0);
posix_setsid();
sleep(1);
ob_start();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.