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(); }
<?php if (!defined('SESSION_STARTED') && $_SESSION) { $session_copy = $_SESSION; @session_start(); if (!$_SESSION) { $_SESSION = $session_copy; } ob_end_flush(); }
以上就介紹了php優化session的使用,包括了方面的內容,希望對PHP教程有興趣的朋友有幫助。