枯痕个人博客
立即登录 马上注册
当前位置: 大后端 > PHP > PHP面试题整理(基础1)
前言:由于以前看过很多很多面试题,但是大多数看过以后记忆一段时间,有一些稀奇八怪的东西不经常使用便会忘记,不妨咱就简单记录一下下喽!!!

1. 请说明 PHP 中传值与传引用的区别。什么时候传值什么时候传引用?

按值传递:函数范围内对值的任何改变在函数外部都会被忽略

按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改

优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。

 

2.在PHP中error_reporting这个函数有什么作用?

设置 PHP 的报错级别并返回当前级别。


1
2
3
4
5
6
7
8
9
请用正则表达式(Regular Expression)写一个函数验证电子邮件的格式是否正确。
if(isset($_POST['action']) && $_POST['action']==’submitted’){
 $email=$_POST['email'];
 if(!preg_match(“/^[0-9a-zA-Z-]+@[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+){1,3}$/”,$email)){
  echo “电子邮件检测失败”;
 }else{
  echo “电子邮件检测成功”;
 }
}

3.PHP session扩展默认将session数据储存在哪里? D

A) SQLite Database

B) MySQL Database

C) Shared Memory

D) File System

E) Session Server

 

4.如果你想要自动加载类,下面哪种函数声明是正确的 C

A) function autoload($class_name)

B) function __autoload($class_name, $file)

C) function __autoload($class_name)

D) function _autoload($class_name)

E) function autoload($class_name, $file)

5.你所知道的php数组相关的函数?

array()----创建数组

array_combine()----通过合并两个数组来创建一个新数组

range()----创建并返回一个包含指定范围的元素的数组

compact()----建立一个数组

array_chunk()----将一个数组分割成多个

array_merge()----把两个或多个数组合并成一个数组

array_slice()----在数组中根据条件取出一段值

array_diff()----返回两个数组的差集数组

array_intersect()----计算数组的交集

array_search()----在数组中搜索给定的值

array_splice()----移除数组的一部分且替代它

array_key_exists()----判断某个数组中是否存在指定的key

shuffle()----把数组中的元素按随机顺序重新排列

array_flip()----交换数组中的键和值

array_reverse()----将原数组中的元素顺序翻转,创建新的数组并返回

array_unique()----移除数组中重复的值

6.php读取文件内容的几种方法和函数?

打开文件,然后读取。Fopen() fread()

打开读取一次完成 file_get_contents()

7.你所知道的设计模式有哪些?

工厂模式、策略模式、单元素模式、观察者模式、命令链模式

8.面向对象中接口和抽象类的区别及应用场景?

1、有抽象方法的类叫做抽象类,抽象类中不一定只有抽象方法,抽象方法必须使用abstract关键字定义。

2、接口中全部是抽象方法,方法不用使用abstract定义。

3、当多个同类的类要设计一个上层,通常设计为抽象类,当多个异构的类要设计一个上层,通常设计为接口。

9.用面向对象来实现A对象继承B和C对象

Interface B{ ... }

Interface C{ ... }

Class A implements B,C{ ... }

10.对于大流量的网站,您采用什么样的方法来解决访问量问题?

优化程序,优化数据库,如果程序和数据库已经最优化,使用以下解决方法:

1、确定当前服务器设备是否满足流量需求。

2、使用Memcache缓存技术,把动态内容缓存到文件中,动态网页直接调用这些文件,而不必再访问数据库。

3、禁止外部盗链,图片和文件外部盗链会给服务器带来大量的负载压力,可以通过refer来禁止外部盗链,或者使用apache来配置禁止盗链。

4、控制大文件的下载,大文件的下载对于非SCSI硬盘来说会占用大量的资源,导致服务器的响应能力下降。

5、使用不同的主机分流主要流量,使服务器均衡负载。

6、使用流量统计软件统计分析网站流量,可以知道哪些地方耗费了大量的流量,哪些页面需要再进行优化。

11.实现中文字串截取无乱码的方法

Mb_substr();

12.用PHP写出显示客户端IP与服务器IP的代码

获取客户端IP:$_SERVER(“REMOTE_ADDR”);

获取服务器端IP:$_SERVER["SERVER_ADDR"];

13.写几个魔术方法并说明作用?

__call()当调用不存在的方法时会自动调用的方法

__autoload()在实例化一个尚未被定义的类是会自动调用次方法来加载类文件

__set()当给未定义的变量赋值时会自动调用的方法

__get()当获取未定义变量的值时会自动调用的方法

__construct()构造方法,实例化类时自动调用的方法

__destroy()销毁对象时自动调用的方法

__unset()当对一个未定义变量调用unset()时自动调用的方法

__isset()当对一个未定义变量调用isset()方法时自动调用的方法

__clone()克隆一个对象

__tostring()当输出一个对象时自动调用的方法

14.$_REQUEST、$_POST、$_GET、$_COOKIE、$_SESSION、$_FILES的意思是什么?

它们都是PHP预定义变量

$_REQUEST用来获取post或get方式提交的值

$_POST用来获取post方式提交的值

$_GET用来获取get方式提交的值

$_COOKIE用来获取cookie存储的值

$_SESSION用来获取session存储的值

$_FILES用来获取上传文件表单的值

15.++i和i++哪一个效率高,为什么?

++i效率比i++的效率更高,因为++i少了一个返回i的过程。

16.框架中什么是单一入口和多入口,单一入口的优缺点?

1、多入口就是通过访问不同的文件来完成用户请求。

单一入口指web程序所有的请求都指向一个脚本文件的。

2、单一入口更容易控制权限,方便对http请求可以进行安全性检查。

缺点:URL看起来不那么美观,特别是对搜索引擎来说不友好。

17.include与require的区别?

1.include()在执行文件时每次都要进行读取和评估

require()文件只处理一次(实际上文件内容替换了require()语句)

2.require()通常放在PHP脚本程序的最前面

include()的使用和require()一样,一般放在流程控制的处理区段中,PHP脚本文件读到include()语句时,才将它包含的文件读进来,这种方式,可以把程序执行时的流程简单化

3,require()和include()语句是语言结构,不是真正的函数,可以像PHP的其他语言结构一样

4,include_once()和require_once()语句也是在脚本执行期间包括并运行指定文件,与include()require()唯一的区别是如果文件中的代码已经被包括了,则不会再次包括.

5,require()包含文件失败,停止执行,给出错误(致命的)

include()常用于动态包含.

通常是自动加载的文件,即使加载出错,整个程序还是继续执行

一个页面声明,另一个页面调用

包函文件失败,继续向下执行,返回一条警告

 

 语句include和require的区别是什么?为避免多次包含同一个文件,可用那个语句代替他们?

答:require()和include()语句都是语言结构,不是真正的函数,可以像PHP的其他的语言结构一样。他们最根本的区别在于处理错误的方式不一样。

require()包含文件失败,停止执行,给出错误(致命的)。

include()常用于动态包含,通常是自动加载的文件,即使加载错误,程序也不会中断,而是继续执行,并显示一个错误。

Include_once()和require_once()语句也是在脚本执行期间包括运行指定文件, 与include()、require()唯一的区别是如果文件中的代码已经被包括了,则不会再次包括。

 

 

18.PHP字符串中单引号与双引号的区别?

单引号不能解释变量,而双引号可以解释变量。

单引号不能转义字符,在双引号中可以转义字符。

19.

写出以下php代码的运行结果:
<?php
function foo($i) {
$i++;
echo $i ;
}

function bar(&$i) {

}
$i = 10 ;
echo $i++ , ++$i; 输出:10,12
foo($i); 输出:13
bar($i); 输出:无输出

 

20.了解XSS攻击吗? 如何防止 ?

XSS是跨站脚本攻击,首先是利用跨站脚本漏洞以一个特权模式去执行攻击者构造的脚本,然后利用不安全的Activex控件执行恶意的行为。

使用htmlspecialchars()函数对提交的内容进行过滤,使字符串里面的特殊符号实体化。

