はじめに (対象読者・この記事でわかること)

この記事は、Amazon Linux環境でPHPアプリケーションを開発・運用しており、Memcachedを利用するためにphp-pecl-memcached拡張のインストールを試みているが、うまくいかないと悩んでいる開発者やインフラエンジニアの方を対象としています。

Memcachedは、データベースやAPIからの応答結果をキャッシュすることで、Webアプリケーションのパフォーマンスを大幅に向上させる強力なツールです。しかし、Amazon Linux上でこのPHP拡張をインストールしようとすると、しばしば予期せぬエラーに直面することがあります。特にyumコマンドでの一発インストールが困難な場合や、PECLからの手動ビルドで依存関係の問題にぶつかるケースが散見されます。

この記事を読むことで、Amazon Linux環境でphp-pecl-memcachedのインストールがなぜ難しいのか、その背景にある主な課題を理解し、そしてそれらの問題を一つずつクリアしながら確実にインストールを成功させるための具体的な手順とトラブルシューティングの方法を習得できます。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。 - PHPの基本的な知識(Webアプリケーション開発経験) - Linuxコマンドラインの基本的な操作(sudo, yum/dnf, cd, lsなど) - Yum/Dnfパッケージマネージャーの基本的な概念 - Memcachedの基本的な知識(役割、利用目的など)

Amazon Linuxにおけるphp-pecl-memcachedインストールの課題

php-pecl-memcachedは、PHPアプリケーションからMemcachedサーバーに接続し、データのキャッシュ操作を行うための重要なPECL(PHP Extension Community Library)拡張です。この拡張を導入することで、PHPアプリケーションはMemcachedの持つ高速なキーバリューデータストアを利用できるようになり、処理速度の向上やデータベース負荷の軽減に貢献します。

しかし、Amazon Linux (特にAmazon Linux 2) 環境では、他のOSディストリビューションに比べてこの拡張のインストールが複雑になる傾向があります。主な課題は以下の通りです。

  1. Yumリポジトリでの提供状況: Amazon LinuxのデフォルトのYumリポジトリでは、php-pecl-memcachedが直接提供されていない、あるいは最新のPHPバージョンに対応したものが提供されていない場合があります。このため、sudo yum install php-pecl-memcachedのような単純なコマンドではインストールが完結しないことが多いです。
  2. PHPバージョンの管理とビルド環境: Amazon Linuxではamazon-linux-extrasコマンドを利用して、複数のPHPバージョン(PHP 7.2, 7.3, 7.4, 8.xなど)を切り替えて利用できます。これ自体は非常に便利ですが、特定のPHPバージョンに対応したphp-develパッケージ(PHP拡張をビルドするために必要)が正しくインストールされていないと、PECLからのビルド時にエラーが発生します。
  3. libmemcachedの依存関係: php-pecl-memcached拡張は、Memcachedサーバーとの通信を行うためのクライアントライブラリであるlibmemcachedに強く依存しています。このlibmemcachedのバージョンが古すぎる、またはPHP拡張が想定しているバージョンと合致しない場合、コンパイルエラーや実行時エラーの原因となります。Amazon Linuxのリポジトリで提供されるlibmemcached-develが、常にPECL拡張と互換性があるとは限りません。特に、新しいPHPやphp-pecl-memcachedのバージョンを使用しようとすると、libmemcachedのバージョン不足が問題となるケースが多いです。

これらの課題により、単にpecl install memcachedを実行するだけではうまくいかないことが多く、適切なビルド環境の整備と依存ライブラリのバージョン管理が成功の鍵となります。次のセクションでは、これらの課題を克服し、確実にphp-pecl-memcachedをインストールする具体的な手順を解説します。

Amazon Linuxでphp-pecl-memcachedを確実にインストールする手順

ここでは、Amazon Linux上でphp-pecl-memcachedをインストールするための具体的なステップと、よく遭遇する問題の解決策を詳細に解説します。

ステップ1: 必要な開発ツールとPHPバージョンの準備

