【问题标题】:How can I install composer via PHP script?如何通过 PHP 脚本安装作曲家?
【发布时间】:2015-01-13 22:25:46
【问题描述】:

我正在尝试为 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 解析错误:语法错误,C:\Users\chris\randomproject\getcomposer.php(4) 中的文件意外结尾:第 1 行的 eval() 代码

解析错误:语法错误,C:\Users\chris\randomproject\getcomposer.php(4) 中的文件意外结束:第 1 行的 eval() 代码

composer服务器下发的脚本好像不能通过eval()来执行。

我还有什么其他选择?

【问题讨论】:

    标签: php symfony composer-php


    【解决方案1】:

    我没有像 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 安装程序后,我们无法执行更多我们自己的代码。

    【讨论】:

    • 此外,当您的虚拟主机有任何限制时,使用 include 可能会更好,因为并不总是允许使用 shell_exec。
    【解决方案2】:

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

    shell_exec('php installer.php');
    

    只要确保您能够通过 cmd 执行“php”(环境变量问题)或找到一种方法来检测 php 安装文件夹以将 php 替换为正确的路径。

    【讨论】:

      【解决方案3】:

      大部分功劳归于克里斯。我只是解决了一些问题。 首先需要设置 $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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-28
        • 1970-01-01
        • 1970-01-01
        • 2013-12-25
        • 2013-07-10
        • 1970-01-01
        • 2021-10-05
        • 1970-01-01
        相关资源
        最近更新 更多