我正在使用 Facebook SDK 在时间轴上发布一些内容。问题是 API 请求通常需要大约 2-3 秒,这会减慢我的网站速度,特别是因为我有很多 ajax 请求。
有没有办法将部分 PHP 代码分叉到后台?我希望所有全局、会话等都保持不变。
您可以使用 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;
}
如果可能的话,我会为它创建一个队列,并从队列中执行那些时间成本问题,而不是从为您的网站生成和处理 Web 请求的 http 进程中执行。
这样您就可以完全控制,甚至可以将其与其他服务器分开,这是此类问题的最常见解决方案。
您最好使用真正的队列解决方案,但我也看到很多简单的 MySQL 解决方案在项目很小的情况下工作。在此处阅读有关此内容的更多信息: http ://www.engineyard.com/blog/2011/5-subtle-ways-youre-using-mysql-as-a-queue-and-why-itll-bite-you/
还检查了我们的一些队列,它还允许诸如速率限制、日志记录和测量等可能发生在几个 API 上的事情。好处是它将发布和与外部方的实际处理分开,从而提供了控制和代码分离的中心点。
您可以尝试独立的 Symfony2 组件Process
听起来你在使用异步 PHP。这篇文章很好地解释了一种技术:http: //petewarden.typepad.com/searchbrowser/2008/06/how-to-post-an.html
请使用它,它对我有用。它工作得很棒。
$pid = pcntl_fork();
if($pid === -1) die('error: unable to fork.');
else if($pid) exit(0);
posix_setsid();
sleep(1);
ob_start();