我正在使用一些遗留代码,该代码具有使用session_set_save_handler()
设置的自定义PHP会话处理程序。在某些时候,该代码必须将会话数据释放到另一个进程。它调用session_write_close()
,等待子进程完成,然后通过重新调用session_set_save_handler()
,然后session_start()
重新加载会话数据。
session_set_save_handler()
session_start()
session_write_close()
session_set_save_handler()
这一步是否必要? session_start()
是否有必要再次设置会话保存处理程序?
答案 0 :(得分:2)
首先我建议你把它放在:
session_write_close();
在第1点之前,因为如果你有会话自动开启,你将收到错误,因为你必须在session_set_save_handler()
之前致电session_start()
。
但现在回到真正的问题:
- session_set_save_handler()这一步是否必要?
醇>
不,没有必要! (但也许您仍然希望在再次开始会话之前致电session_write_close();
)
那你为什么不再打电话呢?
因为它是一个配置选项,它将在整个脚本执行期间保留该值(并将在脚本结束时恢复)。
您还可以在php source code:
中清楚地看到这一点从那里引用(/ext/session/session.c):
/* {{{ proto void session_set_save_handler(string open, string close, string read, string write, string destroy, string gc)
Sets user-level functions */
static PHP_FUNCTION(session_set_save_handler)
{
zval ***args = NULL;
int i, num_args, argc = ZEND_NUM_ARGS();
char *name;
if (PS(session_status) != php_session_none) {
RETURN_FALSE;
}
if (argc != 6) {
WRONG_PARAM_COUNT;
}
if (zend_parse_parameters(argc TSRMLS_CC, "+", &args, &num_args) == FAILURE) {
return;
}
for (i = 0; i < 6; i++) {
if (!zend_is_callable(*args[i], 0, &name TSRMLS_CC)) {
efree(args);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument %d is not a valid callback", i+1);
efree(name);
RETURN_FALSE;
}
efree(name);
}
zend_alter_ini_entry("session.save_handler", sizeof("session.save_handler"), "user", sizeof("user")-1, PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
for (i = 0; i < 6; i++) {
if (PS(mod_user_names).names[i] != NULL) {
zval_ptr_dtor(&PS(mod_user_names).names[i]);
}
Z_ADDREF_PP(args[i]);
PS(mod_user_names).names[i] = *args[i];
}
efree(args);
RETURN_TRUE;
}
/* }}} */
您将看到函数调用:zend_alter_ini_entry()
,它将更改脚本执行配置中的值。所以没有必要再打电话。
修改强>
使用session_set_save_handler()
,您将更改session.save_handler string
配置:http://php.net/manual/en/session.configuration.php#ini.session.save-handler