我有一个PHP页面,我想在其中显示最近3秒内新添加到日志文件中的行。目前,我正在使用PHP函数运行jQuery文件,该文件将运行shell_exec。
我正在使用这些脚本:
主页上的jQuery:
setInterval(function(){
$.get('tailer.php', function(data) {
alert(data);
});
}, 3000);
tailer.php:
<?php
$result = shell_exec("timeout 3s sudo tail -f log.txt");
echo $result;
?>
问题是,当我从命令行运行tailer.php脚本时,它会按预期返回行。但是,当使用浏览器运行同一文件时,它不会停止加载,也不会返回任何内容。因此,PHP主页面中的脚本不会发出任何警告。
我能够缩小问题的范围,并注意到当从-f命令中删除尾部开关时,一切都很好。仅-f交换机出现问题。你能帮帮忙吗?
发布于 2019-02-10 11:22:41
不知道具体原因,但在将sudo
移动到timeout
命令之前后,问题得到了解决。最终工作的tailer.php内容如下所示:
<?php
$result = shell_exec("sudo timeout 3s tail -f log.txt");
echo $result;
?>
发布于 2019-02-09 14:00:41
当我第一次开始编写web应用程序时,我也使用了这种技术,JS - PHP - BASH。这不是最好的方法,您应该考虑使用PHP (或Node)来处理bash现在正在做的所有服务器端工作。
我不记得你有(我也有)这个问题的原因是什么,但这个解决方案对我很有效:
在您的tailer.php中,使用以下代码:
<?php
exec("/bin/bash -c 'tail -f log.txt'", $output, $return_var);
echo $output
?>
$return_var是bash脚本的退出状态,我认为$output将保存bash脚本的返回值。
您能向我展示来自AJAX的响应(在dev-tools Network部分中找到)吗?
如果什么都没有,你可以将echo $output
切换为echo $return_var
,这样我们就可以看到退出的bash cmd是真是假。
:-)
发布于 2019-02-09 14:05:38
第一个问题
PHP引擎在请求到来时执行php代码,并在执行完成时返回php代码的输出(您仍然可以使用flush
函数手动刷新输出缓冲区)。似乎你的php代码在执行shell脚本时被阻塞(等待)。
第二个问题
我建议编写一个运行后台的脚本,将文件更改放到Redis中,并使用ajax查询Redis以进行更新。如果你想要纯php代码,我找不到一个合理的解决方案(PHP不是长连接的最佳工具)。
顺便说一下,当建立多个连接时,将同时执行多个shell脚本,这对于这样的文件监视作业是不够的。
https://stackoverflow.com/questions/54606337
复制