PHP经典面试题目汇总

一、双引号和单引号的区别

  • 双引号解释变量,单引号不解释变量
  • 双引号里插入单引号,其中单引号里若是有变量的话,变量解释
  • 双引号的变量名后面必需要有一个非数字、字母、下划线的特殊字符,或者用{}讲变量括起来,不然会将变量名后面的部分当作一个总体,引发语法错误
  • 双引号解释转义字符,单引号不解释转义字符,可是解释'\和\\
  • 能使单引号字符尽可能使用单引号,单引号的效率比双引号要高(由于双引号要先遍历一遍,判断里面有没有变量,而后再进行操做,而单引号则不须要判断)

二、经常使用的超全局变量(8个)

  • $_GET ----->get传送方式
  • $_POST ----->post传送方式
  • $_REQUEST ----->能够接收到get和post两种方式的值

  • $GLOBALS ----->全部的变量都放在里面
  • $_FILES ----->上传文件使用
  • $_SERVER ----->系统环境变量

  • $_SESSION ----->会话控制的时候会用到
  • $_COOKIE ----->会话控制的时候会用到

三、HTTP中POST、GET、PUT、DELETE方式的区别

HTTP定义了与服务器交互的不一样的方法,最基本的是POST、GET、PUT、DELETE,与其比不可少的URL的全称是资源描述符,咱们能够这样理解:url描述了一个网络上资源,而post、get、put、delegate就是对这个资源进行增、删、改、查的操做!php

3.1表单中get和post提交方式的区别
  • get是把参数数据队列加到提交表单的action属性所指的url中,值和表单内各个字段一一对应,从url中能够看到;post是经过HTTPPOST机制,将表单内各个字段与其内容防止在HTML的head中一块儿传送到action属性所指的url地址,用户看不到这个过程
  • 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据
  • get传送的数据量较小,post传送的数据量较大,通常被默认不受限制,但在理论上,IIS4中最大量为80kb,IIS5中为1000k,get安全性很是低,post安全性较高
3.2
  • GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操做同样,只是用来查询一下数据,不会修改、增长数据,不会影响资源的内容,即该请求不会产生反作用。不管进行多少次操做,结果都是同样的。css

  • 与GET不一样的是,PUT请求是向服务器端发送数据的,从而改变信息,该请求就像数据库的update操做同样,用来修改数据的内容,可是不会增长数据的种类等,也就是说不管进行多少次PUT操做,其结果并无不一样。html

  • POST请求同PUT请求相似,都是向服务器端发送数据的,可是该请求会改变数据的种类等资源,就像数据库的insert操做同样,会建立新的内容。几乎目前全部的提交操做都是用POST请求的。前端

  • DELETE请求顾名思义,就是用来删除某一个资源的,该请求就像数据库的delete操做。mysql

四、PHP介绍

Hypertext Preprocessor----超文本预处理器git

Personal Home Page 原始名称web

目标用途: 容许web开发人员快速编写动态生成的web页面,与其余页面相比,PHP是将程序嵌入到HTML文档中去执行,效率比彻底生成HTML编辑的CGI高不少ajax

HTML: Hypertext Markup Language算法

创始人: 拉姆斯勒·勒多夫Rasmus Lerdorf,1968年生,加拿大滑铁卢大学sql

勒多夫最开始是为了维护我的网页,用prel语言写了维护程序,以后又用c进行了重写,最终衍生出php/fi

时间轴:

  • 1995.06.08将PHP/FI公开释出
  • 1995 php2.0,加入了对MySQL的支持
  • 1997 php3.0
  • 2000 php4.0
  • 2008 php5.0
  • 因为php6.0没有彻底解决Unicode编码,因此基本没有生产线上的应用,基本只是一款概念产品,不少功能已经在php5.3.3和php5.3.4上实现

常见的IDE(Intergrated Development Environment): 集成开发环境

常见文本编辑器,具有代码高亮:

PHP优点

