在浏览器中使用PHP脚本运行composer

时间:2013-06-20 16:55:45

标签: php curl composer-php

想知道是否可以使用一点PHP包装器从浏览器执行composer,因为我无法访问服务器的shell访问权。

不确定您是否可以使用cURL执行此操作?

6 个答案:

答案 0 :(得分:37)

Danack解决方案的替代方案是将"composer/composer"包括在内 依赖于composer.json,只使用它的API,而不是提取 来自composer.phar

的内容

<强> composer.json

...
"require-dev": {
  "composer/composer": "dev-master",
}
...

手动运行composer install,这样您就可以在以下脚本中使用它:

<强> composer_install.php

<?php
require 'vendor/autoload.php'; // require composer dependencies

use Composer\Console\Application;
use Symfony\Component\Console\Input\ArrayInput;

// Composer\Factory::getHomeDir() method 
// needs COMPOSER_HOME environment variable set
putenv('COMPOSER_HOME=' . __DIR__ . '/vendor/bin/composer');

// call `composer install` command programmatically
$input = new ArrayInput(array('command' => 'install'));
$application = new Application();
$application->setAutoExit(false); // prevent `$application->run` method from exitting the script
$application->run($input);

echo "Done.";

当您从浏览器访问脚本时,该命令应按预期运行。

答案 1 :(得分:26)

是的,您可以使用一些PHP包装器运行Composer。 Phar文件中提供了所有Composer源代码,因此可以将其解压缩,然后在设置InputInterface之后运行它,以替换期望通过命令行传递命令的Composer。

如果你设置这样的目录结构:

./project  
./project/composer.json
./project/composer.lock
./project/webroot/composerExtractor.php  
./project/var/

将下面的代码放入composerExtractor.php,然后从Web浏览器运行,Composer应将所有库下载到:

./project/vendors/

同样在该目录中生成类加载器文件。

<强> composerExtractor.php

<?php

define('EXTRACT_DIRECTORY', "../var/extractedComposer");


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

//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;

// change out of the webroot so that the vendors file is not created in
// a place that will be visible to the intahwebz
chdir('../');

//Create the commands
$input = new ArrayInput(array('command' => 'update'));

//Create the application and run it with the commands
$application = new Application();
$application->run($input);

?>

虽然这是可能的,但这不是一个很棒的想法,但如果您不能使用能够为您提供ssh访问权限的主机,则可能是必要的。

我强烈建议至少为自己或办公室获取一个静态IP地址,然后限制只访问自己的IP,以及可能在服务器上运行后删除此脚本以防止它再次意外运行

答案 2 :(得分:6)

我认为在部署之前在托管源代码的计算机上实际运行Composer会更好。

您可能会在将代码上传到主机之前从某种版本控制中检出代码(或者甚至只是将其放在硬盘驱动器上)。该机器应该安装Composer并在上传之前执行composer install。您无需公开生产机器即可下载所有内容。

答案 3 :(得分:2)

我已成功使用此功能。请记住,作曲家来源&#39;是一个目录,其内容是从composer.phar存档中提取的。

[Assessment]

顺便说一句,你可以在这个网站上提取composer.phar:http://unphar.com/

答案 4 :(得分:0)

与Endel的答案类似,但是我需要从数组中捕获composer show --direct的输出,因此我从作曲家存储库中的ShowCommand文件中提取了一些代码并创建了一个{ {3}}库,我可以用它来做:

$cw = new \shadiakiki1986\ComposerWrapper();
$packages = $cw->showDirect();

获取像['composer/composer'=>'1.3.0.0']

这样的关联数组

答案 5 :(得分:0)

我不知道这是否总是在安装时完成,但是我通过Ubuntu的软件包安装了作曲家,它包含了#34; Composer&#34;在&#34; / use / share / php&#34;目录(在包含路径中)。

因此,只需在机器上安装了作曲家,我就能做到:

require_once 'Composer/autoload.php';
$application = new Composer\Console\Application();