【问题标题】:Why can't I run the composer script from PHP using exec, shell_exec, system?为什么我不能使用 exec、shell_exec、system 从 PHP 运行 composer 脚本?
【发布时间】:2017-08-22 10:25:42
【问题描述】:

我可以使用 PHP 的 execshell_exec 运行任何二进制文件,但不能运行 composer.phar。

在同一个文件夹中,我有 composer 和另一个具有相同权限的 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中执行,我得到了同样的错误。

【问题讨论】:

  • 我刚刚看到你关于权限的注释,所以不是这样。我认为你必须打开 phar 的包装。见上面的链接。
  • 不是重复的。从 PHP 脚本以编程方式运行 composer 可能是一种解决方法,但不能解决这个奇怪的问题。

标签: php composer-php exec


【解决方案1】:

我通过禁用 xdebug 扩展解决了这个问题。

来自文档:

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

所以我猜这个“PHP 重启”是从 PHP 调用二进制/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');

【讨论】:

  • 您找到解决此问题的方法了吗?我也面临同样的问题。
  • 我这边的 xdebug 已经禁用。但仍然无法正常工作并获得权限问题。
  • 所以,确实应该是权限问题。我的确切问题肯定与启用 Xdebug 有关。我可以通过重新启用它轻松重现该问题。
【解决方案2】:

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

【讨论】:

  • 我使用系统得到相同的sh: 1: : Permission denied error。您在 /usr/local/bin/composer 中的作曲家与 composer.phar 相同,但没有扩展名。
猜你喜欢
  • 2013-05-13
  • 2014-04-09
  • 2012-06-05
  • 2015-05-26
  • 2011-07-15
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
相关资源
最近更新 更多