Azure Cache for RedisでPHPのセッション管理を行う方法を紹介します。
- AppService上のPHPアプリでのセッション管理について
- AppServiceにPHPRedisをインストール
- PHPのセッションの設定を変更
- まとめ
1. AppService上のPHPアプリでのセッション管理について
AzureのAppService on Linux上のPHPアプリでセッション管理をしようとすると、
- スケールアウト時
- デプロイなどの再起動時
にセッションが破棄されます。
そのため、厳密にセッションを管理する場合、Redisなどの外部ストレージを使用する必要があります。
2. AppServiceにPHPRedisをインストール
AppService on Linuxでは、peclを使えるのでこれでPHPRedisをインストールしてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# pecl install redis Cannot load Zend OPcache - it was already loaded downloading redis-5.3.4.tgz ... Starting to download redis-5.3.4.tgz (268,154 bytes) ........................................................done: 268,154 bytes 29 source files, building // ... 略 config.status: creating config.h running: make /bin/bash /tmp/pear/temp/pear-build-rootA3nVEX/redis-5.3.4/libtool --mode=compile cc -I. -I/tmp/pear/temp/redis -I/tmp/pear/temp/pear-build-rootA3nVEX/redis-5.3.4/include -I/tmp/pear/temp/pear-bui ld-rootA3nVEX/redis-5.3.4/main -I/tmp/pear/temp/redis -I/usr/local/include/php -I/usr/local/include/php/main -I/usr/local/include/php/TSRM -I/usr/local/include/php/Zend -I/usr/local/include/php/ex t -I/usr/local/include/php/ext/date/lib -I/usr/local/include/php/ext -DHAVE_CONFIG_H -g -O2 -c /tmp/pear/temp/redis/redis.c -o redis.lo mkdir .libs cc -I. -I/tmp/pear/temp/redis -I/tmp/pear/temp/pear-build-rootA3nVEX/redis-5.3.4/include -I/tmp/pear/temp/pear-build-rootA3nVEX/redis-5.3.4/main -I/tmp/pear/temp/redis -I/usr/local/include/php -I /usr/local/include/php/main -I/usr/local/include/php/TSRM -I/usr/local/include/php/Zend -I/usr/local/include/php/ext -I/usr/local/include/php/ext/date/lib -I/usr/local/include/php/ext -DHAVE_CONFI G_H -g -O2 -c /tmp/pear/temp/redis/redis.c -fPIC -DPIC -o .libs/redis.o /tmp/pear/temp/redis/redis.c:22:10: fatal error: config.h: No such file or directory #include "config.h" ^~~~~~~~~~ compilation terminated. make: *** [Makefile:209: redis.lo] Error 1 ERROR: `make' failed |
上記のようにエラーが出てしまいました。
以下のURLにpeclでPHPRedisのインストール時にエラーが出た場合の対処法があったので、こちらでPHPRedisをインストールします。
手動でPHPRedisをインストールしていきます。
1 2 |
# mkdir /tmp/pear/temp # cd /tmp/pear/temp |
1 2 3 4 5 6 |
# pecl bundle redis Cannot load Zend OPcache - it was already loaded downloading redis-5.3.4.tgz ... Starting to download redis-5.3.4.tgz (268,154 bytes) ........................................................done: 268,154 bytes Package ready at '/tmp/pear/temp/redis' |
1 2 3 4 5 6 |
# cd redis # phpize Configuring for: PHP Api Version: 20200930 Zend Module Api No: 20200930 Zend Extension Api No: 420200930 |
1 2 3 4 5 6 |
# ./configure --with-php-config=/usr/local/bin/php-config --enable-redis-igbinary=no --enable-redis-lzf=no --enable-redis-zstd=no checking for grep that handles long lines and -e... /bin/grep checking for egrep... /bin/grep -E checking for a sed that does not truncate output... /bin/sed checking for pkg-config... /usr/bin/pkg-config </code>checking whether to build static libraries... no <code></code>creating libtool appending configuration tag "CXX" to libtool configure: patching config.h.in configure: creating ./config.status config.status: creating config.h |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# make // ... 略 ---------------------------------------------------------------------- Libraries have been installed in: /tmp/pear/temp/redis/modules If you ever happen to want to link against installed libraries in a given directory, LIBDIR, you must either use libtool, and specify the full pathname of the library, or use the `-LLIBDIR' flag during linking and do at least one of the following: - add LIBDIR to the `LD_LIBRARY_PATH' environment variable during execution - add LIBDIR to the `LD_RUN_PATH' environment variable during linking - use the `-Wl,--rpath -Wl,LIBDIR' linker flag - have your system administrator add LIBDIR to `/etc/ld.so.conf' See any operating system documentation about shared libraries for more information, such as the ld(1) and ld.so(8) manual pages. ---------------------------------------------------------------------- Build complete. Don't forget to run 'make test'. |
1 2 3 4 5 |
# mkdir -p /home/site/ext # cp /tmp/pear/temp/redis/modules/<span class="s1">redis.so</span> /home/site/ext/<span class="s1">redis.so</span> # mkdir -p /home/site/ini # echo "extension=/home/site/ext/<span class="s1">redis.so</span>" >> /home/site/ini/extensions.ini |
最後に、AppServiceのポータルの「構成」からアプリケーション設定に
名前:PHP_INI_SCAN_DIR
値:/usr/local/etc/php/conf.d:/home/site/ini
を追加してください。
3. PHPのセッションの設定を変更
PHPのセッション管理をRedisで行うように変更します。
PHPアプリのプロジェクト直下に.user.iniファイルを作成し、そこに設定を記述します。
1 2 |
session.save_handler = redis; session.save_path = "tls://{Redisのホスト名}.redis.cache.windows.net:6380?auth=${REDIS_AUTH}"; |
${REDIS_AUTH}で環境変数を参照しています。
${REDIS_AUTH}に当てはまる部分は、Azure Cache for Redisのポータルの「アクセスキー」の「プライマリキー」をURLエンコードした値を環境変数に設定してください。
以上で、Azure Cache for Redisを使用したセッション管理を行えます。
4. まとめ
AppServiceでは、スケールアウト時やデプロイ時にセッションは破棄されますが、セッションの破棄を許容できるならわざわざRedisで管理する必要がないかもしれません。
厳密にセッション管理を行いたい場合はRedisで管理することをお勧めします。