web-dev-qa-db-ja.com

ブラウザでcomposerを使用してPHPスクリプトを実行

サーバーへのシェルアクセスにアクセスできないので、ブラウザーからcomposerを少しのPHPラッパーで実行できるかどうか疑問に思います。

CURLでこれができるかどうかわかりませんか?

29
dcolumbus

はい、実行できますComposer少しPHPラッパー。すべてのComposerソースコードはPharファイルで利用可能です。 、抽出できるため、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だけに制限することを強くお勧めします。また、誤って再実行されるのを防ぐため、サーバーで実行した後にこのスクリプトを削除することを強くお勧めします。

27
Danack

Danackのソリューションに代わる方法は、"composer/composer"に依存関係としてcomposer.jsonを含め、composer.pharからコンテンツを抽出する代わりにAPIを使用することです。

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

ブラウザからスクリプトにアクセスすると、コマンドは期待どおりに実行されます。

37
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

これがインストール時に常に行われるかどうかはわかりませんが、composerをUbuntuのパッケージ経由でインストールし、 "/ use/share/php"ディレクトリ( "インクルードパス内)。

したがって、単にマシンにcomposer=をインストールするだけで、次のことが可能になります。

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

Endelの答えに似ていますが、配列のcomposer show --directからの出力をキャプチャする必要があったため、 ShowCommand ファイルからいくつかのコードを抽出しましたcomposerリポジトリを作成し、 composer-wrapper ライブラリを作成しました。

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

['composer/composer'=>'1.3.0.0']のような連想配列を取得します

0
shadi