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

PHP执行wget nohup并实时写入日志,php,ajax,shell,sh,Php,Ajax,Shell,Sh,我有一个php脚本,它是来自web应用程序的AJAX调用。基本上,我有一个JS事件监听器,它可以监听日志(几乎像tail),并将其内容打印到屏幕上 问题是,我可以使用tee之类的工具写入日志,以进行实时日志创建,但我必须保持脚本打开,并且一些浏览器在长时间下载时超时-- 或我可以nohup和/dev/null&运行脚本(只需一个快速的AJAX调用),并且不会在浏览器中保持脚本打开 但我似乎不能同时做到这两件事 期望的结果 网页-->ajax调用-->ajax返回-->shell仍在运行-->js

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

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

我可以
nohup
/dev/null&
运行脚本(只需一个快速的
AJAX
调用),并且不会在浏览器中保持脚本打开

但我似乎不能同时做到这两件事

期望的结果

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

我试过这个(php):

这与
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的进度。最后,当完成时,它会显示一个下载链接。为了更好地了解我正在尝试完成的工作。请参见下图:


如果您希望在web请求的上下文之外发生某些事情,您不应该像这样把它从一个请求中分离出来。只需要一个恶意方,或者一个非恶意方,就可以多打F5几次,并产生足够多的进程来严重影响或杀死服务器

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

  • 面向客户:
  • 用户单击“scrape foo.com”按钮
  • 支持应用程序将具有唯一ID的“scrape foo.com”作业排入队列
  • 将唯一ID返回给客户端,以用于监视进度
  • 服务器端:
  • 将process manager配置为运行一个或多个辅助任务
  • 辅助任务轮询队列中的工作,并执行此操作。
    • 例如:scrape foo.com并登录到
      log/$unique\u id.log
至于“实时”日志输出,IMHO是真正的实时[在可能的情况下]这可能会有点过分,并且比您想象的更难从PHP连续输出,因为存在几个麻烦的层来缓冲所有来自PHP CGI SAPI的数据,通过您的httpd,并向下进入TCP堆栈。最简单的方法是通过Javascript触发周期性刷新,或者您可以更进一步ep跟踪日志文件中上次结束的偏移量,并仅请求该偏移量之后的字节,将其与已接收的内容合并


如果你真的一心想要真正的“实时”更新然后您应该查看WebSocket,例如:,尽管我仍然认为这对于您想要实现的目标来说是过分的。

您应该更好地描述您试图通过此代码实现的总体目标,因为这里有很多不好的想法,并且您很可能会使用不同的方法得到更好的服务。请参阅我的更新我很乐意接受这样的建议,因为一个浏览器是不可靠的,因为浏览器可能无法接受浏览器(客户端)不让我们说“历史”数据,你可能会考虑把数据放在数据库中,并有一个小控制台来获取这些信息。
 $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");