21.SQL注入漏洞产生的原因 ? 如何防止?

SQL注入产生的原因:程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。

防止SQL注入:

1、开启配置文件中的magic_quotes_gpc和magic_quotes_runtime设置

2、执行sql语句使用addslashes进行sql语句转换

3、Sql语句书写尽量不要省略小引号和单引号

4、过滤掉sql语句中的一些关键字:update、insert、delete、select、*

5、提高数据库表和字段的命名技巧,对一些重要的字段根据程序的特点命名,取不易被猜到的。

6、Php配置文件中设置register_globals为off,关闭全局变量注册

7、控制错误信息,不要再浏览器上输出错误信息,将错误信息写到日志文件中。

一个字节占多少bit ? 一个IPv4地址占几个字节? 一个IPv6地址呢?

一个字节占8bit,一个IPV4占用4字节,一个IPV6占用16字节。

22. 什么事面向对象?主要特征是什么?

面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰。主要特征:封装、继承、多态。

我的官方群点击此处

23. SESSION 与 COOKIE的区别是什么,请从协议,产生的原因与作用说明?

1、http无状态协议,不能区分用户是否是从同一个网站上来的,同一个用户请求不同的页面不能看做是同一个用户。

2、SESSION存储在服务器端,COOKIE保存在客户端。Session比较安全,cookie用某些手段可以修改,不安全。Session依赖于cookie进行传递。

禁用cookie后,session不能正常使用。Session的缺点:保存在服务器端,每次读取都从服务器进行读取,对服务器有资源消耗。Session保存在服务器端的文件或数据库中,默认保存在文件中,文件路径由php配置文件的session.save_path指定。Session文件是公有的。

24. HTTP 状态中302、403、 500代码含义?

一二三四五原则: 一. 消息系列 二 成功系列 三. 重定向系列 四. 请求错误系列 五. 服务器端错误系列

302:临时转移成功,请求的内容已转移到新位置 403:禁止访问 500:服务器内部错误 401代表未授权。

