📄 session.c
字号:
if (PS(id)) efree(PS(id)); PS(id) = estrndup(Z_STRVAL_PP(p_name), Z_STRLEN_PP(p_name)); } RETVAL_STRING(old, 0);}/* }}} *//* {{{ proto bool session_regenerate_id() Update the current session id with a newly generated one. */PHP_FUNCTION(session_regenerate_id){ if (SG(headers_sent)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot regenerate session id - headers already sent"); RETURN_FALSE; } if (PS(session_status) == php_session_active) { if (PS(id)) { efree(PS(id)); PS(id) = NULL; } PS(id) = PS(mod)->s_create_sid(&PS(mod_data), NULL TSRMLS_CC); PS(send_cookie) = 1; php_session_reset_id(TSRMLS_C); RETURN_TRUE; } RETURN_FALSE;}/* }}} *//* {{{ proto string session_cache_limiter([string new_cache_limiter]) Return the current cache limiter. If new_cache_limited is given, the current cache_limiter is replaced with new_cache_limiter */PHP_FUNCTION(session_cache_limiter){ zval **p_cache_limiter; int ac = ZEND_NUM_ARGS(); char *old; if (ac < 0 || ac > 1 || zend_get_parameters_ex(ac, &p_cache_limiter) == FAILURE) WRONG_PARAM_COUNT; old = estrdup(PS(cache_limiter)); if (ac == 1) { convert_to_string_ex(p_cache_limiter); zend_alter_ini_entry("session.cache_limiter", sizeof("session.cache_limiter"), Z_STRVAL_PP(p_cache_limiter), Z_STRLEN_PP(p_cache_limiter), PHP_INI_USER, PHP_INI_STAGE_RUNTIME); } RETVAL_STRING(old, 0);}/* }}} *//* {{{ proto int session_cache_expire([int new_cache_expire]) Return the current cache expire. If new_cache_expire is given, the current cache_expire is replaced with new_cache_expire */PHP_FUNCTION(session_cache_expire){ zval **p_cache_expire; int ac = ZEND_NUM_ARGS(); long old; old = PS(cache_expire); if (ac < 0 || ac > 1 || zend_get_parameters_ex(ac, &p_cache_expire) == FAILURE) WRONG_PARAM_COUNT; if (ac == 1) { convert_to_string_ex(p_cache_expire); zend_alter_ini_entry("session.cache_expire", sizeof("session.cache_expire"), Z_STRVAL_PP(p_cache_expire), Z_STRLEN_PP(p_cache_expire), ZEND_INI_USER, ZEND_INI_STAGE_RUNTIME); } RETVAL_LONG(old);}/* }}} *//* {{{ static void php_register_var(zval** entry TSRMLS_DC) */static void php_register_var(zval** entry TSRMLS_DC){ zval **value; if (Z_TYPE_PP(entry) == IS_ARRAY) { zend_hash_internal_pointer_reset(Z_ARRVAL_PP(entry)); while (zend_hash_get_current_data(Z_ARRVAL_PP(entry), (void**)&value) == SUCCESS) { php_register_var(value TSRMLS_CC); zend_hash_move_forward(Z_ARRVAL_PP(entry)); } } else { convert_to_string_ex(entry); if ((strcmp(Z_STRVAL_PP(entry), "HTTP_SESSION_VARS") != 0) && (strcmp(Z_STRVAL_PP(entry), "_SESSION") != 0)) { PS_ADD_VARL(Z_STRVAL_PP(entry), Z_STRLEN_PP(entry)); } }}/* }}} *//* {{{ proto bool session_register(mixed var_names [, mixed ...]) Adds varname(s) to the list of variables which are freezed at the session end */PHP_FUNCTION(session_register){ zval ***args; int argc = ZEND_NUM_ARGS(); int i; if (argc <= 0) RETURN_FALSE else args = (zval ***)safe_emalloc(argc, sizeof(zval **), 0); if (zend_get_parameters_array_ex(argc, args) == FAILURE) { efree(args); WRONG_PARAM_COUNT; } if (PS(session_status) == php_session_none || PS(session_status) == php_session_disabled) { php_session_start(TSRMLS_C); } if (PS(session_status) == php_session_disabled) { efree(args); RETURN_FALSE; } for (i = 0; i < argc; i++) { if (Z_TYPE_PP(args[i]) == IS_ARRAY) SEPARATE_ZVAL(args[i]); php_register_var(args[i] TSRMLS_CC); } efree(args); RETURN_TRUE;}/* }}} *//* {{{ proto bool session_unregister(string varname) Removes varname from the list of variables which are freezed at the session end */PHP_FUNCTION(session_unregister){ zval **p_name; int ac = ZEND_NUM_ARGS(); if (ac != 1 || zend_get_parameters_ex(ac, &p_name) == FAILURE) WRONG_PARAM_COUNT; convert_to_string_ex(p_name); PS_DEL_VARL(Z_STRVAL_PP(p_name), Z_STRLEN_PP(p_name)); RETURN_TRUE;}/* }}} *//* {{{ proto bool session_is_registered(string varname) Checks if a variable is registered in session */PHP_FUNCTION(session_is_registered){ zval **p_name; zval *p_var; int ac = ZEND_NUM_ARGS(); if (ac != 1 || zend_get_parameters_ex(ac, &p_name) == FAILURE) WRONG_PARAM_COUNT; convert_to_string_ex(p_name); if (PS(session_status) == php_session_none) RETURN_FALSE; IF_SESSION_VARS() { if (zend_hash_find(Z_ARRVAL_P(PS(http_session_vars)), Z_STRVAL_PP(p_name), Z_STRLEN_PP(p_name)+1, (void **)&p_var) == SUCCESS) { RETURN_TRUE; } } RETURN_FALSE;}/* }}} *//* {{{ proto string session_encode(void) Serializes the current setup and returns the serialized representation */PHP_FUNCTION(session_encode){ int len; char *enc; if (ZEND_NUM_ARGS() != 0) { WRONG_PARAM_COUNT; } enc = php_session_encode(&len TSRMLS_CC); if (enc == NULL) { RETURN_FALSE; } RETVAL_STRINGL(enc, len, 0);}/* }}} *//* {{{ proto bool session_decode(string data) Deserializes data and reinitializes the variables */PHP_FUNCTION(session_decode){ zval **str; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &str) == FAILURE) { WRONG_PARAM_COUNT; } if (PS(session_status) == php_session_none) { RETURN_FALSE; } convert_to_string_ex(str); php_session_decode(Z_STRVAL_PP(str), Z_STRLEN_PP(str) TSRMLS_CC); RETURN_TRUE;}/* }}} *//* {{{ proto bool session_start(void) Begin session - reinitializes freezed variables, registers browsers etc */PHP_FUNCTION(session_start){ /* skipping check for non-zero args for performance reasons here ?*/ php_session_start(TSRMLS_C); RETURN_TRUE;}/* }}} *//* {{{ proto bool session_destroy(void) Destroy the current session and all data associated with it */PHP_FUNCTION(session_destroy){ if (ZEND_NUM_ARGS() != 0) { WRONG_PARAM_COUNT; } if (php_session_destroy(TSRMLS_C) == SUCCESS) { RETURN_TRUE; } else { RETURN_FALSE; }}/* }}} *//* {{{ proto void session_unset(void) Unset all registered variables */PHP_FUNCTION(session_unset){ if (PS(session_status) == php_session_none) RETURN_FALSE; IF_SESSION_VARS() { HashTable *ht = Z_ARRVAL_P(PS(http_session_vars)); if (PG(register_globals)) { uint str_len; char *str; ulong num_key; HashPosition pos; zend_hash_internal_pointer_reset_ex(ht, &pos); while (zend_hash_get_current_key_ex(ht, &str, &str_len, &num_key, 0, &pos) == HASH_KEY_IS_STRING) { zend_hash_del(&EG(symbol_table), str, str_len); zend_hash_move_forward_ex(ht, &pos); } } /* Clean $_SESSION. */ zend_hash_clean(ht); }}/* }}} */PHPAPI void session_adapt_url(const char *url, size_t urllen, char **new, size_t *newlen TSRMLS_DC){ if (PS(apply_trans_sid) && (PS(session_status) == php_session_active)) { *new = php_url_scanner_adapt_single_url(url, urllen, PS(session_name), PS(id), newlen TSRMLS_CC); }}static void php_rinit_session_globals(TSRMLS_D){ PS(id) = NULL; PS(session_status) = php_session_none; PS(mod_data) = NULL; PS(http_session_vars) = NULL;}static void php_rshutdown_session_globals(TSRMLS_D){ if (PS(http_session_vars)) { zval_ptr_dtor(&PS(http_session_vars)); PS(http_session_vars) = NULL; } if (PS(mod_data)) { zend_try { PS(mod)->s_close(&PS(mod_data) TSRMLS_CC); } zend_end_try(); } if (PS(id)) { efree(PS(id)); PS(id) = NULL; } PS(session_status)=php_session_none;}PHP_RINIT_FUNCTION(session){ php_rinit_session_globals(TSRMLS_C); if (PS(mod) == NULL) { char *value; value = zend_ini_string("session.save_handler", sizeof("session.save_handler"), 0); if (value) { PS(mod) = _php_find_ps_module(value TSRMLS_CC); } if (!PS(mod)) { /* current status is unusable */ PS(session_status) = php_session_disabled; return SUCCESS; } } if (PS(auto_start)) { php_session_start(TSRMLS_C); } return SUCCESS;}static void php_session_flush(TSRMLS_D){ if (PS(session_status) == php_session_active) { PS(session_status) = php_session_none; zend_try { php_session_save_current_state(TSRMLS_C); } zend_end_try(); }}/* {{{ proto void session_write_close(void) Write session data and end session */PHP_FUNCTION(session_write_close){ php_session_flush(TSRMLS_C);}PHP_RSHUTDOWN_FUNCTION(session){ php_session_flush(TSRMLS_C); php_rshutdown_session_globals(TSRMLS_C); return SUCCESS;}/* }}} */static void php_minit_session_globals(php_ps_globals *ps_globals){ ps_globals->save_path = NULL; ps_globals->session_name = NULL; ps_globals->id = NULL; ps_globals->mod = NULL; ps_globals->mod_data = NULL; ps_globals->session_status = php_session_none; ps_globals->http_session_vars = NULL;}PHP_MINIT_FUNCTION(session){#ifdef ZTS php_ps_globals *ps_globals; ts_allocate_id(&ps_globals_id, sizeof(php_ps_globals), (ts_allocate_ctor) php_minit_session_globals, NULL); ps_globals = ts_resource(ps_globals_id);#else php_minit_session_globals(&ps_globals);#endif zend_register_auto_global("_SESSION", sizeof("_SESSION")-1 TSRMLS_CC); PS(module_number) = module_number; /* if we really need this var we need to init it in zts mode as well! */ PS(session_status) = php_session_none; REGISTER_INI_ENTRIES();#ifdef HAVE_LIBMM PHP_MINIT(ps_mm) (INIT_FUNC_ARGS_PASSTHRU);#endif return SUCCESS;}PHP_MSHUTDOWN_FUNCTION(session){ UNREGISTER_INI_ENTRIES();#ifdef HAVE_LIBMM PHP_MSHUTDOWN(ps_mm) (SHUTDOWN_FUNC_ARGS_PASSTHRU);#endif memset(&ps_modules[PREDEFINED_MODULES], 0, (MAX_MODULES-PREDEFINED_MODULES)*sizeof(ps_module *)); return SUCCESS;}PHP_MINFO_FUNCTION(session){ ps_module **mod; smart_str handlers = {0}; int i; for (i = 0, mod = ps_modules; i < MAX_MODULES; i++, mod++) { if (*mod && (*mod)->s_name) { smart_str_appends(&handlers, (*mod)->s_name); smart_str_appendc(&handlers, ' '); } } php_info_print_table_start(); php_info_print_table_row(2, "Session Support", "enabled" ); if (handlers.c) { smart_str_0(&handlers); php_info_print_table_row(2, "Registered save handlers", handlers.c); smart_str_free(&handlers); } else { php_info_print_table_row(2, "Registered save handlers", "none"); } php_info_print_table_end(); DISPLAY_INI_ENTRIES();}/* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim600: noet sw=4 ts=4 fdm=marker * vim<600: sw=4 ts=4 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -