我有一个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的进度。最后,完成后会显示一个下载链接。为了更好地理解我要完成的工作..请参见下图:
答案 0 :(得分:0)
如果您希望某件事发生在Web请求的上下文之外,则不应将其从这样的请求中派生出来。它所需要的只是一个恶意方,或者是一个非恶意方,可以多击几次F5,并产生足够的进程来严重影响或杀死服务器。
理想情况下,我建议使用队列系统将面向用户的组件与正在运行的任务分离。例如:
log/$unique_id.log
至于“实时”日志输出,恕我直言,真正的实时(虽然可能)会过大,并且比起从PHP连续输出可能要困难得多,因为存在多个麻烦的层来缓冲所有从PHP CGI SAPI,通过您的httpd,然后向下到TCP堆栈。最简单的方法是简单地通过Javascript触发定期刷新,或者您可以更进一步,跟踪上次结束的日志文件中的偏移量,并仅在该偏移量之后请求字节,然后将其与已合并的内容合并已经收到。
如果您真正地依靠真正的“实时”更新,那么您应该研究WebSockets,例如:Ratchet,尽管我仍然会说这对于您想要实现的目标是过大的。