php在后台做代码

Posted

技术标签:

【中文标题】php在后台做代码【英文标题】:php do code in background 【发布时间】:2013-03-10 14:02:14 【问题描述】:

我有一段代码希望持续执行,而不是阻止网站加载。我需要每秒钟左右更新一次数据库中的记录。谁能帮我怎么做?

代码如下:

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);

【问题讨论】:

@nlsbshtr 你能给我一个示例 php 代码吗? @nlsbshtr 仅供参考,cron 的最小分辨率为 1 分钟。 @nlsbshtr 没有问题,我一开始也没有注意到它,因为我们主要使用 Quartz 调度程序:) 【参考方案1】:

PHP 不支持多线程。

如果您需要在收到请求时生成后台进程,最好的办法是查看 pcntl_fork 之类的内容。

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


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

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

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

【讨论】:

@JoeWatkins 不错!可以很好地投入生产,但我认为没有机会。 您对此一无所知...但可以根据您“知道”的内容形成意见并影响他人的选择... 我没有影响任何东西,看到它投入生产我会感到非常惊讶。无论如何,看着 PHP 开发人员尝试使用线程几乎是令人沮丧的。错过了对->join() 的调用导致他们的脚本提前终止,并且想知道发生的事情会无处不在。祝你的项目好运,我只是没有看到它发生。 “错过的电话”......废话,你不知道你在说什么...... sigh.. 我的意思是人们将在填充成员的类上生成一个线程,并尝试在不等待线程的情况下获取成员的值去完成。我不会以任何方式诋毁您的项目,并认为它是针对特定目标的一个很好的解决方案,但主流生产使用不会广泛,线程对于大多数人来说已经够难用真实语言了。【参考方案2】:

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

备选方案;

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

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

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

我希望这会有所帮助。

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

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

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

【讨论】:

如果你想这样做,要非常小心谁在访问那个页面。此外,iiuc 的调用率将取决于您的网站访问率。 这可以修改以适应需要吧?例如添加动态创建的密钥(并通过数据库检查确认)以及执行时间(也通过数据库检查和确认),例如是否需要执行和更新记录。如果其他两个建议都失败了,这只是一个建议(例如没有 cron 作业的可能性,PHP 没有作为 CGI 安装或许多其他原因) 是的,但您应该在答案中包含这一点,这样 OP 就不会出现可能的安全漏洞。另一种选择是修改 Web 服务器配置以禁止来自 localhost 以外的访问。事实上,尽可能多地使用安全检查是可行的方法。 请注意,我并不是说你的答案是错误的,只是需要认真执行。 哦,我没听错didierc。感谢您的提醒。我已经更新了我的答案。【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于php在后台做代码的主要内容,如果未能解决你的问题,请参考以下文章

php后台多用户权限组思路与实现程序代码

php后台运行以及定时任务的4种实现原理以及代码

在php里面用ajax怎么做分页

用php的Smarty模板的后台程序,如何做文件导出(导成excel文件)???

CNVD-2018-19126 EmpireCMS后台任意代码执行可GetShell

怎么在html中写PHP代码,前台页面从后台数据库中取值,