PHP特性:

  • php独特混合了C,Java,Prel以及PHP自创的语法
  • 能够比CGI或者Prel更快速去执行动态网页,与其余变成语言相比,PHP是讲程序嵌入到HTML文档中去执行,执行效率比彻底生成HTML编辑的CGI要高不少,全部的CGI都能实现
  • 支持几乎全部流行的数据库以及操做系统
  • PHP可使用C,C++进行程序的扩展

PHP优点:

  • 开放源代码
  • 免费性
  • 快捷性
  • 跨平台强
  • 效率高
  • 图形处理
  • 面向对象
  • 专业专一

PHP技术应用:

  • 静态页面生成
  • 数据库缓存
  • 过程缓存
  • div+css w3c标准
  • 大负荷
  • 分布式
  • flex
  • 支持MVC
  • Smarty模块引擎

PHP认证级别

  • 初级 IFE:Index Front Engineer 前端工程师
  • 中级 IPE:Index PHP Engineer PHP工程师
  • 高级 IAE:Index Architecture Engineer 架构工程师

六、echo、print_r、print、var_dump之间的区别

* echo、print是php语句,var_dump和print_r是函数 * echo 输出一个或多个字符串,中间以逗号隔开,没有返回值是语言结构而不是真正的函数,所以不能做为表达式的一部分使用 * print也是php的一个关键字,有返回值 只能打印出简单类型变量的值(如int,string),若是字符串显示成功则返回true,不然返回false * print_r 能够打印出复杂类型变量的值(如数组、对象)以列表的形式显示,并以array、object开头,但print_r输出布尔值和NULL的结果没有意义,由于都是打印"\n",所以var_dump()函数更适合调试 * var_dump() 判断一个变量的类型和长度,并输出变量的数值

七、HTTP状态码

点击这儿查看HTTP状态码详解

常见的HTTP状态码:

  • 200 - 请求成功
  • 301 - 资源(网页等)被永久转义到其余URL
  • 404 - 请求的资源(网页等)不存在
  • 505 - 内部服务器错误

HTTP状态码分类:

  • 1** - 信息,服务器收到的请求,须要请求者继续执行操做
  • 2** - 成功,操做被成功接收并处理
  • 3** - 重定向,须要进一步的操做以完成请求
  • 4** - 客户端错误,请求包含语法错误或者没法完成请求
  • 5** 服务器错误,服务器在处理请求的过程
    中发生了错误

八、什么是魔术引号

魔术引号是一个将自动将进入PHP脚本的数据进行转义的过程,最好在编码时不要转义而在运行时根据须要而转义

九、如何获取客户端的ip(要求取得一个int)和服务器ip的代码

客户端:$_SERVER["REMOTE_ADDR"];或者getenv('REMOTE_ADDR')
ip2long进行转换
服务器端:gethostbyname('www.baidu.com')

十、使用那些工具进行版本控制

cvs、svn、vss、git

十一、优化数据库的方法

MySQL数据库优化的八大方式(经典必看)点击获取
  • 选取最适用的字段属性,尽量减小定义字段宽度,尽可能把字段设置NOTNULL,例如'省份'、'性别'最好适用ENUM
  • 使用链接(JOIN)来代替子查询
  • 适用联合(UNION)来代替手动建立的临时表
  • 事务处理
  • 锁定表、优化事务处理
  • 适用外键,优化锁定表
  • 创建索引
  • 优化查询语句

十二、是否使用过模板引擎?使用的模板引擎的名字是?

Smarty:Smarty算是一种很老的PHP模板引擎了,它曾是我使用这门语言模板的最初选择。虽然它的更新已经不算频繁了,而且缺乏新一代模板引擎所具备的部分特性,可是它仍然值得一看。

1三、对于大流量网站,采用什么方法来解决访问量的问题

  • 确认服务器硬件是否可以支持当前的流量
  • 数据库读写分离,优化数据表
  • 程序功能规则,禁止外部的盗链
  • 控制大文件的下载
  • 使用不一样主机分流主要流量

1四、语句include和require的区别是什么?为避免屡次包含同一文件,能够用(?)语句代替他们

  • require是无条件包含,也就是若是一个流程里加入require,不管条件成立与否都会先执行require,当文件不存在或者没法打开的时候,会提示错误,而且会终止程序执行

  • include有返回值,而require没有(可能由于如此require的速度比include快),若是被包含的文件不存在的化,那么会提示一个错误,可是程序会继续执行下去