状态码 含义
100 客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。服务器必须在请求完成后向客户端发送一个最终响应。
101 服务器已经理解了客户端的请求,并将通过Upgrade 消息头通知客户端采用不同的协议来完成这个请求。在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。   只有在切换新的协议更有好处的时候才应该采取类似措施。例如,切换到新的HTTP 版本比旧版本更有优势,或者切换到一个实时且同步的协议以传送利用此类特性的资源。
102 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。
200 请求已成功,请求所希望的响应头或数据体将随此响应返回。
201 请求已经被实现,而且有一个新的资源已经依据请求的需要而建立,且其 URI 已经随Location 头信息返回。假如需要的资源无法及时建立的话,应当返回 '202 Accepted'。
202 服务器已接受请求,但尚未处理。正如它可能被拒绝一样,最终该请求可能会也可能不会被执行。在异步操作的场合下,没有比发送这个状态码更方便的做法了。   返回202状态码的响应的目的是允许服务器接受其他过程的请求(例如某个每天只执行一次的基于批处理的操作),而不必让客户端一直保持与服务器的连接直到批处理操作全部完成。在接受请求处理并返回202状态码的响应应当在返回的实体中包含一些指示处理当前状态的信息,以及指向处理状态监视器或状态预测的指针,以便用户能够估计操作是否已经完成。
203 服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝。当前的信息可能是原始版本的子集或者超集。例如,包含资源的元数据可能导致原始服务器知道元信息的超级。使用此状态码不是必须的,而且只有在响应不使用此状态码便会返回200 OK的情况下才是合适的。
204 服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息。响应可能通过实体头部的形式,返回新的或更新后的元信息。如果存在这些头部信息,则应当与所请求的变量相呼应。   如果客户端是浏览器的话,那么用户浏览器应保留发送了该请求的页面,而不产生任何文档视图上的变化,即使按照规范新的或更新后的元信息应当被应用到用户浏览器活动视图中的文档。   由于204响应被禁止包含任何消息体,因此它始终以消息头后的第一个空行结尾。
205 服务器成功处理了请求,且没有返回任何内容。但是与204响应不同,返回此状态码的响应要求请求者重置文档视图。该响应主要是被用于接受用户输入后,立即重置表单,以便用户能够轻松地开始另一次输入。   与204响应一样,该响应也被禁止包含任何消息体,且以消息头后的第一个空行结束。
206 服务器已经成功处理了部分 GET 请求。类似于 FlashGet 或者迅雷这类的 HTTP 下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。   该请求必须包含 Range 头信息来指示客户端希望得到的内容范围,并且可能包含 If-Range 来作为请求条件。   响应必须包含如下的头部域:   Content-Range 用以指示本次响应中返回的内容的范围;如果是 Content-Type 为 multipart/byteranges 的多段下载,则每一 multipart 段中都应包含 Content-Range 域用以指示本段的内容范围。假如响应中包含 Content-Length,那么它的数值必须匹配它返回的内容范围的真实字节数。   Date   ETag 和/或 Content-Location,假如同样的请求本应该返回200响应。   Expires, Cache-Control,和/或 Vary,假如其值可能与之前相同变量的其他响应对应的值不同的话。   假如本响应请求使用了 If-Range 强缓存验证,那么本次响应不应该包含其他实体头;假如本响应的请求使用了 If-Range 弱缓存验证,那么本次响应禁止包含其他实体头;这避免了缓存的实体内容和更新了的实体头信息之间的不一致。否则,本响应就应当包含所有本应该返回200响应中应当返回的所有实体头部域。   假如 ETag 或 Last-Modified 头部不能精确匹配的话,则客户端缓存应禁止将206响应返回的内容与之前任何缓存过的内容组合在一起。   任何不支持 Range 以及 Content-Range 头的缓存都禁止缓存206响应返回的内容。
207 由WebDAV(RFC 2518)扩展的状态码,代表之后的消息体将是一个XML消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码。
300 被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息。用户或浏览器能够自行选择一个首选的地址进行重定向。   除非这是一个 HEAD 请求,否则该响应应当包括一个资源特性及地址的列表的实体,以便用户或浏览器从中选择最合适的重定向地址。这个实体的格式由 Content-Type 定义的格式所决定。浏览器可能根据响应的格式以及浏览器自身能力,自动作出最合适的选择。当然,RFC 2616规范并没有规定这样的自动选择该如何进行。   如果服务器本身已经有了首选的回馈选择,那么在 Location 中应当指明这个回馈的 URI;浏览器可能会将这个 Location 值作为自动重定向的地址。此外,除非额外指定,否则这个响应也是可缓存的。
301 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。   新的永久性的 URI 应当在响应的 Location 域中返回。除非这是一个 HEAD 请求,否则响应的实体中应当包含指向新的 URI 的超链接及简短说明。   如果这不是一个 GET 或者 HEAD 请求,因此浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。   注意:对于某些使用 HTTP/1.0 协议的浏览器,当它们发送的 POST 请求得到了一个301响应的话,接下来的重定向请求将会变成 GET 方式。
302 请求的资源现在临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。   新的临时性的 URI 应当在响应的 Location 域中返回。除非这是一个 HEAD 请求,否则响应的实体中应当包含指向新的 URI 的超链接及简短说明。   如果这不是一个 GET 或者 HEAD 请求,那么浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。   注意:虽然RFC 1945和RFC 2068规范不允许客户端在重定向时改变请求的方法,但是很多现存的浏览器将302响应视作为303响应,并且使用 GET 方式访问在 Location 中规定的 URI,而无视原先请求的方法。状态码303和307被添加了进来,用以明确服务器期待客户端进行何种反应。
303 对应当前请求的响应可以在另一个 URI 上被找到,而且客户端应当采用 GET 的方式访问那个资源。这个方法的存在主要是为了允许由脚本激活的POST请求输出重定向到一个新的资源。这个新的 URI 不是原始资源的替代引用。同时,303响应禁止被缓存。当然,第二个请求(重定向)可能被缓存。   新的 URI 应当在响应的 Location 域中返回。除非这是一个 HEAD 请求,否则响应的实体中应当包含指向新的 URI 的超链接及简短说明。   注意:许多 HTTP/1.1 版以前的 浏览器不能正确理解303状态。如果需要考虑与这些浏览器之间的互动,302状态码应该可以胜任,因为大多数的浏览器处理302响应时的方式恰恰就是上述规范要求客户端处理303响应时应当做的。
304 如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304响应禁止包含消息体,因此始终以消息头后的第一个空行结尾。   该响应必须包含以下的头信息:   Date,除非这个服务器没有时钟。假如没有时钟的服务器也遵守这些规则,那么代理服务器以及客户端可以自行将 Date 字段添加到接收到的响应头中去(正如RFC 2068中规定的一样),缓存机制将会正常工作。   ETag 和/或 Content-Location,假如同样的请求本应返回200响应。   Expires, Cache-Control,和/或Vary,假如其值可能与之前相同变量的其他响应对应的值不同的话。   假如本响应请求使用了强缓存验证,那么本次响应不应该包含其他实体头;否则(例如,某个带条件的 GET 请求使用了弱缓存验证),本次响应禁止包含其他实体头;这避免了缓存了的实体内容和更新了的实体头信息之间的不一致。   假如某个304响应指明了当前某个实体没有缓存,那么缓存系统必须忽视这个响应,并且重复发送不包含限制条件的请求。   假如接收到一个要求更新某个缓存条目的304响应,那么缓存系统必须更新整个条目以反映所有在响应中被更新的字段的值。
305 被请求的资源必须通过指定的代理才能被访问。Location 域中将给出指定的代理所在的 URI 信息,接收者需要重复发送一个单独的请求,通过这个代理才能访问相应资源。只有原始服务器才能建立305响应。   注意:RFC 2068中没有明确305响应是为了重定向一个单独的请求,而且只能被原始服务器建立。忽视这些限制可能导致严重的安全后果。
306 在最新版的规范中,306状态码已经不再被使用。
307 请求的资源现在临时从不同的URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。   新的临时性的URI 应当在响应的 Location 域中返回。除非这是一个HEAD 请求,否则响应的实体中应当包含指向新的URI 的超链接及简短说明。因为部分浏览器不能识别307响应,因此需要添加上述必要信息以便用户能够理解并向新的 URI 发出访问请求。   如果这不是一个GET 或者 HEAD 请求,那么浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。
400 1、语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。   2、请求参数有误。
401 当前请求需要用户验证。该响应必须包含一个适用于被请求资源的 WWW-Authenticate 信息头用以询问用户信息。客户端可以重复提交一个包含恰当的 Authorization 头信息的请求。如果当前请求已经包含了 Authorization 证书,那么401响应代表着服务器验证已经拒绝了那些证书。如果401响应包含了与前一个响应相同的身份验证询问,且浏览器已经至少尝试了一次验证,那么浏览器应当向用户展示响应中包含的实体信息,因为这个实体信息中可能包含了相关诊断信息。参见RFC 2617。
402 该状态码是为了将来可能的需求而预留的。
403 服务器已经理解请求,但是拒绝执行它。与401响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交。如果这不是一个 HEAD 请求,而且服务器希望能够讲清楚为何请求不能被执行,那么就应该在实体内描述拒绝的原因。当然服务器也可以返回一个404响应,假如它不希望让客户端获得任何信息。
404 请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。假如服务器知道情况的话,应当使用410状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可以跳转的地址。404这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。
405 请求行中指定的请求方法不能被用于请求相应的资源。该响应必须返回一个Allow 头信息用以表示出当前资源能够接受的请求方法的列表。   鉴于 PUT,DELETE 方法会对服务器上的资源进行写操作,因而绝大部分的网页服务器都不支持或者在默认配置下不允许上述请求方法,对于此类请求均会返回405错误。
406 请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体。   除非这是一个 HEAD 请求,否则该响应就应当返回一个包含可以让用户或者浏览器从中选择最合适的实体特性以及地址列表的实体。实体的格式由 Content-Type 头中定义的媒体类型决定。浏览器可以根据格式及自身能力自行作出最佳选择。但是,规范中并没有定义任何作出此类自动选择的标准。
407  与401响应类似,只不过客户端必须在代理服务器上进行身份验证。代理服务器必须返回一个 Proxy-Authenticate 用以进行身份询问。客户端可以返回一个 Proxy-Authorization 信息头用以验证。参见RFC 2617。
408 请求超时。客户端没有在服务器预备等待的时间内完成一个请求的发送。客户端可以随时再次提交这一请求而无需进行任何更改。
409 由于和被请求的资源的当前状态之间存在冲突,请求无法完成。这个代码只允许用在这样的情况下才能被使用:用户被认为能够解决冲突,并且会重新提交新的请求。该响应应当包含足够的信息以便用户发现冲突的源头。   冲突通常发生于对 PUT 请求的处理中。例如,在采用版本检查的环境下,某次 PUT 提交的对特定资源的修改请求所附带的版本信息与之前的某个(第三方)请求向冲突,那么此时服务器就应该返回一个409错误,告知用户请求无法完成。此时,响应实体中很可能会包含两个冲突版本之间的差异比较,以便用户重新提交归并以后的新版本。
410 被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址。这样的状况应当被认为是永久性的。如果可能,拥有链接编辑功能的客户端应当在获得用户许可后删除所有指向这个地址的引用。如果服务器不知道或者无法确定这个状况是否是永久的,那么就应该使用404状态码。除非额外说明,否则这个响应是可缓存的。   410响应的目的主要是帮助网站管理员维护网站,通知用户该资源已经不再可用,并且服务器拥有者希望所有指向这个资源的远端连接也被删除。这类事件在限时、增值服务中很普遍。同样,410响应也被用于通知客户端在当前服务器站点上,原本属于某个个人的资源已经不再可用。当然,是否需要把所有永久不可用的资源标记为'410 Gone',以及是否需要保持此标记多长时间,完全取决于服务器拥有者。
411 服务器拒绝在没有定义 Content-Length 头的情况下接受请求。在添加了表明请求消息体长度的有效 Content-Length 头之后,客户端可以再次提交该请求。
412 服务器在验证在请求的头字段中给出先决条件时,没能满足其中的一个或多个。这个状态码允许客户端在获取资源时在请求的元信息(请求头字段数据)中设置先决条件,以此避免该请求方法被应用到其希望的内容以外的资源上。
413 服务器拒绝处理当前请求,因为该请求提交的实体数据大小超过了服务器愿意或者能够处理的范围。此种情况下,服务器可以关闭连接以免客户端继续发送此请求。   如果这个状况是临时的,服务器应当返回一个 Retry-After 的响应头,以告知客户端可以在多少时间以后重新尝试。
414 请求的URI 长度超过了服务器能够解释的长度,因此服务器拒绝对该请求提供服务。这比较少见,通常的情况包括:   本应使用POST方法的表单提交变成了GET方法,导致查询字符串(Query String)过长。   重定向URI “黑洞”,例如每次重定向把旧的 URI 作为新的 URI 的一部分,导致在若干次重定向后 URI 超长。   客户端正在尝试利用某些服务器中存在的安全漏洞攻击服务器。这类服务器使用固定长度的缓冲读取或操作请求的 URI,当 GET 后的参数超过某个数值后,可能会产生缓冲区溢出,导致任意代码被执行[1]。没有此类漏洞的服务器,应当返回414状态码。
415 对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝。
416 如果请求中包含了 Range 请求头,并且 Range 中指定的任何数据范围都与当前资源的可用范围不重合,同时请求中又没有定义 If-Range 请求头,那么服务器就应当返回416状态码。   假如 Range 使用的是字节范围,那么这种情况就是指请求指定的所有数据范围的首字节位置都超过了当前资源的长度。服务器也应当在返回416状态码的同时,包含一个 Content-Range 实体头,用以指明当前资源的长度。这个响应也被禁止使用 multipart/byteranges 作为其 Content-Type。
417 在请求头 Expect 中指定的预期内容无法被服务器满足,或者这个服务器是一个代理服务器,它有明显的证据证明在当前路由的下一个节点上,Expect 的内容无法被满足。
421 从当前客户端所在的IP地址到服务器的连接数超过了服务器许可的最大范围。通常,这里的IP地址指的是从服务器上看到的客户端地址(比如用户的网关或者代理服务器地址)。在这种情况下,连接数的计算可能涉及到不止一个终端用户。
422 从当前客户端所在的IP地址到服务器的连接数超过了服务器许可的最大范围。通常,这里的IP地址指的是从服务器上看到的客户端地址(比如用户的网关或者代理服务器地址)。在这种情况下,连接数的计算可能涉及到不止一个终端用户。
422 请求格式正确,但是由于含有语义错误,无法响应。(RFC 4918 WebDAV)423 Locked   当前资源被锁定。(RFC 4918 WebDAV)
424 由于之前的某个请求发生的错误,导致当前请求失败,例如 PROPPATCH。(RFC 4918 WebDAV)
425 在WebDav Advanced Collections 草案中定义,但是未出现在《WebDAV 顺序集协议》(RFC 3658)中。
426 客户端应当切换到TLS/1.0。(RFC 2817)
449 由微软扩展,代表请求应当在执行完适当的操作后进行重试。
500 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器的程序码出错时出现。
501 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。
502 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
503 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。如果能够预计延迟时间,那么响应中可以包含一个 Retry-After 头用以标明这个延迟时间。如果没有给出这个 Retry-After 信息,那么客户端应当以处理500响应的方式处理它。   注意:503状态码的存在并不意味着服务器在过载的时候必须使用它。某些服务器只不过是希望拒绝客户端的连接。
504 作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应。   注意:某些代理服务器在DNS查询超时时会返回400或者500错误
505 服务器不支持,或者拒绝支持在请求中使用的 HTTP 版本。这暗示着服务器不能或不愿使用与客户端相同的版本。响应中应当包含一个描述了为何版本不被支持以及服务器支持哪些协议的实体。
506 由《透明内容协商协议》(RFC 2295)扩展,代表服务器存在内部配置错误:被请求的协商变元资源被配置为在透明内容协商中使用自己,因此在一个协商处理中不是一个合适的重点。
507 服务器无法存储完成请求所必须的内容。这个状况被认为是临时的。WebDAV (RFC 4918)
509 服务器达到带宽限制。这不是一个官方的状态码,但是仍被广泛使用。
510 获取资源所需要的策略并没有没满足。(RFC 2774)

 

