PHP-需要一个用于用户注册的后台站点处理的cron ...(或fork进程)

Mic*_*ICE 3 php apache cron

每当新用户在我的网站上注册时,我都希望进行一些预处理,以便将来缩短搜索时间.这涉及30到2分钟的处理时间.显然,当他们点击注册时的提交按钮或他们访问的任何PHP页面时,我都无法做到这一点.但是,我希望在他们注册(或更少)的5分钟内完成.

Cron Route I认为这需要在cron工作中,如果是这样,我应该如何设置cron作业?如果是这样,我的cron线应该每2分钟运行一次,我怎样才能确保我没有相同的cron作业重叠下一个?

事件/ 分叉路由- 首选如果我可以在不中断用户体验的情况下将某些事件发送到我的服务器,或者从用户注册(而不是cron作业)中分离出一个进程,我该怎么办?

Mat*_*att 5

我建议不要解决.

相反,您最好使用长时间运行的进程(守护进程)从消息队列中获取其作业.如果这是您首选的方法,则消息队列本身可能不在数据库中.

您将该作业的标识符发布到您的数据库,然后一个长时间运行的进程将偶尔迭代它们并对它们进行操作.

这很简单:

<?php
while(true) {
   jobs = getListOfJobsFromDatabase();  // get the jobs from the databbase
   foreach (jobs as job) {
      processAJob(job); // do whatever needs to be done for the job
      deleteJobFromDatabase(job); //remember to delete the job once its done!
   }
   sleep(60); // sleep for a while so it doesnt thrash your database when theres nothing to do
}
?>
Run Code Online (Sandbox Code Playgroud)

然后从命令行运行该脚本.

这对cron工作的好处是你不会遇到竞争条件.

您可能还希望分离作业的实际处理,以便可以并行完成许多工作,而不是按顺序处理.

  • 如果您在cronjob上运行它,并在运行之前将任务从队列中弹出,那么在发生问题时您可能无法完成任务.同样,通过NOT从队列中弹出任务,您可能有机会在任务完成之前启动另一个cron作业(然后从队列中删除),并尝试执行相同的任务 - 因此竞争条件 (3认同)