#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-скрипт. Теперь это тоже сработало.