ECS Ubuntu 18.04上にPHPでMemcachedサーバを設定する

このガイドでは、**ECS Ubuntu 18.04**インスタンス上に**Memcached**サーバを設定し、PHPコード上で**Memcached**サーバを使用して操作を高速化する方法を紹介します。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/how-to-set-up-memcached-with-php-on-ubuntu-18-04_595628)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

#前提条件
始める前に、以下のものがあることを確認してください。

- Alibaba Cloudアカウント。サインアップは無料です。[Alibaba Cloudアカウント](https://www.alibabacloud.com/ja/referral?referralCode=1bgh7r)を作成して、50以上のAlibaba Cloud製品をテストするための最大1200ドル相当の無料トライアルをお楽しみください。
- オペレーティングシステムとしてUbuntu 18.04を実行しているAlibaba Cloud [Elastic Compute Service (ECS)インスタンス。](https://www.alibabacloud.com/ja/product/ecs)[初期のECSセットアップガイド](https://www.alibabacloud.com/help/ja/doc-detail/25424.htm)に従って、1つのECSを作成することができます。
- ECS インスタンス上で sudo 権限を実行できる非 root ユーザー。

#ステップ 1: Apache Web サーバのインストール
最初のステップは、Apache ウェブサーバをインストールすることです。Apacheがすでにサーバ上で実行されている場合は、このステップを省略しても構いません。Alibaba Cloud ECSインスタンスにSSHし、以下のコマンドを実行します。

```
$ sudo apt-get update 
$ sudo apt-get install -y apache2
```

Webサーバーがインストールされ、実行されたら、次はPHPをインストールします。

#ステップ2: PHPのインストール
次に、以下のコマンドを実行してPHPをインストールします。前のステップと同様に、すでにシステム上でPHPが実行されている場合はインストールを省略しても構いません。また、以下のコマンドでは、ApacheウェブサーバとPHPを連携させる`libapache2-mod-php`モジュールをインストールします。

```
$ sudo apt-get install -y php libapache2-mod-php
```

次に、`php-memcached` 拡張モジュールをインストールします。このモジュールは、クライアント(PHPコードなど)にMemcachedサーバへのアクセスを提供します。

```
$ sudo apt-get install -y php-memcached
```

変更を反映させるために Apache を再起動します。

```
$ sudo systemctl restart apache2
```

PHP と Memcached 拡張モジュールがインストールされているので、次は Memcached サーバのインストールに移ることができます。


#ステップ 3: Memcached サーバのインストールと設定
MemcachedパッケージはUbuntuのデフォルトのソフトウェアリポジトリにあるので、aptを使ってインストールします。また、`libmemcached-tools` もインストールします。これは、Memcachedサーバが使用する軽量なライブラリとツールのセットです。

Memcachedをインストールするには、以下のコマンドを実行します。

```
$ sudo apt-get install -y memcached libmemcached-tools
```

インストールしたら、nano テキストエディタで `/etc/memcached.conf` ファイルを修正することで、Memcached の設定を編集することができます。

```
$ sudo nano /etc/memcached.conf
```


Memcached が使用する設定のいくつかを見てみましょう。

`-d` : このオプションにより、Memcached をデーモンとして実行することができます。

`logfile`: Memcached はエラーとそのアクティビティをこのファイルに記録します。

`-m` : -m の後の値は、Memcached サーバが保持できる最大メモリを指定しますが、Memcached は最初に起動したときに合計メモリを保持しません。キャッシュサイズは、Alibaba Cloud ECSインスタンスで利用可能なRAMに応じて変更することができます。

`-p` : Memcachedは、このオプションで指定されたポートでリッスンします。デフォルト値は11211です。

`-u` : このオプションは、Memcached が実行されるユーザを指定します。デフォルト値は memcache です。

`-i` : Memcached サーバがリッスンする IP アドレスを指定します。Ubuntu 18.04サーバのデフォルト値はlocalhostで、IPアドレスは127.0.0.0.1に設定されています。

`-c` : このオプションを使用して、Memcachedサーバへの同時接続数を制限することができます。デフォルト値は1024です。

ファイルに変更を加えた場合は、以下のコマンドでMemcachedサーバを再起動する必要があります。

```
$ sudo systemctl restart memcached
```

その後、Apacheウェブサーバを再起動します。

```
$ sudo systemctl restart apache2
```

これでMemcachedサーバは期待通りに動作しているはずです。次のステップでは、簡単な PHP スクリプトを書いて、PHP が本当に Memcached サーバをサポートしているかどうかを確認します。

#ステップ 4: Memcached のサポートを確認する
Memcached をインストールして設定したら、次は Apache ウェブサーバと PHP が Memcached を認識できるかどうかを確認します。

これを行うには、ウェブサイトのルートに `info.php` ファイルを作成します。

```
$ sudo nano /var/www/html/info.php
```

そして、以下の内容をファイルに貼り付けてください。

```
<?php
 phpinfo();
?>
```

CTRL+X、Y、Enterを押してファイルを保存します。

次に、Webブラウザで、以下のようにファイルパスにアクセスします。172.16.0.1をAlibaba Cloud ECSインスタンスに関連付けられたパブリック/インターネットIPアドレスに置き換えることを忘れないでください。

```
172.16.0.0.1/info.php
```

memcached のヘッダを見つけると、以下のような情報が表示されるはずです。これで、Memcached が PHP でサポートされていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/8d842d11-0153-556d-1063-93d3b85826aa.png)


次に、以下のコマンドを実行して、Memcached サーバがサーバ上で期待通りに動作していることを確認します。

```
echo stats | nc 127.0.0.0.1 11211
```

以下のような出力が表示されます。

```
STAT pid 9493
STAT uptime 725
STAT time 1570086409
...
STAT moves_within_lru 0
STAT direct_reclaims 0
STAT lru_bumps_dropped 0
END
```

Memcached サーバが動作していることを確認したら、次は Memcached ライブラリを使用する PHP スクリプトを作成します。

#ステップ 5: PHP スクリプトで Memcached をテスト
このステップでは、簡単なPHPスクリプトを作成し、Memcachedクラスを使用してデータをキャッシュします。nano テキストエディタを使って、ウェブサイトのルートに `/var/www/html/test_memcached.php` ファイルを作成します。

```
$ sudo nano /var/www/html/test_memcached.php
```

次に、下のPHPコードをファイルに貼り付けて、CTRL+X、Y、Enterを押して保存します。

```
<?php

try

{
    $memcached = new Memcached();
    $memcached->addServer("127.0.0.1", 11211); 
    $response = $memcached->get("sample_key");
 
    if($response==true) 
    {
      echo $response;
    } 

    else

    {
    echo "Cache is empty";
    $memcached->set("sample_key", "Sample data from cache") ;
    }
}
catch (exception $e)
{
echo $e->getMessage();
}
?>
```

Memcached サーバは、キーと値のペアを使用してキャッシュされたデータを保存します。上のコードは、PHP に Memcached クラスのインスタンスを作成し、IP アドレス 127.0.0.0.1 のサーバを 11211 ポート経由で追加するように指示しています。

次に、このコードは `sample_key` という名前のキーの値を取得しようとします。キーがサーバ上に存在する場合は、その値が返され、そうでない場合は、コードはキーを作成して、`"Sample data from cache “`という値を追加しようとします。

ブラウザ上のファイルパスにアクセスして、Memcachedの動作を確認してください。172.16.0.1をAlibaba ECSインスタンスに関連付けられたインターネットIPアドレスに置き換えます。

```
172.16.0.0.1/test_memcached.php
```

初めてコードを実行すると、以下のような出力が得られます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/6521d04a-1fa4-3aa1-1f13-391ff58a57dd.png)


次に、ページをリフレッシュして、今度はMemcachedが最初にコードを実行したときにキャッシュされた値を取得するはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/fbcda1f9-1921-9532-ac30-7399f2b7db66.png)


PHPでMemcachedを設定して使う方法については以上です。このコードを拡張して、データベースや外部のウェブソース (API など)、ファイルシステムからのデータをキャッシュすることができます。

#結論
このガイドでは、Alibaba Cloud上でホストされているPHP Ubuntu 18.04サーバーでMemcachedを設定して使用する手順を説明しました。これは、WebサイトやWebアプリケーションのパフォーマンスを最適化するために使用できる数少ない技術の一つに過ぎません。また、[Alibaba Cloud ECS上でMySQLクエリを速度とパフォーマンスのために最適化する方法](https://www.alibabacloud.com/blog/how-to-optimize-mysql-queries-for-speed-and-performance-on-alibaba-cloud-ecs_593872?spm=a2c65.11461447.0.0.750b59e9qTwZGn)についても読んでみてください。

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*