PHP面试题之四 (高级部分)--- 2021-09-16

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的区别?
COOKIE保存在客户端,而SESSION则保存服务器端。
从安全性的角度来讲,SESSION的安全性要高。
从保存内容的类型的角度来讲,COOKIE只保存字符串(及能够自动转换成字符串),而session则可以保存所有的数据类型。
从保存内容的大小的角度来讲,COOKIE保存的内容是有限制的,比较小,而SESSION基本上没有这个限制。
从性能的角度来讲,用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_maxlifetime、gc_probability和gc_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

2.你用什么方法检查PHP脚本的执行效率(通常是脚本执行时间)和数据库SQL的效率(通常是数据库Query时间),并定位和分析脚本执行和数据库查询的瓶颈所在?(腾讯)
脚本执行时间,启用xdebug,使用WinCacheGrind分析。
数据库查询,mysql使用EXPLAIN分析查询,启用slow query log记录慢查询。

3.对于大流量的网站,您采用什么样的方法来解决访问量问题?
确认服务器硬件能否支持当前的流量
对于普通的pc server来说,它能够独立支持每天10万个独立ip访问,如果访问量过大,最好更好性能更高的专用服务器。
优化数据库的访问服务器的负载过大,一个重要的原因就是CPU和内存负载过高,而读写数据在这块占据较多的资源。可以从页面静态化、memcache缓存和mysql优化几个方面着手。
禁止外部盗链
占用较大的流量,防盗链,使用reference来判断一下。如果是图片的话,使用添加水印即可很好的防止。
控制大文件的下载
最好把文件下载的容量控制为相对较小的一个值,如果有大文件下载,最好使用专用的服务器。
使用多台主机实现分流,集群
使用流量分析软件进行分析统计谷歌和百度

6.请举例说明在你的开发过程中用什么方法来加快页面的加载速度。
要用到服务器资源时才打开,及时关闭服务器资源,数据库添加索引,页面可生成静态,图片等大文件单独服务器,使用代码优化工具等。
16.把一篇英文文档中所有单词的首字母转为大写,文档存在doc.txt中。可以在多种编程语言中选择(C\C++,JAVA,PHP...)写出你的思路,尽量优化你的程序。(百度)
str=file_get_contents('doc.txt');str=ucwords(str); file_put_contents('doc.txt',str);
17.防止SQL注射漏洞一般用_____函数
addslashes
19.请问cgi和fastcgi有什么不同,你在什么情况下会选择哪个?(酷讯)
原理一样,都是利用标准输入输出流处理HTTP之类的文本协议,都是通过多进程模式处理多请求。不同之处在于FastCGI的一个进程处理完一个请求之后重置状态并挂起,待下一个请求来时继续处理;而CGI的一个进程则处理完一个请求后退出,下一个请求来时再创建新进程。
21.列举web开发中的安全性问题
sql注入攻击。
数据库操作安全,UPDATE、DELETE、INSERT的操作没有限制用户操作权限,这将是一件很危险的事情。
没有验证用户http请求的方式POST或者GET,GET请求被合法通过。
没有验证表单来源的唯一性,不能识别是合法的表单提交还是黑客伪造的表单提交。
XSS攻击。

[!]22.如何通过php程序防止外部页面提交表单?编写一段代码

<?php
    session_start();
    if(isset($_POST['name'])&&!empty($_POST['name'])){
        if($_POST['check']==$_SESSION['check']){
            echo'正常访问';
            }else{
            echo'外部访问';
        }
    }
    $token=md5(uniqid(rand(),true));
    $_SESSION['check']=$token;
?>
<form method="post"action="">
<input type="text"name="name">
<input type="hidden"name="check"value="<?php echo$token;?>">
<input type="submit">
</form>

25.请简述操作系统的线程与进程的区别。列举LINUX下面你使用过的软件?
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
线程是进程的一个实体是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
Linux下常用软件,vim,emacs,tar,openoffice,putty,wget,links,ssh等。