25.    foo()和@foo()有什么区别?

答:foo()会在执行这个函数时,任何解释错误,语法错误,执行错误都会显示在页面上。@foo()在执行时,会隐藏解释错误,语法错误,执行错误的错误信息。

26.    strlen()与mb_strlen()的作用分别是什么?

答:strlen()返回字符串string的长度;如果string为空。则返回0。

mb_strlen():返回具有encoding编码的字符串str包含的字节数,多字节的字符被统计为1,如果给定的encoding无效则返回false。

mb前缀的函数是用来处理多字节的,一般汉语,韩语,日语中用。

27.<? echo ‘hello’ ?> 没有输出结果,可能是什么原因?

答:可能服务器上面没有开启短标签,short_open_tag设置为Off。在php.ini中设置short_open_tag=On即可。

28.  常量分为系统内置常量和自定义常量,请说出最常见的几个系统内置常量?

答: 当前PHP文件的相对路径(__FILE__),当前PHP文件中所在的行号(__LINE__)。

当前函数名,只对函数内调用起作用(__FUNCTION__)。当前类名,只对类起作用(__CLASS__)。TRUE, FALSE,M_PI,M_E。

29.  常量和变量有哪些区别?

答:

(1)常量没有$符号;

(2)常量只能是标量类型,变量的数据类型有8种原始类型;

(3)常量只能使用define()定义,不能通过赋值语句定义;

(4)常量可以在任何地方定义和使用,变量有全局和局部之分;

(5)常量一旦定义就不能被重新定义或取消定义,变量通过赋值方式重新定义。

30.页面字符出现乱码,怎么解决?

答:(1)首先考虑当前文件是不是设置了字符集。查看是不是meta标签中写了chartset,若是PHP页面还可以看看是否在设置header()函数中指定了charset,如

Header(‘content-type:text/html;charset=utf-8’);

(2)如果设置了字符集(charset),那么判断当前文件保存的编码是否跟页面设置的字符集保持一致,两者必须保持一致;

(3)如果涉及到从数据库中提取数据,那么判断数据库查询时的字符集是否跟当前设置的字符集一致,两者必须一致;

31.  PHP重定向的方法?

答:(1)header(‘location:index.php’);

(2) echo ’<script>window.location=\”$PHP_SELF\”<script>’;

(3) echo “<METAHTP-EQUIV\”Refresh\”CONTENT=\”0; URL=index.php”>”;

32.  简述PHP的常用函数

答:数组函数,sort,asort,ksort,array_num,array_values, array_keys, in_array, array_count_values, array_pop, array_push,array_shift, array_unshift。

字符串函数,substr,strlen, str_split, explode, implode, md5, strrev, trim, strtoupper,strtolower, ucwords, ucfirst。

数学函数,max,min,abs,rand,ceil,floor。

日期函数,date,strtotime,mktotime,time。

33.  打开PHP.ini中的safe_mode,会影响那些参数?

答:safe_mode,php安全模式,它提供一个基本安全的共享环境,在一个多用户账号存在的php开发的web上,当安全模式打开时,有一些函数将被完全禁止,而另外一些函数的功能将会受到限制。如:chdir,move_uploaded_file,chgrp,parse_ini_file,chown,rmdir,copy,rename,fopen,require,mkdir,unlink等。

34.$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。

  1. $_SERVER['HTTP_HOST']  请求头信息中的Host内容,获取当前域名。
  2. $_SERVER["SERVER_NAME"]  输出配置文件httpd.conf中的ServerName,一般情况下与HTTP_HOST值相同,但如果服务器端口不是默认的80端口,或者协议规范不是HTTP/1.1时,HTTP_HOST会包含这些信息,而SERVER_NAME不一定包含。(主要看配置文件的设置)。
  3. $_SERVER["HTTP_USER_AGENT"]  获取用户相关信息,包括用户浏览器、操作系统等信息。
  4. $_SERVER['HTTP_ACCEPT']  当前请求的ACCEPT头部信息。
  5. $_SERVER["HTTP_ACCEPT_LANGUAGE"]  这个值是由浏览器发送,表明用户默认的语言设置,后面的q值表示用户对该语言的喜好程度。
  6. $_SERVER["HTTP_ACCEPT_ENCODING"]  大部分的现代浏览器都支持gzip压缩,并会把这一信息报告给服务器。这时服务器就会压缩过的HTML发送给浏览器。这可以减少近80%的文件大小,以节省下载时间和带宽。
  7. $_SERVER["HTTP_COOKIE"]  浏览器的cookie信息。
  8. $_SERVER["HTTP_CONNECTION"]  当前请求的连接情况。
  9. $_SERVER["HTTP_UPGRADE_INSECURE_REQUESTS"]  表示浏览器可读懂服务器发过来的请求,
  10. $_SERVER["HTTP_CACHE_CONTROL"]  表示浏览器是否会缓存这个页面信息。
  11. $_SERVER["PATH"]  当前脚本所在文件系统。
  12. $_SERVER["SystemRoot"]  当前服务器的操作系统。
  13. $_SERVER["COMSPEC"]  指向cmd.exe的路径。
  14. $_SERVER["PATHEXT"]  环境变量设置。
  15. $_SERVER["WINDIR"]  脚本指向的系统目录。
  16. $_SERVER["SERVER_SIGNATURE"]  包含服务器版本和虚拟主机名的字符串。
  17. $_SERVER["SERVER_SOFTWARE"]  服务器软件配置信息。
  18. $_SERVER["SERVER_ADDR"]  当前运行脚本的服务器的ip地址。
  19. $_SERVER["SERVER_PORT"]  服务器端口。
  20. $_SERVER["REMOTE_ADDR"]  浏览网页的用户ip。
  21. $_SERVER["DOCUMENT_ROOT"]  当前运行脚本所在的根目录。
  22. $_SERVER["REQUEST_SCHEME"]  服务器通信协议,是http或https。
  23. $_SERVER["CONTEXT_PREFIX"]  前缀。
  24. $_SERVER["CONTEXT_DOCUMENT_ROOT"]  当前脚本所在的文档根目录。
  25. $_SERVER["SERVER_ADMIN"]  服务器管理员信息。
  26. $_SERVER["SCRIPT_FILENAME"]  当前执行脚本的绝对路径。
  27. $_SERVER ["REMOTE_PORT"]  用户连接到服务器时所使用的端口。
  28. $_SERVER["GATEWAY_INTERFACE"]  服务器使用的CGI规范的版本。
  29. $_SERVER["SERVER_PROTOCOL"]  请求页面时通信协议的名称和版本。
  30. $_SERVER["REQUEST_METHOD"]  请求提交数据的方式。
  31. $_SERVER["QUERY_STRING"]  服务器请求时?后面的参数。
  32. $_SERVER["REQUEST_URI"]  当前脚本路径,根目录之后的目录。
  33. $_SERVER["SCRIPT_NAME"]  当前脚本的路径。这在页面需要指向自己时非常有用。
  34. $_SERVER["PHP_SELF"]  当前正在执行脚本的文件名。
  35. $_SERVER["REQUEST_TIME"]  得到请求开始时的时间戳。

