2016-09-04 77 views
1

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

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

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

  1. 请问popen()能解决我的问题吗?
  2. 我是否正在以正确的方式进行操作,或者是否有更好的方法在用户登录时按间隔执行脚本?

任何帮助或建议非常感谢,一如既往!

干杯

安迪

+0

单独的过程总是一个单独的过程。在脚本中加载会话可能更容易(完全取决于代码以及如何管理会话),或者仅将JSON(或序列化数组)与作为参数的信息一起传递给进程。 –

+0

当用户登录时,每X分钟需要执行一次该代码的原因是什么?代码是做什么的? – Sherif

回答

0

我会使用JavaScript和Ajax请求调用从前端脚本和处理结果。 然后,您可以在JavaScript中设置时间间隔,并发送一个AJAX-Request每个间隔刻度。

+1

如果您使用标准会话处理程序(使用文件),则无法发出新请求,因为它必须等到ajax调用完成。 ajax调用正在锁定会话文件,因此新的请求无法访问它,从而导致它们挂起。 – MarcHoH

+0

这只适用于他想要同时提出请求的情况。 –

2

也许一个想法把会话数据也放在一个表中。 通过这种方式,您可以轻松地从后台进程访问它。您只需要通过session_id()user id作为参数,以便过程知道它当前正在处理哪个用户。

2
  1. 没有,因为PHP仍然需要等待由popen()启动的进程,才可以退出
  2. 大概不会,因为该解决方案不符合系统

的结构限制你不使用cron作业的推理实际上并不健全。你可能已经放弃了快速探索这条特定路径,并且试图将一个方形钉子安装在一个圆孔中,将自己拉到一个角落里。

您遇到的真正问题是搞清楚如何在web请求和从crontab运行的PHP之间进行进程间通信。这可以通过多种方式解决,并且更容易尝试针对PHP的体系结构约束。

例如,您可以将会话标识存储在数据库或其他存储中,并可以从运行在crontab中的PHP脚本访问会话文件,而不受Web请求的限制。

假设您通过将某些数据存储中的此信息作为时间戳与用户表中的当前会话ID一起存储,根据他们对服务器发出的最后一个请求确定用户已登录。

cron作业可以每隔X分钟启动一次,查看数据库或持久性存储区中的活动时间戳记在给定范围内的任何记录,然后将这些会话标识符并执行所需的操作。

现在,如果处理时间超过30秒,如何真正有效地扩展这个问题,也可以单独解决。 See this answer for more details on how to deal with distributed job managers/queues from PHP