PHP

composerをPHPのexec関数から実行する方法

PHP-アイキャッチ

こんにちは!ゆーたろうです。

本日、とても興味深い知識を知ることができました。

それは、PHPの関数からでもコンポーザーをインストールすることができるということです。

今までは、SSHなどのシェルや、コマンドプロンプトなどからしかインストールしたことがなかったのですが、この方法があるとは驚きでした。

この記事では、SSHが使えないサーバにcomposerを入れる必要がある時に、PHPを使ってインストールする方法を紹介していきます。

動作環境

  • PHP:7.3.17
  • サーバ:ロリポップ ライトプラン

※ライトプランはSSH接続ができないプランです。
そのため、セキュアシェル コマンドプロンプトでのインストールができません。

今回は、こういったSSH接続ができないサーバにcomposerを入れる方法となります。

PHPからインストールする背景と目的

背景

以前の記事でeBay SDKを用いたAPI実装を行いました。

このときに使用したのはテスト環境としてSSHが使えるロリポップサーバプランを仮でセッティングしたのですが、本番環境はSSHが使えないサーバなのです。

そこで、PHPからインストールする方法を模索していました。

※PHPでなくてもPythonなどでもいいのですが、せっかくなら私の好きな言語でやってみたかったので今回はPHPにしました。

目的

今回は、以下の2点を目標に掲げました。

  1. composerをPHPでインストールする
  2. ebay-php-sdk-samplesのプログラムがライトプランサーバで実行できる

その中でも特に、ロリポップ ライトプランで、ebay-php-sdk-samplesを実行することが最重要ポイントです。

使用するのはexec()関数

今回使うのは、exec関数です。

exec() – PHPマニュアル

これは外部プログラムを実行する関数なので、コマンドの実行も可能です。

非同期処理を行う際にも使える優れものです。

サンプルプログラム

サーバ内のファイル構成

composerを入れるルートディレクトリに、ebay-php-sdk-examplesの中にある、以下の3つのファイルを、置くようにしてください。

ルート
┣composer.json
┣composer.phar
┗composer.lock

余談:私が躓いた点

なんとcomposerがインストールされても、ebay-php-sdk-examplesが機能しなかったのです。。。

具体的には、下記に書いたプログラムを実行しインストールが終わったはずなのに「Fatal error: Uncaught Error: Class ‘DTS\eBaySDK\Trading\Services\TradingService’ not found in 」と出たのです。

「あれ?やっぱりできないのかな?」と思いましたが、調べて解決しました。

余談:機能しなかった理由

これらのcomposerファイルの中身を見てもらうとわかるように、このebay-php-sdk-examplesに関係する記述があります。

composerの仕組みが分かっていれば、composer.*の各種ファイルの重要性が分かるのですが、私はわかっていなかったので躓きました。

つまり、composerのインストールは、composer.jsonとcomposer.lockの記述に沿って行われるのです。

以下を読んで理解しました。

ということなので、ebay-php-sdk-examples内にもともとあるcomposer.*ファイルは、インストール時に必要になるので、アップロードしておきましょう。

PHPソースコード

実際にインストールできたものがこちらです。

<?php

    /**
     * composerインストールコマンド設定
     */
    $command = "curl -sS https://getcomposer.org/installer | /usr/local/php/7.3/bin/php ";
    $output = "";

    //コマンドを実行
    exec("{$command} 2>&1", $output, $ret);
    
    //実行結果を出力
    echo "exec result:" . $ret . "<br>";
    echo "exec output:";
    print_r($output);
    echo "<br><br>";
    
    
    
    /**
     * pharバージョン確認コマンド設定
     */
    $output=""; 
    $command= "/usr/local/php/7.3/bin/php composer.phar -V";
    
    //コマンドを実行
    exec("{$command} 2>&1", $output, $ret);
    
    //実行結果を出力
    echo "exec result:" . $ret . "<br>";
    echo "exec output:";
    print_r($output);
    echo "<br><br>";
  
  
  
    /**
     * pharインストールコマンド設定
     */
    $output=""; 
    $command= "/usr/local/php/7.3/bin/php composer.phar install";
    
    //コマンドを実行
    exec("{$command} 2>&1", $output, $ret);
    
    //実行結果を出力
    echo "exec result:" . $ret . "<br>");
    echo "exec output:");
    print_r($output);
    
?>

※完全に余談ですが、ここに来て初めてsyntax highlighterを使うと「&」が「&amp;」になってしまうことが判明したので、

SyntaxHighlighter Evolvedのブロックエディタで「&」が「&amp;」になる問題の対応

を参考に、functions.phpを直しました笑

インストールの実行結果

composer-php-exec-run-1
composer-php-exec-run-finish

無事に最後まで走り、インストールされました!

もちろん、ebay-php-sdk-examplesもしっかりインストールされました。

[8] => – Installing dts/ebay-sdk-php (18.0.0): Downloading
(connecting…)
Downloading (100%)  

インストール直下のディレクトリを見ると、venderフォルダが入っており、その中身もしっかりと入っています。

インストール後のvenderの中身

いいですね!成功です。

いざ、eBay APIを実行!

eBAy-API-シンプル検索

やりました!ebay-php-sdk-examplesのプログラムが無事に動きました(^o^)

実行したのはebay-php-sdk-examples/finding/01-simple-keywords-search.phpの検索APIです。

これで、今回の目標である

  1. composerをPHPでインストールする・・・OK✅
  2. ebay-php-sdk-samplesのプログラムがライトプランサーバで実行できる・・・OK✅

が達成されました!良かったです。

注意点

めでたく実装することができましたが、セキュリティ面を考え、composer.*の各種ファイルとvenderは一般ユーザがアクセスできないディレクトリに置いておくようにしましょう。

例えば、ロリポップでいえば、/local/user/2/***/web/直下が一般公開されるディレクトリなので、/web/より上に置くとかですね。

あとは、composerファイル自体にアクセス制限をかけるなどをするようにしましょう。

まとめ

いかがだったでしょうか。

PHPのexec関数を使えば、SSHが使えないサーバでもcomposerをインストールすることはできました。

そもそもロリポップでSSHが使えないライトプランと使えるスタンダードプランの差は250円しかないので、それだったらこの手間よりも250円で解決したほうがいいとは思いますが^^;

それでも、こういった工夫で少しでもコスト削減ができるし、何しろ、「こんなこともできるんだ!」ととても面白かったです。

ぜひみなさんも、exec関数を使いこなしてみてください。

きっと新し発見があると思います。