【问题标题】:Real time update of terminal in php (popen or proc_open)php中终端的实时更新(popen或proc_open)
【发布时间】:2014-07-25 00:30:24
【问题描述】:

目标: 从终端获取实时更新而无需换行。 目前我正在使用这个

    header('Content-Encoding: none;');

    set_time_limit(0);

    $handle = popen("python -m youtube_dl https://www.youtube.com/watch?v=S2JOicnUh1s", "r");

    if (ob_get_level() == 0) 
        ob_start();

    while(!feof($handle)) {
        $buffer = fgets($handle);
        $buffer = trim(htmlspecialchars($buffer));
        echo "<pre>";
        echo $buffer ;
        echo str_pad('', 4096);
        echo "</pre>";
        ob_flush();
        flush();
        sleep(1);
    }
    pclose($handle);
    ob_end_flush();

这段代码的输出

            [youtube] S2JOicnUh1s: Downloading webpage
            [youtube] S2JOicnUh1s: Downloading video info webpage
            [download]   0.0% of 3.26MiB at 12.82KiB/s ETA 04:20
            [download]   0.1% of 3.26MiB at 38.46KiB/s ETA 01:26
            [download]   0.2% of 3.26MiB at 89.74KiB/s ETA 00:37
            [download]   0.4% of 3.26MiB at 79.79KiB/s ETA 00:41
            [download]   0.9% of 3.26MiB at 79.28KiB/s ETA 00:41
            ....................................................
            ....................................................
            [download]  98.1% of 3.26MiB at 72.50KiB/s ETA 00:00
            [download] 100.0% of 3.26MiB at 72.66KiB/s ETA 00:00
            [download] 100% of 3.26MiB in 00:45 

它在下载结束时只输出一次(起初它给了我实时更新,后来我不知道为什么会这样)。但是在我的 windows 命令提示符中,我在一行中获得了百分比和速度,而没有换行符。为此,我尝试了此代码

        function execute($cmd,$stdin=null){
            $proc=proc_open($cmd,array(0=>array('pipe','r'),1=>array('pipe','w'),2=>array('pipe','w')),$pipes);
            fwrite($pipes[0],$stdin);                      fclose($pipes[0]);
            $stdout=stream_get_contents($pipes[1]);        fclose($pipes[1]);
            $stderr=stream_get_contents($pipes[2]);        fclose($pipes[2]);
            $return=proc_close($proc);
            return array( 'stdout'=>$stdout, 'stderr'=>$stderr, 'return'=>$return );
        }

  echo '<pre>';
  print_r(execute('python -m youtube_dl https://www.youtube.com/watch?v=S2JOicnUh1s'));
  echo '</pre>';

失败了……结果是空的

输出

Array
  (
    [stdout] => 
    [stderr] => C:\Python27\python.exe: No module named youtube_dl

    [return] => 1
  )

那么任何人都可以提供任何建议来修改这些代码或新代码吗?谢谢。

【问题讨论】:

  • 你试过fread($handle, ..)而不是fgets($handle)吗?

标签: php python popen proc-open youtube-dl


【解决方案1】:

这不是 php 问题。正如您在 stderr 输出中看到的那样,无法加载模块 youtube_dlyoutube_dl 目录很可能不在您的PYTHONPATH 中。尝试扩展 PYTHONPATH 或将 youtube_dl 目录移动到您的 current working directory

【讨论】:

    猜你喜欢
    • 2014-01-04
    • 1970-01-01
    • 2011-01-13
    • 2018-01-12
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    相关资源
    最近更新 更多