在每个X页面视图上运行PHP函数(替代cron)

Nic*_*ick 1 php

我正在做一些错误检查,涉及单个数据库查询.错误是测试cron作业是否已停止工作,因此本质上我不想使用cron作业来运行PHP函数.

我没有在每个网页浏览上运行数据库调用,而是认为"每X次浏览一次运行"的不同方法将是减轻负载的一个很好的替代方法.

这不是我听说过或者可以寻找的东西 - 这让我觉得有更好的选择.非常有兴趣听取利弊.

And*_*sky 5

实际上,如果您正在使用PHP会话,那么您在每个调用中都可能使用完全相同的机制.PHP会话垃圾收集器完全相同 - 随机删除过期的会话.

请参阅:https://secure.php.net/manual/en/sessionhandler.gc.php

清理过期的会话.当会话启动或调用session_start()时,由PHP在内部随机调用.调用此频率基于session.gc_divisor和session.gc_probability配置指令.

为此,只需滚动一个随机数并检查它是否高于您所需的"百分比":

$roll = mt_rand(1, 100);

if ($roll > 90) {
  // This will fire in 10% of cases
  // Do what you need
}
Run Code Online (Sandbox Code Playgroud)

但重要的是要考虑:

  1. 即使你把它设置为在99%的情况下发射,它仍然可能最终不能连续100年发射.这很像概率论的工作原理.
  2. 如果您的流量较低(通常或某些特定日期),您的检查代码现在可能会触发,您可能会错过错误.
  3. 此外,您的支票总是有可能由同时查看页面的两个不同用户同时启动两次.因此,您可能希望确保这不会导致任何问题,特别是如果您在支票中进行任何更新.
  4. 小心不要在你的支票上做繁重的工作,因为这样你的一些请求会经历更高的响应时间(duuuh,我知道,但是为了完整性.而且因为它实际上咬了我几次).

第1点和第2点将这种机制从"可靠"类别转移到"不太可靠,无论是对于那些不是非常重要的东西,还是作为另一种可靠机制的附加保障".

所以,我会说 - 衡量一切,如果你还想要它 - 继续使用这个机制.