it-roy-ru.com

Запустите композитор с PHP скрипт в браузере

Хотите знать, возможно ли выполнить composer из браузера с небольшой оболочкой PHP, так как у меня нет доступа к Shell для доступа к серверу.

Не уверен, что вы можете сделать это с помощью cURL?

24
dcolumbus

Да, вы можете запустить Composer с небольшой оболочкой PHP. Весь исходный код Composer доступен в файле Phar, поэтому его можно извлечь, а затем запустить после установки InputInterface для замены Composer, ожидая, что команды будут переданы через командную строку.

Если вы настроите структуру каталогов следующим образом:

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

Поместите приведенный ниже код в composerExtractor.php, а затем запустите его из веб-браузера, 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-адресом, а также, вероятно, удалить этот скрипт после его запуска на сервере, чтобы предотвратить его случайный запуск.

25
Danack

Альтернативой решению 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.";

Когда вы получаете доступ к скрипту из вашего браузера, команда должна запускаться как положено.

36
Endel

Я думаю, что было бы лучше на самом деле запустить Composer на машине, на которой размещен ваш исходный код, непосредственно перед развертыванием.

Вы, вероятно, извлекаете свой код из какой-то системы контроля версий, прежде чем загружать его на свой хост (или даже просто иметь его на жестком диске без него). Эта машина должна установить Composer и выполнить composer install прямо перед загрузкой. Вам не нужно выставлять производственную машину, чтобы загрузить все вещи.

6
Sven

Я успешно использовал эту функцию. Помните, что «composer-source» - это каталог с содержимым, извлеченным из архива composer.phar.

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\StreamOutput;

function composerInstall() {
    //create composer.json with some content
    require_once 'composer-source/vendor/autoload.php';
    putenv('COMPOSER_HOME=' . __DIR__ . '/composer-source/bin/composer');
    chdir(__DIR__);
    $stream = fopen('php://temp', 'w+');
    $output = new StreamOutput($stream);
    $application = new Application();
    $application->setAutoExit(false);
    $code = $application->run(new ArrayInput(array('command' => 'install')), $output);
    return stream_get_contents($stream);
}

Кстати, вы можете извлечь composer.phar на этом сайте: http://unphar.com/

2
Mangirdas Skripka

Я не знаю, всегда ли это делается при установке, но я установил composer через пакет Ubuntu, и он включил «Composer» в каталог «/ use/share/php» (который находится в пути включения).

Поэтому, просто установив composer на машину, я могу сделать:

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

Аналогично ответу Эндела, но мне нужно было захватить вывод из composer show --direct в массиве, поэтому я извлек некоторый код из файла ShowCommand в репозитории composer и сделал библиотеку composer-wrapper , с помощью которой я сможет сделать:

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

и получить ассоциативный массив, такой как ['composer/composer'=>'1.3.0.0']

0
shadi