繁体   English   中英

PHP页面执行后台进程

[英]PHP page to execute a background process

我有一个PHP脚本,可从第三方来源提取用户特定的数据并将其转储到本地表中,我想在用户登录时每隔X分钟执行一次,但是运行大约需要30秒,我不这样做不想让用户体验。 我认为最好的方法是为每个成功的请求添加时间戳,然后在每个页脚中放置一些代码,以检查上一次请求,如果超过X分钟前,则在后台执行PHP脚本。

我不想使用cron作业来执行此操作,因为执行pull脚本时需要特定于用户的全局变量和会话变量。

我可以看到popen()允许我运行PHP脚本,但是我似乎找不到任何有关是否以访问者身份在其会话中运行的信息(因此可以访问用户特定的全局变量或会话变量)或作为一个单独的会话。

  1. popen()是否可以解决我的问题?
  2. 我要采用正确的方法还是在用户登录时间隔执行脚本的更好方法?

一如既往,任何帮助或建议都将不胜感激!

干杯

安迪

也许可以将会话数据也放在表中。 这样,您可以轻松地从后台进程访问它。 您只需传递session_id()user id作为参数,以便进程知道当前正在处理的用户。

  1. 不,因为PHP仍然需要等待popen()启动的进程才能退出
  2. 可能不是,因为该解决方案不适合系统的体系结构约束

您不使用Cron作业的理由实际上并不合理。 您可能已经放弃了太快地探索该特定路径,而试图将一个方形的钉子插入一个圆孔中而陷入一个角落。

您遇到的真正问题是弄清楚如何在Web请求和从crontab运行的PHP之间进行进程间通信。 这可以通过多种方式解决,然后可以轻松地克服PHP的体系结构约束。

例如,您可以将会话ID存储在数据库或其他存储中,并独立于Web请求从crontab中运行的PHP脚本访问会话文件。

假设您是根据用户对服务器的上一次请求确定登录的,方法是将该信息作为时间戳存储在某个数据存储中,并将当前会话ID存储在user表中。

cron作业可以每隔X分钟启动一次,查看数据库或持久性存储中是否有给定范围内具有活动时间戳记的所有记录,提取这些会话ID并执行所需的操作。

现在,如果处理时间超过30秒,您如何真正有效地进行扩展的问题也可以独立解决。 有关如何处理来自PHP的分布式作业管理器/队列的更多详细信息,请参见此答案

我将使用Javascript和AJAX请求从前端调用脚本并处理结果。 然后,您可以在JavaScript中设置时间间隔,并在每个时间间隔滴答时发送AJAX请求。

AJAX是您所需要的: http : //api.jquery.com/jquery.ajax/

在那30秒之后,使用方法“成功”执行某项操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM