Я пытаюсь написать php-скрипт, где он будет загружать mp3-файл и автоматически создавать его копию в формате ogg. Моя идея – использовать exec () или shell_exec () для запуска dir2ogg из php. Это мой код:
$command = 'dir2ogg /var/www/bais-mordechai-laravel/public/uploads/"'.$filename.'"'; $output = shell_exec($command);
Результат, который я получаю от этого, – это только первая строка ожидаемого вывода:
dir2ogg 0.11.8 (2009-08-04), converts audio files into ogg vorbis.
Когда я запускаю это непосредственно из командной строки (как пользователь root), я получаю следующее:
dir2ogg 0.11.8 (2009-08-04), converts audio files into ogg vorbis. INFO: Converting "/var/www/bais-mordechai-laravel/public/uploads/Track 02.mp3" (using mpg123 as decoder)... [wav.c:371] warning: Cannot rewind WAV file. File-format isn't fully conform now. Encoding standard input to "/var/www/bais-mordechai-laravel/public/uploads/Track 02.ogg" at quality 3.00 Encoding [ 0m15s so far] / [wav.c:371] warning: Cannot rewind WAV file. File-format isn't fully conform now. Done encoding file "/var/www/bais-mordechai-laravel/public/uploads/Track 02.ogg" File length: 3m 50.0s Elapsed time: 0m 15.7s Rate: 14.6600 Average bitrate: 91.1 kb/s
Таким образом, кажется, что функция возвращается до завершения команды.
Я думал, что, возможно, сценарий закончил сам по себе, но нет файла ogg, созданного, как я предполагаю.
Поэтому мой вопрос: как мне заставить это работать, или как я могу отлаживать это?
ОБНОВЛЕНИЕ: Используя совет Мехрана, вот мой вывод stderr:
Array ( [stdout] => dir2ogg 0.11.8 (2009-08-04), converts audio files into ogg vorbis. [stderr] => Traceback (most recent call last): File "/usr/bin/dir2ogg", line 673, in <module> main() File "/usr/bin/dir2ogg", line 641, in main conf = read_opts() File "/usr/bin/dir2ogg", line 120, in read_opts in_path = [prefix for prefix in os.environ['PATH'].split(os.pathsep) if os.path.exists(os.path.join(prefix, command))] File "/usr/lib/python2.7/UserDict.py", line 23, in __getitem__ raise KeyError(key) KeyError: 'PATH' [return] => 1 )