3: 2011-10-26 (水) 17:12:57 nao-pon With "urlbookmark" plugin. |
現: 2013-04-11 (木) 20:47:59 nao-pon XOOPS 2 系における APC のセッション問題の解決案を追記 |
||
---|---|---|---|
Line 63: | Line 63: | ||
~この「ニワトリが先かタマゴが先か」の問題を解決するために、 デストラクタから session_write_close() を コールすることが可能です。 | ~この「ニワトリが先かタマゴが先か」の問題を解決するために、 デストラクタから session_write_close() を コールすることが可能です。 | ||
<< | << | ||
- | -- XOOPS 2 の場合、kernel/session.php の XoopsSessionHandler クラスにデストラクタを追加することで APC 使用時も問題なくセッションが使えるようになる。 | + | -- %%XOOPS 2 の場合、kernel/session.php の XoopsSessionHandler クラスにデストラクタを追加することで APC 使用時も問題なくセッションが使えるようになる。%% (NG: ob_start() で登録したコールバックにおいて、セッション変数を使えない。) |
--- | --- | ||
#code(php,nonumber){{ | #code(php,nonumber){{ | ||
Line 71: | Line 71: | ||
} | } | ||
}} | }} | ||
- | - mod_xsendfile (0.12) - [[mod_xsendfile for Apache2/Apache2.2:https://tn123.org/mod_xsendfile/]] | + | -- 'session_write_close' を register_shutdown_function() 関数で登録するのが正解? |
- | -- &ref(mod_xsendfile.c); | + | >>オブジェクトをセッション保存ハンドラとして使うときには、 シャットダウン関数を PHP に登録しておくことが重要です。 これで、PHP スクリプトの終了時に内部的にオブジェクトを破棄する処理による副作用や、 write および close がコールされてしまうことを防げます。 一般的には、'session_write_close' を register_shutdown_function() 関数で登録しなければなりません。 |
- | -- &ref(mod_xsendfile.c.diff); | + | << |
- | --- [[効果絶大! の mod_xsendfile [nao-pon/blog/2010-05-19]>nao-pon/blog/2010-05-19]] | + | --- しかし、XOOPS 2 の include/common.php の session_set_save_handler() をコールしたあたりに、 |
+ | #code(php,217-){{ | ||
+ | session_set_save_handler(array(&$sess_handler, 'open'), array(&$sess_handler, 'close'), array(&$sess_handler, 'read'), array(&$sess_handler, 'write'), array(&$sess_handler, 'destroy'), array(&$sess_handler, 'gc')); | ||
+ | session_start(); | ||
+ | register_shutdown_function('session_write_close'); | ||
+ | }} | ||
+ | と、登録すると、タイミングの問題なのか、ob_start() で登録したコールバックにおいて、セッション変数を使えない。 | ||
+ | -- ob_start() でコールバックを指定して、そこで session_write_close() を実行するようにしてみた。 | ||
+ | --- | ||
+ | #code(php,217-){{ | ||
+ | session_set_save_handler(array(&$sess_handler, 'open'), array(&$sess_handler, 'close'), array(&$sess_handler, 'read'), array(&$sess_handler, 'write'), array(&$sess_handler, 'destroy'), array(&$sess_handler, 'gc')); | ||
+ | session_start(); | ||
+ | ob_start(create_function('$output', 'session_write_close();return $output;')); | ||
+ | }} | ||
+ | ビンゴ!です。これで問題ありません。全て解決しました。 | ||
+ | - mod_xsendfile - [[mod_xsendfile for Apache2/Apache2.2:https://tn123.org/mod_xsendfile/]] | ||
+ | -- 独自改造版 - [[nao-pon/mod_xsendfile:https://github.com/nao-pon/mod_xsendfile/tree/use_content-encoding]] | ||
+ | -- [[効果絶大! の mod_xsendfile [nao-pon/blog/2010-05-19]>nao-pon/blog/2010-05-19]] | ||
** データの引越し [#eda507a7] | ** データの引越し [#eda507a7] |
ぺージ情報 | |
---|---|
ぺージ名 : | nao-pon/Vine Linux 6 (Haut Brion) |
ページ別名 : | 未設定 |
ページオーナー : | nao-pon |
閲覧可 | |
グループ : | すべての訪問者 |
ユーザー : | すべての訪問者 |
編集可 | |
グループ : | なし |
ユーザー : | ゲスト |