exec («ls») работает. exec («другая команда») не работает

#php #exec

#php #exec

Вопрос:

Если я включу это в свой сценарий:

 $output = array();
exec("/var/www", $output);
var_dump($output);
  

Я получаю массив всех файлов в этой папке.

Однако, когда я делаю это:

 $output = array();
exec("../node_modules/less/bin/lessc ./default.less", $output);
var_dump($output);
  

Результат, который я получаю, это

массив(0) {}

Если я запускаю ту же команду в командной строке (из того же каталога, в котором находится мой php-скрипт), она работает нормально.

Я также пробовал абсолютные пути:

/var/www/node_modules/меньше/bin/меньше /var/www/без узлов/по умолчанию.меньше

Вот разрешения для этих файлов:

drwxr-xr-x 2 ftpuser ftpuser 4096 2011-06-06 16:43 без узлов

drwxr-xr-x 4 ftpuser www-данные 4096 2011-06-06 15:44 node_modules

Есть идеи, почему я не могу сделать это с PHP?

Комментарии:

1. Какой рабочий каталог PHP относительно PHP-скрипта?

2. используйте полный путь, а не относительный.

3. @icktoofay скрипт находится в /var/www/nodeless/less.php корне сайта php, это /var/www исполняемый файл, который я пытаюсь вызвать, находится по адресу /var/www/node_modules/less/bin/lessc

4. @Джон Айзекс, чтобы узнать, откуда запускается ваш скрипт, взгляните на выходные данные из getcwd() .

5. Когда вы тестировали из командной строки, вы работали от имени того же пользователя, что и PHP?

Ответ №1:

Не используйте относительные пути. Используйте dirname(__FILE__) , чтобы найти путь к вашему PHP-скрипту, затем создайте из него абсолютный путь. Пример:

 $lessc = dirname(__FILE__) . '/../node_modules/less/bin/lessc';
  

Ответ №2:

Мы не дадим вам точного ответа, потому что мы не знаем, как настроен ваш сервер, но вы должны определить, какой путь используется PHP, а затем соответствующим образом исправить свои пути. Лучший способ — использовать абсолютные пути, поскольку они всегда разрешаются правильно.

Комментарии:

1. Я обновил свой вопрос. Я пробовал с абсолютными путями. Это работает в командной строке, но все еще не из PHP.

2. Ответ все тот же. Ваш путь не подходит, и это не ошибка PHP. Ваш интерпретатор PHP может находиться в каком-то странном каталоге, и вы можете даже не знать, где он находится.

3. Почему мой путь нехорош? Сейчас я использую абсолютные пути. Возможно, это не вина PHP, но они могли бы, по крайней мере, дать мне какую-то подсказку относительно того, почему это не работает, а не вообще ничего. Если я использую абсолютные пути, почему это должно иметь значение, где находится мой интерпретатор PHP? Я установил PHP стандартным apt-get install способом.

Ответ №3:

Я действительно обязан найти решение своей проблемы помощи Раду и Томалаку Герет’Калу. Однако в том виде, в каком сейчас находится ответ Раду, он не описывает, что устранило мою проблему. Поэтому я объясню это здесь.

Я попытался подключиться к серверу по SSH, используя того же пользователя, что и PHP (www-data), и выполнить ту же команду. Мне выдали эту ошибку:

/usr/bin/env: узел: такого файла или каталога нет

Как оказалось, при первой установке node.js инструкции, которым я следовал, говорили мне добавить путь к моей переменной окружения $ PATH. Однако это был другой пользователь, чем www-data, поэтому пути к узлу больше не было в моем $ PATH при использовании пользователя www-data.

Я не эксперт в этой области, но я предположил, что, вероятно, проблема была в этом. Итак, я начал заново, следуя инструкциям по установке для node.js , только на этот раз от имени пользователя www-data.

После этого я мог бы выполнить команду в командной строке как www-data. Итак, я снова попробовал свой PHP-скрипт. Теперь это тоже сработало.