質問: **環境** ・CentOS 6 ・PHP7 --- **質問1.session_save_pathディレクトリの所有者とパミッション設定は?** ・root? ・apache? ・FTPユーザ? --- **質問2.session_set_save_handler** ・session_set_save_handler使用する際は、上記設定を変更する必要があるでしょうか? --- **質問3.書き込みエラー?** ・下記エラーが表示されるのですが、セッション書き込み出来ていないのでしょうか? ・ログイン状態が維持されているのはCookieが活きているから? ・あるいは、session_set_save_handlerでユーザー定義のセッション保存関数を使用しようとしたから? ※session_save_pathは変更していません > > Unknown: Failed to write session data (user). Please verify that the current setting of session.save_path is correct > > > --- **質問4.session_set_save_handler** ・下記エラーも表示されます > > Unknown: Session callback expects true/false return value in Unknown > > > ・このページを見つけたのですが、何て書いてあるでしょうか? ※ Symfony も nginx も未使用
回答: そもそも何故`session_set_save_handler()`を実行するのでしょうか?この関数は主に**セッションファイルとして保存している情報をRedisなどのKVSやMySQLなどのRDBに代わりに保存したい**というニーズのためにあるものですが,その目的ですか?単にセッションファイルの保存先を変えたいだけなら`session.save_path`を設定するだけで十分です. > > **質問1.session_save_pathディレクトリの所有者とパミッション設定は?** > > > mod_phpとして実行しているならば,Apacheユーザが読み書き可能なように設定しておく必要があります.指定したディレクトリそのものには**読み+書き+実行**,親ディレクトリには**実行**権限が必要です. ``` sudo chown apache /path/to/dir sudo -u apache chmod +rxw /path/to/dir ``` > > **質問2.session_set_save_handler** > > ・session_set_save_handler使用する際は、上記設定を変更する必要があるでしょうか? > > > `session_set_save_hanlder()`を使うからというか,Apacheがアクセス出来ない権限のディレクトリを取り扱おうとしないでください,ということですね. > > **質問3.書き込みエラー?** > > ・下記エラーが表示されるのですが、セッション書き込み出来ていないのでしょうか? > > ・ログイン状態が維持されているのはCookieが活きているから? > > ・あるいは、session_set_save_handlerでユーザー定義のセッション保存関数を使用しようとしたから? > > ※session_save_pathは変更していません > > > セッションファイルは保存出来ているようですが,マニュアルで定義されているコールバック関数の動作に従わないコードを書いているからでしょう.**コールバック関数の中でしかるべき値を`return`しなければ失敗とみなされます.** > > **質問4.session_set_save_handler** > > ・下記エラーも表示されます > > > これも同じ理由です.当該箇所で`false`を`return`している場合は質問3のほうのエラーしか出ないと思いますが,そもそも何も`return`していなかったり誤った型を`return`していればこちらのエラーも発生するはずです. > > ・このページを見つけたのですが、何て書いてあるでしょうか? > > ※ Symfony も nginx も未使用 > > > **「PHP7からはセッションハンドラのコールバック関数で然るべき値を`return`しましょうねー,さもなくば動かなくなったよ」**的な感じですかね.むしろ今までそうじゃなくても動いてたことに驚愕.