exec / popen运行批处理文件是在后台打开程序,而不是正确启动

时间:2015-08-12 03:17:13

标签: php windows batch-file xampp popen

我不知道这是php问题还是Windows问题。我在Windows 10中。

我安装了xampp,并且我正在使用Web浏览器运行自定义构建的媒体库。

我已将其设置为当我点击播放视频时,php执行批处理文件,即时创建,以全屏模式在VLC中打开视频。

我也是这样,在浏览器中,您可以单击一个图标,它将执行批处理文件,打开explorer.exe中的视频位置

这两项工作都很好,超过两天。但是今天,由于暴风雨,我们在失去电源(关闭计算机)5秒后停止工作。

现在的行为是:资源管理器窗口函数永远不会打开窗口,popen命令超时并发生致命错误:超出了最大执行时间。而今天早些时候它立即起作用。

VLC问题更为棘手。它没有超时。 ajax响应立即回来,它实际上确实开始在VLC中播放视频,HOWEVER(!!),VLC从未实际打开(现在);它只是在后台播放视频中的音频。我必须去任务管理器停止它,因为VLC没有(明显地)启动。

同样,这两个功能都工作得很好,自从我第一次编写功能以来几天都没有问题,直到今天短暂的断电问题。

所以,我认为这不是一个PHP问题,但也许某些Windows的东西是腐败的,阻止了正常的行为。

请注意,如果我直接点击它们正常工作的批处理文件(打开资源管理器窗口或以全屏模式打开VLC)。当我用popen执行批处理文件时,现在发生了奇怪的现象。

以下是我的代码:

JS:

// open up VLC to play video file
$('body').on('click', 'img.hover', function()
{
    var dir = $(this).data('dir');
    $.post
    (
        ajax_url,
        {
            action:'play',
            source:'mediacenter',
            dir:dir
        },
        function(response)
        {
            console.log(response);
        }
    );
});
// open up folder in explorer.exe
$('body').on('click', 'div.search-field-folder-location', function()
{
    var dir = $(this).data('dir');
    $.post
    (
        ajax_url,
        {
            action:'explore',
            source:'mediacenter',
            dir:dir
        },
        function(response)
        {
            console.log(response);
        }
    );
});

PHP:

// open VLC
private function play()
{
    $dir = $_POST['dir'];
    $files = glob($dir.'/*');
    $files = glob("$dir/*.{mkv,avi,mp4,webm,flv,ogv,ogg,mov,qt,wmv,m4v}", GLOB_BRACE);
    if(count($files) === 1)
    {
        $path = "file:///C:".str_replace('\\','/', $dir);
        $dir = getcwd();
        $batch = 'runvlc.bat';
        $handle = fopen($batch, 'w');
        $data = 
"CD
CD C:\Program Files (x86)\VideoLAN\VLC
start vlc -f --volume 75 \"$path\"
exit";
        fwrite($handle, $data);
        fclose($handle);
        $cmd = '"'.$dir.'\runvlc.bat"';
        mc_utl::bg_exec($cmd);
        return $this->response(array('status'=>'success','message'=>$files));   
    }
    elseif(!$files)
    {
        return $this->response(array('status'=>'error','message'=>'No Files Found'));    
    }
    else 
    {
        $choices = array();
        foreach($files as $file) $choices[] = basename($file);
        return $this->response(array('status'=>'multiple','choices'=>$choices));     
    }
}

// open explorer.exe
private function explore()
{
    $dir = str_replace('\\\\', '\\', 'c:\\'.str_replace('/','\\',  $_POST['dir']));
    $data = 
'%SystemRoot%\explorer.exe "'.$dir.'"
exit';  
    $batch = 'opendir.bat';
    $handle = fopen($batch, 'w');
    fwrite($handle, $data);
    fclose($handle);
    mc_utl::bg_exec('"'.getcwd().'\\'.$batch.'"');
    return $this->response(array('status'=>'success','data'=>$data));   
}

这是bg_exec函数:

public static function bg_exec($cmd)
{ 
    pclose(popen($cmd, "r"));
    return;
} 

如果我使用shell_execexec也会出现同样的问题,而在关闭电脑之前,所有三个函数(shell_exec,exec或popen)都在工作。

更新

我尝试从等式中删除批处理文件,只需将命令直接运行到shell_exec,如下所示:

chdir('C:\Program Files (x86)\VideoLAN\VLC');
shell_exec("start vlc -f \"$media\" exit");

仍在做同样的事情:启动VLC过程并从视频文件开始播放音频,但VLC的应用程序从未明显启动,我必须在任务管理器中关闭该过程。

所以这不是批处理文件问题(通过dbl点击它直接运行批处理文件可以正常工作)。每当我尝试从php启动程序时,它只在后台打开(资源管理器或VLC)。

我刚刚完成了系统文件检查。没有发现腐败。

今晚工作到凌晨5点。我正在失去理智。

1 个答案:

答案 0 :(得分:0)

该问题与意外重启或其他任何事情无关。

我已将Apache更改为作为Web服务运行,当它作为Web服务运行时,不允许与桌面gui交互(即使您选中允许apache服务与桌面交互的框)。

因此,手动运行apache而不是服务,可以解决问题。完全。如果我知道如何在作为服务运行时使其工作,我会回来。