目的: 从终端获取实时更新,无需新的换行符。 目前我正在使用此
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命令promt中,我获得了一行中的百分比和速度而没有新的换行符。为此,我尝试了这段代码
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
)
那么有人可以提供修改这些代码或新代码的任何建议吗?感谢。
答案 0 :(得分:0)
这不是php问题。正如您在stderr输出中看到的,无法加载模块youtube_dl
。最有可能的是,youtube_dl
目录不在您的PYTHONPATH中。尝试扩展PYTHONPATH或将youtube_dl
目录移动到current working directory。