我有一个PHP页面,我希望在最近3秒钟内将新添加的行显示到日志文件中。此刻,我正在使用jQuery get函数运行一个PHP文件,该文件又运行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主页上的脚本不会发出任何警报。
我能够缩小问题范围,并注意到从tail命令中删除-f switch时,一切都很好。该问题仅与-f开关有关。你能帮忙吗?
答案 0 :(得分:0)
当我第一次开始编写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的响应吗(位于“开发工具”网络部分)。
如果什么都没有,您可以将echo $output
切换为echo $return_var
,以便我们查看bash cmd是否退出true或false。
:-)
答案 1 :(得分:0)
当请求到来时,PHP引擎执行php代码,并在执行完成后返回php代码的输出(您仍然可以使用flush
函数手动刷新输出缓冲区)。似乎在执行Shell脚本时您的php代码被阻止了(等待)。
我建议编写一个运行后台脚本,以将文件更改放入Redis并使用Ajax查询Redis更新。如果您想要纯PHP代码,我找不到合理的解决方案(PHP并不是长连接的最佳工具)。
顺便说一句,建立多个连接时将同时执行多个shell脚本,这对于这样的文件监视作业是不够的。
答案 2 :(得分:0)
完全不知道为什么,但是在将sudo
移至timeout
命令之前将问题解决了。最终的工作tailer.php内容如下:
<?php
$result = shell_exec("sudo timeout 3s tail -f log.txt");
echo $result;
?>