例如有tail -f a.logphp怎么可以实现获取tail -f a.log里边的内容并实时返回到网页中?

解决方案 »

  1.   

    file_get_contents('/var/log/a.log');  不行吗?
    之前先给a.log增加一个读的权限。
      

  2.   

    这个是我的一个比方,例如有一个程序
    ./a.py它会不时的打印出来一些数据,我要把这些数据实时的展示在前端。
      

  3.   

    那就ajax,每隔60秒,重新读取a.py这个文件,可以用file_get_contents(),fopen()之类的。
      

  4.   

    py是个程序,如果是输出到std.out,可能要外部调用
    如果a.py是后台运行,只能抓输出的log文件了
      

  5.   

    就是类似tail -f ,只不过我要把显示在屏幕中的内容显示在网页中。
      

  6.   

    参考手册 进程控制扩展 - System program execution 一章
    但确实不推荐这么做,尤其外部程序是个长时间运行的程序,php调用没什么用
      

  7.   

    $logpath = 'a.log'
    $read_line = '80';
    $output = shell_exec('sudo tail -n'.$read_line.' '.$logpath);
    $log_array = explode(PHP_EOL, trim($output));
    $content = array();
    foreach($log_array as $val){
    $content[]=trim($val);
    }
    unset($log_array);
    var_dump($content);
      

  8.   

    tail读取的时间几乎可以忽略不计
      

  9.   

    纯理论解释,没试过,但我觉得可能也靠谱,你可以做个popen,然后循环fread和echo,别设置缓存,应该可以实时输出到屏幕上,但是也别忘了设置时间超时为0。如果这个不行,那也可以通过popen一个“nohup tail -f xxx & > xxx”文件的后台进程,循环读这个文件,然后echo到屏幕不就行了么,当然,想echo的东西显示到屏幕,就别设置cache,否则就别忘了ob_flush和flush。
    最后,还是建议ajax,这种用户体验太差了
      

  10.   


    这里第一次说的popen就是指popen你的tail -f xxx进程
      

  11.   


    shell_exec应该是等执行完了才返回的,可能和楼主说的意思不太一样,但是,我觉得你这个配合ajax比楼主的方案更靠谱一些~~
      

  12.   


    http1.1协议貌似限定浏览器每次只能最多接收两个请求(我试的结果,每次只能1个请求),如果不用ajax,会造成只要这个页面开着,你其他请求都发不出去的窘境当然,不止一个服务器并有负载均衡策略就另当别论了
      

  13.   

    恩 如果实时去读的话 用ajax加上setTimeout即可