PHPのセッションストレージをデフォルトのファイルからMySQLに切り替える際に以下のエラーが出てしまって困っています。
Warning: session_start(): Failed to read session data: user (path: /var/lib/php/7.2/session)
下記参考サイトをもとに作成しました。
参考サイト:https://www.keicode.com/cgi/save-session-in-mysql.php
実際に作成したコードが以下になります
・セッションをMySQLで使用するためのクラス
※参考サイトでは、mysqliでデータベース接続を行っていたのですが、私は今回PDOで行っております。
PHP
1<?php 2 3require_once(__DIR__."/../lib/QuerySession.php"); 4 5 6class MySessionHandler implements SessionHandlerInterface 7{ 8 9 /** 10 * @inheritDoc 11 * セッションを閉じる際に呼ばれる 12 */ 13 public function close() 14 { 15 return true; 16 } 17 18 /** 19 * @inheritDoc 20 */ 21 public function destroy($session_id) 22 { 23 $query_session = new QuerySession(); 24 $flg = $query_session->delete_session(); 25 return $flg; 26 } 27 28 /** 29 * @inheritDoc 30 */ 31 public function gc($maxlifetime) 32 { 33 $t = time() - $maxlifetime; 34 $query_session = new QuerySession(); 35 $flg = $query_session->delete_session_by_updatedtime($t); 36 return $flg; 37 } 38 39 /** 40 * @inheritDoc 41 * セッションを開始する際に呼ばれる 42 */ 43 public function open($save_path, $name) 44 { 45 return true; 46 } 47 48 /** 49 * @inheritDoc 50 * セッションのデータを読み込む。 51 * 対象レコードのIDを取り出してデータを返す 52 * @param string $session_id セッションID 53 * @return string セッションのデータ(存在しない場合は空文字) 54 */ 55 public function read($session_id) 56 { 57 $query_session = new QuerySession(); 58 $session_data = $query_session->get_session_by_id($session_id); 59 return $session_data; 60 } 61 62 /** 63 * @inheritDoc 64 */ 65 public function write($session_id, $session_data) 66 { 67 $query_session = new QuerySession(); 68 $affected_rows = $query_session->insert_session($session_id,$session_data); 69 return $affected_rows ? true : false; 70 71 } 72}
・Sessionテーブルを操作するクラス
※このクラスはデータベース接続を行うDatabaseConnectionクラスを継承しているため、実際の接続処理は記述していません。
PHP
1<?php 2 3require_once(__DIR__."/DatabaseConnection.php"); 4 5class QuerySession extends DatabaseConnection 6{ 7 function __construct() 8 { 9 parent::__construct(); 10 } 11 12 13 public function get_session_by_id($session_id) 14 { 15 $stmt = $this->pdo->prepare('SELECT session_data FROM session WHERE session_id = :session_id;'); 16 $stmt->bindParam(':session_id', $session_id, PDO::PARAM_STR); 17 $stmt->execute(); 18 $session_data = $stmt->fetchColumn(); 19 return $session_data; 20 } 21 22 public function insert_session($session_id,$session_data) 23 { 24 $stmt = $this->pdo->prepare( 25 'INSERT INTO session(session_id,session_data) 26 VALUES(:session_id,:session_data) 27 ON DUPLICATE KEY UPDATE 28 session_data = :session_data;'); 29 $stmt->bindParam(':session_id', $session_id, PDO::PARAM_STR); 30 $stmt->bindParam(':session_data', $session_data, PDO::PARAM_STR); 31 $stmt->bindParam(':session_data', $session_data, PDO::PARAM_STR); 32 $stmt->execute(); 33 $affected_rows = $stmt->rowCount(); 34 return $affected_rows; 35 36 } 37 38 public function delete_session($session_id) 39 { 40 $stmt = $this->pdo->prepare('DELETE FROM session WHERE session_id = :session_id;'); 41 $stmt->bindParam(':session_id', $session_id, PDO::PARAM_STR); 42 $flg = $stmt->execute(); 43 return $flg; 44 } 45 46 public function delete_session_by_updatedtime($updated_time){ 47 $stmt = $this->pdo->prepare('DELETE FROM session WHERE updated_at < :updated_at;'); 48 $stmt->bindParam("updated_at",$updated_time,PDO::PARAM_STR); 49 $flg = $stmt->execute(); 50 return $flg; 51 } 52 53}
補足
・このサイトをもとに、session.save_pathのディレクトリの権限や所有者の変更は行いました。
・webサーバーはApache、phpのバージョンは7.2で行っております。
お分かりになるかたいらっしゃいましたら回答よろしくお願い致します。
また同じようなエラーが起こった方いらっしゃいましたらどのようにしたら直ったのか教えてください。
以上、よろしくお願い致します!
足らない情報ありましたら追記いたしますので、是非コメントお願い致します。
あなたの回答
tips
プレビュー