web-dev-qa-db-fra.com

Exécuter le compositeur avec un PHP script dans le navigateur

Vous vous demandez s'il est possible d'exécuter composer à partir du navigateur avec un petit wrapper PHP, car je n'ai pas accès à l'accès Shell au serveur.

Vous ne savez pas si vous pouvez le faire avec cURL?

24
dcolumbus

Oui, vous pouvez exécuter Composer avec un petit wrapper PHP. Tout le code source de Composer est disponible dans le fichier Phar. Il peut donc être extrait. Vous pouvez ensuite l'exécuter après avoir configuré une InputInterface pour remplacer Composer, en attendant que les commandes soient transmises via la ligne de commande.

Si vous configurez votre structure de répertoire comme ceci:

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

Placez le code ci-dessous dans composerExtractor.php, puis exécutez-le à partir d'un navigateur Web. Composer doit télécharger toutes les bibliothèques dans:

./project/vendors/

En plus de générer les fichiers de chargeur de classe dans ce répertoire.

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

?>

Bien que cela soit possible, ce n'est pas une idée fantastique mais peut être nécessaire si vous ne pouvez pas utiliser un hôte qui vous donne un accès SSH.

Je vous recommande fortement de vous procurer au moins une adresse IP statique pour vous ou votre bureau, puis de limiter l'accès à votre propre adresse IP, ainsi que de supprimer probablement ce script après son exécution sur le serveur afin d'éviter son réexécution accidentelle.

25
Danack

Une alternative à la solution de Danack consiste à inclure "composer/composer" en tant que dépendance .__ dans votre composer.json et à utiliser simplement son API, au lieu d'extraire Le contenu de composer.phar.

composer.json

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

Exécutez composer install manuellement afin de pouvoir l'exiger sur le script suivant:

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

Lorsque vous accédez au script à partir de votre navigateur, la commande doit être exécutée comme prévu.

36
Endel

Je pense que ce serait une meilleure idée d'exécuter Composer sur la machine qui héberge votre code source juste avant le déploiement.

Vous devez probablement extraire votre code d’une sorte de contrôle de version avant de le télécharger sur votre hôte (ou même de l’avoir sur votre disque dur sans). Composer doit être installé sur cette machine et exécuter composer install juste avant le téléchargement. Vous n'avez pas besoin d'exposer la machine de production pour télécharger tout le matériel.

6
Sven

J'ai utilisé cette fonction avec succès. N'oubliez pas que 'composer-source' est un répertoire dont le contenu est extrait de l'archive 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);
}

À propos, vous pouvez extraire composer.phar sur ce site: http://unphar.com/

2
Mangirdas Skripka

Je ne sais pas si cela se fait toujours lors de l'installation, mais j'ai installé composer via le paquet Ubuntu et il a inclus "Composer" dans le répertoire "/ use/share/php" (qui se trouve dans le chemin d'inclusion).

Par conséquent, en ayant simplement installé le compositeur sur la machine, je suis capable de faire:

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

Semblable à la réponse d'Endel, mais j'avais besoin de capturer la sortie de composer show --direct dans un tableau. J'ai donc extrait du code du fichier ShowCommand dans le référentiel composer et créé une composer-wrapper bibliothèque, avec laquelle peut faire:

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

et obtenez un tableau associatif comme ['composer/composer'=>'1.3.0.0']

0
shadi