2012-03-21 1 views
1

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

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

  1. Некоторые команды Сох прекрасно работают с использованием 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'); 

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

+0

Что делает shell_exec() return? –

+0

/soxpath/sox ???? что полный путь или образец .... – Baba

+0

shell_exec() возвращает NULL. И «/ soxpath /» является просто заполнителем фактического полного пути. В моем случае это «/bin/sox-14.4.0/» – brettcito

ответ

0

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

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

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