我正在尝试为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()执行。
我还有其他选择吗?
答案 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);