使用 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 或无限循环中运行它,这会覆盖文件。 实际上我希望它用于slurm
和htop
以获取详细的 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】:
system
和 exec
将命令的结果作为字符串返回。使用fwrite 或类似函数将输出保存到文件。
【讨论】:
以上是关于使用 php 流式传输程序的数据,例如 `htop`的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 PHP api 在 Flutter 中流式传输 MySQL 数据库记录?
如何使用 PHP、cURL、ajax 流式传输实时数据并将其呈现在折线图中