Любая идея, почему я могу выполнить команду из командной строки, но не из PHP exec()

OK,

Я проделал несколько творческих поисков и наткнулся на блокпост.

Я пытаюсь использовать программу для Linux "sox". Я пытаюсь вызвать его из моего PHP-скрипта. Сценарий работает, если я использую командную строку. Однако, когда я использую PHP exec, он не работает.

Пример:

sox file1.mp3 file2.mp3 tempfile.mp3 -V3

("V3" указывает подробный вывод)

При выполнении в командной строке как «Пользователь X» или как root я могу создать новый файл. Однако, когда я выполняю команду как:

<?php
exec('sox file1.mp3 file2.mp3 tempfile.mp3  -V3', $output);
foreach($output as $line){
print $line;
}

Он не создает новый файл. Кроме того, массив, который должен возвращать результаты команды, пуст.

Я сделал простой текст с

exec(ls,$output);

и я получаю содержимое корневого каталога.

Я использовал команду PHP get_current_user(), и она вернула владельца каталога, который является корнем веб-сайта.

Однако, когда я использую команду linux whoami, я обнаружил, что она рассматривает текущего человека как «apache». Нужно ли давать apache права на использование программы?

Я буду продолжать искать в Интернете и делать пробы и ошибки, чтобы понять, что я делаю неправильно. Любая помощь приветствуется.

Пояснения

  • Я не в безопасном режиме (проверил страницу phpinfo())

person Scott    schedule 09.01.2011    source источник
comment
Итак, основные проблемы здесь заключались в следующем: 1) вам нужно указать полный путь к sox, а не просто набирать sox, и 2) пользователь, выполняющий скрипт (apache), должен иметь разрешение на выходную папку.   -  person Scott    schedule 10.01.2011


Ответы (3)


Обычно это проблема пути. Приложение, которое вы пытаетесь вызвать, вероятно, не находится в пути поиска учетной записи пользователя веб-сервера. Я только вызываю приложения из PHP, используя полный путь. Я сохраняю этот путь в файлах настроек, поэтому он работает в любой системе, в которой он используется.

person Matt S    schedule 09.01.2011
comment
поэтому исправление здесь будет заключаться в том, чтобы найти путь к программе во всей структуре каталогов, а затем вызвать это? а обычная командная строка будет искать местонахождение программы или как-то знает? Простите меня, если мои вопросы покажутся глупыми. Я изучаю линукс по необходимости. - person Scott; 09.01.2011
comment
Похоже, это можно сделать с помощью команды which, я попробую - person Scott; 09.01.2011
comment
Каждая учетная запись оболочки в Linux имеет путь поиска типичных приложений командной строки (например, /usr/bin). Часто путь поиска учетной записи веб-сервера пуст. Я бы не хотел, чтобы PHP находил приложение, но где-то жестко задавал путь (например, exec('/usr/local/sox/bin/sox file1... ). Для своих веб-приложений я использую файлы настроек для каждого сервера, и каждый из них иметь путь к sox в этой конкретной системе. - person Matt S; 09.01.2011
comment
Хорошо, я нашел полный путь, и это не решило проблему. Я скопировал команду в командную строку с полным путем, и она сработала. Так что кажется, что я кое-что узнал о Linux, но само по себе это не решило проблему! - person Scott; 09.01.2011
comment
Значит, тебе кажется, что я последовал твоему совету и проблема была не в этом? - person Scott; 09.01.2011
comment
Ну, еще одна проблема может быть в разрешениях. Есть ли у веб-приложения права на выполнение? Вы, вероятно, захотите, чтобы файл был глобально читаемым и исполняемым. Вы хотите, чтобы команда ls -l показывала три значения x рядом с sox, что означает, что она может выполняться пользователем, группой и другими пользователями. - person Matt S; 09.01.2011
comment
Итак, вы были правы как минимум наполовину. У меня была ваша проблема И проблема с разрешениями. Если бы я вернулся к простому sox и использовал 2&1 для вывода ошибок на экран, он сказал, что не может найти sox, но может найти прямой системный путь, который я нашел, используя which. Я также создал новый каталог с apache в качестве владельца, и он мог записывать файлы в этот каталог. - person Scott; 10.01.2011

Я уверен, что php запускается от имени пользователя, запускающего ваш апач, а это чаще всего никто (пользователь без прав на создание каталогов). Попробуйте создать свой вывод где-нибудь, где всем разрешено писать и проверять, под каким пользователем работает apache.

person Daniel    schedule 09.01.2011
comment
whoami вернул apache Как лучше всего это сделать, предоставить apache право использовать программу или аутентифицироваться как пользователь с дополнительными разрешениями с помощью команды exec? Вот если бы это было возможно... - person Scott; 09.01.2011
comment
Используйте выходной каталог, в который apache может писать. Обычно веб-приложения содержат папку /cache/ для таких операций. - person Daniel; 09.01.2011
comment
Итак, я создал новую папку с именем tempfiles. Я указал выходной путь к этой новой папке с apache в качестве владельца. Команда работала, если я запускал ее из командной строки, но не из php exec. - person Scott; 09.01.2011
comment
Похоже, это действительно может быть решением... У меня были некоторые элементы в коде, которые сбивали с толку проблему.... - person Scott; 09.01.2011

Проверьте, используете ли вы сейчас PHP в safe_mode.

person amosrivera    schedule 09.01.2011
comment
Я не в безопасном режиме: safe_mode - Off - Off - person Scott; 09.01.2011