2012-06-16 62 views
1

我正在使用Facebook SDK在時間線上發佈一些內容。問題在於API請求通常需要大約2-3秒的時間,並且會減慢我的網站,特別是因爲我有很多Ajax請求。PHP:將部分代碼運行到後臺

有沒有辦法將部分PHP代碼分離到背景中?我希望所有的全球會議等都保持不變。

+0

有關[進程控制](http://www.php.net/manual/en/book.pcntl.php)上的PHP手冊的全部內容。我所說的功能都是以'pcntl_'開始的。 –

+0

你有沒有試過cron工作和捲曲?或者使用ajax觸發器到PHP並請求這些API? – Tom

+0

我會傾向於使用exec來調用背景中的腳本 – 2012-06-16 09:02:24

回答

1

如果可能的話,我會爲它創建一個隊列,並從隊列中執行那些花費時間的問題,而不是從http進程生成並處理Web請求的網站。

這樣你可以完全控制,甚至可以將它分離到其他服務器,這是這類問題最常見的解決方案。

你應該最好使用一個真正的隊列解決方案,但我也看到很多簡單的MySQL解決方案在項目很小的時候工作。閱讀更多關於這裏: http://www.engineyard.com/blog/2011/5-subtle-ways-youre-using-mysql-as-a-queue-and-why-itll-bite-you/

也檢查了我們的一些隊列,它也允許像速率限制,日誌記錄和測量可能發生在幾個API的東西。好的是,它將外部的一方與控制和代碼分離的中心點進行實際處理分開。

2

您可以使用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; 
} 
+0

正如我在問題中指定的,我需要使用當前的用戶會話,餅乾,初始化的類等 – keepwalking

+0

會將會話變量中的所有值傳遞給腳本工作嗎? 'php -q /var/somescript.php $ _SESSION ['ip'] $ _SESSION ['username']' – AustinAllover

0

請使用它,它爲我工作。它工作真棒。

$pid = pcntl_fork(); 
if($pid === -1) die('error: unable to fork.'); 
else if($pid) exit(0); 

posix_setsid(); 
sleep(1); 

ob_start();