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


How can I run an fql request in the background? (asynchronous api calls via php)

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