使用 php 流式传输程序的数据,例如 `htop`

Posted

技术标签:

【中文标题】使用 php 流式传输程序的数据,例如 `htop`【英文标题】:using php to stream data of programs such as `htop` 【发布时间】:2013-03-10 10:35:12 【问题描述】:

使用其中一种代码

system("htop");
//or
exec('htop');

如何防止htop的数据被写入文件或其他东西(脚本的时间限制设置为0不用担心)

【问题讨论】:

webdeveloper.com/forum/… 我也在挖掘同样的东西。当您使用 shell 时,您可以在远程 ssh 客户端上看到流,因此,我认为使用 SSH 库(如 libSSH2 或 phpseclib(purephp ssh 实现))并非不可能。我知道 PHP 可以从任何连接刷新流(这就是视频的工作方式......例如),但我还没有找到这样做的方法,因为我对使用 libSSH2 真的很陌生。很有趣的事情。我也问自己有关具有交互式输入的 CLI 程序。我喜欢/需要一种从网络上获得真正 ssh 感觉的方法。 【参考方案1】:

htop 是一个交互式程序,它在循环中运行直到退出,并且似乎没有提供任何标志来执行单次迭代然后退出,这使得捕获输出有问题。

你考虑过使用top吗?您可以使用 -n 1 将其限制为 1 次迭代:

$resp = system("top -n 1");
print $resp; 

【讨论】:

所以我无法将迭代连续流式传输到文件中? 如果你想在网页上连续显示这个信息,你可以人为地通过AJAX循环调用“top -n 1”命令,并用最新的数据覆盖一个div在每次迭代中。您可以随时在 cron 或无限循环中运行它,这会覆盖文件。 实际上我希望它用于slurmhtop 以获取详细的 CPU 使用率和基于树的 PID @RonanDejhero:与 linux 系统管理员交谈,如果您在与她的讨论中详细说明您的需求,她应该能够为您命名一些非交互式的替代程序,这些程序可以满足您的需求.【参考方案2】:

这是另一种解决方案,即使用虚拟终端并进行屏幕截图,然后关闭会话。这是一个不错的技巧,但 top -n 1 在资源使用方面更有效。如果在 redhat/centos 中,你需要做 yum screen。似乎包含在 ubuntu/debian 中。

<?php
`screen  -d -m -S htop_session htop`;
sleep(1);
`screen -p 0 -S htop_session -X hardcopy`;
`screen -p 0 -S htop_session -X quit`;
?>
<pre>
<?php print file_get_contents('hardcopy.0'); ?>
</pre>

【讨论】:

请解释为什么您的解决方案有效,而不是仅仅输入一些代码......即使它可能有效。【参考方案3】:

我同意@d_g 的回答,top 是一个打算在终端中运行的程序。我建议使用 AJAX 频繁更新 top 的输出

此外,我想添加有关函数passthru() 的信息。该函数将 shell 命令的输出直接打印到 php 的标准输出。在外部程序完成之前,您不需要额外的打印和输出。如果命令需要很长时间来处理,这很重要。所以你可以替换:

$resp = system("top -n 1");
print $resp; 

passthru('top -n 1');

【讨论】:

我将使用 websock 而不是 Ajax,我需要来自 htop 和 slurm 而不是 top 的数据。谢谢。 比使用web socket请求更新htop的输出。这没什么区别。你在期待什么?网页上 htop 的彩色输出?这行不通(如您所料) htop 似乎编码不佳,因为它不尊重 glibc 函数isatty(),因此不会轻易与 php 配合使用(尽管有 hacky 方法实现这一目标)。【参考方案4】:

systemexec 将命令的结果作为字符串返回。使用fwrite 或类似函数将输出保存到文件。

【讨论】:

以上是关于使用 php 流式传输程序的数据,例如 `htop`的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 PHP api 在 Flutter 中流式传输 MySQL 数据库记录?

如何通过烧瓶应用程序流式传输数据?

如何使用 PHP、cURL、ajax 流式传输实时数据并将其呈现在折线图中

PHP <---> FLASH持久连接(数据流式传输)

是否可以使用 OpenCV 将视频从 https://(例如 YouTube)流式传输到 python 中?

以编程方式将视频从 php 服务器流式传输到 android