如何使用PHP的实时反馈运行shell脚本?
如何在向浏览器提供持续/实时反馈的同时从PHP执行shell脚本? 我从system函数文档理解:如何使用PHP的实时反馈运行shell脚本?
的系统()调用也尝试如果PHP运行作为服务器 模块来自动冲洗web服务器的 输出缓冲器输出的每一行之后。
我不清楚它们作为“服务器模块”运行的意思。
例PHP代码:
<?php
system('/var/lib/script_test.sh');
实施例壳代码:
#!/bin/bash
echo "Start..."
for i in {1..10}
do
echo "$i..."
sleep 1
done
echo "Done."
此作用:它将等待大约10秒,然后冲洗到输出缓冲器。
我希望这样做:每行输出后冲洗到输出缓冲区。
这可以通过使用popen()它给你把手给你打开任何程序的标准输出来完成。可以使用ob_flush()将大块数据发送到客户端,可以使用XHR显示数据。
当然,浏览器没有任何义务去显示它,因为它真的是最好的事情是使用ajax轮询或其他东西,并实际上以非阻塞的方式运行该过程。 – 2012-03-20 17:38:41
@TylerEaves,好想法。尽管我正在使用AJAX调用来加载运行shell脚本的PHP页面,所以如果我可以使用'popen()'持续刷新,这对我的情况来说很理想。 – 2012-03-20 18:08:41
我在一个我实现的应用程序(不是PHP)中实现这一点的方法是在外部页面中分配一个作业ID,然后使用结构为jobid/message/timestamp(unix整数样式)的表格。对于我插入到消息表中的每行/每组输出。每秒钟(这是一个Intranet应用程序,所以延迟很低)。我通过ajax进行轮询,传入作业ID和最后处理的消息的时间戳,并返回一个包含时间戳和文本的json数组。将文本预先添加到我的消息div中。完成。简单。适用于多个用户。 – 2012-03-20 18:12:09
一种选择是写在shell脚本文件,在每一步说哪里就看。在您的网页上,每X秒/分钟使用一次ajax呼叫。 ajax调用将调用一个PHP脚本来读取状态文件并返回状态或完成的步骤。
的优势,这种做法是页面实时信息将提供给多位访客,而不仅仅是实际启动的shell脚本的一个。显然这可能会或可能不会取决于您的需要。
当然的缺点是较长的AJAX间隔,过时的多个更新会。嵌入式
文件是多余的,这就是popen存在和stdout处理程序的原因。 – rook 2012-03-20 18:13:15
需要文件访问而不是popen的情况包括但不限于:跨脚本链接,实时数据馈送,xhr结果广播。 – 2013-11-16 02:06:14
服务器模块= PHP的网络服务器内(例如mod_php的),并在“CGI”模式没有运行。 – 2012-03-20 17:37:05