PHP セッションをDBに保存するには
津路です。こんにちは、春めいてきました。
最近は、AWSにはまっていまして、EC2を2つ起動して、ALBで負荷分散する環境で作業しています。
Apche2とPHP8.2を利用していますが、セッション変数がおかしいために、テストがうまくいかないという問題を解決する手段を探っていました。
まず、ブラウザの開発ツールでセッションIDを確認すると、値は不変なのですが、セッションをvar_dumpすると、あれ、なんか保存されていない??
と思っていると、実際にsessionディレクトリを確認してみると、一方のEC2インスタンスにしか保存されてません。ファイルはあるのですが。。。
そこで、調べてみると、解決方法としては、いろいろあるのですが、データベースに保存するのが正攻法とわかりました。
https://www.keicode.com/cgi/save-session-in-mysql.php
投稿者さまのコードをほぼそのままphpソースに書いて、実行してみましたところ、エラーが出まして、deprecatedメッセージが出ました。
open, close, read, write, destroy, gcどれも、戻り値の型を指定しなければならないとわかり、:bool など指定しました。
ところが、次には、ワーニングが頻繁に表示され、時間をかけてしまいました。
1 | Warning: session_write_close(): Failed to write session data using user defined save handler. (session.save_path: /var/lib/php/sessions, handler: MySessionHandler::updateTimestamp) in Unknown on line 0 |
1.warningであるので、無視してよいのか、考えました。
毎回ではないものの、出たままでは困ります。実際にセッションデータベースを見ると、更新はされています。
2.では、/var/lib/php/sessionsディレクトリのパーミッションを見ると、apacheはグループ許可されているので、書き込めます。
ですが、更新されていません。データベースに書き込むのだから、無視してよいはず。
3.では、ファイルに書き込めないから、ワーニング?と思いましたが、メッセージには、updateTimestampと書かれています。
ふと、PHPドキュメントページを見ると、このupdateTimestampに関連する、SessionUpdateTimestampHandlerInterface クラスのページがあります。
しかし、StackOverflowなどでは、ドキュメントが詳しくないから。。。という投稿ばかり。
解決方法は次回。。