【问题标题】:PHP - How to run long lasting functions after script has executed or in a separate way?PHP - 如何在脚本执行后或以单独的方式运行持久的函数?
【发布时间】:2014-04-07 09:37:52
【问题描述】:

我有以下问题:

我创建了一个社交网络,每个用户都可以在其中在 facebook 上分享他的个人资料。用户在我的社交网络上有一个排名,该排名必须出现在 Facebook 上共享的链接的标题中。这种排名会根据用户活动而变化:如果用户发布任何内容,他的排名就会增长。

第一个问题来了:Facebook 缓存了打开的图数据,所以如果我第一次分享我的页面并且我的排名是 100,我在 facebook 上分享的标题中会有 100。然后,如果我的排名上升到 200,因为我发布了一些东西并且我再次分享了我的页面,我仍然会在 facebook 上看到 100,因为数据被缓存了。

然后我做了以下功能:

function refresh(){
  $access_token="APPID|APPSECRET"; //replace with your app details
  $params = array("id"=>'MY URL', "scrape"=>"true","access_token"=>$access_token);
  $ch = curl_init("https://graph.facebook.com");
  curl_setopt_array($ch, array(
    CURLOPT_RETURNTRANSFER=>true,
    CURLOPT_SSL_VERIFYHOST=>false,
    CURLOPT_SSL_VERIFYPEER=>false,
    CURLOPT_POST=>true,
    CURLOPT_POSTFIELDS=>$params
  ));
  $result = curl_exec($ch);
}

成功刷新缓存。

因此,当用户添加新帖子时,会调用一个脚本,该脚本的作用如下:

1) add post to db;
2) refresh();
3) header('location: profile_page');

问题如下: refresh() 需要很长时间..所以添加新帖子的脚本从 0.2 秒(不刷新)变为 4 秒(刷新),这对用户来说很烦人,因为他们必须等待很长时间发布后的时间,他们认为我的网站很慢。有没有办法在 PHP 中以不让用户等待的方式执行 refresh()? 比如:

1) add post to db;
2) run refresh(), but finish the script even if refresh has not finished yet.
3) header('location: profile_page');

【问题讨论】:

    标签: php facebook facebook-graph-api


    【解决方案1】:

    您可以在单独的脚本中执行刷新工作。从当前脚本中,您通过打开一个套接字来调用该脚本。使用 socket 运行脚本将异步返回,用户无需等待。

    查看这里以了解如何异步执行脚本:Can PHP asynchronously use sockets?

    【讨论】:

      【解决方案2】:

      不幸的是,PHP 不支持多线程。你可以试试这个:

      header('location: profile_page');
      header('Connection: close');
      header('Content-Length: 1');
      echo 'a';
      flush();
      

      它不会在单独的线程中运行任何东西,而是完成脚本输出并立即将其发送到浏览器。 (也许您的服务器上不需要第 2-4 行,只需尝试一下)

      另一种方法是用非阻塞的 fopen 打开一些其他脚本(http://cz2.php.net/manual/en/function.fopen.php,似乎只在 linux 上支持),但这是一个有点脏的解决方案。

      【讨论】:

      • 好的,但是在你的例子中 refresh() 去哪里了?
      • 它在 flush() 之后 - 浏览器应在收到标头位置后立即重定向,但 php 脚本继续在服务器上运行。
      猜你喜欢
      • 1970-01-01
      • 2017-11-05
      • 2019-06-13
      • 1970-01-01
      • 2014-12-07
      • 1970-01-01
      • 2013-08-07
      • 2013-02-03
      • 2016-08-21
      相关资源
      最近更新 更多