如何在PHP服务器上运行composer update?

时间:2016-07-15 12:23:39

标签: php composer-php server-side phar

有没有办法在我们的生产/测试环境中运行composer update命令?

问题是我无法访问命令行。

3 个答案:

答案 0 :(得分:5)

是。有一个解决方案。但它可能需要一些服务器配置...... 由于安全风险,默认情况下禁止其中一些!!

下载composer.phar https://getcomposer.org/download/   - 这是PHP档案,可以通过Phar()提取并作为常规库执行。

创建新的php文件并将其放到Web公共文件夹中。即/public/composer.php

或下载https://github.com/whipsterCZ/laravel-libraries/blob/master/public/composer.php

配置

<?php

//TODO! Some Authorization - Whitelisted IP, Security tokens...


echo '<pre>
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/  UPDATE
                    /_/

';
define('ROOT_DIR',realpath('../'));
define('EXTRACT_DIRECTORY', ROOT_DIR. '/composer');
define('HOME_DIRECTORY', ROOT_DIR. '/composer/home');
define('COMPOSER_INITED', file_exists(ROOT_DIR.'/vendor'));

set_time_limit(100);
ini_set('memory_limit',-1);

if (!getenv('HOME') && !getenv('COMPOSER_HOME')) {
    putenv("COMPOSER_HOME=".HOME_DIRECTORY);
}

提取作曲家库

if (file_exists(EXTRACT_DIRECTORY.'/vendor/autoload.php') == true) {
    echo "Extracted autoload already exists. Skipping phar extraction as presumably it's already extracted.\n";
}
else{
    $composerPhar = new Phar("../composer.phar");
    //php.ini set phar.readonly=0
    $composerPhar->extractTo(EXTRACT_DIRECTORY);
}

运行Composer Command

// change directory to root
chdir(ROOT_DIR);

//This requires the phar to have been extracted successfully.
require_once (EXTRACT_DIRECTORY.'/vendor/autoload.php');

//Use the Composer classes
use Composer\Console\Application;
use Composer\Command\UpdateCommand;
use Symfony\Component\Console\Input\ArrayInput;


//Create the commands
$args = array('command' => 'update');
if(!COMPOSER_INITED) { 
    echo "This is first composer run: --no-scripts option is applies\n";
    $args['--no-scripts']=true; }        
}
$input = new ArrayInput($args);

//Create the application and run it with the commands
$application = new Application();
$application->setAutoExit(false);
$application->setCatchExceptions(false);
try {
    //Running commdand php.ini allow_url_fopen=1 && proc_open() function available
    $application->run($input);
    echo 'Success';
} catch (\Exception $e) {
    echo 'Error: '.$e->getMessage()."\n";
}

表现更好 composer install,根据composer.lock,这是从本地环境测试的最后一个依赖配置

只有改变

$args = array('command' => 'install');

答案 1 :(得分:1)

最好的想法是不在生产服务器上运行Composer命令,但在其外部运行。有一个部署脚本 - 无论如何都必须将您的代码放在服务器上,如果您在上传代码后或在上载之前在服务器上添加依赖项,则无关紧要。

工作流程如下:拥有本地计算机,从存储库检出代码,运行malloc(),然后将所有内容上传到服务器。这听起来像是一个四行剧本:

composer install

是的,如果出现问题,您需要进行一些错误处理,以阻止脚本部署非工作站点。此外,使用git archive master | tar -x -C /deploy/application pushd /deploy/application && composer install popd scp /deploy/application user@remoteserver:/srv/www/htdocs 优化上传也是一个建议。

答案 2 :(得分:-1)

你也可以这样做: 1)下载最新的composer.phar 2)使用PHP脚本执行命令,使用下载的composer文件

进行操作

这是一个临时解决方案,但可以满足眼前的需求。