我尝试使用exec()
在/var/www/litecoin/bin
和echo
输出中运行程序。
基本上,这个:
(来自/var/www/html/index.php
)
<?php
echo exec("../litecoin/bin/litecoin-cli getinfo");
?>
它只是显示一个空白页面。
我知道它可能是一个权限错误,因为正在运行ls
工作正常,但我不知道如何修复它。 (或者,如果有更好的做事方式)
通过终端直接运行命令工作正常。 我在Ubuntu 16.04上使用PHP7.0和Apache,如果重要的话。
修改
当我在登录php index.php
时通过终端执行www-data
时运行正常,但是当我在网络浏览器中打开它时,它似乎无法执行{{1}毕竟。
修改2
将错误从stderr重定向到stdout(/var/www/litecoin/bin/litecoin-cli
)时,我得到以下内容:
2>&1
www-data拥有/ var / www / but的完全权限。
答案 0 :(得分:2)
使用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
答案 1 :(得分:1)
我找到的这种情况的主要区别是环境和权限。错误[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
无论它有权访问哪个路径,然后执行程序