我想在后台运行一个特别昂贵的fql查询,将结果记录到数据库中,然后检索它,而不需要用户等待每一步。
你能分享一个如何异步运行facebook请求的例子吗?main.php
$uid = $facebook->getUser();
if ($uid) {
try {
echo $user;
////////////////////////////////////////////////////////
// Run lengthy query here, asynchronously (async.php) //
////////////////////////////////////////////////////////
// //
// For example: $profile = $facebook->api('/me'); //
// (I know this request doesn't take long, but //
// if I can run it in the background, it'll do. //
// //
////////////////////////////////////////////////////////
} catch (FacebookApiException $e) {
echo $e;
}
}
async.php
$profile = $facebook->api('/me');
$run = mysql_query("INSERT INTO table (id) VALUES (" . $profile['id'] . ");";
complete.php
echo getProfileId(); // assume function grabs id from db, as stored via async.php
我在后台运行PHP作业的解决方案只是让脚本本身发出一个执行实际作业的新请求。
我之前使用的代码如下,我不确定是否有更优雅的解决方案…但在过去,它对我来说已经足够好了。我使用fsock而不是file_get_contents()等的原因当然是这样我就不必等待作业完成(这会破坏目的)
$sock = fsockopen("127.0.0.1", 80);
fwrite($sock, "GET /yourjoburl/ HTTP/1.1'r'n");
fwrite($sock, "Host: yourdomain.com'r'n");
fwrite($sock, "Connection: close'r'n");
fwrite($sock, "'r'n");
fflush($sock);
fclose($sock);
所以,然后你只需要让另一个脚本将结果和进程写入数据库或其他…还要记住MySQL支持互斥锁,这意味着你可以很容易地防止多个作业同时运行…或者允许其他脚本等待作业完成。
p。我个人避免使用exec的原因是,使用不同的服务器、不同的设置、不同的操作系统等,似乎很麻烦。这在所有允许打开套接字的主机上都是一样的。尽管您可能希望为您在作业中验证的请求添加私钥,或检查调用方的IP,以防止其他人能够启动作业。
编辑:这是未经测试的,但应该工作,如果你想转发cookie,包括会话cookie。
$sock = fsockopen("127.0.0.1", 80);
fwrite($sock, "GET /yourjoburl/ HTTP/1.1'r'n");
fwrite($sock, "Host: yourdomain.com'r'n");
fwrite($sock, "Cookie: " . $_SERVER['HTTP_COOKIE'] . "'r'n");
fwrite($sock, "Connection: close'r'n");
fwrite($sock, "'r'n");
fflush($sock);
fclose($sock);