メモ > サーバ > 各論: プログラミング > PHPでComposerを使う
PHPでComposerを使う
PHPの依存性管理ツール
依存ライブラリ郡も含めて、まとめてインストールできる
composer require 使いたいライブラリ
もしくは、composer.json に使いたいライブラリを記述して
composer install
とコマンドを実行するとインストールされる
自分で一つ一つ依存ライブラリをダウンロードする必要が無い
ダウンロードしたファイルは vendor フォルダ内に格納される
PHP開発でComposerを使わないなんてありえない!基礎編 - Qiita
http://qiita.com/niisan-tokyo/items/8cccec88d45f38171c94
Laravel5のプロジェクトをGitで管理する - Qiita
https://qiita.com/zaburo/items/bc448a9fbf2d35194302
php - vendorディレクトリをGit管理下に置かないのは何故? - スタック・オーバーフロー
https://ja.stackoverflow.com/questions/23725/vendor%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%...
CentOS7にComposerをインストールする - Qiita
https://qiita.com/inakadegaebal/items/d370bcb1627fce2b5cd1
Composer を CentOS にインストールする手順 | WEB ARCH LABO
https://weblabo.oscasierra.net/php-composer-centos-install/
■インストール
# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
# php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
# php composer-setup.php
# php -r "unlink('composer-setup.php');"
# php composer.phar
ハッシュの値はバージョンによって異なるため、最新の手順は以下で確認する
https://getcomposer.org/download/
この際、
All settings correct for using Composer
Unable to create Composer home directory "/usr/share/httpd/.config/composer": mkdir(): Permission denied
と表示されるなら、rootで以下を実行しておく(もしくは apache を所有者とするディレクトリを作成するか)
# cd /usr/share/httpd
# mkdir .config
# cd .config
# mkdir composer
# chmod 0777 composer
Composerをどこからでも呼び出せるようにする場合、以下も実行する
# mv composer.phar /usr/local/bin/composer
以下のように、パスも拡張子も無しで呼び出せる
# composer
■コマンド例
バージョンを表示(Composerの動作確認)
$ composer
ライブラリのインストール(Goutteをインストールする場合)
$ composer require fabpot/goutte
各ライブラリを最新に更新(プログラムの動作に影響する可能性があるので慎重に)
$ composer update
composer.json に書かれたライブラリとバージョンに従って更新(他環境で更新された場合など)
$ composer install
以下のようにすると、開発用ツールを除いてインストールされる(本番環境などでは、この方法でインストールするといい)
$ composer install --no-dev
インストールに失敗して原因が不明な場合、以下のように composer.lock を退避してから実行すれば成功することがある(ただし恐らく非推奨)
$ mv composer.lock composer.20200513.lock
$ composer install --no-dev
「--no-dev」の指定については、以下などが参考になる
【Laravel】composer require-devの開発、本番での切り分け - Qiita
https://qiita.com/k-kurikuri/items/8e644b3338d8759d64fd
PHP |【パッケージ管理】Composerの使い方 - わくわくBank
https://www.wakuwakubank.com/posts/415-php-composer/
■オートローディング
名前空間に従って自動的にファイルを読み込む
require_once などで明示的にファイルを読み込む必要がない
Composerを使うことで簡単に導入できる
PHPでクラスをspl_autoload_registerを使ってオートロードする - バカンス駆動開発
http://egapool.hatenablog.com/entry/2013/11/17/195045
PHPのオートロード(autoload) - Qiita
http://qiita.com/atwata/items/5ba72d3d881a81227c2a
src/Refirio/Greeting/Hello.php
<?php
class Hello
{
function say()
{
echo 'Hello World!';
}
}
sample.php
<?php
require_once "src/Refirio/Greeting/Hello.php";
$hello = new Hello();
echo $hello->say();
↓オートロードに対応させる
composer.json
{
"autoload": {
"psr-4": {
"myapp\\": "src/"
}
}
}
$ composer install … composer.json に設定した内容に合わせて vender ディレクトリ内にプログラムが作られる
以下のようにしてオートロードを利用できる
src/Refirio/Greeting/Hello.php
<?php
namespace myapp\Refirio\Greeting;
class Hello
{
function say()
{
echo 'Hello World!';
}
}
sample.php
<?php
require_once "vendor/autoload.php";
$hello = new myapp\Refirio\Greeting\Hello();
echo $hello->say();
↓名前空間のエイリアスを作成
<?php
require_once "vendor/autoload.php";
use myapp\Refirio\Greeting\Hello;
//use myapp\Refirio\Greeting\Hello as Hello; // クラスに別名を指定する場合
$hello = new Hello();
echo $hello->say();
■require
新しいパッケージを追加する
$ composer require fabpot/goutte
vendor 内に諸々のプログラムがインストールされる
また、composer.json が以下のように変更される
composer.json
{
"autoload": {
"psr-4": {
"myapp\\": "src/"
}
},
"require": {
"fabpot/goutte": "^4.0"
}
}
goutteが追加されたことを確認
sample.php
<?php
require_once 'vendor/autoload.php';
$client = new Goutte\Client();
$crawler = $client->request('GET', 'http://refirio.org/');
$tr = $crawler->filter('ul li')->each(function($element){
echo $element->text()."\n";
});
なお、以下のようにインストールできるパッケージがあったとして、
$ composer require xxx/yyy
以下のようにすることでバージョンを指定してインストールできる
$ composer require xxx/yyy:"4.1.2"
■install
composer.lockに書かれている各ライブラリをインストールする
$ composer install
vendor 内に諸々のプログラムがインストールされる
■update
composer.jsonをもとに各ファイルを最新版にアップデートする
$ composer update
■composer.json の指定
$ COMPOSER=composer-default.json composer install
とすると、composer.json と composer.lock ではなく
composer-default.json と composer-default.lock をもとにインストールが行われる
以下、検証した内容
composer.json と composer.lock のコピーを、それぞれ
composer-default.json と composer-default.lock として作成する
つまり goutte をインストールできる状態
$ composer require monolog/monolog
monologが追加されたことを確認
sample.php
<?php
require_once 'vendor/autoload.php';
use \Monolog\Logger;
use \Monolog\Handler\StreamHandler;
// ロガー作成
$logger = new Logger('sample');
$logger->pushHandler(new StreamHandler('logs/sample.log', Logger::INFO));
// INFOログ出力
$logger->info('情報ログ');
echo "OK\n";
vendor を削除し、再度以下を実行する
$ composer install
goutte と monolog がインストールされる
つまり vendor がなくても composer.json と composer.lock によって環境を再現できた
vendor を削除し、今度は以下を実行する
$ COMPOSER=composer-default.json composer install
goutte だけがインストールされる
monolog はインストールされない
つまり composer-default.json を指定してインストールできた
追加で以下を実行する
$ composer install
monolog が追加インストールされた
■create-project でプロジェクト作成
$ composer create-project ethna/ethna-project
によって、以下が実行されているみたい
$ git clone https://github.com/ethna/ethna-project.git
$ cd ethna-project
$ composer install
Composerのcreate-projectが何をやっているのか調べてみた - Qiita
https://qiita.com/DQNEO/items/74f4bb8fe447e4582a97
ただし自作のリポジトリで create-project をしようとすると以下のエラーになった
また詳細を確認したい
$ composer create-project https://github.com/refirio/laravel6 test
Creating a "https://github.com/refirio/laravel6" project at "./test"
[UnexpectedValueException]
Could not parse version constraint //github.com/refirio/laravel6: Invalid version string "//github.com/refirio/laravel6"
■補足
vendor フォルダは通常、gitの管理対象外とする
インストールしたライブラリの情報は composer.json と composer.lock に記録され、
「composer install」を実行すると同じバージョンのライブラリをダウンロードしてくれる
つまり、他の環境でも同じ状態を再現できる
ただし運用方法によっては、vendor をgit管理対象にするのも有効(コマンドラインでの操作が難しい開発メンバーが多い、など)
メリット&デメリットを考える
XAMPP環境にインストールする手順は XAMPP.txt を参照