php優化session的使用

WBOY
發布: 2016-08-08 09:27:13
原創
1620 人瀏覽過

php的session擴充可以將session資料存入任意容器,只要容器實作了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;
登入後複製

如果在php.ini定義了session.auto_start = 1,session擴充在請求初始化階段(rinit )會呼叫s_open並s_read資料。
如果在php頁面中呼叫了session_start()(只有第一次呼叫生效),session擴充也會呼叫s_open並s_read資料。
但是對於一些涉及不到session資料的頁面,如果也去讀取session資料會造成效能上的浪費,例如磁碟操作或網路操作。
所以要想個辦法對涉及session資料和不涉及session資料的頁面區別對待,但是處理程式碼需要是一致的。
想的辦法就是去掉session.auto_start = 1改成session.auto_start = 0並對cookie中沒有session_name的請求延遲調用session_start(),
如果cookie中沒有session_name,調用session_start()時,session擴展會自動生成一個session_id並且傳送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優化session的使用,包括了方面的內容,希望對PHP教程有興趣的朋友有幫助。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板