我不知道这是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_exec
或exec
也会出现同样的问题,而在关闭电脑之前,所有三个函数(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点。我正在失去理智。
答案 0 :(得分:0)
该问题与意外重启或其他任何事情无关。
我已将Apache更改为作为Web服务运行,当它作为Web服务运行时,不允许与桌面gui交互(即使您选中允许apache服务与桌面交互的框)。
因此,手动运行apache而不是服务,可以解决问题。完全。如果我知道如何在作为服务运行时使其工作,我会回来。