PHP执行程序wget nohup并实时写入日志

时间:2019-01-11 18:08:23

标签: php ajax shell sh

我有一个php脚本,它是来自Web应用程序的AJAX调用。基本上,我有一个JS事件监听器,它监听日志(几乎像tail一样,并将其内容打印到屏幕上。这可以正常工作

问题是我可以使用tee之类的工具来任一写入日志,以进行实时日志创建,但是我必须保持脚本打开并且长时间下载会导致某些浏览器超时-

我可以nohup> /dev/null &来使脚本运行(只是快速的AJAX调用),并且不会保持脚本处于打开状态浏览器。

但我似乎都无法做到两者

期望的结果

网页-> ajax调用-> ajax返回-> shell仍在运行-> js侦听器查看wget日志并实时显示在控制台上

我已经尝试过此( php ):

 $url = "internaldomain.com/some-download";
 $user_file = "/some/user/directory/";
 exec("nohup wget --random-wait -r -p -e robots=off -P $user_file -U mozilla $url > /dev/null &");

哪个可以与AJAX进行通话,然后不等待..好事。

我也尝试过

 $url = "internaldomain.com/some-download";
 $user_file = "/some/user/directory/";
 exec("nohup wget --random-wait -r -p -e robots=off -P $user_file -U mozilla $url 2>&1 | tee -a wget_log");

可以写入日志文件-但是我的AJAX仍然保持连接。

我可以在其中进行实时日志记录(不仅仅是在wget结束时输出到日志)的两个之间在不等待结论的情况下启动shell,这样我的其余JS可以继续运行,并开始“监听”日志文件?

然后,使用AJAX侦听器的最终结果是“看起来”像一个实时控制台-但基于Web。

更新 我们托管约600个网站。这是一个内部程序,它通过端口80进入网站并以递归方式打包(wget)。我们的支持人员无法得知wget期间发生的情况。因此,我想通过浏览器启动脚本,将站点下载到指定目录,并创建“实时”日志,以便我们的支持人员了解wget的进度。最后,完成后会显示一个下载链接。为了更好地理解我要完成的工作..请参见下图:

Application UI View

1 个答案:

答案 0 :(得分:0)

如果您希望某件事发生在Web请求的上下文之外,则不应将其从这样的请求中派生出来。它所需要的只是一个恶意方,或者是一个非恶意方,可以多击几次F5,并产生足够的进程来严重影响或杀死服务器。

理想情况下,我建议使用队列系统将面向用户的组件与正在运行的任务分离。例如:

  • 面向客户:
    1. 用户点击“ scrape foo.com”按钮。
    2. 支持应用程序使具有唯一ID的“ scrape foo.com”作业入队。
    3. 该唯一ID返回给客户端以用于监视进度。
  • 服务器端:
    1. 配置supervisord之类的流程管理器来运行一个或多个工作者任务。
    2. 工作者任务轮询队列以进行工作,然后执行。
      • 例如:抓取foo.com并登录到log/$unique_id.log

至于“实时”日志输出,恕我直言,真正的实时(虽然可能)会过大,并且比起从PHP连续输出可能要困难得多,因为存在多个麻烦的层来缓冲所有从PHP CGI SAPI,通过您的httpd,然后向下到TCP堆栈。最简单的方法是简单地通过Javascript触发定期刷新,或者您可以更进一步,跟踪上次结束的日志文件中的偏移量,并仅在该偏移量之后请求字节,然后将其与已合并的内容合并已经收到。

如果您真正地依靠真正的“实时”更新,那么您应该研究WebSockets,例如:Ratchet,尽管我仍然会说这对于您想要实现的目标是过大的。