0

简短的背景:

我的数据库将有一个电子邮件列表,用户将创建价格表以发送到这些客户的电子邮件。我希望通过单击按钮来确保价格表在发送前正确无误,而不是设置 CRON 作业来为我处理此问题。

过程

我正在使用 Codeigniter 和远程主机上的 Linux 服务器。

  1. 用户单击按钮以启动该过程。将 db 列状态设置为我在模型中获得的 PID。
  2. AJAX 调用控制器函数。这会一直运行,直到它完成向客户发送电子邮件。(暂时的虚拟睡眠功能)。
  3. 当脚本完成(HTTP 请求完成)时,ajax 会移除处理图标。

    • 如果用户在脚本启动后访问该页面,如果 status != 0,则循环到 HTTP 请求控制器检查 PID 的状态。
    • 我注意到我得到的 PID 总是 5012,在我的脚本中似乎总是在运行。
    • 我正在运行if (shell_exec("ps aux | grep " . $pid . " | wc -l") > 0) { // PID is running }以检查进程是否正在运行,其中 $pid 是函数的参数。

使这一切融合在一起的最后步骤:

  • 如果用户访问该页面并且脚本正在运行,我无法查看脚本是否以及何时完成
  • 我不想暴力查询数据库,因为这似乎是以后的性能问题
  • 我最终想在网站上添加一个静态图标,这样用户就不必返回这里查看状态

TLDR

我在 codeigniter 中运行 PHP 脚本,并且需要一种方法,当我访问不同的页面或刷新当前页面时,我可以检查脚本是否仍在运行以获得正确的用户反馈。

4

1 回答 1

2

由于性能原因,您希望避免使用数据库,但在某个地方您需要一个标志或其他方式来识别脚本正在运行。PHP 会话已退出,因为从另一个会话查看它的人不会设置相同的标志。

尝试使用比数据库更快的东西——比如 memcache。

<?php
// if memcache->is_running is set
    // echo some response message saying it's running and exit
// set memcache->is_running w/ the start time maybe
// ... your code
// write memcache->is_running start timestamp and end timestamp to db or file
// clear memcache->is_running
于 2013-09-24T19:14:59.420 回答