【问题标题】:How to keep a PHP script running even after the user leaves?即使在用户离开后如何保持 PHP 脚本运行?
【发布时间】:2011-07-18 01:27:45
【问题描述】:

我有一个 PHP 脚本,用于检查用户访问页面时 SQLite 数据库上次更新的时间(30 分钟时间跨度)。如果超过 30 分钟,则脚本会将新信息拉入数据库。但是,我担心用户可能会在数据库更新时离开,因此忽略更新某些条目。即使在用户离开后,我该怎么做才能让脚本继续执行?

我在这里查看了一些类似的问题,发现有人建议使用ignore_user_abort(),但是当数据无法发送回客户端时似乎存在问题。任何其他建议将不胜感激。谢谢!

【问题讨论】:

  • 将 ignore_user_abort() 视为确保任何未完成的数据库工作继续进行的方法,仅此而已,“数据无法发送给用户”的问题非常明显,因为用户已中止连接,我认为这根本不会影响您的数据库进程。

标签: php database


【解决方案1】:

异步 PHP 调用

一种选择是进行异步 PHP 调用(请求)。请参阅Asynchronous PHP calls? 了解更多信息。但请记住,当你经常这样做时,你会产生很多可能会杀死你的服务器的后台进程。

P.S:另外,当您使用共享主机时,通常不太喜欢这样做

消息队列

一种更好的方法是使用消息队列 (MQ)。您可以使用RedisBeanstalkd 来命名两个流行的MQ。感谢http://redistogo.com/,为您提供了一个免费的 redis 实例。然后从客户端/生产者(访问您的页面的用户)中,您可以使用RPUSH 将消息添加到队列中。从消费者(SQLite)这是一个在后台无限运行的 PHP 进程(CLI),您可以使用BLPOP 检索放入队列的消息。生成进程的成本很高,并且在使用消息队列时可以避免。

【讨论】:

    【解决方案2】:

    当客户退出/停止访问您的网站时,您无法将数据发回给客户。您可以在加载页面时打开 sock 女巫以防止客户端减速

    $fp = fsockopen($host, 80, $errno, $errstr, 10);
    if (!$fp) {
        echo "$errstr ($errno)\n";
    } else {
       $header = "GET /cron.php HTTP/1.1\r\n";
       $header .= "Host: $host\r\n";
       $header .= "Connection: close\r\n\r\n";
       fputs($fp, $header);
       fclose($fp);
    }
    
    //do another stuff
    

    这将向 /cron.php 发送信号以执行您想要的操作,并且也不会减慢用户的浏览体验;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-07
      • 2013-05-20
      • 2012-01-27
      • 2010-10-09
      相关资源
      最近更新 更多