流程控制

1.    for ($i='a'; $i <='z' ; $i++) {

   echo $i.'--';

}    结果是什么?

答:打印到‘z’之后还会继续打印,原因1. 是PHP字符比较,会从首字母依次往后进行比较,例如:‘abb’ < ’abcd’。’a’和‘a’一样,‘b’和‘b’一样,‘b’小于‘c’。所以,‘abb’<’abcd’为true。2. 字符‘a’自加后为‘b’,‘z’自加后为‘aa’,‘aaaa’自加后为‘aaab’。

答案:a--b--c--d--e--f--g--h--i--j--k--l--m--n--o--p--q--r--s--t--u--v--w--x--y--z--aa--ab--ac--ad--ae--af--ag--ah--ai--aj--ak--al--am--an--ao--ap--aq--ar--as--at--au--av--aw--ax--ay--az--ba--bb--bc--bd--be--bf--bg--bh--bi--bj--bk--bl--bm--bn--bo--bp--bq--br--bs--bt--bu--bv--bw--bx--by--bz--ca--cb--cc--cd--ce--cf--cg--ch--ci--cj--ck--cl--cm--cn--co--cp--cq--cr--cs--ct--cu--cv--cw--cx--cy--cz--da--db--dc--dd--de--df--dg--dh--di--dj--dk--dl--dm--dn--do--dp--dq--dr--ds--dt--du--dv--dw--dx--dy--dz--ea--eb--ec--ed--ee--ef--eg--eh--ei--ej--ek--el--em--en--eo--ep--eq--er--es--et--eu--ev--ew--ex--ey--ez--fa--fb--fc--fd--fe--ff--fg--fh--fi--fj--fk--fl--fm--fn--fo--fp--fq--fr--fs--ft--fu--fv--fw--fx--fy--fz--ga--gb--gc--gd--ge--gf--gg--gh--gi--gj--gk--gl--gm--gn--go--gp--gq--gr--gs--gt--gu--gv--gw--gx--gy--gz--ha--hb--hc--hd--he--hf--hg--hh--hi--hj--hk--hl--hm--hn--ho--hp--hq--hr--hs--ht--hu--hv--hw--hx--hy--hz--ia--ib--ic--id--ie--if--ig--ih--ii--ij--ik--il--im--in--io--ip--iq--ir--is--it--iu--iv--iw--ix--iy--iz--ja--jb--jc--jd--je--jf--jg--jh--ji--jj--jk--jl--jm--jn--jo--jp--jq--jr--js--jt--ju--jv--jw--jx--jy--jz--ka--kb--kc--kd--ke--kf--kg--kh--ki--kj--kk--kl--km--kn--ko--kp--kq--kr--ks--kt--ku--kv--kw--kx--ky--kz--la--lb--lc--ld--le--lf--lg--lh--li--lj--lk--ll--lm--ln--lo--lp--lq--lr--ls--lt--lu--lv--lw--lx--ly--lz--ma--mb--mc--md--me--mf--mg--mh--mi--mj--mk--ml--mm--mn--mo--mp--mq--mr--ms--mt--mu--mv--mw--mx--my--mz--na--nb--nc--nd--ne--nf--ng--nh--ni--nj--nk--nl--nm--nn--no--np--nq--nr--ns--nt--nu--nv--nw--nx--ny--nz--oa--ob--oc--od--oe--of--og--oh--oi--oj--ok--ol--om--on--oo--op--oq--or--os--ot--ou--ov--ow--ox--oy--oz--pa--pb--pc--pd--pe--pf--pg--ph--pi--pj--pk--pl--pm--pn--po--pp--pq--pr--ps--pt--pu--pv--pw--px--py--pz--qa--qb--qc--qd--qe--qf--qg--qh--qi--qj--qk--ql--qm--qn--qo--qp--qq--qr--qs--qt--qu--qv--qw--qx--qy--qz--ra--rb--rc--rd--re--rf--rg--rh--ri--rj--rk--rl--rm--rn--ro--rp--rq--rr--rs--rt--ru--rv--rw--rx--ry--rz--sa--sb--sc--sd--se--sf--sg--sh--si--sj--sk--sl--sm--sn--so--sp--sq--sr--ss--st--su--sv--sw--sx--sy--sz--ta--tb--tc--td--te--tf--tg--th--ti--tj--tk--tl--tm--tn--to--tp--tq--tr--ts--tt--tu--tv--tw--tx--ty--tz--ua--ub--uc--ud--ue--uf--ug--uh--ui--uj--uk--ul--um--un--uo--up--uq--ur--us--ut--uu--uv--uw--ux--uy--uz--va--vb--vc--vd--ve--vf--vg--vh--vi--vj--vk--vl--vm--vn--vo--vp--vq--vr--vs--vt--vu--vv--vw--vx--vy--vz--wa--wb--wc--wd--we--wf--wg--wh--wi--wj--wk--wl--wm--wn--wo--wp--wq--wr--ws--wt--wu--wv--ww--wx--wy--wz--xa--xb--xc--xd--xe--xf--xg--xh--xi--xj--xk--xl--xm--xn--xo--xp--xq--xr--xs--xt--xu--xv--xw--xx--xy--xz--ya--yb--yc--yd--ye--yf--yg--yh--yi--yj--yk--yl--ym--yn--yo--yp--yq--yr--ys--yt--yu--yv--yw--yx--yy--yz--

数组

1.    PHP中常用的几个预定义的全局数组是哪些?

答:有9大预处理的内置数组变量 $_GET,$_POST,$_REQUSET,$_SESSION,$_COOKIE,$_FILES,$_SERVER,$_ENV,$GLOBALS。

2.    数组合并函数array_merge()和数组加法运算$arr+$arr2的区别是什么?

答:array_merge()--如果是关联数组合并,数组的键名相同的情况下,后面的会覆盖前面相同键名的值;若是索引数组合并,则不会覆盖,而是后者追加到前者的后面。

+--使用数组加法运算,与marray_merge()不同,加法运算不管是关联数组还是数字数组,都是将相同键名的值舍弃,也就是只保留首次出现该键名的元素,后具有相同键名的元素不会被加进来。

3.    数据库索引有几类?什么时候使用索引?

