如何在用户离开后保持PHP脚本运行?

时间:2011-07-18 01:27:46

标签: php database

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

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

2 个答案:

答案 0 :(得分:1)

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

$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发送信号以执行您想要的操作,并且不会减慢用户的浏览体验;)

答案 1 :(得分:1)

异步PHP调用

一种选择是进行异步PHP调用(Request)。有关详细信息,请参阅Asynchronous PHP calls?。但请记住,当你做很多这样的事情时,你会产生大量的后台进程,这些进程可能会扼杀你的服务器。

P.S:当你使用共享主机时,做这些事情通常不太受欢迎

消息队列

更好的方法是使用Message Queue(MQ)。您可以使用RedisBeanstalkd来命名两个流行的MQ。由于http://redistogo.com/,您有一个免费的redis实例。从客户端/生产者(访问您的页面的用户),您将使用RPUSH将消息添加到队列。来自消费者(SQLite),这是一个无休止地在后台运行的PHP进程(CLI),您将使用BLPOP检索放入队列的消息。产生过程很昂贵,在使用消息队列时可以避免。