Я пытаюсь использовать exec()
запустить программу в /var/www/litecoin/bin
а также echo
выход.
В основном это:
(от /var/www/html/index.php
)
<?php
echo exec("../litecoin/bin/litecoin-cli getinfo");
?>
Это просто показывает пустую страницу, хотя.
Я знаю, что это, вероятно, ошибка разрешения, так как работает ls
работает нормально, но я понятия не имею, как это исправить. (или если есть лучший способ сделать что-то)
Запуск команды напрямую через терминал работает нормально.
Я использую PHP7.0 и Apache на Ubuntu 16.04, если это имеет значение.
редактировать
Он работает нормально, когда я запускаю его через терминал, делая php index.php
когда вошел в www-data
, но когда я открываю его в веб-браузере, кажется, он не выполняется /var/www/litecoin/bin/litecoin-cli
совсем.
Редактировать 2
При перенаправлении ошибок из stderr в stdout (2>&1
), Я получаю следующее:
[0] =>
[1] =>
[2] => ************************
[3] => EXCEPTION: N5boost10filesystem16filesystem_errorE
[4] => boost::filesystem::create_directory: Permission denied: "/.litecoin"[5] => litecoin in AppInitRPC()
[6] =>
www-data имеет полное разрешение на / var / www /.
Основное различие в таких случаях, которое я нахожу, — это среда и разрешения. Ошибка [4] => boost::filesystem::create_directory: Permission denied: "/.litecoin"
предполагает, что ваша php страница ищет папку litecoin
в ~
или же $HOME
и это не установлено. Вот почему это становится /.litecoin
Я создал простой index.php
файл с кодом ниже
<?php
$out = array();
exec("env", $out);
var_dump($out);
Вывод же на моем php по умолчанию
/home/vagrant/nginx/html/index.php:6:
array (size=9)
0 => string 'APACHE_RUN_DIR=/var/run/apache2' (length=31)
1 => string 'APACHE_PID_FILE=/var/run/apache2/apache2.pid' (length=44)
2 => string 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' (length=65)
3 => string 'APACHE_LOCK_DIR=/var/lock/apache2' (length=33)
4 => string 'LANG=C' (length=6)
5 => string 'APACHE_RUN_USER=www-data' (length=24)
6 => string 'APACHE_RUN_GROUP=www-data' (length=25)
7 => string 'APACHE_LOG_DIR=/var/log/apache2' (length=31)
8 => string 'PWD=/home/vagrant/nginx/html' (length=28)
Как вы можете видеть, есть $HOME
и это может быть одной из возможных причин, вызывающих проблему
Таким образом, вы должны убедиться, что правильная среда доступна для исполняемого файла, который вы запускаете. Вы можете сделать это, делая
exec("HOME=/var/www/html X=Y A=B env", $out);
Вывод команды показывает, что он может видеть обновленные переменные
/home/vagrant/nginx/html/index.php:6:
array (size=12)
0 => string 'HOME=/var/www/html' (length=18)
1 => string 'APACHE_RUN_DIR=/var/run/apache2' (length=31)
2 => string 'APACHE_PID_FILE=/var/run/apache2/apache2.pid' (length=44)
3 => string 'A=B' (length=3)
4 => string 'X=Y' (length=3)
5 => string 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' (length=65)
6 => string 'APACHE_LOCK_DIR=/var/lock/apache2' (length=33)
7 => string 'LANG=C' (length=6)
8 => string 'APACHE_RUN_USER=www-data' (length=24)
9 => string 'APACHE_RUN_GROUP=www-data' (length=25)
10 => string 'APACHE_LOG_DIR=/var/log/apache2' (length=31)
11 => string 'PWD=/home/vagrant/nginx/html' (length=28)
Выясните, какие переменные среды вам нужны, и убедитесь, что они существуют, и попытайтесь установить пути, чтобы ваш исполняемый файл использовался /var/www
или же /var/www/html
к какому пути он имеет доступ, а затем выполняет программу
С помощью exec()
и просто повторение возвращаемого значения может пропустить основное содержимое вывода, так как оно вернет только последнюю строку вывода. На моем компьютере, если я бегу
echo exec("ls");
Я получаю вывод …
xsl.php
Если вы добавите второй параметр в exec()
все выходные данные отправляются этому параметру. Так…
exec("ls", $output);
print_r($output);
выходы …
Array
(
[0] => Copy of data.xml
[1] => Copy of test.json
[2] => NewFile.html
[...] // Shortened for example
[35] => xsl.php
)
Если ваша команда имеет пустую строку в качестве последней строки вывода, это все, что вы увидите. Чтобы убедиться, что вы видите весь контент …
exec("../litecoin/bin/litecoin-cli getinfo", $output );
print_r($output);
Я также (в этом случае) изменил бы exec для использования абсолютного пути, чтобы убедиться, что я знаю, что запускается и откуда …
exec("/var/www/litecoin/bin/litecoin-cli getinfo", $output );
Что касается разрешений, ваш сервер apache запускается как www-data: www-data, поэтому убедитесь, что этому пользователю разрешено выполнять сценарии. Есть несколько решений для этого, самый простой способ состоит в том, чтобы гарантировать, что этот пользователь владеет всеми этими файлами.
chown -R www-data:www-data /var/www/litecoin