使用shell_exec打开视频文件会导致最大执行时间致命错误

时间:2015-08-10 04:08:26

标签: php xampp vlc execution-time

我在Windows 10上运行xampp,在localhost的Web浏览器环境中编写个人媒体浏览器。我正在使用shell_exec()打开VLC Media Player并开始播放给定的视频文件。

首先,我直接在shell_exec()中执行了vlc命令,如:

shell_exec('vlc -f "path/to/file.mp4"');

它可以正常工作,打开VLC(就像从网络浏览器一样),以全屏方式自动播放视频文件。

问题是,只要VLC打开,它就会一直运行脚本。

为了试图解决这个问题,我想我会通过创建批处理文件来实现。

现在,在浏览器中单击文件后,我将ajax运行到服务器并将临时runvlc.bat文件写入当前脚本目录,然后使用shell_exec执行批处理文件,自动关闭命令提示符。我原本以为这会解决运行脚本一样长的VLC问题,因为shell_exec只打开退出自身的批处理文件。

然而,这并没有解决问题。 30秒后,我仍然收到来自服务器的致命错误(最长执行时间)响应。它并没有真正伤害任何东西,但我想解决这个问题。

我记得在某个地方读过有一种方法可以将执行关闭,以便php可以继续,但我再也找不到了。

这就是代码目前在服务器端的样子:

private function test()
{
    $dir = getcwd();
    $batch = 'runvlc.bat';
    $handle = fopen($batch, 'w');
    $media = "file:///C:/mymovie.mp4";
    $data = 
"CD
CD C:\Program Files (x86)\VideoLAN\VLC
start vlc -f --volume 75 \"$media\"
exit";
    fwrite($handle, $data);
    fclose($handle);
    $line = '"'.$dir.'\'.$batch.'"';
    shell_exec($line);
    return $this->response(array('status'=>'success')); 
}

如何将执行与VLC的状态分离为开放/运行?

1 个答案:

答案 0 :(得分:1)

尝试使用此功能运行您的bat文件:

这将在后台执行$ cmd(没有cmd窗口)而没有PHP等待它完成

public function bgExec($cmd) { 
        pclose(popen($cmd, "r"));  
} 

private function test()
{
    $dir = getcwd();
    $batch = 'runvlc.bat';
    $handle = fopen($batch, 'w');
    $media = "file:///C:/mymovie.mp4";
    $data = 
"CD
CD C:\Program Files (x86)\VideoLAN\VLC

start vlc -f --volume 75 \"$media\"
exit";
    fwrite($handle, $data);
    fclose($handle);
    $line = '"'.$dir.'\'.$batch.'"';
    $this->bgExec($line);
    return $this->response(array('status'=>'success')); 
}