まず、PHP拡張をビルドするために必要な開発ツールと、ターゲットとなるPHPバージョンの開発パッケージをインストールします。

  1. PHPバージョンの有効化と開発パッケージのインストール: 使用しているPHPのバージョンに応じて、amazon-linux-extrasを使って有効化し、php-develをインストールします。例えば、PHP 8.2を使用している場合:

    ```bash

    現在有効になっているPHPモジュールを確認(オプション)

    amazon-linux-extras | grep php

    必要であれば古いPHPモジュールを無効化(例: php7.4)

    sudo amazon-linux-extras disable php7.4

    PHP 8.2を有効化

    sudo amazon-linux-extras enable php8.2

    パッケージリストの更新

    sudo yum clean all sudo yum update -y

    PHP本体、開発パッケージ、PECL、Memcachedクライアントライブラリをインストール

    sudo yum install -y php php-cli php-fpm php-json php-pdo php-mbstring php-xml php-devel php-pear gcc make autoconf libmemcached-devel `` **ポイント**:php-develはPECL拡張をコンパイルするために必須です。libmemcached-develは、php-pecl-memcachedが依存するlibmemcached`ライブラリの開発ファイルを提供します。通常はこのパッケージで十分ですが、後述するバージョン問題に遭遇した場合は注意が必要です。

  2. phpizepeclのパス確認: phpizepeclコマンドが正しく認識されているか確認します。これらのコマンドはphp-develphp-pearをインストールすることで提供されます。

    bash which phpize which pecl もし見つからない場合は、PHPのPATHが正しく設定されているか、またはphp-devel/php-pearのインストールが完了しているか確認してください。

ステップ2: php-pecl-memcachedのインストール

次に、PECLを使ってmemcached拡張をインストールします。

  1. PECLでのインストール: bash sudo pecl install memcached このコマンドを実行すると、いくつか質問される場合があります。

    • libmemcachedに関するパスの入力プロンプト: Please provide the prefix of libmemcached installation [autodetect] : 通常はautodetectでEnterを押せば問題ありませんが、libmemcached-develを特定のパスに手動インストールした場合は、そのパスを指定する必要があります(例: /usr/local/libmemcached)。
  2. php.iniへの拡張の有効化: インストールが成功したら、PHPがこの拡張をロードするようにphp.iniに設定を追加します。 通常、拡張は/etc/php.d/ディレクトリに設定ファイルが自動で作成されますが、念のため確認し、なければ手動で追加します。

    ```bash

    memcached.ini が作成されているか確認

    ls /etc/php.d/memcached.ini

    もし存在しない場合は、手動で作成または既存のiniファイルに追加

    例: /etc/php.ini に追加する場合

    sudo vi /etc/php.ini

    以下の一行を追記

    extension=memcached.so

    または、推奨される方法として /etc/php.d/memcached.ini を作成

    echo "extension=memcached.so" | sudo tee /etc/php.d/memcached.ini ```

  3. WebサーバーとPHP-FPMの再起動: 変更を反映させるために、PHP-FPM(WebサーバーがApacheの場合はApacheも)を再起動します。

    ```bash sudo systemctl restart php-fpm

    Apacheを使用している場合も再起動

    sudo systemctl restart httpd

    ```

  4. インストール確認: PHP情報ページ (phpinfo()) を確認するか、以下のコマンドで拡張がロードされているかを確認します。

    bash php -m | grep memcached memcachedと表示されれば成功です。

ハマった点やエラー解決

phpizeが見つからない、またはPHPバージョンミスマッチ

エラー例: bash: phpize: command not found phpize: command not found (pecl install 実行時)

原因: - php-develパッケージがインストールされていない。 - 複数のPHPバージョンが存在し、適切なphpizeがPATHに含まれていない。

解決策: - 使用しているPHPバージョンに対応するphp-develをインストールします。 sudo yum install -y php-devel - 環境変数のPATHを確認し、正しいPHPのバイナリが優先されるようにします。amazon-linux-extrasを使用している場合、通常は自動でPATHが設定されますが、念のため確認してください。

libmemcachedが見つからない、またはバージョン不適合

これが最も一般的な問題です。

エラー例: - configure: error: memcached support requires libmemcached. - checking for libmemcached location... configure: error: Please reinstall libmemcached - memcached support requires libmemcached. - ビルドは成功するが、実行時にセグメンテーションフォールトが発生する。

原因: php-pecl-memcached拡張が要求するlibmemcachedのバージョンと、システムにインストールされているlibmemcached-develのバージョンが合致していないためです。Amazon Linuxのリポジトリで提供されるlibmemcached-develが古いか、逆に新しすぎる場合があります。

