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

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

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

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

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

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

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

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

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

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

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

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

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

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

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