использование shell_exec для открытия видео файла приводит к фатальной ошибке максимального времени выполнения

Я использую 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 как открытый / работающий?

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'));
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]