注意:包含文件不存在或者语法错误的时候require是致命的,而include不是

  • require_once表示了只包含一次,避免了重复包含

1五、谈谈mvc的认识

由模型、视图、控制器完成的应用程序,由模型发出要实现的功能到控制器,控制器接收组织功能传递给视图

1六、 说明php中传值与传引用的区别,并说明传值何时传引用?

变量默认老是传值赋值,那也就是说,当将一个表达式的值赋予一个变量时,整个表达式的值被赋值到目标变量,这意味着:当一个变量的赋予另一个变量时,改变其中一个变量的值,将不会影响到另一个变量

php也提供了另一种方式给变量赋值:引用赋值。这意味着新的变量简单的引用(换言之,成为了其别名或者指向)了原始变量。改动的新的变量将影响到原始变量,反之亦然。使用引用赋值,简单地将一个&符号加到将要赋值的变量前(源变量)

对象默认是传引用
对于较大是的数据,传引用比较好,这样能够节省内存的开销

1七、isset、empty、is_null的区别

isset 判断变量是否认义或者是否为空

变量存在返回ture,不然返回false 变量定义不赋值返回false unset一个变量,返回false 变量赋值为null,返回false 

empty:判断变量的值是否为空,能转换为false的都是空,为空返回true,反之返回false。

"",0,"0",NULL,FALSE都认为为空,返回true 没有任何属性的对象都认为是空 

is_null:检测传入的值(值、变量、表达式)是否为null

定义了,可是赋值为Null 定义了,可是没有赋值 unset一个变量

1八、前端调试的工具

  • Firefox的firebug
  • Chrome的开发工具
  • Emmet
  • JSON格式校验工具

19. 简单描述mysql中,索引,主键,惟一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面)(新浪网技术部)

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里全部记录的引用指针。
普通索引(由关键字KEY或INDEX定义的索引)的惟一任务是加快对数据的访问速度。
普通索引容许被索引的数据列包含重复的值。若是能肯定某个数据列将只包含彼此各不相同的值,在为这个数据列建立索引的时候就应该用关键字UNIQUE把它定义为一个惟一索引。也就是说,惟一索引能够保证数据记录的惟一性。
主键,是一种特殊的惟一索引,在一张表中只能定义一个主键索引,主键用于惟一标识一条记录,使用关键字 PRIMARY KEY 来建立。
索引能够覆盖多个数据列,如像INDEX(columnA, columnB)索引,这就是联合索引。
索引能够极大的提升数据的查询速度,可是会下降插入、删除、更新表的速度,由于在执行这些写操做时,还要操做索引文件。

20.数据库中的事务是什么?

事务(transaction)是做为一个单元的一组有序的数据库操做。若是组中的全部操做都成功,则认为事务成功,即便只有一个操做失败,事务也不成功。若是全部操做完成,事务则提交,其修改将做用于全部其余数据库进程。若是一个操做失败,则事务将回滚,该事务全部操做的影响都将取消。ACID 四大特性,原子性、隔离性、一致性、持久性。

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

XSS是跨站脚本攻击,首先是利用跨站脚本漏洞以一个特权模式去执行攻击者构造的脚本,而后利用不安全的Activex控件执行恶意的行为。
使用htmlspecialchars()函数对提交的内容进行过滤,使字符串里面的特殊符号实体化。

22.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. 控制错误信息,不要在浏览器上输出错误信息,将错误信息写到日志文件中。

