如何通过PHP脚本安装composer?

时间:2014-12-15 13:55:29

标签: php symfony composer-php

我正在尝试为Symfony 2项目创建自动部署。部署过程的一部分应该是下载和安装Composer(http://getcomposer.org)。

安装Composer的说明在Windows和Linux之间有所不同,但此命令似乎适用于两个系统: php -r "readfile('https://getcomposer.org/installer');" | php

基本上,它的作用是下载一个PHP脚本,然后运行它来安装composer。我想创建自己的PHP脚本,因为我想避免为不同的操作系统创建不同的shell脚本(.bat和.sh)。

我非常简单的PHP脚本如下所示:

<?php
$installer = readfile('https://getcomposer.org/installer');
eval($installer);

但是,在调用此脚本时,我总是收到错误:

PHP Parse error:  syntax error, unexpected end of file in C:\Users\chris\randomproject\getcomposer.php(4) : eval()'d code on line 1

Parse error: syntax error, unexpected end of file in C:\Users\chris\randomproject\getcomposer.php(4) : eval()'d code on line 1

似乎编曲服务器提供的脚本无法通过eval()执行。

我还有其他选择吗?

3 个答案:

答案 0 :(得分:3)

我没有按照Polak的建议依赖shell_exec,而是选择使用include执行下载的安装程序文件。这样做的好处是我们不需要知道PHP可执行文件的路径,也不需要依赖路径中的PHP可执行文件。

这是我的完整下载和安装脚本:

<?php
$installerFilename = "composer-installer.php";
$installer = file_get_contents('https://getcomposer.org/installer');
file_put_contents($installerFilename, $installer);
include($installerFilename);

请注意,遗憾的是,我们无法删除创建的文件,因为所包含的代码使用exit。这意味着在包含composer安装程序后,我们无法执行更多自己的代码。

答案 1 :(得分:2)

您可以使用file_get_contents下载安装程序,将其写入文件installer.php,然后执行以下操作:

shell_exec('php installer.php');

确保您能够执行&#34; php&#34;通过cmd(环境变量问题)或找到一种方法来检测php安装文件夹,用正确的路径替换php。

答案 2 :(得分:1)

大部分功劳归功于克里斯。我刚刚解决了一些问题。 首先需要设置$ argv,你也可以进行查找和替换,以确保脚本在执行自己的代码之前不会退出。

function install($file){
    $argv = array(
        // '--install-dir=../',     
        // '--filename=composer.phar',
        // '--version=1.0.0-alpha8'
    );
    include_once($file);
}
$installerFilename = "composer-installer.php";
$composer_installer_content  = file_get_contents('https://getcomposer.org/installer');
$find = array('#!/usr/bin/env php', 'exit(','print');
$replace = array('', 'return(','//print');
$new_composer_installer_content = str_replace($find,$replace, $composer_installer_content);
file_put_contents($installerFilename, $new_composer_installer_content);
$return = install($installerFilename);