我必须在session_write_close()之后调用session_set_save_handler()吗?

时间:2015-03-19 17:35:23

标签: php session

我正在使用一些遗留代码,该代码具有使用session_set_save_handler()设置的自定义PHP会话处理程序。在某些时候,该代码必须将会话数据释放到另一个进程。它调用session_write_close(),等待子进程完成,然后通过重新调用session_set_save_handler(),然后session_start()重新加载会话数据。

  1. session_set_save_handler()
  2. session_start()
  3. 读取/修改会话数据
  4. session_write_close()
  5. 执行加载会话,修改数据和写入会话的子进程
  6. session_set_save_handler() 这一步是否必要?
  7. session_start()
  8. 在会话中读取数据,可能由之前的子进程编写
  9. 是否有必要再次设置会话保存处理程序?

1 个答案:

答案 0 :(得分:2)

首先我建议你把它放在:

session_write_close();

在第1点之前,因为如果你有会话自动开启,你将收到错误,因为你必须在session_set_save_handler()之前致电session_start()


但现在回到真正的问题:

  
      
  1. session_set_save_handler()这一步是否必要?
  2.   

不,没有必要! (但也许您仍然希望在再次开始会话之前致电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