1

我有一个我想连续执行的代码,而不是阻止网站加载。我需要每秒钟左右更新一次数据库中的记录。有人可以帮我怎么做吗?

这是代码:

while(true){
    $hits++;
    $db =& JFactory::getDBO();
    $query = "UPDATE u32lb_mt_links SET link_hits='".$hits."' WHERE link_id='".$firma_id."'";
    $db->setQuery( $query );
    $db->query();
    sleep(1);
}
4

4 回答 4

4

PHP 不支持多线程。

pcntl_fork如果您需要在请求进来时生成后台进程,最好的办法是研究类似的东西。

否则,请使用 cronjob 或使用php命令行解释器手动执行脚本。


话虽如此,我不确定您的脚本在做什么。它的目的只是每秒增加一个值而不是每个请求?

最好使用的东西(假设这个想法并不疯狂)将是一个每分钟运行的 cronjob,while(true)而不是只运行任务 60 次。或者,每分钟运行一次 cron 以将命中计数增加 60。

另一种选择是创建一个无限循环的批处理脚本(而不是 PHP 这样做,因此您可以轻松地杀死批处理文件)执行 PHP 命令行解释器直到完成。不过,我仍然不明白这一点。

于 2013-03-10T14:07:16.003 回答
1

好吧,CRON JOB是最好的方法。但是由于某种原因,您的主机不支持添加 cron 作业,并且您不想使用pcntl_fork,因为Rudi Visser说还有一个选项(实际上这是一种逻辑)。

备选方案;

创建一个将更新(或做任何你想做的事)记录的页面。此页面应可通过 URL 访问,例如;http://yourwebsite.com/update_records.php

创建一个cURL函数,您可以将 URL 传递给它,或者甚至可以传递超时参数。超时参数应该很短。

这里的逻辑是只执行脚本而不等待返回的结果。只需执行并继续。这样您的页面将能够快速打开,并且您还可以更新您的记录。

我希望这有帮助。

PS 在与didierc分享想法后,我意识到我还应该注意可能的安全建议;

  • 您可以添加 .htaccess 规则来决定谁可以访问该页面。
  • 您可能想要生成一个密钥并将其添加到数据库并通过查询字符串发布此密钥。请确保您保护查询字符串中的值。在继续更新记录之前,您还应该检查并确认密钥(如果愿意,也可以将其称为令牌)。
  • 如果您不希望每次访问者访问该页面时都执行它,那么我建议您记录上次执行它的时间(至少)。这样你可以检查它是否需要执行。

根据记录的敏感程度以及您拥有的代码类型,您可能会采取额外的安全措施。

于 2013-03-10T14:21:22.303 回答
0

守护脚本并将其变成后台进程/任务:PEAR System Daemon

于 2013-06-24T23:06:06.800 回答
0

用你想做的任何事情制作一个 php 脚本文件,然后为它设置一个 CRON JOB。

请参考http://www.thegeekstuff.com/2009/06/15-practical-crontab-examples/设置 CRON JOB

我希望这可能会有所帮助。

于 2013-03-10T14:09:55.763 回答