PHP:将部分代码运行到后台

时间:2012-06-16 08:47:36

标签: php fork

我正在使用Facebook SDK在时间轴上发布一些内容。问题是API请求通常需要2-3秒,这会减慢我的网站速度,特别是因为我有很多ajax请求。

有没有办法将PHP代码的一部分分配到后台?我希望所有全局,会话等都保持不变。

5 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

如果可能的话,我会为它创建一个队列,并从队列中执行那些时间成本问题,而不是从生成和处理网站Web请求的http进程执行。

通过这种方式,您可以完全控制,甚至可以将其分离到其他服务器,这是解决此类问题的最常见方法。

您最好使用真正的队列解决方案,但我也看到许多简单的MySQL解决方案在项目保持较小时工作。在这里阅读更多相关信息: http://www.engineyard.com/blog/2011/5-subtle-ways-youre-using-mysql-as-a-queue-and-why-itll-bite-you/

还检查了我们的一些队列,它还允许对几个API可能发生的速率限制,记录和测量等事情。好处是它分离了一个帖子和真正的处理与外部方,它提供了一个中心控制点和代码分离。

答案 2 :(得分:0)

听起来像是在异步PHP之后。本文很好地解释了一种技术:http://petewarden.typepad.com/searchbrowser/2008/06/how-to-post-an.html

答案 3 :(得分:0)

您可以尝试独立的Symfony2组件Process

答案 4 :(得分:0)

请使用它,它适合我。它很棒。

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

posix_setsid();
sleep(1);

ob_start();