8.1设置cookie
问题
希望设置一个cookie,是网站能识别俩字同一个web浏览器的而后续请求。
解决方案
调用setcookie()并提供一个cookie名和值
setcookie('flavor','chocolate chip');
讨论
cookie随HTTP首部发送,所以,如果没有输出缓冲,必须在生成输出之前调用setcookie()
可以像setcookie()传递二外的参数来控制cookie的行为。setcoookie()的第三个参数是一个到期时间,表示为一个纪元时间戳。例如,这个setcookie会在2014年12月3日中午12点到期。
setcookie('flavor','cholocate chip',1217608000);
如果没有带三个参数(或者第三个参数为空),cookie会在浏览器关闭时到期。另外,如果cookie到期时间大于2147483467,很多系统将无法处理,因为这是32位整数所能表示的最大纪元时间戳
第四个参数是一个路径。只有当请求页面的路径以制定字符串开头时,才会将cookie发送回服务器。
setcookie('flavor','chocolate chip',0,‘/products/’);
其实不非得是以/products/开头。不过只有以/products/开头的页面可以收到发回的cookie
第五个参数是一个域。只有当锁清秋的页面的主机名以指定域结尾时才会向服务器发回cookie
setcookie('flavor','chocolate chip',0,',','.example.com');
8.2读取cookie的值
问题
希望读取之前设置的一个cookie的值
解决方案
查看&_COOKIE超集全局变量数组
if(isset($_COOKIE['flavor'])){
print "you ate a {$_COOKIE[‘flavor’]} cookie.";
}
讨论
如果正在请求设置cookie,在此期间则无法在$_CCOKIE中得到cookie的值。换句话说,调用setcookie()函数不会改变$_COOKIE的值。不过,后续请求中发回服务器的各个cookie会存储在$_COOKIE中。
浏览器向服务器发回一个cookie时,它只负责发送值。无法通过$_COOKIE访问cookie的域、路径、到期时间或安全状态。因为浏览器未将这些信息发送给服务器。
要输出一个特定请求中发送的所有cookie的名和值,可以循环处理$_COOKIE数组:
foreach ($_COOKIE as $cookie_name => $cookie_value){
print "$cookie_name = $cookie_value <br/>"
}
8.3删除cookie
问题
希望删除一个cookie,不让浏览器将它发回给服务器。例如,使用cookie跟踪网站的用户登录情况时,如果一个用户注销,就可以删除相应的cookie。
解决方案
调用setcookie(),不过不提供cookie的值,并制定过去的一个时间作为到期时间:
setcookie('flavor','',1);
删除cookie的setcookie()调用与设置的cookie的setcookie的setcookie()调用必须有相同的参数,所以必要时需要包含路径、域和安全标志。
8.4构建查询字符串
问题
需要构建一个连接,其中的查询字符串中包含名/值对
解决方案
使用http_build_query()函数
$vars = array('name'=>'Oscar the Gouch',
'color'=>'green',
'favorite_punctuation'=>'#');
$query_string = http_build_query($vars);
$url = '/muppet/se;ect.php?'.$query_string;
讨论
解决方案中构建的url如下:
/muppet/select.php?name=ostcar+the+Grouch&color=green&favorite_punctuation=%23
可以使用htmlentities()将输出url之前将对应的html实体的字符转换为相应的实体
8.5读取POST请求体
问题
希望直接访问一个请求的体,而不是访问PHP放在$_POST中解析后的数据。例如,希望处理一个xml文档。这个文档作为web服务请求的一部分提交。
解决方案
读取php://input流
$body = file_get_content('php://input');
讨论
超集全局变量数组$_POST设计用来访问所提交的HTML表单变量,不过如果需要直接访问整个请求体,他就不适用了。
8.6使用HTTP基本或摘要认证
问题
希望利用PHP用密码保护网站的某些部分。不是将密码保存在一个外部文件中并由web服务器来认证,而是希望在一个PHP程序中实现密码认证逻辑。
解决方案$_SERVER['PHP_AUTH_USER']$_SERVER['PHP_SUTH_PW']超级全局变量包含用书提供的用户和密码。
8-1validate
function validate($user,$pass)
{
$user=array('david'=>'fadj&32',
'adam'=>'8HEj838');
if(isset($users[$user])&&($user[$user]===$pass))
return true;
}else{
return false;
}
采用基本认证的时候,用户名和密码要在网络上明文传送,只是利用base64编码做了最低程度的模糊化处理,不过采用摘要认证时,密码本身不会从浏览器发送到服务器。实际上,只会发送密码的一个散列值以及其他一些值。这样就能降低攻击者捕获和重放网络数据流的可能性。摘要认证可以提供更高的安全性,这意味着实现摘要热证的代码比简单的密码比较更为复杂。
8.7使用cookie认证
问题
希望更多地控制用户登录过程,如提供你自己的登陆表单
将认证状态存储在一个cookie,或者存储为会话的一部分。用户登录时,将他的用户名(或另一个唯一值)放在一个cookie中。另外还要包含用户名的散列值和一个密语,实用化无法仅由用户名建立认证cookie。
$secret_word = 'if i ate spinach';
if(validate($_POST['username'],$_POST['password'])){
setcookie('login','$_POST['username'].','.md5($_POST['username'].$secret_word));
}
讨论
使用cookie认证时,必须提供你自己的登录表单
<form method="POST"action="login.php">
username:<input type="text" name="username"> <br>
password:<input type="password" name="passwrd" > <br>
<input type="submit" value="Log In">
</form>
使用cookie或会话认证而不是http基本认证时,可以容易地注销永华:只需要删除他们的登录cookie或者从其会话删除登录变量。将认证信息存储在会话中还有一个好处,可以把用户登录时的浏览活动与登录前或注销后的浏览活动关联起来。
链接注销和登录信息
if(validate($_POST['username'],$_POST['password'])){
$_SESSION['login']=
$_POST['username'].','.md5($_POST['username'].$secret_word);
error_log('Session id'.session_id().' log in as '.$_POST['username']);
}
向错误日志写入一个消息,不过也可以将这个信息记录在数据库中,以便在网站使用率和流量分析中使用。
8.8读取HTTP首部
问题
希望读取一个http请求首部
解决方案
要读取一个首部,可以查看$_server超集全局变量数组
echo $_SERVER['HTTP_USER_AGENT'];
要读取所有首部,可以调用getallheaders():
$headers = getallheaders();
echo $headers['user-agent'];
8.9写http首部
问题
希望写一个http首部
解决方案
调用header()函数
header('Content-Type: image/png');
8.10发送一个特定的http状态码
http_response_code()设置响应
http_response_code(401)
不允许某一个人查看一个页面时。
8.11重定向到不同的位置
问题
希望将用户自动重定向到一个新的url,例如,成功保存表单数据后,希望将用户重定向到一个确认页面,确认数据已经保存。
解决方案
输出后,使用header()发送一个location首部并指定新url,然后调用exit(),以避免再输出其他内容:
header('Location: http://www.example.com/confirm.html');
exit();
讨论
要向新页面传递变量,可以将这些变量包含在url的查询字符串中。
重定向url,必须要保函协议和主机名,而不能只是一个路径名。
8.12浏览器刷新输出
问题
希望强制将输出发送到浏览器。例如,希望在完成一个可能很慢的数据库查询之前为永华提供一个状态更新。
解决方案
使用flush()
print 'finding indentical snowflakes';
flush();
$sth=$dbh->query(
'SELECT shape,COUNT(*) AS c FROM snowflakes GROUP BY shape HAVING c>1'
);
8.13浏览器缓冲输出
问题
希望在发送首部或在cookie 之前就开始生成输出。
解决方案
在页面最上面调用ob_start(),另外在最下面调用ob_end_flush();
8.14压缩web输出
问题
希望想支持自动解压缩的浏览器发送压缩的内容
解决方案
将以下设置增加php.ini文件
zlib.output_compression=1;
8.15读取环境变量
问题
希望得到一个环境变量的值。
解决方案
使用getenv();
$path = getenv('PATH');
8.16设置环境变量
一种使用情景就是,会员的权限大,游客的权限小。
8.17Apache的内部通信
问题
希望PHP与Apache请求进程的其他部分通信。这包括在access_log中设置变量
解决方案
使用apache_note()
获得
$session = apache_note('session')
设置值
apache_note('session',$session);
Apache处理来自客户端的请求时,会经过一系列步骤,PHP只是这一系列步骤中的一环。Apache还要重新映射url,认证用户,记录请求等。处理一个请求是,每个处理程序可以访问一组键/值对。
将会话ID增加到notes表
appache_note('session_id',session_id());
8.18将移动浏览器重定向到专门为移动设备优化的网站
get_browser()函数会检查这个环境变量,并与一个外部浏览器功能文件中流出的浏览器进行比较。由于许可证问题,PHP未提供浏览器功能文件。可以从browscap得到浏览器功能文件。。
在php.ini
browscap=usr/local/lib/php_browscap.ini
网友评论