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:
auto_append_file:
以上就介紹了php最佳化session的使用,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。