【问题标题】:How can I run an fql request in the background? (asynchronous api calls via php)如何在后台运行 fql 请求? (通过 php 进行异步 api 调用)
【发布时间】:2011-09-04 06:59:40
【问题描述】:

我想在后台运行一个特别昂贵的 fql 查询,将结果记录到数据库中,然后在以后检索它,而无需用户等待每一步。

您能否分享一个如何异步运行 facebook 请求的示例?

ma​​in.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

【问题讨论】:

  • 我开始使用 exec(),但我很难传递所有必需的参数来完成这项工作。相反,我最终得到了一个全新的会话和一个未连接的 facebook 对象。

标签: php facebook asynchronous facebook-fql


【解决方案1】:

我在后台运行 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);

【讨论】:

  • 谢谢安德烈亚斯。这个策略是否也保持相同的会话?如果没有,您能推荐一种发送会话数组的方法吗?
  • 啊,它不维护会话。如何在后台脚本上检索相同的会话?通过phpsessid Cookie?我不清楚如何再次接听该会话。
  • @Ryan 我已经用一段对你有用的新代码更新了我的答案。它目前转发所有 cookie,但如果您愿意,您可以输入 PHPSESSID=" . $_COOKIE['PHPSESSID'] . ",它只会转发会话 cookie。
  • 谢谢安德烈亚斯。出于某种原因,我仍然卡住了。我还为社区的其他人添加了一个更普遍的问题:stackoverflow.com/questions/7300871/…
  • @Ryan 无论如何,我自己测试了代码,它对我有用。会话正确传输。但是,您必须小心保持会话打开,因为这会阻止用户在作业运行时执行任何其他操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多