php面试题之三——PHP网络编程(高级部分)

三、PHP网络编程

[!!!]1.禁用COOKIE后SEESION还能用吗?(51.com笔试题)

可以,COOKIE和SESSION都是用来实现会话机制的,由于http协议是无状态的,所以要想跟踪一个用户在同一个网站之间不同页面的状态,需要有这么一个机制----会话机制。
COOKIE:将会话信息的保存到浏览器端。
SESSION:将会话信息保存到服务器端。

SESSION默认情况下是基于COOKIE的,对于SESSION来说,每生成一个SESSIONID,都会将其发送到浏览器端,让后将其保存到cookie当中。
如果禁用了COOKIE,则基于COOKIE的SESSION不好使了,我们可以使用get,传递SID,或者直接开启透明的SID(此时需要关闭基于cookie的SESSION配置项)。

[!!!]相关题目:SESSION与COOKIE的区别?
  1. COOKIE保存在客户端,而SESSION则保存服务器端。
  2. 从安全性的角度来讲,SESSION的安全性要高。
  3. 从保存内容的类型的角度来讲,COOKIE只保存字符串(及能够自动转换成字符串),而session则可以保存所有的数据类型。
  4. 从保存内容的大小的角度来讲,COOKIE保存的内容是有限制的,比较小,而SESSION基本上没有这个限制。
  5. 从性能的角度来讲,用SESSION的话,对服务器的压力会更大一些。
