簡體   English   中英

PHP:將部分代碼運行到后台

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM