ホームページ  >  記事  >  バックエンド開発  >  PHP はセッションの使用を最適化します

PHP はセッションの使用を最適化します

WBOY
WBOYオリジナル
2016-08-08 09:27:131586ブラウズ

php のセッション拡張機能は、コンテナが php_session.h のインターフェイスを実装している限り、セッション データを任意のコンテナに保存できます:

typedef struct ps_module_struct {
	const char *s_name;
	int (*s_open)(PS_OPEN_ARGS);
	int (*s_close)(PS_CLOSE_ARGS);
	int (*s_read)(PS_READ_ARGS);
	int (*s_write)(PS_WRITE_ARGS);
	int (*s_destroy)(PS_DESTROY_ARGS);
	int (*s_gc)(PS_GC_ARGS);
	char *(*s_create_sid)(PS_CREATE_SID_ARGS);
} ps_module;

session.auto_start = 1 が php.ini で定義されている場合、セッション拡張機能はリクエスト中に実行されます初期化フェーズ (rinit ) は s_open および s_read データを呼び出します。
session_start() が PHP ページで呼び出された場合 (最初の呼び出しのみが有効になります)、セッション拡張機能は s_open および s_read データも呼び出します。
ただし、セッション データが関与しない一部のページでは、セッション データの読み取りにより、ディスク操作やネットワーク操作などのパフォーマンスの無駄が発生します。
そのため、セッション データを含むページとセッション データを含まないページを別々に扱う方法を見つける必要がありますが、処理コードは一貫している必要があります。
そのアイデアは、session.auto_start = 1 を削除して session.auto_start = 0 に変更し、Cookie に session_name のないリクエストに対する session_start() の呼び出しを遅らせることです。
Cookie に session_name がない場合、セッション拡張は自動的に行われます。 session_start() が呼び出されたときに生成され、Set-Cookie ヘッダーを送信します。ヘッダー情報は、ページがコンテンツを出力する前に出力するか、出力を遅らせるためにページのコンテンツを出力バッファーに入れる必要があります。
最終的な実装は次のとおりです:
auto_prepend_file:

<?php
if (isset($_COOKIE[session_name()])) {
	define('SESSION_STARTED', true);
	@session_start();
} else {
	ob_start();
}

auto_append_file:
<?php
if (!defined('SESSION_STARTED') && $_SESSION) {
	$session_copy = $_SESSION;
	@session_start();
	if (!$_SESSION) {
		$_SESSION = $session_copy;
	}
	ob_end_flush();
}

上記では、PHP セッション最適化の使用方法をその内容も含めて紹介していますが、PHP チュートリアルに興味のある友人に役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。