答:(1)普通索引,最基本的索引,没有任何限制。

       (2)唯一索引,与‘普通索引类似’,不同的是,索引列的值必须唯一,但允许有空值。

       (3)主键索引,它是一种特殊的唯一索引,不允许有空值。

      (4)全文索引,针对较大的数据,生成全文索引很消耗空间。

      (5)   组合索引,为了更多的提高mysql效率可建立组合索引,遵循‘最左前缀’原则。

4.数组内置的排序方法有哪些?


1
2
3
4
5
6
7
8
9
10
11
sort($array); //数组升序排序

rsort($array); //数组降序排序

asort($array);  //根据值,以升序对关联数组进行排序

ksort($array);  //根据建,以升序对关联数组进行排序

arsort($array);   //根据值,以降序对关联数组进行排序

krsort($array);  // 根据键,以降序对关联数组进行排序

字符串

1.    实现中文截取无乱码的方法。

答:使用mbstring扩展库的mb_substr()函数。

例如:mb_substr(‘这样以来就不会出现乱码了’, 0, 7, ‘utf-8’);

2.    如何实现字符串翻转?

答:strrev(‘123’); //321

3.    Php路径相关函数。 $url =" D:\wamp\www\test.php";

答:(1) pathinfo($url) 返回一个关联数组含有path的信息,包含的数组元素有:dirname,basename,filename以及可能存在的extension。例如执行print_r(pathinfo($url));

返回结果:Array (

[dirname] => D:\wamp\www

[basename] => test.php

[extension] => php

[filename] => test

)  // 注意dirname, basename数组单元和执行dirname(),basename()函数返回的结果一致。

(2) parse_url函数 解析一个url并返回一个关联数组,包含url中出现的各种组成。

4.    写 5 个不同的自己的函数,来获取一个全路径的文件的扩展名,允许封装 php 库中已有的函数。

答:
$path = __FILE__;
function fun1($path){
    $a = strpos($path,'.');  //返回.出现的位置。
    return substr($path, $a+1); // 返回去掉.的后缀名。
}

function fun2($path){
    return ltrim(strrchr($path,'.'),'.');
}

function fun3($path){
    $pathinfo = pathinfo($path);
    return $pathinfo['extension'];
}

function fun4($path){
    $filename = basename($path);
    $namearray = explode( '.',$filename);
    return array_pop($namearray);
}

function fun5($path){
    $pattern = '/^[^\.]+\.([\w]+)$/';
    return preg_replace($pattern, '${1}', basename($path));
}

5.    从一个带有参数的 url 里取出文件的扩展名,例如: http://www.zhuxiaoyuan.cn/home/index.php?id=1

答:使用parse_url函数。返回结果如下:

$parsearray = Array (

[scheme] => http

[host] => www.zhuxiaoyuan.cn

[path] =>/home/index.php

[query] => id=1

)

在使用上题中的任一方法取出后缀,例如:

$path = 'http://www.zhuxiaoyuan.cn/home/index.php?id=1';
$parsearray= parse_url($path);
$pathinfo = pathinfo($parsearray['path']);
echo $pathinfo['extension'];

日期时间

1.    用PHP打印出前一天的时间,格式是2017-05-31 12:14:24?

答:echo date(‘Y-m-d H:i:s’,strtotime(‘-1 days’));

echodate(‘Y-m-d H:i:s’, time() - 24 * 3600);

echo strftime(‘%Y-%m-%d %H:%M:%s’,strtotime(‘-1 days’));

正则表达式

1.    正则表达式的组成?

答:定界符号,原子,元字符,模式修正符。

       定界符号,标识正则表达式的开始和结束。作为定界符的字符不仅仅局限于斜线’ /’,除字母,数字,反斜线之外的字符都可以做定界符号。如‘#’,‘!’,‘{}’,‘|’等。

       原子,正则表达式的最基本的组成单位,标识需要匹配的内容。

       元字符,在正则表达式中元字符不可单独出现,它必须用来修饰原子。标识原子需要匹配的次数,限定字段串或单次的边界。

       模式修正符,调整正则表达式的解释,扩展正表达式在匹配,替换等操作的某些功能。

文件处理

1.    有一个网页地址,例如http://www.baidu.com,如何得到它的内容?

答:echo file_get_contents(‘http://www.baidu.com’);

2.    PHP中读取文件内容的方法和函数?

答:(1)打开文件,然后读取。Fopen(), fread()。

(2)打开读取一次完成file_get_contents()。

(3)使用fsockopen函数打开url(可以以get和post的方式获取),以get方式获取完整的数据,包括header和body。

(4)使用curl库获取内容,使用curl前,需查看curl扩展是否开启。

会话控制

1.    什么是会话控制?

答:简单地说会话控制就是跟踪和识别用户信息的机制,会话控制的思想就是能够在网站中跟踪一个变量,通过这个变量,系统能识别出相应的用户信息,根据这个用户信息可以得知用户权限,从而展示给用户适合于其相应权限的页面内容。

目前最主要的会话跟踪方式有cookie,session。

2.    会话跟踪的基本步骤

答:(1)访问与当前请求相关的会话对象。

(2)查找与会话相关的信息。

(3)存储会话信息。

(4)   废弃会话数据。

3.    禁用Cookie后,Session还可以使用吗,有什么解决方法?

答:Cookie与Session,一般认为是两个独立的东西,Session采用的是在服务器保持状态的方案,而Cookie采用的是在客户端保持的方案。但为什么禁用Cookie就不能得到Session呢?因为Session是用SessionID来确定当前对话所对应的服务器Session,而SessionID是通过Cookie来传递的,禁用了Cookie相当于失去了Session ID,也就得不到Session了。

解决方法:(1)设置php.ini配置文件中的‘session.use_trans_id = 1’,或者编译时打开‘—enable-trans-sid’选项,让PHP自动跨页传递Session ID。

(2)手动通过URL传值、隐藏表单传递Session ID。

(3)用文件、数据库等形式保存Session ID,在跨页过程中调用。

4.    PHP如何修改Session的生存时间?

答:(1)在php.ini中设置session_gc_maxlifetime = 1440  //默认时间

(2)session_set_cookie_params(24* 3600);  //保存一天

5.    Session和cookie的使用步骤分别是什么?

答:session的步骤(1)启动session,使用session_start()函数。

(2)注册会话:直接给$_SESSION数组添加元素即可。

(3)使用会话:判断session是否为空或是否已经注册,如果已经存在则像普通数组使用即可。

(4)删除会话

        1)可以使用unset函数删除单个session;

        2)使用$_SESSION=array(),一次注销所有的会话变量。

        3)使用session_destroy()函数来彻底销毁session。

Cookie的使用步骤

(1)   创建cookie,setcookie(string cookiename, string value, int expire)。

(2)   读取cookie,通过超级全局变量$_COOKIE来读取浏览器的cookie值。

(3)   删除cookie:

1) 手动删除法,通过浏览器删除cookie文件。

2) Setcookie()方法,跟设置cookie一样,不过将cookie的值设置为空,有效时间为0或小于当前时间戳。

6.    Session和cookie的区别是什么?

答:1. 由于HTTP协议是无状态协议,所以服务端要记录用户状态时,就需要某种机制来标识用户并跟踪用户,这个机制就是Session。典型场景,当你点击购买一件商品时,由于HTTP无状态,所以不知道是哪个用户购买的商品,所以服务端为特定的用户创建Session,用于标识并跟踪这个用户。

2. 服务端如何识别特定的客户?这个时候Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。有人问,如果客户端的浏览器禁用了 Cookie 怎么办?一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。

所以,总结一下:

Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;

Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。

7.    如何将session存放在数据库中?

答:默认情况下php.ini中session.save.handler=files,也就是session是以文件形式存储的。如果想更改为数据库或其它存储方式,那么需要更改设置,让session.save_handler=user。除了在php.ini中配置外,还可以在PHP页面汇总单独配置,用ini_set(‘session.save_handler’, ‘user’)来设置session的存储方式,设置为用户自定义存储方式。设置好存储方式后,需要使用session_set_save_handler()函数。该函数是设置用户级别的session保存过程的函数。该函数6个参数,这6个参数是6个自定义函数的名称,分别代表对session的开启,关闭,读,写,销毁。

