Я не знаю, если это проблема php или проблема Windows. Я в Windows 10.
У меня установлен xampp, и я запускаю собственную медиатеку из веб-браузера.
Я настроил его так, что когда я нажимаю, чтобы воспроизвести видео, php запускает пакетный файл, созданный на лету, чтобы открыть видео в VLC в полноэкранном режиме.
У меня также это так, в браузере, вы можете нажать на иконку, и он выполнит командный файл, который открывает местоположение видео в explorer.exe
Оба из них работали нормально в течение более двух дней. Но сегодня он перестал работать, особенно после того, как мы потеряли питание (выключив компьютер) примерно на 5 секунд из-за шторма.
Теперь поведение таково: оконная функция проводника никогда не открывает окно, а popen
команда истекает с фатальной ошибкой: превышено максимальное время выполнения. В то время как ранее сегодня это работало мгновенно.
Проблема VLC более странная. Это не время ожидания. Ответ ajax возвращается немедленно, и он фактически начинает воспроизводить видео в VLC, ОДНАКО (!!), 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:00 этим вечером. Я схожу с ума.
Проблема оказалась не связана с неожиданной перезагрузкой или чем-то подобным.
Я изменил Apache для запуска в качестве веб-службы, и когда он работает в качестве веб-службы, ему не разрешается взаимодействовать с графическим интерфейсом рабочего стола (даже если вы установите флажок, позволяющий службе Apache взаимодействовать с рабочим столом).
Таким образом, запуск apache вручную, а не как сервис, решает проблему. Целиком. Я вернусь, если выясню, как заставить его работать при запуске в качестве службы.
Других решений пока нет …