0

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

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

4

5 回答 5

2

您可以使用 PHPexec()执行单独的 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;
}
于 2012-06-16T09:07:08.807 回答
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 上的事情。好处是它将发布和与外部方的实际处理分开,从而提供了控制和代码分离的中心点。

于 2012-06-16T09:03:12.170 回答
0

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

于 2012-06-16T11:22:09.680 回答
0

听起来你在使用异步 PHP。这篇文章很好地解释了一种技术:http: //petewarden.typepad.com/searchbrowser/2008/06/how-to-post-an.html

于 2012-06-16T09:13:45.497 回答
0

请使用它,它对我有用。它工作得很棒。

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

posix_setsid();
sleep(1);

ob_start();
于 2015-09-16T14:35:32.913 回答