我想在后台运行一个特别昂贵的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
答案 0 :(得分:2)
我在后台运行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支持互斥锁,这意味着你可以轻松地防止多个作业同时运行......或者允许其他脚本等待作业完成。
PS。我个人避免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);