web-dev-qa-db-ja.com

プラグインをオーサリングするとき、どのようにsession_start()をフックするべきですか?

セッションについてもっと知るsession_start()<?phpのすぐ後ろに来るべきだと思いました。 正確にどこにSESSION_STARTを置きますか?header.phpの後に<?phpsession_start()を追加するプラグインを作成します。ただし、検索の後、これを行うための適切な手順を見つけようとしました。

session を検索しましたが、さまざまなQ&Aがよく見られます。

それで、header.phpに追加されるセッションに依存するプラグインをオーサリングするとき、session_start()を追加するための適切なフックは何ですか?

通常の出力がないため、フロントエンドのtemplate_redirectの前にヘッダーが送信されません。バックエンドでもセッションが必要な場合は、両方をカバーするためにアクションwp_loadedを使用してください。

例:

add_action( 'template_redirect', function() {

    $status = session_status();

    if ( PHP_SESSION_DISABLED === $status ) {
        // That's why you cannot rely on sessions!
        return;
    }

    if ( PHP_SESSION_NONE === $status ) {
        session_start();
    }

    $_SESSION[ 'foo' ] = 'bar';
});

セッションを使用すると、セキュリティ、スケーラビリティ(ロードバランサ)、および時間のかかるサポートの問題など、コード全体に 一連の非常に複雑な問題 が追加されることに注意してください。お勧めしません。

3
fuxia

これはあなたが内部で見つけることができるPHPバージョンのすべての種類のためのもう一つの解決策でもあります CF Geo Plugin

if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
    if(function_exists('session_status') && session_status() == PHP_SESSION_NONE) {
        session_start(array(
          'cache_limiter' => 'private_no_expire',
          'read_and_close' => false,
       ));
    }
}
else if (version_compare(PHP_VERSION, '5.4.0') >= 0)
{
    if (function_exists('session_status') && session_status() == PHP_SESSION_NONE) {
        session_cache_limiter('private_no_expire');
        session_start();
    }
}
else
{
    if(session_id() == '') {
        if(version_compare(PHP_VERSION, '4.0.0') >= 0){
            session_cache_limiter('private_no_expire');
        }
        session_start();
    }
}

このソリューションを使用すると、セッションに関する問題を回避し、必要なときにいつでも開始できます。