数据库结构:session_id,session_value,expire_time,分别存储session的id和值以及失效时间。

8.    Session的运行机制

答:用户A访问站点Y,如果站点Y指定了 session_start();(以下假设 session_start()总是存在)那么会产生一个 session_id,这个session_id一般会以Cookie的形式保存到用户A(我们可以通过在 php.ini 里设置 session.use_only_cookies 为 1,强制Session必须以COOKIE专递)。这时候 Session表现为$_COOKIE[‘PHPSESSID’];(PHPSESSID可用session_name()函数来下修改)用户A接着访问,这个 session id($_COOKID[‘PHPSESSID’])就会在A每次访问Y的时候传送到站点Y。在站点Y上,会有这么一个目录,是用来保存 Session的实际数据的。站点Y接收到Sessionid,然后通过Sessionid,来获得与Session数据的关联,并返回Session数据。

9.     

框架,设计模式

1.    架构、框架和设计模式关系

答:首先架构应该是一个范畴最大的概念,是最高层次的设计。一个架构设计中可能会用到多个框架和多个设计模式;而框架是针对共性抽象出来的半成品,这里面可能包含着多个设计模式,而设计模式就是解决单一问题的设计思路和解决方法。

2.    谈谈你对MVC的理解

答:MVC是Model-View-Controler的简称,即模型-视图-控制器。MVC是一种框架模式,它强制的把应用程序的输入、处理和输出分开。

MVC的处理过程:首先控制器接受用户的请求,调用相应的模型来进行业务处理,并返回数据给控制器。控制器调用相应的视图来显示处理的结果。并通过视图呈现给用户。

优点:耦合性低,重用性高,声明周期成本低。

缺点:没有明确的定义,不适合小型,中等规模的应用程序,增加系统结构实现的复杂性。

数据库

1.    什么是SQL注入,如何防范?

答:所谓SQL注入,就是通过把SQL命令插入到Web表单提交或页面请求的字符串,最终达到欺骗服务器执行恶意的SQL命令。防范措施如下

(1)  永远不要信任用户的输入。对用户的输入进行校验,过滤关键字和转义字符。

(2)  永远不要使用动态拼接SQL,可以使用参数化的SQL或直接使用存储有限的数据库链接。

(3)  不要把机密信息直接存放,加密或者hash掉密码和敏感信息。

防止SQL注入漏洞的函数有: addslashes(),mysql_escape_string()

2.    为什么MyISAM会比Innodb的查询速度快?

答:(1)数据库,Innodb要缓存,MyISAM仅缓存索引块。

(2)innodb寻址要映射到块,再到行,MyISAM记录的直接是文件的offset,定位比Innodb快。

(3)Innodb还需要维护MVCC一致,虽然你的场景没有,但他还是需要去检查和维护MVCC(Multi-Version Concurrency Control)多版本并发控制。

注:InnoDB:通过为每一行记录添加两个额外的隐藏的值来实现MVCC,这两个值一个记录这行数据何时被创建,另外一个记录这行数据何时过期(或者被删除)。但是InnoDB并不存储这些事件发生时的实际时间,相反它只存储这些事件发生时的系统版本号。这是一个随着事务的创建而不断增长的数字。每个事务在事务开始时会记录它自己的系统版本号。每个查询必须去检查每行数据的版本号与事务的版本号是否相同。让我们来看看当隔离级别是REPEATABLEREAD时这种策略是如何应用到特定的操作的:

  SELECT InnoDB必须每行数据来保证它符合两个条件:

  1、InnoDB必须找到一个行的版本,它至少要和事务的版本一样老(也即它的版本号不大于事务的版本号)。这保证了不管是事务开始之前,或者事务创建时,或者修改了这行数据的时候,这行数据是存在的。

  2、这行数据的删除版本必须是未定义的或者比事务版本要大。这可以保证在事务开始之前这行数据没有被删除

3.    怎样理解InnoDB的行级锁?

答:InnoDB行锁是通过给索引上的索引项加锁来实现的,这样当其他查询或修改时根据索引找到这行记录时,发现索引被上了锁,就会等待。如果查询不是通过索引访问,InnoDB将使用表锁。

即便条件中使用了索引字段,但是否使用索引来检索数据还是由Mysql通过判断不同执行计划的代价来决定的,如果Mysql认为全表扫描效率更高,比如一些较小的表,它就不会使用索引,这种情况下InnoDB将使用表锁,而不是行锁。

4.    什么是全文索引?全文索引的原理是什么?

答:试想在1M大小的文件中搜索一个词,可能需要几秒,在100M的文件中可能需要几十秒,如果在更大的文件中搜索那么就需要更大的系统开销,这样的开销是不现实的。所以在这样的矛盾下出现了全文索引技术,有时候有人叫倒排文档技术。

原理是先定义一个词库,然后在文章中查找每个词条(term)出现的频率和位置,把这样的频率和位置信息按照词库的顺序归纳,这样就相当于对文件建立了一个以词库为目录的索引,这样查找某个词的时候就能很快的定位到该词出现的位置。

5.     

其他

1.    对于大流量的网站,你采用什么样的方法支持当前流量?

答:(1)确认服务器硬件是否支持当前的流量。

(2)优化数据表。

(3)控制外部的盗链。

(4)控制文件的下载。

(5)使用不同主机分流主要流量。

(6)数据库读写分离。

2. 用PHP显示出客户端I与服务器IP的代码?

       答:(1)echo $_SERVER[‘REMOTE_ADDR’]; //返回客户端IP地址

                     echo  getenv('REMOTE_ADDR') ;    //通过环境变量来获得

       (2)echo $_SERVER[‘SERVER_ADDR’];  //返回服务器ID地址

       (3)echo $_SERVER[‘QUERY_STRING’]; //查询url中第一个?之后的内容

       (4)echo $_SERVER[‘DOCUMENT_ROOT’]; //当前运行脚本所在的文档根目录

       (5)echo gethostbyname(‘www.baidu.com’); //根据域名获取ID,不要加HTTP

       使用$_SERVER获取的IP地址有一个问题,即当客户机使用代理的时候获取不到真实的 IP 地址。

3.    请举例说明在你开发过程中用什么方法来加快页面的加载速度?

答:数据库优化,缓存技术,分布式部署

4.    能够使HTML和PHP分离使用的模板?

答:Smarty,Savant。

5.    使用哪些工具进行版本控制?

答:svn,git。

6.    Smarty模板的特点

答:smarty是一个使用PHP写出来的PHP模板引擎,目的是要使用PHP程序员同美工分离,使得程序员改变程序的逻辑内容时不会影响到美工的页面设计。美工重新修改页面时不会影响程序的逻辑。

优点:1. 速度快 相对其他引擎。

2. 编译型:采用smarty编写的程序在运行时要编译一个非模板的PHP文件。 

3. 缓存技术:它可以将用户最终看到的html文件缓存成一个静态的html文件。

4. 插件技术:smarty可以自定义插件。

不适合使用smarty的地方:1. 需要实时更新的内容。如股票显示,它需要经常对数据进行更新。2. 小项目。

7.    PHP的垃圾回收机制是怎样的?

答:PHP5.3之前使用的垃圾是单纯的“引用计数”,也就是每个内存对象都分配一个计数器,当内存对象被变量引用是,计数器+1;当变量引用撤掉后,计数器-1;当计数器=0时,表名内存中没有对象使用,该内存对象则进行销毁,垃圾回收完成。

“引用计数”存在问题,就是两个或多个对象相互引用形成环状后,内存对象的计数器则不会消减为0;这个时候,这一组内存对象已经没用了,但是不能回收,从而导致内存泄露。PHP5.3开始使用新的垃圾回收机制。

8.    请写一段PHP代码,确保多个进程同时写入同一个文件成功。

