为什么设置上了cookie,但第一次请求的时候拿不到?(最简解释 + 图、文、码三维解析)

272 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、先上答案

1、cookie是设置在客户端的,setcookie函数自己并不能设置cookie,它只能通过头信息的方式告诉浏览器说:我想要设置一个 cookie,键为a,值为value,你在你那里帮我设置一下

2、编程语言的执行是自上而下的,当次执行的时候cookie文件中并没有,请求之初也没有携带需要的存的信息,所以拿不到

3、当第二次请求的时候,由于服务器让浏览器存入了cookie文件,在浏览器的请求头信息中已经有了,具体可以参照下图

二、再亮代码


<?php

    function test() {
        setcookie('user_cookie', 123, time()+3600, '/');
        var_dump($_COOKIE['user_cookie']);exit;
    }
    

三、图文说明:

3.1  第一次请求为空的情景

3.2 第二次请求的情景

四、拓展知识 :

4.1 Cookie在PHP中是如何携带的


<?php
header('Content-Type:text/html;charset=utf-8');
echo  "<pre>";
 
function curl($cookie,$user_agent,$destURL, $paramStr='',$flag='get',$ip='10.57.22.166',$fromurl='http://www.juejin.cn'){
	$curl = curl_init();
	if($flag=='post'){//post传递
		curl_setopt($curl, CURLOPT_POST, 1);
		curl_setopt($curl, CURLOPT_POSTFIELDS, $paramStr);
	}
	curl_setopt($curl, CURLOPT_URL, $destURL);//地址
	
	curl_setopt($curl, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:'.$ip, 'CLIENT-IP:'.$ip));  //构造IP
	
	
	curl_setopt($curl, CURLOPT_REFERER, $fromurl);
	curl_setopt($curl, CURLOPT_TIMEOUT, 3);#3s超时时间
	
	curl_setopt ($curl, CURLOPT_USERAGENT, $user_agent);
	//curl_setopt ($curl, CURLOPT_COOKIEJAR, $cookie);
	curl_setopt ($curl, CURLOPT_COOKIEFILE, $cookie);
	
	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
	$str = curl_exec($curl);
	curl_close($curl);
	return $str;
}
 
	
	$postdata = 'a=66666666';
	$user_agent = "Mozilla/5.".rand(0,100)." (MacOS NT 13.1; Gecko/20220513 Firefox/33.0";
	$cookie = 'd:\cookie.txt';
	$getip='66.66.'.rand(0,16).'.'.rand(0,158) ;
	//file_put_contents('d:\cookie.txt', '');
	$cookie_file = dirname(__FILE__).'/cookie.txt';
	ob_start();
	$html =  curl($cookie_file,$user_agent,'http://127.0.0.1/b.php',$postdata,'post',$getip,'');
	ob_end_clean();
	
	echo $html;

4.2 PHP是怎样识别不同的SESSION的呢?

    
    ### php.ini
    
    session_start();
    
    session.auto_start = On ;
    
    session.auto_start = off ;
    

SESSION是一种机制,可以在服务器端跨文件暂时保存数据或传递数据,常用于购物车等方面。SESSION只在用户关闭浏览器之前有效。每一次SESSION会话都有一个SESSION ID,用来识别不同的会话,保存在浏览器Cookie之中,也就是这个名为PHPSESSID的Cookie(当然,这个名称是可以更改的)。