23.PHP网站的主要攻击方式有哪些?

  1. 命令注入(Command Injection)
  2. eval 注入(Eval Injection)
  3. 客户端脚本攻击(Script Insertion)
  4. 跨网站脚本攻击(Cross Site Scripting, XSS)
  5. SQL 注入攻击(SQL injection)
  6. 跨网站请求伪造攻击(Cross Site Request
    Forgeries, CSRF)
  7. Session 会话劫持(Session Hijacking)
  8. Session 固定攻击(Session Fixation)
  9. HTTP 响应拆分攻击(HTTP Response Splitting)
  10. 文件上传漏洞(File Upload Attack)
  11. 目录穿越漏洞(Directory Traversal)
  12. 远程文件包含攻击(Remote Inclusion)
  13. 动态函数注入攻击(Dynamic Variable
    Evaluation)
  14. URL 攻击(URL attack)
  15. 表单提交欺骗攻击(Spoofed Form
    Submissions)
  16. HTTP 请求欺骗攻击(Spoofed HTTP Requests)

2四、框架中什么是单一入口和多入口 , 单一入口的优缺点?

  1. 多口就是经过访问不一样的文件来完成用户请求。单一入口只 web 程序全部的请求都指向一个脚本文件的。
  2. 单一入口更容易控制权限,方便对 http 请求能够进行安全性检查。
    缺点:URL 看起来不那么美观,特别是对搜索引擎来讲不友好。

2五、 对于关系型数据库而言,索引是至关重要的概念,请回答有关索引的几个问题:

a)、索引的目的是什么?
  1. 快速访问数据表中的特定信息,提升检索速度
  2. 建立惟一性索引,保证数据库表中每一行数据的惟一性。
  3. 加速表和表之间的链接
  4. 使用分组和排序子句进行数据检索时,能够显著减小查询中分组和排序的时间
b)、索引对数据库系统的负面影响是什么?

负面影响:
建立索引和维护索引须要耗费时间,这个时间随着数据量的增长而增长;索引须要占用物理空间,不光是表须要占用数据空间,每一个索引也须要占用物理空间;当对表进行增、删、改、的时候索引也要动态维护,这样就下降了数据的维护速度。

c)、为数据表创建索引的原则有哪些?
  1. 在最频繁使用的、用以缩小查询范围的字段上创建索引。
  2. 在频繁使用的、须要排序的字段上创建索引
d)、 什么状况下不宜创建索引?
  1. 对于查询中不多涉及的列或者重复值比较多的列,不宜创建索引。
  2. 对于一些特殊的数据类型,不宜创建索引,好比文本字段(text)等。

2六、 简述在MySQL数据库中MyISAM和InnoDB的区别

区别于其余数据库的最重要的特色就是其插件式的表存储引擎。切记:存储引擎是基于表的,而不是数据库。

InnoDB与MyISAM的区别:

InnoDB存储引擎: 主要面向OLTP(Online Transaction Processing,在线事务处理)方面的应用,是第一个完整支持ACID事务的存储引擎(BDB第一个支持事务的存储引擎,已经中止开发)。

特色:

  • 行锁设计、支持外键;
  • 支持相似于Oracle风格的一致性非锁定读(即:默认状况下读取操做不会产生锁);
  • InnoDB将数据放在一个逻辑的表空间中,由InnoDB自身进行管理。从MySQL4.1版本开始,能够将每一个InnoDB存储引擎的表单独存放到一个独立的ibd文件中;
  • InnoDB经过使用MVCC(多版本并发控制:读不会阻塞写,写也不会阻塞读)来得到高并发性,而且实现了SQL标准的4种隔离级别(默认为REPEATABLE级别);
  • InnoDB还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead)等高性能和高可用的功能;
  • InnoDB采用了汇集(clustered)的方式来存储表中的数据,每张标的存储都按主键的顺序存放(若是没有显式的在建表时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此做为主键);
  • InnoDB表会有三个隐藏字段:除了上面提到了6字节的DB_ROW_ID外,还有6字节的DB_TX_ID(事务ID)和7字节的DB_ROLL_PTR(指向对应回滚段的地址)。这个能够经过innodb monitor看到;

MyISAM存储引擎: 是MySQL官方提供的存储引擎,主要面向OLAP(Online Analytical Processing,在线分析处理)方面的应用。
特色:

  • 不支持事务,支持表所和全文索引。操做速度快;
  • MyISAM存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件。MySQL数据库只缓存其索引文件,数据文件的缓存交给操做系统自己来完成;
    MySQL5.0版本开始,MyISAM默认支持256T的单表数据;