解決策: 1. まず、Amazon Linuxのリポジトリ版libmemcached-develを試す: ほとんどの場合、sudo yum install -y libmemcached-develでインストールされるバージョンで動作します。うまくいかない場合に以下の手順に進みます。

  1. 特定のバージョンのlibmemcachedを手動でビルドし、パスを指定してインストールする: これは最も確実な方法です。php-pecl-memcachedのGitHubリポジトリやPECLのページで、互換性のあるlibmemcachedのバージョンを確認し、そのソースコードをダウンロードして手動でコンパイルします。 ここでは、バージョン1.0.18を例とします。

    ```bash

    libmemcached のソースコードをダウンロード

    公式サイトやGitHubから適切なバージョンを探してURLを取得してください。

    例: libmemcached-1.0.18.tar.gz

    wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz

    展開

    tar -xzf libmemcached-1.0.18.tar.gz cd libmemcached-1.0.18

    configure, make, make install

    --prefixでインストール先を指定することが重要です

    ./configure --prefix=/usr/local/libmemcached --enable-memcached-sasl make sudo make install

    必要であれば共有ライブラリのパスを設定

    echo "/usr/local/libmemcached/lib" | sudo tee /etc/ld.so.conf.d/libmemcached.conf sudo ldconfig

    PECLでのインストール時にパスを指定

    libmemcached ソースディレクトリの親ディレクトリ(--prefixで指定したパス)を指定します

    cd .. # libmemcached-1.0.18 ディレクトリから出る sudo pecl install memcached

    Please provide the prefix of libmemcached installation [autodetect] : と聞かれたら

    /usr/local/libmemcached を入力して Enter

    `` **注意**:libmemcachedのバージョンとphp-pecl-memcachedのバージョンには相性があります。もし手動ビルドでもエラーが出る場合は、php-pecl-memcachedの古いバージョンを試すことも検討してください(例:sudo pecl install memcached-3.1.5`)。

PHPのバージョンアップ後に動かなくなった

原因: PHPのバージョンをアップグレードした場合、以前にインストールしたPECL拡張は新しいPHPバージョンとは互換性がなくなります。

解決策: 新しいPHPバージョンに対応するために、php-pecl-memcachedを再インストールする必要があります。 1. 既存のmemcached.somemcached.iniを削除(または無効化)。 2. php-develが新しいPHPバージョンに対応していることを確認。 3. 上記の手順 (sudo pecl install memcached) を再度実行。 4. php.iniの設定を確認し、PHP-FPM/Webサーバーを再起動。

解決策

上記のハマり点を踏まえた上で、Amazon Linuxでphp-pecl-memcachedをインストールする際の最も堅牢な解決策は以下の流れになります。

  1. PHPバージョンの確定と開発環境の整備: amazon-linux-extras enable phpX.YでPHPバージョンを固定し、php-devel, gcc, make, autoconfなどのビルドツールをyum installする。
  2. libmemcachedの準備:
    • まずはsudo yum install -y libmemcached-develでリポジトリ版を試す。
    • もしPECLインストール時にlibmemcached関連のエラーが出る、またはビルドは通るが実行時に問題が発生する場合は、互換性のあるバージョンのlibmemcached手動でソースからビルドし、/usr/local/libmemcachedのような分離されたパスにインストールする
  3. php-pecl-memcachedのインストール: sudo pecl install memcachedを実行し、もしlibmemcachedのパスを求められたら、手動ビルドしたlibmemcached--prefixパス (/usr/local/libmemcached) を正確に指定する。
  4. PHP設定ファイルの更新: extension=memcached.sophp.iniに追加するか、/etc/php.d/memcached.iniを作成する。
  5. サービス再起動と確認: sudo systemctl restart php-fpm (およびWebサーバー) を行い、php -m | grep memcachedでロードされていることを確認する。

この手順を踏むことで、ほとんどのAmazon Linux環境でphp-pecl-memcachedのインストールに成功するはずです。

まとめ

本記事では、Amazon Linux環境でphp-pecl-memcached拡張のインストールが困難な状況に焦点を当て、その原因と具体的な解決策を詳細に解説しました。

  • php-pecl-memcachedのインストール課題: Amazon LinuxではYumリポジトリの提供状況、PHPのバージョン管理、そして特にlibmemcachedのバージョン互換性問題が複雑さを増す原因となります。
  • 必要な開発ツールの整備: php-develgccmakeなどのビルドツールがPHP拡張のコンパイルには不可欠であることを確認しました。
  • libmemcachedのバージョン管理: 最も頻繁に発生する問題はlibmemcachedのバージョン不適合であり、これを解決するために特定のバージョンのlibmemcachedを手動でビルドし、PECLインストール時にそのパスを明示的に指定する方法が非常に有効であることを示しました。

この記事を通して、読者の皆様がAmazon Linux上でのphp-pecl-memcachedのインストールに成功し、Memcachedを利用したPHPアプリケーションのパフォーマンス向上を実現できるようになったことと思います。

今後は、Memcachedの具体的な利用例(例: セッション管理、オブジェクトキャッシュ)、クラスター構成、あるいはパフォーマンスチューニングのベストプラクティスについても記事にする予定です。

参考資料