PHP面试题总汇整理完整版.docx
《PHP面试题总汇整理完整版.docx》由会员分享,可在线阅读,更多相关《PHP面试题总汇整理完整版.docx(52页珍藏版)》请在冰豆网上搜索。
PHP面试题总汇整理完整版
PHP的意思
PHP是一个基于服务端来创建动态网站的脚本语言,您可以用PHP和HTML生成网站主页
什么是面向对象主要特征是什么
面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰。
主要特征:
封装、继承、多态。
SESSION与COOKIE的区别是什么,请从协议,产生的原因与作用说明
1、http无状态协议,不能区分用户是否是从同一个网站上来的,同一个用户请求不同的页面不能看做是同一个用户。
2、SESSION存储在服务器端,COOKIE保存在客户端。
Session比较安全,cookie用某些手段可以修改,不安全。
Session依赖于cookie进行传递。
禁用cookie后,session不能正常使用。
Session的缺点:
保存在服务器端,每次读取都从服务器进行读取,对服务器有资源消耗。
Session保存在服务器端的文件或数据库中,默认保存在文件中,文件路径由php配置文件的指定。
Session文件是公有的。
不使用cookie向客户端发送一个cookie.
理解:
session_start()开启时,生成一个常量SID,当COOKIE开启时,这个常量为空,当COOKIE关闭时,这个常量中存储了PHPSESSID的值。
通过在URL后加一个SID参数来传递SESSIONID的值,从而使客户端页面可以使用SESSION里面的值。
当客户端开启COOKIE和服务器端开启SESSION时。
浏览器第一次请求,服务器会向浏览器端发送一个COOKIE里面存储SESSIONID.当浏览器第二次请求时,会把已存在的COOKIE一起提交到服务器端。
简述Cookie的设置及获取过程
设置COOKIE的值:
Setcookie(名称,值,保存时间,有效域);
获取值:
$_COOKIE['名称'];
HTTP状态中302、403、500、200、404、502代码含义
一二三四五原则:
一.消息系列二.成功系列三.重定向系列四.请求错误系列五.服务器端错误系列302:
临时转移成功,请求的内容已转移到新位置403:
禁止访问500:
服务器内部错误401代表未授权。
200是请求成功,404是文件未找到,502是服务器内部错误。
请写出数据类型(intcharvarchardatetimetext)的意思;请问varchar和char有什么区别
19、Int整数char定长字符Varchar变长字符Datetime日期时间型Text文本型Varchar与char的区别char是固定长度的字符类型,分配多少空间,就占用多长空间。
Varchar是可变长度的字符类型,内容有多大就占用多大的空间,能有效节省空间。
Varchar是变长,节省存储空间,char是固定长度。
查找效率要char型快,因为varchar是非定长,必须先查找长度,然后进行数据的提取,比char定长类型多了一个步骤,所以效率低一些
MyISAM和InnoDB的基本区别索引结构如何实现
MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。
MyISAM类型的表强调的是性能,其执行速度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。
创建索引:
alerttabletablenameaddindex(`字段名`)
isset()和empty()区别
Isset判断变量是否存在,如果存在则返回真,empty判断变量是否为空为假,如果为空为假则返回真。
include与require的区别
()在执行文件时每次都要进行读取和评估
require()文件只处理一次(实际上文件内容替换了require()语句)
()通常放在PHP脚本程序的最前面
include()的使用和require()一样,一般放在流程控制的处理区段中,PHP脚本文件读到include()语句时,才将它包含的文件读进来,这种方式,可以把程序执行时的流程简单化
3,require()和include()语句是语言结构,不是真正的函数,可以像PHP的其他语言结构一样
4,include_once()和require_once()语句也是在脚本执行期间包括并运行指定文件,与include()require()唯一的区别是如果文件中的代码已经被包括了,则不会再次包括.
5,require()包含文件失败,停止执行,给出错误(致命的)
include()常用于动态包含.
通常是自动加载的文件,即使加载出错,整个程序还是继续执行
一个页面声明,另一个页面调用
包函文件失败,继续向下执行,返回一条警告
PHP字符串中单引号与双引号的区别
单引号不能解释变量,而双引号可以解释变量。
单引号不能转义字符,在双引号中可以转义字符。
请说明PHP中传值与传引用的区别。
什么时候传值什么时候传引用?
按值传递:
函数范围内对值的任何改变在函数外部都会被忽略
按引用传递:
函数范围内对值的任何改变在函数外部也能反映出这些修改
优缺点:
按值传递时,php必须复制值。
特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。
按引用传递则不需要复制值,对于性能提高很有好处。
functiontest(&$a)
{
$a=$a+100;
}
$b=1;
echo$b;HTTP协议中GET、POST和HEAD的区别
HEAD:
只请求页面的首部。
GET:
请求指定的页面信息,并返回实体主体。
POST:
请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。
(1)HTTP定义了与服务器交互的不同方法,最基本的方法是GET和POST。
事实上GET适用于多数请求,而保留POST仅用于更新站点。
(2)在FORM提交的时候,如果不指定Method,则默认为GET请求,Form中提交的数据将会附加在url之后,以分开与url分开。
字母数字字符原样发送,但空格转换为“+“号,其它符号转换为%XX,其中XX为该符号以16进制表示的ASCII(或ISOLatin-1)值。
GET请求请提交的数据放置在HTTP请求协议头中,而POST提交的数据则放在实体数据中;
GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
(3)GET这个是浏览器用语向服务器请求最常用的方法。
POST这个方法也是用来传送数据的,但是与GET不同的是,使用POST的时候,数据不是附在URI后面传递的,而是要做为独立的行来传递,此时还必须要发送一个Content_length标题,以标明数据长度,随后一个空白行,然后就是实际传送的数据。
网页的表单通常是用POST来传送的。
表单中get与post提交方法的区别?
1.get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。
post是通过HTTPpost机制,将表单内各个字段与其内容放置在HTMLHEADER内一起传送到ACTION属性所指的URL地址。
用户看不到这个过程。
2.对于get方式,服务器端用获取变量的值,对于post方式,服务器端用获取提交的数据。
3.get传送的数据量较小,不能大于2KB。
post传送的数据量较大,一般被默认为不受限制。
但理论上,IIS4中最大量为80KB,IIS5中为100KB。
get安全性非常低,post安全性较高。
foo()和@foo()之间有什么区别(1分)
@foo()控制错误输出
线性表和顺序表的区别
1、线性表包括顺序表和链表。
2、顺序表中的元素的地址是连续的,链表里面节点的地址不是连续的,是通过指针连起来的。
什么是数据库索引,主键索引,唯一索引的区别,索引的缺点是什么
索引用来快速地寻找那些具有特定值的记录。
主键索引和唯一索引的区别:
主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”,每个表只能有一个主键。
唯一索引索引列的所有值都只能出现一次,即必须唯一。
索引的缺点:
1、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
2、索引需要占用物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,需要的空间就会更大。
3、当对表中 的数据进行增加、删除、修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
浏览器IE和非IE浏览器的划分,区别是什么
IE浏览器指的是使用IE内核的浏览器,对一些W3C标准的网页代码的支持不是很好。
非IE浏览器指的是没有使用IE内核的浏览器,对W3C标准的网页代码有很好的支持。
数据库中的事务是什么?
事务(transaction)是作为一个单元的一组有序的数据库操作。
如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。
如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。
如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。
解释:
左连接,右连接,内连接,索引。
1、內连接仅选出两张表中互相匹配的记录.因此,这会导致有时我们需要的记录没有包含进来。
内部连接是两个表中都必须有连接字段的对应值的记录,数据才能检索出来。
2、左连接和右连接都是外部连接,也就是区别于内部连接,它对不满足连接条件的行并不是象内部连接一样将数据完全过滤掉,而是保留一部分数据,行数不会减少。
3、左连接是只要左边表中有记录,数据就能检索出来,而右边有的记录必要在左边表中有的记录才能被检索出来
4、右连接是只要右边表中有记录,数据就能检索出来;
5、全连接则会回返回两个表中的所有记录
简述0000000中无限分类的实现原理。
1、数据库分类表的设计:
id字段、父id字段、类名称字段、path字段
2、Path字段存当前分类的路径,格式:
0,父类id,本身id
3、查询分类:
select*from分类表orderbypathasc;
4、这样就查出来每个分类及其对应的子类。
能够使html和php分离开使用的模板
Smarty、template、PHPlibTemplate、FastTemplate
使用那些工具进行版本控制
Clearcase、CVS、SVN、PVCS、Perforce、CCC、StarTeam、RCS
写出三种以上MySQL数据库存储引擎的名称(提示:
不区分大小写)
MyISAM、InnoDB、BDB(BerkeleyDB)、Merge、Memory(Heap)、Example、Federated、Archive、CSV、Blackhole、MaxDB等等十几个引擎
什么是模板技术、能够使HTML和PHP分离开使用的模板
模板技术就是使程序的逻辑代码和界面分开的技术。
能够使HTML和PHP分开的模板有:
Smarty、Template、PHPlibTemplate、FastTemplate
实现中文字串截取无乱码的方法
Mb_substr();
用PHP写出显示客户端IP与服务器IP的代码
获取客户端IP:
get_env(“REMOTE_ADDR”);
获取服务器端IP:
$_SERVER["SERVER_ADDR"];
数据库索引有几类,分别是什么什么时候该用索引
普通索引、主键索引、唯一索引
并非所有的数据库都以相同的方式使用索引,作为通用规则,只有当经常查询列中的数据时才需要在表上创建索引。
写几个魔术方法并说明作用
__call()当调用不存在的方法时会自动调用的方法
__autoload()在实例化一个尚未被定义的类是会自动调用次方法来加载类文件
__set()当给未定义的变量赋值时会自动调用的方法
__get()当获取未定义变量的值时会自动调用的方法
__construct()构造方法,实例化类时自动调用的方法
__destroy()销毁对象时自动调用的方法
__unset()当对一个未定义变量调用unset()时自动调用的方法
__isset()当对一个未定义变量调用isset()方法时自动调用的方法
__clone()克隆一个对象
__tostring()当输出一个对象时自动调用的方法
$_REQUEST、$_POST、$_GET、$_COOKIE、$_SESSION、$_FILE的意思是什么
它们都是PHP预定义变量
$_REQUEST用来获取post或get方式提交的值
$_POST用来获取post方式提交的值
$_GET用来获取get方式提交的值
$_COOKIE用来获取cookie存储的值
$_SESSION用来获取session存储的值
$_FILE用来获取上传文件表单的值
数组中下标最好是什么类型的,为什么
数组的下标最好是数字类型的,数字类型的处理速度快。
++i和i++哪一个效率高,为什么
++i效率比i++的效率更高,因为++i少了一个返回i的过程。
magic_quotes_gpc()、magic_quotes_runtime()的意思是什么
Magic_quotes_gpc()是php配置文件中的,如果设置为on则会自动POST,GET,COOKIE中的字符串进行转义,在‘之前加\
Magic_quotes_runtime()是php中的函数,如果参数为true则会数据库中取出来的单引号、双引号、反斜线自动加上反斜杠进行转义。
框架中什么是单一入口和多入口,单一入口的优缺点
1、多入口就是通过访问不同的文件来完成用户请求。
单一入口只web程序所有的请求都指向一个脚本文件的。
2、单一入口更容易控制权限,方便对http请求可以进行安全性检查。
缺点:
URL看起来不那么美观,特别是对搜索引擎来说不友好。
你对Memcach的理解,优点有哪些
Memcache是一种缓存技术,在一定的时间内将动态网页经过解析之后保存到文件,下次访问时动态网页就直接调用这个文件,而不必在重新访问数据库。
使用memcache做缓存的好处是:
提高网站的访问速度,减轻高并发时服务器的压力。
Memcache的优点:
稳定、配置简单、多机分布式存储、速度快。
对关系型数据库而言,索引是相当重要的概念,请回答有关索引几个问题:
a)索引的目的是什么
1、快速访问数据表中的特定信息,提高检索速度
2、创建唯一性索引,保证数据库表中每一行数据的唯一性
3、加速表和表之间的连接
4、使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间
b)索引对数据库系统的负面影响是什么
负面影响:
创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改的时候索引也要动态维护,这样就降低了数据的维护速度。
c)为数据表建立索引的原则有哪些
1、在最频繁使用的、用以缩小查询范围的字段上建立索引
2、在平频繁使用的、需要排序的字段上建立索引
d)什么情况下不宜建立索引
1、对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引
2、对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等。
web应用中,数据库的读取频率远高于写入频率,如何优化MySQL而应对此种情景
使用memcache缓存技术,将动态数据缓存到文件,访问动态页面时直接调用缓存文件,而不必重新访问数据库,这样就减少了查询数据库的次数。
如果网站的访问量很大,可以把数据库读写服务器分开,使用多态服务器去处理数据库查询,使用较少的服务器去处理数据库的写入和修改。
如果是一个Web频繁访问的查询,上题的查询如何优化
使用memcache缓存技术,在一定时间内将动态内容缓存到文件中,访问动态页面时,世界调用缓存文件而不必重新查询数据库。
数据库设计时,常遇到的性能瓶颈有哪些,常有的解决方案
瓶颈主要有:
1、磁盘搜索 优化方法是:
将数据分布在多个磁盘上
2、磁盘读/写 优化方法是:
从多个磁盘并行读写。
3、CPU周期 优化方法:
扩充内存
4、内存带宽
请举例说明在你的开发过程中用什么方法来加快页面的加载速度
要用到服务器资源时才打开,及时关闭服务器资源,数据库添加索引,页面可生成静态,图片等大文件单独服务器。
使用代码优化工具。
描述一下大流量高并发量网站的解决方案
1、确认服务器硬件是否足够支持当前的流量。
2、使用memcache缓存技术,将动态数据缓存到内存中,动态网页直接调用这些文件,而不必在访问数据库。
3、禁止外部的盗链。
4、外部网站的图片或者文件盗链往往会带来大量的负载压力,因此应该严格限制外部对自身图片或者文件盗链,目前可以简单的通过refer来控制盗链,apache自己就可以通过配置来禁止盗链。
5、控制大文件的下载。
大文件的下载会占用很大的流量,对于非SCSI硬盘来说会消耗,使得网站响应能力下降。
6、使用不同的主机分流主要流量
7、使用流量统计软件。
在网站上安装一个流量统计软件,可以即时知道哪些地方耗费了大量流量,哪些页面需要再进行优化。
8、分库分表。
9、Sphinx全文索引引擎。
对于大流量的网站,您采用什么样的方法来解决访问量问题
优化程序,优化数据库,如果程序和数据库已经最优化,使用以下解决方法:
1、确定当前服务器设备是否满足流量需求。
2、使用Memcache缓存技术,把动态内容缓存到文件中,动态网页直接调用这些文件,而不必再访问数据库。
3、禁止外部盗链,图片和文件外部盗链会给服务器带来大量的负载压力,可以通过refer来禁止外部盗链,或者使用apache来配置禁止盗链。
4、控制大文件的下载,大文件的下载对于非SCSI硬盘来说会占用大量的资源,导致服务器的响应能力下降。
5、使用不同的主机分流主要流量,使服务器均衡负载。
6、使用流量统计软件统计分析网站流量,可以知道哪些地方耗费了大量的流量,哪些页面需要再进行优化。
如何设计或配置Mysql,才能达到高效使用的目的。
1、数据库设计方面,设计结构良好的数据库,允许部分数据冗余。
选取最适用的字段属性,尽可能把字段设置为NOTNULL,这样在查询的时候,数据库不用去比较NULL值。
2、系统架构设计方面,表散列,把海量数据散列到几个不同的表里面,集群,数据库查询和写入分开。
写高效sql语句,以提高效率。
使用连接(join)来代替子查询
使用联合(union)来代替手动创建的临时表
所得皆必须,只从数据库取必须的数据。
必要的时候用不同的存储引擎,比如Innodb可以减少死锁,HEAP可以提高一个数量级的查询速度。
使用事务
使用外键
使用索引
设定网站的用户数量在千万级,但是活跃用户的数量只有1%,如何通过优化数据库提高活跃用户的访问速度
我们可以根据用户的活跃程度,把活跃的用户提取出来放到另外一张表里面,每次活跃的用户登陆的时候就直接到活跃用户表中进行查询,这样就提高了数据库的查询速度。
了解XSS攻击吗如何防止
XSS是跨站脚本攻击,首先是利用跨站脚本漏洞以一个特权模式去执行攻击者构造的脚本,然后利用不安全的Activex控件执行恶意的行为。
使用htmlspecialchars()函数对提交的内容进行过滤,使字符串里面的特殊符号实体化。
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、控制错误信息,不要再浏览器上输出错误信息,将错误信息写到日志文件中。
如何进行防SQL注入
1、过滤掉一些常见的数据库操作关键字:
select,insert,update,delete,and,*等
或者通过系统函数:
addslashes(需要被过滤的内容)来进行过滤。
2、在PHP配置文件中
Register_globals=off;设置为关闭状态.catch,异常的代码放在try代码块内,如果没有触发异常,则代码继续执行,如果异常被触发,就会抛出一个异常。
Catch代码块捕获异常,并创建一个包含异常信息的对象。
$e->getMessage(),输出异常的错误信息。
PHP的网站主要攻击方式有哪些
1、命令注入(CommandInjection)
2、eval注入(EvalInjection)
3、客户端脚本攻击(ScriptInsertion)
4、跨网站脚本攻击(CrossSiteScripting,XSS)
5、SQL注入攻击(SQLinjection)
6、跨网站请求伪造攻击(CrossSiteRequestForgeries,CSRF)
7、Session会话劫持(SessionHijacking)
8、Session固定攻击(SessionFixation)
9、HTTP响应拆分攻击(HTTPResponseSplitting)
10、文件上传漏洞(FileUploadAttack)
11、目录穿越漏洞(DirectoryTraversal)
12、远程文件包含攻击(RemoteInclusion)
13、动态函数注入攻击(DynamicVariableEvaluation)
14、URL攻击(URLattack)
15、表单提交欺骗攻击(SpoofedFormSubmissions)
16、HTTP请求欺骗攻击(SpoofedHTTPRequests)
几个重要的选项
RegisterGlobals
php>=,的register_globals选项的默认值预设为Off,当register_globals的设定为On时,程序可以接收来自服务器的各种环境变量,包括表单提交的变量,而且由于PHP不必事先初始化变量的值,从而导致很大的安全隐患。
safe_mode
安全模式,PHP用来限制文档的存取、限制环境变量的存取,控制外部程序的执行。
启用安全模式必须设置中的safe_mode=On
1、限制文件存取
safe_mode_include_dir=“/path1:
/path2:
/path3″
不同的文件夹用冒号隔开
2、限制环境变量的存取
safe_mode_allowed_env_vars=string
指定PHP程序可以改变的环境变量的前缀,如:
safe_mode_allowed_env_vars=PHP_,当这个选项的值为空时,那么php可以改变任何环境变量
safe_mode_protected_env_vars=string
用来指定php程序不可改变的环境变量的前缀
3、限制外部程序的执行
safe_mode_exec_dir=