2七、 解释MySQL外链接、内链接与自链接的区别

先说什么是交叉链接: 交叉链接又叫笛卡尔积,它是指不使用任何条件,直接将一个表的全部记录和另外一个表中的全部记录一一匹配。

内链接 则是只有条件的交叉链接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出如今结果集中,即内链接只链接匹配的行。
外链接 其结果集中不只包含符合链接条件的行,并且还会包括左表、右表或两个表中
的全部数据行,这三种状况依次称之为左外链接,右外链接,和全外链接。

左外链接,也称左链接,左表为主表,左表中的全部记录都会出如今结果集中,对于那些在右表中并无匹配的记录,仍然要显示,右边对应的那些字段值以NULL来填充。右外链接,也称右链接,右表为主表,右表中的全部记录都会出如今结果集中。左链接和右链接能够互换,MySQL目前还不支持全外链接。

2八、 写出三种以上MySQL数据库存储引擎的名称(提示:不区分大小写)

MyISAM、InnoDB、BDB(BerkeleyDB)、Merge、Memory(Heap)、Example、Federated、
Archive、CSV、Blackhole、MaxDB 等等十几个引擎

2九、 什么是面向对象?主要特征是什么?几大原则是什么?

面向对象是程序的一种设计模式,它利于提升程序的重用性,使程序机构更加清晰。 主要特征是:封装、继承、多态。
五大基本原则: 单一职责原则;开放封闭原则;替换原则; 依赖原则; 接口分离原则。

30、什么是静态路由,其特色是什么?什么是动态路由,其特色是什么?

 参考答案:
  静态路由是由系统管理员设计与构建的路由表规定的路由。适用于网关数量有限的场 合,且网络拓朴结构不常常变化的网络。其缺点是不能动态地适用网络情况的变化,当 网络情况变化后必须由网络管理员修改路由表。
动态路由是由路由选择协议而动态构建的,路由协议之间经过交换各自所拥有的路由信 息实时更新路由表的内容。动态路由能够自动学习网络的拓朴结构,并更新路由表。其 缺点是路由广播更新信息将占据大量的网络带宽。

3一、使用过 Memcache 缓存吗,若是使用过,可以简单的描述一下它的工做原理吗?

Memcahce 是把全部的数据保存在内存当中,采用 hash 表的方式,每条数据由 key 和 value 组成,每一个 key 是独一无二的,当要访问某个值的时候先按照找到值,而后返回结果。
Memcahce 采用 LRU 算法来逐渐把过时数据清除掉。

32. 列举流行的 Ajax 框架?说明 Ajax 实现原理是什么及 json 在 Ajax 中起什么做用?

流行的 Ajax 框架有 jQuery,Prototype,Dojo,MooTools。

Ajax 的工做原理是一个页面的指定位置能够加载另外一个页面全部的输出内容,这样就实现了一个静态页面也能获取到数据库中的返回数据信息了。因此 Ajax 技术实现了一个静态网页在不刷新整个页面的状况下与服务器通讯,减小了用户等待时间,同时也从而下降了网络流量,加强了客户体验的友好程度。
在使用 Ajax 时,涉及到数据传输,即将数据从服务器返回到客户端,服务器端和客户端分别使用不一样的脚步语言来处理数据,这就须要一种通用的数据格式,XML 和 json 就是最经常使用的两种,而 json 比 XML 更简单。

3三、Myql中的事务回滚机制概述

事务是用户定义的一个数据库操做序列,这些操做要么全作要么全不作,是一个不可分割的工做单位,事务回滚是指将该事务已经完成的对数据库的更新操做撤销。

  要同时修改数据库中两个不一样表时,若是它们不是一个事务的话,当第一个表修改完,可能第二个表修改过程当中出现了异常而没能修改,此时就只有第二个表依旧是未修改以前的状态,而第一个表已经被修改完毕。而当你把它们设定为一个事务的时候,当第一个表修改完,第二表修改出现异常而没能修改,第一个表和第二个表都要回到未修改的状态,这就是所谓的事务回滚。

相关文章
相关标签/搜索