⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 session.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
	if (SG(headers_sent)) {		char *output_start_filename = php_get_output_start_filename(TSRMLS_C);		int output_start_lineno = php_get_output_start_lineno(TSRMLS_C);		if (output_start_filename) {			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot send session cookie - headers already sent by (output started at %s:%d)",				output_start_filename, output_start_lineno);		} else {			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot send session cookie - headers already sent");		}			return;	}	smart_str_appends(&ncookie, COOKIE_SET_COOKIE);	smart_str_appends(&ncookie, PS(session_name));	smart_str_appendc(&ncookie, '=');	smart_str_appends(&ncookie, PS(id));		if (PS(cookie_lifetime) > 0) {		struct timeval tv;		time_t t;		gettimeofday(&tv, NULL);		t = tv.tv_sec + PS(cookie_lifetime);				if (t > 0) {			date_fmt = php_std_date(t TSRMLS_CC);			smart_str_appends(&ncookie, COOKIE_EXPIRES);			smart_str_appends(&ncookie, date_fmt);			efree(date_fmt);		}	}	if (PS(cookie_path)[0]) {		smart_str_appends(&ncookie, COOKIE_PATH);		smart_str_appends(&ncookie, PS(cookie_path));	}		if (PS(cookie_domain)[0]) {		smart_str_appends(&ncookie, COOKIE_DOMAIN);		smart_str_appends(&ncookie, PS(cookie_domain));	}	if (PS(cookie_secure)) {		smart_str_appends(&ncookie, COOKIE_SECURE);	}	smart_str_0(&ncookie);		sapi_add_header_ex(ncookie.c, ncookie.len, 0, 0 TSRMLS_CC);}static ps_module *_php_find_ps_module(char *name TSRMLS_DC){	ps_module *ret = NULL;	ps_module **mod;	int i;	for (i = 0, mod = ps_modules; i < MAX_MODULES; i++, mod++)		if (*mod && !strcasecmp(name, (*mod)->s_name)) {			ret = *mod;			break;		}		return ret;}static const ps_serializer *_php_find_ps_serializer(char *name TSRMLS_DC){	const ps_serializer *ret = NULL;	const ps_serializer *mod;	for (mod = ps_serializers; mod->name; mod++)		if (!strcasecmp(name, mod->name)) {			ret = mod;			break;		}	return ret;}#define PPID2SID \		convert_to_string((*ppid)); \		PS(id) = estrndup(Z_STRVAL_PP(ppid), Z_STRLEN_PP(ppid))static void php_session_reset_id(TSRMLS_D){	int module_number = PS(module_number);		if (PS(use_cookies) && PS(send_cookie)) {		php_session_send_cookie(TSRMLS_C);		PS(send_cookie) = 0;	}	/* if the SID constant exists, destroy it. */	zend_hash_del(EG(zend_constants), "sid", sizeof("sid"));		if (PS(define_sid)) {		smart_str var = {0};		smart_str_appends(&var, PS(session_name));		smart_str_appendc(&var, '=');		smart_str_appends(&var, PS(id));		smart_str_0(&var);		REGISTER_STRINGL_CONSTANT("SID", var.c, var.len, 0);	} else {		REGISTER_STRINGL_CONSTANT("SID", empty_string, 0, 0);	}	if (PS(apply_trans_sid)) {		php_url_scanner_reset_vars(TSRMLS_C);		php_url_scanner_add_var(PS(session_name), strlen(PS(session_name)), PS(id), strlen(PS(id)), 1 TSRMLS_CC);	}}	PHPAPI void php_session_start(TSRMLS_D){	zval **ppid;	zval **data;	char *p;	int nrand;	int lensess;	PS(apply_trans_sid) = PS(use_trans_sid);	PS(define_sid) = 1;	PS(send_cookie) = 1;	if (PS(session_status) != php_session_none) {				if (PS(session_status) == php_session_disabled) {			char *value;			value = zend_ini_string("session.save_handler", sizeof("session.save_handler"), 0);			if (value) { 				php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot find save handler %s", value);			}			else {				php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot find unknown save handler");			}			return;		}						php_error(E_NOTICE, "A session had already been started - ignoring session_start()");		return;	}	lensess = strlen(PS(session_name));		/*	 * Cookies are preferred, because initially	 * cookie and get variables will be available. 	 */	if (!PS(id)) {		if (PS(use_cookies) && zend_hash_find(&EG(symbol_table), "_COOKIE",					sizeof("_COOKIE"), (void **) &data) == SUCCESS &&				Z_TYPE_PP(data) == IS_ARRAY &&				zend_hash_find(Z_ARRVAL_PP(data), PS(session_name),					lensess + 1, (void **) &ppid) == SUCCESS) {			PPID2SID;			PS(apply_trans_sid) = 0;			PS(send_cookie) = 0;			PS(define_sid) = 0;		}		if (!PS(use_only_cookies) && !PS(id) &&				zend_hash_find(&EG(symbol_table), "_GET",					sizeof("_GET"), (void **) &data) == SUCCESS &&				Z_TYPE_PP(data) == IS_ARRAY &&				zend_hash_find(Z_ARRVAL_PP(data), PS(session_name),					lensess + 1, (void **) &ppid) == SUCCESS) {			PPID2SID;			PS(send_cookie) = 0;		}		if (!PS(use_only_cookies) && !PS(id) &&				zend_hash_find(&EG(symbol_table), "_POST",					sizeof("_POST"), (void **) &data) == SUCCESS &&				Z_TYPE_PP(data) == IS_ARRAY &&				zend_hash_find(Z_ARRVAL_PP(data), PS(session_name),					lensess + 1, (void **) &ppid) == SUCCESS) {			PPID2SID;			PS(send_cookie) = 0;		}	}	/* check the REQUEST_URI symbol for a string of the form	   '<session-name>=<session-id>' to allow URLs of the form	   http://yoursite/<session-name>=<session-id>/script.php */	if (!PS(use_only_cookies) && !PS(id) && PG(http_globals)[TRACK_VARS_SERVER] &&			zend_hash_find(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_SERVER]), "REQUEST_URI",				sizeof("REQUEST_URI"), (void **) &data) == SUCCESS &&			Z_TYPE_PP(data) == IS_STRING &&			(p = strstr(Z_STRVAL_PP(data), PS(session_name))) &&			p[lensess] == '=') {		char *q;		p += lensess + 1;		if ((q = strpbrk(p, "/?\\")))			PS(id) = estrndup(p, q - p);	}	/* check whether the current request was referred to by	   an external site which invalidates the previously found id */		if (PS(id) &&			PS(extern_referer_chk)[0] != '\0' &&			PG(http_globals)[TRACK_VARS_SERVER] &&			zend_hash_find(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_SERVER]), "HTTP_REFERER",				sizeof("HTTP_REFERER"), (void **) &data) == SUCCESS &&			Z_TYPE_PP(data) == IS_STRING &&			Z_STRLEN_PP(data) != 0 &&			strstr(Z_STRVAL_PP(data), PS(extern_referer_chk)) == NULL) {		efree(PS(id));		PS(id) = NULL;		PS(send_cookie) = 1;		if (PS(use_trans_sid))			PS(apply_trans_sid) = 1;	}		php_session_initialize(TSRMLS_C);		if (!PS(use_cookies) && PS(send_cookie)) {		if (PS(use_trans_sid))			PS(apply_trans_sid) = 1;		PS(send_cookie) = 0;	}	php_session_reset_id(TSRMLS_C);		PS(session_status) = php_session_active;	php_session_cache_limiter(TSRMLS_C);	if (PS(mod_data) && PS(gc_probability) > 0) {		int nrdels = -1;		nrand = (int) ((float) PS(gc_divisor) * php_combined_lcg(TSRMLS_C));		if (nrand < PS(gc_probability)) {			PS(mod)->s_gc(&PS(mod_data), PS(gc_maxlifetime), &nrdels TSRMLS_CC);#if 0			if (nrdels != -1)				php_error_docref(NULL TSRMLS_CC, E_NOTICE, "purged %d expired session objects", nrdels);#endif		}	}}static zend_bool php_session_destroy(TSRMLS_D){	zend_bool retval = SUCCESS;	if (PS(session_status) != php_session_active) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Trying to destroy uninitialized session");		return FAILURE;	}	if (PS(mod)->s_destroy(&PS(mod_data), PS(id) TSRMLS_CC) == FAILURE) {		retval = FAILURE;		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Session object destruction failed");	}		php_rshutdown_session_globals(TSRMLS_C);	php_rinit_session_globals(TSRMLS_C);	return retval;}/* {{{ proto void session_set_cookie_params(int lifetime [, string path [, string domain [, bool secure]]])   Set session cookie parameters */PHP_FUNCTION(session_set_cookie_params){	zval **lifetime, **path, **domain, **secure;	if (!PS(use_cookies))		return;	if (ZEND_NUM_ARGS() < 1 || ZEND_NUM_ARGS() > 4 ||		zend_get_parameters_ex(ZEND_NUM_ARGS(), &lifetime, &path, &domain, &secure) == FAILURE)		WRONG_PARAM_COUNT;	convert_to_string_ex(lifetime);	zend_alter_ini_entry("session.cookie_lifetime", sizeof("session.cookie_lifetime"), Z_STRVAL_PP(lifetime), Z_STRLEN_PP(lifetime), PHP_INI_USER, PHP_INI_STAGE_RUNTIME);	if (ZEND_NUM_ARGS() > 1) {		convert_to_string_ex(path);		zend_alter_ini_entry("session.cookie_path", sizeof("session.cookie_path"), Z_STRVAL_PP(path), Z_STRLEN_PP(path), PHP_INI_USER, PHP_INI_STAGE_RUNTIME);		if (ZEND_NUM_ARGS() > 2) {			convert_to_string_ex(domain);			zend_alter_ini_entry("session.cookie_domain", sizeof("session.cookie_domain"), Z_STRVAL_PP(domain), Z_STRLEN_PP(domain), PHP_INI_USER, PHP_INI_STAGE_RUNTIME);			if (ZEND_NUM_ARGS() > 3) {				convert_to_long_ex(secure);				zend_alter_ini_entry("session.cookie_secure", sizeof("session.cookie_secure"), Z_BVAL_PP(secure)?"1":"0", 1, PHP_INI_USER, PHP_INI_STAGE_RUNTIME);			}		}	}}/* }}} *//* {{{ proto array session_get_cookie_params(void)   Return the session cookie parameters */ PHP_FUNCTION(session_get_cookie_params){	if (ZEND_NUM_ARGS() != 0) {		WRONG_PARAM_COUNT;	}	array_init(return_value);	add_assoc_long(return_value, "lifetime", PS(cookie_lifetime));	add_assoc_string(return_value, "path", PS(cookie_path), 1);	add_assoc_string(return_value, "domain", PS(cookie_domain), 1);	add_assoc_bool(return_value, "secure", PS(cookie_secure));}/* }}} *//* {{{ proto string session_name([string newname])   Return the current session name. If newname is given, the session name is replaced with newname */PHP_FUNCTION(session_name){	zval **p_name;	int ac = ZEND_NUM_ARGS();	char *old;	if (ac < 0 || ac > 1 || zend_get_parameters_ex(ac, &p_name) == FAILURE)		WRONG_PARAM_COUNT;		old = estrdup(PS(session_name));	if (ac == 1) {		convert_to_string_ex(p_name);		zend_alter_ini_entry("session.name", sizeof("session.name"), Z_STRVAL_PP(p_name), Z_STRLEN_PP(p_name), PHP_INI_USER, PHP_INI_STAGE_RUNTIME);	}		RETVAL_STRING(old, 0);}/* }}} *//* {{{ proto string session_module_name([string newname])   Return the current module name used for accessing session data. If newname is given, the module name is replaced with newname */PHP_FUNCTION(session_module_name){	zval **p_name;	int ac = ZEND_NUM_ARGS();	if (ac < 0 || ac > 1 || zend_get_parameters_ex(ac, &p_name) == FAILURE)		WRONG_PARAM_COUNT;	if (ac == 1) {		convert_to_string_ex(p_name);		if (!_php_find_ps_module(Z_STRVAL_PP(p_name) TSRMLS_CC)) {			php_error_docref(NULL TSRMLS_CC, E_ERROR, "Cannot find named PHP session module (%s)",					Z_STRVAL_PP(p_name));			RETURN_FALSE;		}		if (PS(mod_data)) {			PS(mod)->s_close(&PS(mod_data) TSRMLS_CC);		}		PS(mod_data) = NULL;		if (PS(mod) && PS(mod)->s_name) {			RETVAL_STRING(safe_estrdup(PS(mod)->s_name), 0);		} else {			RETVAL_EMPTY_STRING();		}				zend_alter_ini_entry("session.save_handler", sizeof("session.save_handler"), Z_STRVAL_PP(p_name), Z_STRLEN_PP(p_name), PHP_INI_USER, PHP_INI_STAGE_RUNTIME);	} else {		if (PS(mod) && PS(mod)->s_name) {			RETURN_STRING(safe_estrdup(PS(mod)->s_name), 0);		} else {			RETURN_EMPTY_STRING();		}	}}/* }}} *//* {{{ proto void session_set_save_handler(string open, string close, string read, string write, string destroy, string gc)   Sets user-level functions */PHP_FUNCTION(session_set_save_handler){	zval **args[6];	int i;	ps_user *mdata;	char *name;	if (ZEND_NUM_ARGS() != 6 || zend_get_parameters_array_ex(6, args) == FAILURE)		WRONG_PARAM_COUNT;		if (PS(session_status) != php_session_none) 		RETURN_FALSE;	for (i = 0; i < 6; i++) {		if (!zend_is_callable(*args[i], 0, &name)) {			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);	mdata = emalloc(sizeof(*mdata));		for (i = 0; i < 6; i++) {		ZVAL_ADDREF(*args[i]);		mdata->names[i] = *args[i];	}	PS(mod_data) = (void *) mdata;		RETURN_TRUE;}/* }}} *//* {{{ proto string session_save_path([string newname])   Return the current save path passed to module_name. If newname is given, the save path is replaced with newname */PHP_FUNCTION(session_save_path){	zval **p_name;	int ac = ZEND_NUM_ARGS();	char *old;	if (ac < 0 || ac > 1 || zend_get_parameters_ex(ac, &p_name) == FAILURE)		WRONG_PARAM_COUNT;		old = estrdup(PS(save_path));	if (ac == 1) {		convert_to_string_ex(p_name);		zend_alter_ini_entry("session.save_path", sizeof("session.save_path"), Z_STRVAL_PP(p_name), Z_STRLEN_PP(p_name), PHP_INI_USER, PHP_INI_STAGE_RUNTIME);	}		RETVAL_STRING(old, 0);}/* }}} *//* {{{ proto string session_id([string newid])   Return the current session id. If newid is given, the session id is replaced with newid */PHP_FUNCTION(session_id){	zval **p_name;	int ac = ZEND_NUM_ARGS();	char *old = empty_string;	if (ac < 0 || ac > 1 || zend_get_parameters_ex(ac, &p_name) == FAILURE)		WRONG_PARAM_COUNT;	if (PS(id))		old = estrdup(PS(id));	if (ac == 1) {		convert_to_string_ex(p_name);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -