我正在使用Facebook SDK在時間線上發佈一些內容。問題在於API請求通常需要大約2-3秒的時間,並且會減慢我的網站,特別是因爲我有很多Ajax請求。PHP:將部分代碼運行到後臺
有沒有辦法將部分PHP代碼分離到背景中?我希望所有的全球會議等都保持不變。
我正在使用Facebook SDK在時間線上發佈一些內容。問題在於API請求通常需要大約2-3秒的時間,並且會減慢我的網站,特別是因爲我有很多Ajax請求。PHP:將部分代碼運行到後臺
有沒有辦法將部分PHP代碼分離到背景中?我希望所有的全球會議等都保持不變。
如果可能的話,我會爲它創建一個隊列,並從隊列中執行那些花費時間的問題,而不是從http進程生成並處理Web請求的網站。
這樣你可以完全控制,甚至可以將它分離到其他服務器,這是這類問題最常見的解決方案。
你應該最好使用一個真正的隊列解決方案,但我也看到很多簡單的MySQL解決方案在項目很小的時候工作。閱讀更多關於這裏: http://www.engineyard.com/blog/2011/5-subtle-ways-youre-using-mysql-as-a-queue-and-why-itll-bite-you/
也檢查了我們的一些隊列,它也允許像速率限制,日誌記錄和測量可能發生在幾個API的東西。好的是,它將外部的一方與控制和代碼分離的中心點進行實際處理分開。
您可以使用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;
}
正如我在問題中指定的,我需要使用當前的用戶會話,餅乾,初始化的類等 – keepwalking
會將會話變量中的所有值傳遞給腳本工作嗎? 'php -q /var/somescript.php $ _SESSION ['ip'] $ _SESSION ['username']' – AustinAllover
聽起來你異步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();
有關[進程控制](http://www.php.net/manual/en/book.pcntl.php)上的PHP手冊的全部內容。我所說的功能都是以'pcntl_'開始的。 –
你有沒有試過cron工作和捲曲?或者使用ajax觸發器到PHP並請求這些API? – Tom
我會傾向於使用exec來調用背景中的腳本 – 2012-06-16 09:02:24