Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

Альтернативой решению Данака является включение "composer/composer" в качестве зависимостей в вашем composer.json, и просто используйте его API, а не извлечение содержимое из composer.phar.

composer.json

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

Запустите composer install вручную, поэтому вы сможете потребовать его на следующем script:

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.";

При доступе к script из вашего браузера команда должна работать как ожидалось.

Ответ 3

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

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

Ответ 4

Я успешно использовал эту функцию. Имейте в виду, что "композитор-источник" - это каталог с содержимым, извлеченным из архива 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);
}

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

Ответ 5

Как и для ответа Endel, но мне нужно было записать результат из composer show --direct в массиве, поэтому я извлек некоторый код из ShowCommand в репозитории композитора и создал библиотеку composer-wrapper, с которой я могу сделать:

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

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

Ответ 6

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

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

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