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
- 例如:scrape foo.com并登录到
如果你真的一心想要真正的“实时”更新然后您应该查看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");