Я использую xampp в Windows 10, пишу персональный медиа-браузер в среде веб-браузера от localhost. я использую shell_exec()
открыть VLC Media Player и начать воспроизведение данного видео файла.
Сначала я выполнил команду vlc прямо в shell_exec (), например:
shell_exec('vlc -f "path/to/file.mp4"');
Он работает как надо, открывает VLC (как будто из веб-браузера), автоматически воспроизводит видеофайл в полноэкранном режиме.
Проблема в том, что он продолжает запускать скрипт, пока открыт VLC.
Чтобы попытаться обойти это, я решил сделать это путем создания командного файла.
Так что теперь, по щелчку файла в браузере, я запускаю ajax на сервер и пишу временный runvlc.bat
файл в текущий каталог скриптов, затем используйте shell_exec
выполнить командный файл и автоматически закрыть командную строку. Я думал, что это решит проблему выполнения сценария-пока-как-VLC-is-open, потому что 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 как открытый / работающий?
Попробуйте запустить файл 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'));
}
Других решений пока нет …