为什么我不能使用exec,shell_exec,system从PHP运行composer脚本?

时间:2017-08-22 10:25:42

标签: php composer-php exec

我可以使用PHP execshell_exec来运行任何二进制文件而不是composer.phar。

在同一个文件夹中,我有作曲家和另一个具有相同权限的php可执行文件:

ls -lh
total 1,8M
-rwxr-xr-x  1 me me 1,8M août  22 20:48 composer.phar
-rwxr-xr-x  1 me me   39 août  22 21:05 test.php

Test.php包含:

#!/usr/bin/env php
<?php
print 'hello';

然后我有这个脚本:

<?php
print $cmd  = "composer.phar --version 2>&1" ;
print "<br>";

$return  = exec( $cmd );
var_dump($return);

print "<br><br>";

print $cmd  = "test.php 2>&1";
print "<br>";

$return  = shell_exec( $cmd );
var_dump($return);

这是我得到的:

composer.phar --version 2>&1
[...]Process.php:81:string 'sh: 1: : Permission denied' (length=26)

test.php 2>&1
[...]Process.php:88:string 'hello' (length=5)

为什么我会收到string 'sh: 1: : Permission denied'错误?我尝试使用/usr/bin/env php composer.php /usr/bin/php composer.php在PHP中执行,我得到了同样的错误。

2 个答案:

答案 0 :(得分:5)

我通过禁用xdebug扩展来解决它。

来自doc:

  

在启用xdebug扩展时,提高Composer的性能   没有它就自动重启PHP。

所以我猜这个&#34; PHP重启&#34;从PHP调用binary / phar时出现问题。

可以使用环境变量COMPOSER_ALLOW_XDEBUG使其与xdebug一起使用,同时还可以改变一些可能改变性能的xdebug选项:

<?php
$result = shell_exec('COMPOSER_ALLOW_XDEBUG=1 /usr/bin/env php -d xdebug.remote_enable=0 -d xdebug.profiler_enable=0 -d xdebug.default_enable=0 composer.phar --version 2>&1');

答案 1 :(得分:0)

我认为它可以与system('php /usr/local/bin/composer install -d /...')一起使用,因为如果你只是直接在shell中运行composer,它将通过读取文件开头的shebang来说它应该由php执行,但使用{ {1}}你没有shell,所以你需要自己指定。