ページへ戻る

− Links

 印刷 

PHP >= 5.2.10 + APC での session_set_save_handler() 問題の解決法 :: XOOPS マニア

UsersWiki:nao-pon/blog/2010-04-10


RSS of nao-pon/blog[5]
2010 4月 10 (土)
 
ページ内コンテンツ
  • PHP >= 5.2.10 + APC での session_set_save_handler() 問題の解決法
    • 正解は次のような感じです。
    • 以下は当時の記事で間違った対応策。
      • その他の参考ページ

PHP >= 5.2.10 + APC での session_set_save_handler() 問題の解決法 anchor.png[6]

Tag: PHP[7] 自宅サーバー[8] APC[9]

このページの以前の内容は間違いでした。(2011-10-21 追記)

Page Top

正解は次のような感じです。 anchor.png[10]

    • セッションのカスタムハンドラでオブジェクトを使用している時にセッションが保存されない場合は、カスタムハンドラオブジェクトのデストラクタで session_write_close() を コールする。
    • PHP: session_set_save_handler - Manual[11]

      PHP 5.0.5 以降、write ハンドラおよび close ハンドラはオブジェクトが破棄されたあとにコールされます。 そのため、セッション内でデストラクタを使用可能ですが、 ハンドラ内ではオブジェクトを使用できません。

      この「ニワトリが先かタマゴが先か」の問題を解決するために、 デストラクタから session_write_close() を コールすることが可能です。

    • XOOPS[12] 2 の場合、kernel/session.php の XoopsSessionHandler クラスにデストラクタを追加することで APC 使用時も問題なくセッションが使えるようになる。
      •     // for PHP >= 5.0.5
            function __destruct() {
                session_write_close();
            }
Page Top

以下は当時の記事で間違った対応策。 anchor.png[13]

2010-01-13[14] の Blog で、PHP 5.3.1 + APC APC-3.1.3p1 で、XOOPS[12] のセッションが正常に機能しなくて、ログインできない問題があると書いて、なんとか適当な修正で乗り切ってきたけど、正解ぽい修正案を見つけたので、試してみたところ上手くいった。

  • PHP5.2.10とAPC3.0.19の組み合わせでsession_set_save_handler()を使うと不具合が生じる。 - 浅倉卓司@blog風味? - ひとりでもグループ[15]
    • 終了処理の順番が問題らしい。PHP5.2.10 以降では、スクリプト終了時のセッションの終了処理の前にエクステンションの終了処理(PHP_RSHUTDOWN)が実行されるようになったらしい。

      なので、APCの終了処理で、セッションハンドラーオブジェクトが破棄されてしまいセッションの書き込み処理が行われないという状況になっていた模様。

  • 徒然と: pecl-APCとphp-5.2.10[16]
    • このページに上記の問題を解決する方法そのものがバッチリ紹介されていた。
    • その方法: APC の終了処理を PHP_RSHUTDOWN から ZEND_MODULE_POST_ZEND_DEACTIVATE_N に変更する。 :ok:
      --- php_apc.c.org	2010-04-10 20:37:52.000000000 +0900
      +++ php_apc.c	2010-04-10 23:10:44.000000000 +0900
      @@ -314,7 +314,7 @@
       /* }}} */
       
       /* {{{ PHP_RSHUTDOWN_FUNCTION(apc) */
      -static PHP_RSHUTDOWN_FUNCTION(apc)
      +static ZEND_MODULE_POST_ZEND_DEACTIVATE_D(apc)
       {
           if(APCG(enabled)) {
               apc_request_shutdown(TSRMLS_C);
      @@ -1628,10 +1628,12 @@
           PHP_MINIT(apc),
           PHP_MSHUTDOWN(apc),
           PHP_RINIT(apc),
      -    PHP_RSHUTDOWN(apc),
      +    NULL,
           PHP_MINFO(apc),
           PHP_APC_VERSION,
      -    STANDARD_MODULE_PROPERTIES
      +    NO_MODULE_GLOBALS,
      +    ZEND_MODULE_POST_ZEND_DEACTIVATE_N(apc),
      +    STANDARD_MODULE_PROPERTIES_EX
       };
       
       #ifdef COMPILE_DL_APC
      • この修正を php_apc.c に行いリビルドしたら、バッチリOKとなりました。 :thumb_up:

Last-modified: 2010-04-11 (日) 00:15:49 (JST) (5129d) by nao-pon