26.用户在网站表单提交数据的时候,为了防止脚本攻击(比如用户输入<script>alert(111);</script>),php端接收数据的时候,应该如何处理?
可以对用户输入数据进行转义,如htmlspecialchars($_POST[‘title’]);

[!!!]27.使用过Memcache缓存吗,如果使用过,能够简单的描述一下它的工作原理吗?
Memcahce是把所有的数据保存在内存当中,采用hash表的方式,每条数据由key和value组成,每个key是独一无二的,当要访问某个值的时候先按照找到值,然后返回结果。
Memcahce采用LRU算法来逐渐把过期数据清除掉。
31.什么是Ajax?Ajax的原理是什么?Ajax的核心技术是什么?Ajax的优缺点是什么?
Ajax是Asynchronous JavaScript and XML的缩写,是JavaScript、XML、CSS、DOM等多个技术的组合。
Ajax的工作原理是一个页面的指定位置可以加载另一个页面所有的输出内容,这样就实现了一个静态页面也能获取到数据库中的返回数据信息了。所以Ajax技术实现了一个静态网页在不刷新整个页面的情况下与服务器通信,减少了用户等待时间,同时也从而降低了网络流量,增强了客户体验的友好程度。
Ajax的核心技术是XMLHttpRequest,它是JavaScript中的一个对象。
Ajax的优点是:
(1).减轻了服务器端负担,将一部分以前由服务器负担的工作转移到客户端执行,利用客户端闲置的资源进行处理;
(2).在只局部刷新的情况下更新页面,增加了页面反应速度,使用户体验更友好。
Ajax的缺点是不利于SEO推广优化,因为搜索引擎无法直接访问到Ajax请求的内容。

32.请用PHP实现一个函数,将一个2进制数的无符号非负电位字符串非浮点字符串转成一个10进制数,返回该10进制数。不许使用BIN等系统内置函数(嘀嗒团)
题目意思有些模糊,题目本意可能是将一个无符号的2进制字符串转成10进制数,如'10100010',应该得到10100010的十进制表示162。

<?php
function bin2dec(bin){temp = strrev(bin);result = 0;
for (i=0,len = strlen(temp);i < len;i++) {
result += pow(2,i) * temp[i];
}
return $result;
}

$a = '10100010';
echo bin2dec($a);//结果162

?>
33.请使用PHP设计一个函数,对学生英语考试得分从高到低排序,输入时所有学生的学号和考试得分,返回排好序的考试得分和对应学生的学号。考试满分为100,得分可能会有小数,由于考试评分要求,小数位只会是0或0.5
要求:
请不要使用qsort等系统内置排序函数
请使用你认为最快最优的方法实现该函数并使排序的性能最高。(嘀嗒团)

<?php
// 快速排序实现
function array_sort(&arr,left,right){ if (left < right) {pivot = arr[left];
low =left;
high =right;

        while ($low < $high) {
            while ($low < $high && $arr[$high]['score'] >= $pivot['score']) {
                $high--;
            }
            $arr[$low] = $arr[$high];
            while ($low < $high && $arr[$low]['score'] <= $pivot['score']) {
                $low++;
            }
        }
        $arr[$low] = $pivot;
        array_sort($arr,$left,$low-1);
        array_sort($arr,$low+1,$right);
    }
}

$english = array(
        array('sid'=>1,'score'=>76),
        array('sid'=>2,'score'=>93),
        array('sid'=>3,'score'=>68.5),
        array('sid'=>4,'score'=>82.5),

    );
$left = 0;
$right = count($english) - 1;
array_sort($english,$left,$right);

print_r($english);

?>
34.需要设置一个有效期为31天,的memcach值,请补充下面的代码(奇矩互动)
<?php
memcache_obj=new memcachememcache_obj->connect(‘memcache_host,11211’);
$memcache_obj->set(‘varKey’,’varValue’,0,____);
?>
time()+36002431

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容