Не удается запустить команды sox через PHP shell_exec

Я искал помощь и пробовал все на этот поток, но все еще не может заставить его работать. Я пытаюсь запустить утилиту командной строки sox (Sound eXchange) из моего PHP-скрипта с помощью shell_exec(). Мне нужно объединить два аудиофайла, оба из которых находятся в том же каталоге, что и PHP-скрипт (т.е. доступны для apache).

Вот путаница:

  1. Некоторые команды sox прекрасно работают с помощью shell_exec(). Например, я могу воспроизвести аудиофайл или получить информацию о нем.
  2. Если я повторю команду конкатенации (чтобы я точно знал, что PHP отправляет в оболочку), а затем скопирую и вставлю ее в окно оболочки, она будет работать отлично.
  3. Мой пользователь apache (_www) имеет полные права на каталог, где находится PHP-скрипт, а также на каталог sox. Я запустил "chown -R _www:_www" и "chmod -R 777" в обоих каталогах.
  4. Я использую полный путь к исполняемому файлу sox и аудиофайлам.

Итак, это работает в оболочке:

"/soxpath/sox /filepath/file1.wav /filepath/file2.wav /filepath/combined.wav"

Но это не работает с PHP:

shell_exec('/soxpath/sox /filepath/file1.wav /filepath/file2.wav /filepath/combined.wav');

Может кто-нибудь пролить некоторый свет на это? Что мне не хватает? Спасибо.


person brettcito    schedule 21.03.2012    source источник
comment
что возвращает shell_exec()?   -  person    schedule 22.03.2012
comment
/сокспат/сокс ???? это полный путь или образец....   -  person Baba    schedule 22.03.2012
comment
shell_exec() возвращает NULL. И /soxpath/ — это просто заполнитель для фактического полного пути. В моем случае это /bin/sox-14.4.0/   -  person brettcito    schedule 22.03.2012
comment
как насчет: shell_exec('/soxpath/sox /filepath/file1.wav /filepath/file2.wav /filepath/combined.wav ›file.txt'); что-нибудь появляется в файле .txt?   -  person    schedule 22.03.2012
comment
Это создает file.txt, но это пустой файл (размер 0 байт), и shell_exec() по-прежнему возвращает NULL.   -  person brettcito    schedule 22.03.2012
comment
Возможно, это проблема конкретной ОС (у меня Mac OS 10.7.2). Я читал несколько вещей о том, что sox не работает должным образом в Mac OS X, но это было некоторое время назад, и они выпустил версию, которая предположительно исправила эти проблемы более года назад. Мне нужно, чтобы наш администратор установил sox на наш рабочий сервер, чтобы я мог протестировать его там.   -  person brettcito    schedule 22.03.2012
comment
Ok. Похоже, это не зависит от ОС. У меня сейчас установлен sox на нашем производственном сервере Linux, и он ведет себя так же. Из сценария PHP shell_exec() возвращает NULL, но запуск той же команды из оболочки работает нормально. У меня нет идей. Если кто-то смог использовать sox для объединения файлов с помощью PHP-скрипта, я хотел бы услышать, как вы это сделали :)   -  person brettcito    schedule 23.03.2012


Ответы (1)


Хорошо, у меня наконец-то все заработало, поэтому я подумал, что должен устранить любую путаницу, которую я создал. Проблема была в чем-то не связанном. Итак, да, вы можете запускать команды sox из PHP, используя shell_exec().

Я просто столкнулся с проблемой синхронизации с javascript. Я использовал устройство записи wami для записи звука на стороне клиента, а затем сохранял аудиофайл. на сервере. Итак, мой PHP-скрипт был в контексте обработчика вызовов ajax, который по определению является асинхронным. Должен был понять это раньше.

Проблема заключалась в том, что файл не был сохранен при выполнении команды sox для объединения, поэтому, естественно, произошел сбой, потому что файл еще не существовал. Когда я сделал вызов синхронным, он сработал.

person brettcito    schedule 28.03.2012