|
現: 2010-04-11 (日) 00:15:49 nao-pon  間違い訂正。 at 2011-10-21 (金) 22:33:17 |
| | + | #navi |
| | + | RIGHT:&rsslink(../); |
| | + | #boxdate |
| | | | |
| | + | * PHP >= 5.2.10 + APC での session_set_save_handler() 問題の解決法 [#f0628cab] |
| | + | RIGHT:&tag(PHP,自宅サーバー,APC); |
| | + | |
| | + | このページの以前の内容は間違いでした。(2011-10-21 追記) |
| | + | |
| | + | ** 正解は次のような感じです。 [#u1550648] |
| | + | |
| | + | -- セッションのカスタムハンドラでオブジェクトを使用している時にセッションが保存されない場合は、カスタムハンドラオブジェクトのデストラクタで session_write_close() を コールする。 |
| | + | -- [[PHP: session_set_save_handler - Manual:http://www.php.net/manual/ja/function.session-set-save-handler.php]] |
| | + | > PHP 5.0.5 以降、write ハンドラおよび close ハンドラはオブジェクトが破棄されたあとにコールされます。 そのため、セッション内でデストラクタを使用可能ですが、 ハンドラ内ではオブジェクトを使用できません。 |
| | + | ~この「ニワトリが先かタマゴが先か」の問題を解決するために、 デストラクタから session_write_close() を コールすることが可能です。 |
| | + | < |
| | + | -- XOOPS 2 の場合、kernel/session.php の XoopsSessionHandler クラスにデストラクタを追加することで APC 使用時も問題なくセッションが使えるようになる。 |
| | + | --- |
| | + | #code(php,nonumber){{ |
| | + | // for PHP >= 5.0.5 |
| | + | function __destruct() { |
| | + | session_write_close(); |
| | + | } |
| | + | }} |
| | + | |
| | + | ** 以下は当時の記事で間違った対応策。 [#z41a23a2] |
| | + | |
| | + | 2010-01-13 の Blog で、PHP 5.3.1 + APC APC-3.1.3p1 で、XOOPS のセッションが正常に機能しなくて、ログインできない問題があると書いて、なんとか適当な修正で乗り切ってきたけど、正解ぽい修正案を見つけたので、試してみたところ上手くいった。 |
| | + | |
| | + | - [[PHP5.2.10とAPC3.0.19の組み合わせでsession_set_save_handler()を使うと不具合が生じる。 - 浅倉卓司@blog風味? - ひとりでもグループ:http://asakura.g.hatena.ne.jp/asakura-t/20091104/1257325821]] |
| | + | -- 終了処理の順番が問題らしい。PHP5.2.10 以降では、スクリプト終了時のセッションの終了処理の前にエクステンションの終了処理(PHP_RSHUTDOWN)が実行されるようになったらしい。 |
| | + | ~なので、APCの終了処理で、セッションハンドラーオブジェクトが破棄されてしまいセッションの書き込み処理が行われないという状況になっていた模様。 |
| | + | - [[徒然と: pecl-APCとphp-5.2.10:http://blogs.dion.ne.jp/gisupeke/archives/8914112.html]] |
| | + | -- このページに上記の問題を解決する方法そのものがバッチリ紹介されていた。 |
| | + | -- その方法: APC の終了処理を PHP_RSHUTDOWN から ZEND_MODULE_POST_ZEND_DEACTIVATE_N に変更する。 :ok: |
| | + | #code(diff,nonumber){{{{ |
| | + | --- 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: |
| | + | |
| | + | *** その他の参考ページ [#ncba5698] |
| | + | -[[PHP :: Bug #48787 :: session_set_save_handler: can't find previously included class in write func:http://bugs.php.net/bug.php?id=48787]] |
| | + | -[[PECL :: Bug #16721 :: Fatal Error: Class xxx not found:http://pecl.php.net/bugs/bug.php?id=16721]] |
| | + | -[[PECL :: Bug #16745 :: APC causes object destruction / session writing timing behavior to change:http://pecl.php.net/bugs/bug.php?id=16745]] |
| | + | -[[PHP: zend_module 構造体 - Manual:http://www.php.net/manual/ja/internals2.structure.modstruct.php]] |
| | + | |
| | + | RIGHT:&font(90%){&page_comments;}; |
| | + | #navi |