如何使用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秒,然后冲洗到输出缓冲器。

我希望这样做:每行输出后冲洗到输出缓冲区。

+0

服务器模块= PHP的网络服务器内(例如mod_php的),并在“CGI”模式没有运行。 – 2012-03-20 17:37:05

这可以通过使用popen()它给你把手给你打开任何程序的标准输出来完成。可以使用ob_flush()将大块数据发送到客户端,可以使用XHR显示数据。

+0

当然,浏览器没有任何义务去显示它,因为它真的是最好的事情是使用ajax轮询或其他东西,并实际上以非阻塞的方式运行该过程。 – 2012-03-20 17:38:41

+0

@TylerEaves,好想法。尽管我正在使用AJAX调用来加载运行shell脚本的PHP页面,所以如果我可以使用'popen()'持续刷新,这对我的情况来说很理想。 – 2012-03-20 18:08:41

+0

我在一个我实现的应用程序(不是PHP)中实现这一点的方法是在外部页面中分配一个作业ID,然后使用结构为jobid/message/timestamp(unix整数样式)的表格。对于我插入到消息表中的每行/每组输出。每秒钟(这是一个Intranet应用程序,所以延迟很低)。我通过ajax进行轮询,传入作业ID和最后处理的消息的时间戳,并返回一个包含时间戳和文本的json数组。将文本预先添加到我的消息div中。完成。简单。适用于多个用户。 – 2012-03-20 18:12:09

一种选择是写在shell脚本文件,在每一步说哪里就看。在您的网页上,每X秒/分钟使用一次ajax呼叫。 ajax调用将调用一个PHP脚本来读取状态文件并返回状态或完成的步骤。

的优势,这种做法是页面实时信息将提供给多位访客,而不仅仅是实际启动的shell脚本的一个。显然这可能会或可能不会取决于您的需要。

当然的缺点是较长的AJAX间隔,过时的多个更新会。嵌入式

+0

文件是多余的,这就是popen存在和stdout处理程序的原因。 – rook 2012-03-20 18:13:15

+0

需要文件访问而不是popen的情况包括但不限于:跨脚本链接,实时数据馈送,xhr结果广播。 – 2013-11-16 02:06:14