我有一个PHP脚本从第三方源提取用户特定数据并将其转储到本地表中,我想在用户登录时每隔X分钟执行一次,但运行大约需要30秒,我不希望用户体验。我认为这样做的最好方法是为每个成功的拉取时间戳,然后在每个页脚中放置一些代码,检查最后一次拉动,如果超过X分钟,则在后台执行PHP脚本。
我不想使用cron作业来执行此操作,因为在执行pull脚本时,我需要特定于用户的全局和会话变量。
我可以看到popen()允许我运行PHP脚本,但我似乎无法找到任何有关这是否会作为访问者在其会话中运行的信息(因此可以访问用户)特定的全局或会话变量)或作为一个单独的会话。
我们非常感谢任何帮助或建议!
干杯
安迪
答案 0 :(得分:2)
也许是将会话数据也放在表格中的想法。
这样您就可以从后台进程轻松访问它。您只需传递session_id()
或user id
作为参数,以便进程知道它当前正在处理哪个用户。
答案 1 :(得分:2)
popen()
启动的进程才能退出你不使用cron作业的理由实际上并不合理。你可能已经放弃了太快地探索那条特定的路径并将自己拉到一个角落里,试图将一个方形钉固定在一个圆孔中。
您遇到的真正问题是如何在Web请求和从您的crontab运行的PHP之间进行进程间通信。这可以通过多种方式解决,然后更容易尝试抵御PHP的架构约束。
例如,您可以将会话ID存储在数据库或其他存储中,并从crontab中运行的PHP脚本访问会话文件,而不受Web请求的影响。
假设您通过将此信息作为时间戳存储在某个数据存储中,以及用户表中的当前会话ID,确定用户是根据他们对服务器的最后一个请求登录的。
cron作业可以每X分钟启动一次,查看数据库或持久性存储,查看在给定范围内具有活动时间戳的任何记录,拉出这些会话ID并执行所需的操作。
现在,如果处理时间超过30秒,你如何能够有效地扩展这个问题也可以独立解决。 See this answer for more details on how to deal with distributed job managers/queues from PHP
答案 2 :(得分:0)
我会使用Javascript和AJAX请求从前端调用脚本并处理结果。 然后,您可以在JavaScript中设置间隔,并在每个间隔时间内发送一个AJAX-Request。
答案 3 :(得分:0)
AJAX是您所需要的: http://api.jquery.com/jquery.ajax/
使用方法"成功"在那30秒之后做点什么。