如何在后台运行fql请求? (通过php调用异步api)

时间:2011-09-04 06:59:40

标签: php facebook asynchronous facebook-fql

我想在后台运行一个特别昂贵的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

1 个答案:

答案 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);