2.请使用socket相关函数(非curl)实现如下功能:构造一个post请求,发送到指定httpserver的指定端口的指定请求路径(如http://www.example.com:8080/test)。请求中包含以下变量:

用户名(username):温柔一刀
密码(pwd):&123=321&321=123&
个人简介(intro):Hello world!
且该http server需要以下cookie来进行简单的用户动作跟踪:
cur_query:you&me
last_tm:...(上次请求的unix时间戳,定为当前请求时间前10分钟)
cur_tm:...(当前请求的unix时间戳)
设置超时为10秒,发出请求后,将http server的响应内容输出(腾讯)

参考代码:

<?php
if($fp = fsockopen('localhost','80')){
//连接成功
$request_data="POST/2.php HTTP/1.1"."\r\n";//请求行
$request_data.="Host:localhost"."\r\n";//host头信息
$request_data.="User-Agent:Mozilla/5.0(compatible;MSIE 9.0;Windows NT 6.1;Trident/5.0)"."\r\n";//host头信息 $request_content="username=".urlencode('温柔一刀')
."&pwd=".urlencode('&123=321&321=123&')
."&intro=".urlencode("Hello world!"); $request_data.="Content-Type:application/x-www-form-urlencoded"."\r\n";
$request_data.="Content-Length:".strlen($request_content)."\r\n";
$cur_query=urlencode("you&me"); $last_tm=time()-10*60;
$cur_tm=time();
$request_data.="Cookie:cur_query=$cur_query;last_tm=$last_tm;cur_tm=$cur_tm"."\r\n";
$request_data.="\r\n";//请求头信息结束时的空行 //请求主体数据部分
$request_data.=$request_content;
//利用建立好的通道,将数据发送过去
fwrite($fp,$request_data);//写入数据(发送数据) //读取数据
while(!feof($fp)){//判断是否没有到文件末尾
$resp_data=fgets($fp);
echo$resp_data.'<br>';
}
}
?>
3.在HTTP 1.0中,状态码401的含义是________;如果返回“找不到文件”的提示,则可用header函数,其语句为__________;

未经授权:访问由于凭据无效被拒绝
header("HTTP/1.0 404 Not Found")

[!!]4.如何修改SESSION的生存时间?

要注意这里的生存时间指的是什么?
由于session默认是基于cookie的,也就是说使用session会话技术,首先是将session数据保存到服务器端,其次会将sessionID保存到浏览器端,保存在服务器端的session文件生命周期由php.ini中的session.gc_maxlifetimegc_probabilitygc_divisor来决定,而保存在客户端的sessionID由客户端cookie来决定。
默认其生存周期直到浏览器关闭,它也可以通过php.ini中的设置session.cookie_lifetime来控制,二者共同来决定session的生存时间,二者中的其中任意一个失效了,就会造成session失效,要根据自己的需求来决定是要从哪方面来修改其生存时间。

参考1:将php.ini中的session.gc_maxlifetime设置为9999重启apache
参考2:

$savePath="./session_save_dir/";
$lifeTime=小时*秒;
session_save_path($savePath);
session_set_cookie_params($lifeTime);
session_start();

参考3:

session_start();
$lifeTime=24*3600;//保存一天
setcookie(session_name(),session_id(),time()+$lifeTime,"/");
5.How can you get round the stateless nature of HTTP using PHP?(Yahoo)

最主要的两个选择是SESSION和COOKIE。使用SESSION的方法是在每一页的开始加session_start(),然后利用$_SESSION来存取SESSION变量。至于COOKIE你只需记着一个原则:在输出任何文字之前调用set_cookie()函数设置COOKIE,使用$_COOKIE获取COOKIE变量。

6.PHP程序中如何设置当前页面的编码为utf-8?

header(“content-type:text/html;charset=utf-8”);

7.如何设置一个cookie的名字为username,值为jack,并且让此cookie一周后失效?

setcookie(‘username’,’jack’,time()+7243600);

[!!]8.一个浏览器最多可以产生多少个cookie,每个cookie文件最大不能超过多少?

cookie的总数量没有限制,但是每个域名的COOKIE数量和每个COOKIE的大小是有限制的!
IE每个域名限制为50个。
Firefox每个域名cookie限制为50个。
Opera每个域名cookie限制为30个。
Safari/webkit貌似没有cookie限制。但是假如cookie很多,则会使header大小超过服务器的处理的限制,会导致错误发生。

不同浏览器间每个cookie文件大小也不同
Firefox和safari是4097个字节,包括名(name)、值(value)和等号。
Opera是4096个字节,包括:名(name)、值(value)和等号。
IE是4095个字节,包括:名(name)、值(value)和等号。

9.设置或读取session之前,需要做什么?

session_start()前面不能有任何输出,包括空行。

相关题目:使用setcookie函数前,需要注意什么?

前面不能有任何输出,包括空行。

10.请描述出七层网络模型的名称,由下到上(可以使用中文描述)

物理层、数据链路层、网络层、传输层、会话层、表示层、应用层

11.说说下面这些这些协议的全称和中文解释(提示:都是工作在应用层)SMTP、POP3、HTTP、FTP、DNS(小米)

SMTP(Simple Mail Transfer Protocol)简单邮件传输协议
POP3(Post Office Protocol 3)邮局协议第3版
HTTP(Hypertext Transfer Protocol)超文本传输协议
FTP(File Transfer Protocol)文件传输协议
DNS(Domain Name System and Domain Name Service protocol)域名系统(服务)协议

[!!]12.COOKIE、SESSION的联系和区别,多台web服务器如何共享SESSION?

COOKIE和SESSION都是用于会话机制,COOKIE保存在客户端,而SESSION则保存在服务器端。
在默认情况下,SESSION机制是基于COOKIE的,每生成一个SESSIONID,都会将其发送到浏览器端,让后将其保存到COOKIE当中,在下次请求的时候,由浏览器携带这个COOKIE。
要想多台web服务器共享SESSION,可以利用MySQL数据库存储SESSION数据。

13.HTTP/1.0中,状态码200 301 304 403 404 500的含义(小米)

200 OK服务器成功处理了请求
301 Moved Permanently(重定向)请求的URL已移走
304 Not Modified(未修改)客户的缓存资源是最新的,要客户端使用缓存
403 Forbidden(禁止)请求被服务器拒绝了
404 Not Found未找到资源
Internal Server Error(内部服务器错误)服务器遇到一个错误,使其无法为请求提供服务

[!!!]14.请描述PHP(或其他语言)Session的运行机制,大型网站中Session方面应注意什么?(小米)

session机制是一种服务器端的机制,它将数据保存到服务器端。
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识,称为sessionid,如果已包含一个sessionid则说明以前已经为此客户端创建过session,服务器就按照sessionid把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含sessionid,则为此客户端创建一个session并且生成一个与此session相关联的sessionid,sessionid的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个sessionid将被在本次响应中返回给客户端以cookie的形式保存。

session在大访问量网站上确实影响系统性能,影响性能的原因之一由文件系统设计造成,在同一个目录下超过10000个文件时,文件的定位将非常耗时。另外就是小文件的效率问题,一般我们的session数据都不会太大(1~2K),如果有大量这样1~2K的文件在磁盘上,IO效率肯定会很差,我们可以采用改写session存储机制,比如存放到数据库中。

15.在子网掩码为255.255.255.248的局域网中能够同时使用的IP有多少个?(亿邮)

6个,255.255.255.248换算成二进制就是11111111.11111111.11111111.11111000
后面的三位用来表示主机,前面的29位用来表示网络。
三位表示主机,就是可以用来表示2^3=8个,再减去网络地址和广播地址,就是6个了。

16.简述Tcp协议的三次握手过程。(亿邮)

TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据。

17.你会用哪个函数设置当前内容的Content-Type?(卓望)

header函数

18.通过页面输入用户名abc和密码123登录到www.10086.cn,请写出该次请求的HTTP协议报文(包括请求行、消息报头、请求正文)。(卓望)
POST www.10086.cn HTTP/1.1
Accept:text/html,application/xhtml+xml,*/*
Referer:http://localhost/a.html
Accept-Language:zh-CN
User-Agent:Mozilla/5.0(compatible;MSIE 10.0;Windows NT 6.1;WOW64;Trident/6.0;
KB974487)
Content-Type:application/x-www-form-urlencoded
Accept-Encoding:gzip,deflate
Host:localhost
Content-Length:25
Connection:Keep-Alive username=abc&password=123

php网络编程的更多相关文章

  1. 猫哥网络编程系列:HTTP PEM 万能调试法

    注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...

  2. python select网络编程详细介绍

    刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...

  3. Linux Socket 网络编程

    Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...

  4. 猫哥网络编程系列:详解 BAT 面试题

    从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...

  5. 浅谈C#网络编程(一)

    阅读目录: 基础 Socket编程 多线程并发 阻塞式同步IO 基础 在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践. Socket是一种网络编程接口,它是对传输层T ...

  6. C++11网络编程

    Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...

  7. Java - 网络编程

    Java的网络编程学习,关于计算机基础的学习参考:计算机网络基础学习 - sqh.     参考:  

  8. Linux网络编程-IO复用技术

    IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了.Linux中,提 ...

  9. Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  10. iOS网络编程

    今天的重点是UIWebView.NSURLSession.JSon. 网络编程联网准备:1.在Info.plist中添加AppTransportSecurity类型Dictionary:2.在AppT ...

随机推荐

  1. wildfly jboss deploy 报 拒绝访问

    用maven clean package wildfly:deploy 部署war,不时报拒绝访问.有时重启wildfly即可.有时需要在standalone.xml中删除war部署: <dep ...

  2. Mysql学习笔记(四)聊聊数据库索引

    小心情(可直接跳到分割线后) 今天心情好些了.一些浓的化不开的坏情绪,也渐渐的在晚上解决掉一个复杂的逻辑问题后,渐渐消散了. 今天中午去吃饭的时候,坤哥漫不经心的说:'我这么多年终于悟出了一个道理,人 ...

  3. NSNotificationCenter(通知)与Key-Value Coding (KVC)与Key-Value Observing (KVO)

    NSNotificationCenter //下面是不同类中需要实现的代码 1.[[NSNotificationCenter defaultCenter] addObserver:self selec ...

  4. 兼容ie6及一下版本的自适应

    <meta http-equiv="X-UA-Compatible" content="IE=edge,Chrome=1" /> <meta ...

  5. MyISAM 和InnoDB 区别 转

    MyISAM 和InnoDB 讲解 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处理 ...

  6. can not import Flask错误

    在学习flask官方文档——应用构建代码时,遇到了一个小问题照例子敲好代码以后出现了can not import  Flask错误,思考很久也没有解决,最后发现是因为应用模块和flask重名了.下面是 ...

  7. Java关键字——throws和throw

    throws关键字 在定义一个方法时,可以使用throws关键字声明,使用throws声明的方法表示此方法不处理异常,而交给方法的调用处进行处理. 使用了throws关键字,表示不管是否会有异常,在调 ...

  8. [Redis]如何通过Powershell创建Redis服务

    目前Redis在中国上线了,不过只是预览版而且不能通过Portal进行操作,不过可以通过Powershell创建,具体如下: 下载最新的Powershell SDK:http://www.window ...

  9. Construct Bounding Sphere

    点集的包围球 http://en.wikipedia.org/wiki/Bounding_sphere http://blogs.agi.com/insight3d/index.php/2008/02 ...

  10. 几个有用的jQuery代码片段

    1.检测Internet Explorer版本 $(document).ready(function() { if (navigator.userAgent.match(/msie/i) ){ ale ...