答:加锁。

9.    Nginx使用那一层的网络协议?

答:nginx是应用层,从低到高的话传输层用的是TCP/IP,应用层用的是HTTP。

10.  什么是ajax?ajax的原理是什么?ajax的核心技术是什么?ajax的优缺点是什么?

答:ajax是asynchrononus javascript and xml的缩写,是javascript,xml,css,DOM等多个技术的组合。

页面中用户的请求通过ajax引擎异步地与服务器进行通信,服务器将请求的结果返回这个ajax引擎,最后由这个ajax引擎来决定返回的数据显示到页面中的指定位置。Ajax最终实现了在一个页面的指定位置可以加载另一个页面所有的输出内容。这样就实现一个静态页面也能获取到数据库的返回数据信息了。所以ajax技术实现了一个静态页面在不刷新整个页面整个页面的情况下与服务器通信,减少了用户等待时间,同时也从而降低了网络流量,增加了客户体验的友好程度。

Ajax的优点是:(1)减轻了服务器端负担,将一部分以前由服务器负担的工作转移到客户端操作执行,利用客户端闲置的资源进行处理;

(2)在只局部刷新的情况下更新页面,增加了页面反应速度,是用户体验更友好。

缺点是:不利于seo推广优化,因为搜索引擎无法直接访问到ajax请求的内容。

11.  分页原理是什么?

答:数据分页需要以下几个条件:

1) 参与分页的总条数【$msg_count】,该值通过数据库查询可以获取到;

2) 每页显示的条数【$pagesize】,这个值可以根据实际情况定义;

3) 当前页面的页码数【$page】,该值通过地址栏传递和接收;

4) 可以通过以上材料计算出总页面【$pagecount】,此处需要借助ceil();

【$pagecount=ceil($msg_count/$pagesize); 】

5) 数据库查询借助sql语句中的【limit】来实现数据的变化;

【 $startnum = ($page - 1) *$pagesize; 】

【 select * from 表名 where 条件 limit $startnum, $pagesize; 】

12.  什么是无限极分类?

答:要实现无限极分类,数据库建表是关键。

表结构中至少需要三个字段,如果想避免递归循环,那么需要四个字段。

1) id,当前数据的唯一标识。

2) typename,类型名称。

3) parentid,当前类型的上层父级类型的id。

4) path,其中存储当前类型和它所有父级类别的id,这些id之间采用“-”隔开。

5) 当通过以下sql语句就可以实现,相同顶级类下的信息都在一起集中显示。

【 select * from 表名 wehre 条件 order by path; 】

13.  Apache和Nginx的区别

答:Ngnix优点:

(1)   轻量级,同样起web服务,比起apache占用更少内存及资源。

(2)   抗并发,nginx处理请求是异步非阻塞式,而apache则是阻塞式的,在高并发ngnix能保持低资源的高性能。

(3)   高度模块化的设计,编写模块相对简单。

(4)   社区活跃,各种高性能模块出品迅速。

Apache优点:

(1)   Apache的重写模块比nginx的重写模块强大。

(2)   模块多,基本想到的都可以找到。

(3)   少bug,超稳定。

为什么Nginx的性能要比Apache高得多?这得益于Nginx使用的epoll(Linux 2.6内核)和kqueue(freebsd)网络I/O模型,而Apache则使用的是传统的select模型。目前Linux下能够承受高并发访问的Squid、Memcached都采用的是epoll网络I/O模型。

  处理大量的连接的读写,Apache所采用的select网络I/O模型非常低效。下面用一个比喻来解析Apache采用的select模型和Nginx采用的epoll模型进行之间的区别:

  你在大学读书,住的宿舍楼有很多间房间,你的朋友要来找你。select版宿管大妈就会带着你的朋友挨个房间去找,直到找到你为止。而epoll版宿管大妈会先记下每位同学的房间号,你的朋友来时,只需告诉你的朋友你住在哪个房间即可,不用亲自带着你的朋友满大楼找人。如果来了10000个人,都要找自己住这栋楼的同学时,select版和epoll版宿管大妈,谁的效率更高,不言自明。同理,在高并发服务器中,轮询I/O是最耗时间的操作之一,select和epoll的性能谁的性能更高,同样十分明了。

14.  PHP有多线程吗?

答:在PHP5.3之前php是没有多线程的,可通过其他方式实现多线程(Linux, Apache)。在PHP5.3及其以上安装pthread扩展后是可以支持多线程的。

15.  对于静态页面文件,是放在ngnix端,还是server端?

答:ngnix处理静态页面性能比apache快3倍,所以静态页面放在ngnix处理。

16.  常用的PHP扩展及功能?

答:(1) bz2, bzip2压缩函数库

Curl 允许你与各种的服务器使用各种类型的协议进行连接和通讯。

Gd2 GD库图像函数库

Mysqli mysqli函数库

Pdo

Mbstring 多字节字符串函数库 

17.  XSS攻击

答:XSS(Cross Site Scripting),意为跨站网络脚本攻击,为了和样式表(Cascading Style Sheet)区分,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

18.  什么是Token?生成规则,过期时间,添加令牌。

答:在计算机身份认证中是令牌(临时)的意思。

19.  PHP缓存技术有哪些?Tp是局部还是完全缓存?

答:(1)全页面静态化缓存,也就是将页面全部生成HTML静态页面,用户访问时直接访问静态也页面,而不是去走php服务器解析。

(2)页面部分缓存,将一个页面不经常变的部分进行静态缓存,而经常变化的那块不缓存,最后组装一起显示。

(3)数据缓存,通过一个id进行请求的数据,将数据缓存到一个php文件中,id和文件是对应的,下次通过这个id进行请求时直接读php文件。

(4)查询缓存,和数据缓存差不多,根据查询语句进行缓存。

(5)常用的缓存技术有:redis和memcache。

Tp应该使用的是全局缓存,因为:Tp缓存是在本地生成一个php文件来存储数据库中读取出来的数据。

20.  使用token防止表单重复提交

答:如何防止表单重复提交?可以在前台页面中放置一个隐藏域用于存放session中的token,当第一次提交时验证token相同后,会将session中的token信息更新,页面重复提交时,因为表单中的token值没有更新,所以提交失败。此外,要避免加token但不进行验证的情况,在session中增加了token,但在服务器中没有对token进行验证,根本起不到防范的作用。

21.  常见网络协议默认端口

答:FTP文件传输协议,21

    Telnet远程登陆协议,23

        SMTP简单邮件传输协议,25

        POP3邮局协议版本3,110

        HTTP超文本传输协议,80

        DNS域名解析协议,53

        SNMP简单网络管理协议,161

SSH安全登陆协议,22

1
 

「梦想一旦被付诸行动,就会变得神圣,如果觉得我的文章对您有用,请帮助本站成长」

赞(3) 打赏
欢迎打赏您的小可爱~~~~

支付宝扫一扫打赏

微信扫一扫打赏

上一篇:

下一篇:

相关推荐

0 条评论关于"PHP面试题整理(基础1)"

最新评论

    暂无留言哦~~

博客简介

枯痕个人博客: xiaole.biz,一个关注Web后端开发技术、关注用户体验、坚持更多原创实战教程的个人网站,愿景:成为宇宙中最具有代表性的后端博客,期待您的参与。

精彩评论

友情链接

他们同样是一群网虫,却不是每天泡在网上游走在淘宝和网游之间、刷着本来就快要透支的信用卡。他们或许没有踏出国门一步,但同学却不局限在一国一校,而是遍及全球!申请交换友链

站点统计

  • 文章总数: 106 篇
  • 草稿数目: 1 篇
  • 分类数目: 26 个
  • 独立页面: 4 个
  • 评论总数: 11 条
  • 链接总数: 5 个
  • 标签总数: 177 个
  • 注册用户: 10 人
  • 访问总量: 8,769,814 次
  • 最近更新: 2021年11月23日
服务热线:
 156144**650

 QQ在线交流

 旺旺在线