【问题标题】:How to run shell script with live feedback from PHP?如何使用 PHP 的实时反馈运行 shell 脚本?
【发布时间】:2012-04-05 05:16:10
【问题描述】:

如何在向浏览器提供持续/实时反馈的同时从 PHP 执行 shell 脚本? 我从system函数文档中了解到:

system() 调用也会尝试自动刷新 Web 服务器的 如果 PHP 作为服务器运行,则在每行输出之后输出缓冲区 模块。

我不清楚将其作为“服务器模块”运行是什么意思。

示例 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 秒,然后刷新到输出缓冲区。

我想要这样做:在每行输出后刷新到输出缓冲区。

【问题讨论】:

  • 服务器模块 = PHP 嵌入在网络服务器中(例如 mod_php),而不是在 'cgi' 模式下运行。

标签: php shell shell-exec


【解决方案1】:

这可以使用popen() 来完成,它为您提供了您打开的任何进程的标准输出的句柄。可以使用ob_flush() 将数据块发送到客户端,可以使用 XHR 显示​​数据。

【讨论】:

  • 当然,浏览器没有义务在它进入时显示它。最好的办法是使用ajax轮询或其他东西,并以非阻塞方式实际运行进程。
  • @TylerEaves,好主意。虽然我使用 AJAX 调用来加载运行 shell 脚本的 PHP 页面,所以如果我可以使用popen() 不断刷新,那将是我的理想选择。
  • 我在我实现的应用程序中执行此操作的方式(虽然不是 PHP)是在外部页面中分配一个作业 ID,然后我有一个结构为 jobid / message / timestamp (unix整数样式)。对于我插入到消息表中的每一行/每组输出。每秒(这是一个 Intranet 应用程序,因此延迟很低)。我通过 ajax 进行轮询,传入作业 ID 和处理的最后一条消息的时间戳,并返回一个包含时间戳和文本的 json 数组。将文本添加到我的消息 div 中。完毕。简单的。适用于多个用户。
  • @Highway of Life 是的,就是这样。
  • Internet Explorer 中的 XHR 不会让您读取部分响应,因此在 IE 中,您只能在 shell 脚本完全完成后才能获得页面上的信息。见:css.dzone.com/articles/partial-xmlhttprequest
【解决方案2】:

一种选择是在 shell 脚本中写入一个文件,在每一步都说明它的位置。在您的网页上,每 X 秒/分钟使用一次 ajax 调用。 ajax 调用将调用一个 PHP 脚本,该脚本读取状态文件并返回状态或已完成的步骤。

这种方法的优点是页面实时信息将可供多个访问者使用,而不仅仅是实际启动 shell 脚本的访问者。显然,根据您的需要,这可能会也可能不会。

缺点当然是ajax间隔越长,更新越过时。

【讨论】:

  • 一个文件是多余的,这就是popen存在和stdout处理程序的原因。
  • 需要文件访问而不是 popen 的情况包括但不限于:跨脚本链接、实时数据馈送、xhr 结果广播。
猜你喜欢
  • 2014-10-10
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 2011-04-14
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多