php面试题与答案
Posted 画个圈圈爱上你
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php面试题与答案相关的知识,希望对你有一定的参考价值。
是什么 ,在什么地方用,注意什么,特点,如何配置(相关关联),出现的问题(缺点),引出解决办法或另一种方法
+-
php:Hypertext Preprocessor
一、get和post的区别
1. get是从服务器上获取数据,post是向服务器传送数据。
2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在html HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
二、session与cookie的区别
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、所以个人建议:
将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中
6、cookie有5个参数(名,值,有效期,服务器路径,域名,规定是否通过安全的 HTTPS 连接来传输 cookie)
三、数据库中的事务是什么
事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务:
原子性
事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
一致性
事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。
事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。
隔离性
由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,
要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,
并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。
持久性
事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。
begin 开始一个事务
rollback事务回滚
commit事务确认
注:rollback和commit不能并列使用,当同时使用时,只有前面一个生效
mysql默认是自动提交的
可以通过set autocommit=0 来设置 禁止自动提交
可以通过set autocommit=1 来设置 开启自动提交
四、PHP打印 日期
<?php
echo date('Y-m-d H:i:s', strtotime('-1 day')); //前一天
echo '<br>';
echo date('Y-m-d H:i:s', strtotime('-1 week'));//前一周
echo '<br>';
echo date('Y-m-d H:i:s');//现在时间
echo '<br>';
echo date('Y-m-d H:i:s', strtotime('next Monday'));//下一个星期一
echo '<br>';
echo date('Y-m-d H:i:s', strtotime('last Monday'));//上一个星期一
echo “现在的时间是:” .date(h:i:sa); //a - 小写的上午和午后(am 或 pm)
?>
/* 时间差 */
<?php
$startdate = strtotime("2012-01-01");
$enddate = strtotime("2012-02-14");
$days = round(($enddate-$startdate) / 86400)+1;
echo $days;
?>
先用5升的水壶装满水,倒入六升的水壶中.六升的水壶中还空出 一升水体积.
2.再用把盛五升水水壶装满水,倒入容积六升的水壶中,壶中还剩4升水.
3.把容积六升水中的水倒掉,再把容积五升的水壶倒满水,把这些水倒入容积六升的壶中,容积五升的水壶中这时刚好剩下三升水.
五、能够使Html和PHP分离开的模板
smarty ,phptal ,template、 PHPlib Template 、 FastTemplate
Smarty , Dwoo , TinyButStrong , Template Lite , Savant , phemplate , XTemplate
echo $a[0]; echo $a{0}; echo chr(ord($a));
七、echo(),print(),print_r()的区别
echo
可以一次输出多个值,多个值之间用逗号分隔。echo是语言结构(language construct),而并不是真正的函数,因此不能作为表达式的一部分使用。
print()
函数print()打印一个值(它的参数),如果字符串成功显示则返回true,否则返回false。
printf()
printf()源于C语言中的printf()。该函数输出格式化的字符串。
print_r()和var_dump()
print_r()可以把字符串和数字简单地打印出来,而数组则以括起来的键和值得列表形式显示,并以Array开头
有两个参数,第二个参数为true的时候,返回值,而不显示。
八、PHP可以和sql server/oracle等数据库连接吗
Oracle
<?php
$dbconn=oci_connect("你的账号","你的密码","你的数据库名称");//请把中文件设置为你的值;
$stmt=oci_parse($dbconn, "select * from scott.hallo");
oci_execute($stmt, OCI_DEFAULT);
echo $conn."----selecting\\n\\n";
while (oci_fetch($stmt))
{
echo ($conn."[".oci_result($stmt, "TEST")."]\\n\\n");
}
echo ($conn . "----done\\n\\n");
?>
九、php5权限控制修饰符
public(公共), private(私用), protected(继承)
九点一:魔术方法
__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload
1、__get、__set
这两个方法是为在类和他们的父类中没有声明的属性而设计的
__get( $property ) 当调用一个未定义的属性时访问此方法
__set( $property, $value ) 给一个未定义的属性赋值时调用
这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)
2、__isset、__unset
__isset( $property ) 当在一个未定义的属性上调用isset()函数时调用此方法
__unset( $property ) 当在一个未定义的属性上调用unset()函数时调用此方法
与__get方法和__set方法相同,这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)
3、__call
__call( $method, $arg_array ) 当调用一个未定义的方法是调用此访求
这里的未定义的方法包括没有权限访问的方法
4、__autoload
__autoload 函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。
注意: 在 __autoload 函数中抛出的异常不能被 catch 语句块捕获并导致致命错误。
5、__construct、__destruct
__construct 构造方法,当一个对象创建时调用此方法,使用此方法的好处是:可以使构造方法有一个独一无二的名称,无论它所在的类的名称是什么.这样你在改变类的名称时,就不需要改变构造方法的名称
__destruct 析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法
默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源.
析构函数允许你在使用一个对象之后执行任意代码来清除内存.
当PHP决定你的脚本不再与对象相关时,析构函数将被调用.
在一个函数的命名空间内,这会发生在函数return的时候.
对于全局变量,这发生于脚本结束的时候.如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值.通常将变量赋值勤为NULL或者调用unset.
6、__clone
PHP5中的对象赋值是使用的引用赋值,如果想复制一个对象则需要使用clone方法,在调用此方法是对象会自动调用__clone魔术方法
如果在对象复制需要执行某些初始化操作,可以在__clone方法实现
7、__toString
__toString方法在将一个对象转化成字符串时自动调用,比如使用echo打印对象时
如果类没有实现此方法,则无法通过echo打印对象,否则会显示:Catchable fatal error: Object of class test could not be converted to string in
此方法必须返回一个字符串
在PHP 5.2.0之前,__toString方法只有结合使用echo() 或 print()时 才能生效。PHP 5.2.0之后,则可以在任何字符串环境生效(例如通过printf(),使用%s修饰符),但 不能用于非字符串环境(如使用%d修饰符)。从PHP 5.2.0,如果将一个未定义__toString方法的对象 转换为字符串,会报出一个E_RECOVERABLE_ERROR错误。
8、__sleep、__wakeup
__sleep 串行化的时候用
__wakeup 反串行化的时候调用
serialize() 检查类中是否有魔术名称 __sleep 的函数。如果这样,该函数将在任何序列化之前运行。它可以清除对象并应该返回一个包含有该对象中应被序列化的所有变量名的数组。
使用 __sleep 的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。
相反地,unserialize() 检查具有魔术名称 __wakeup 的函数的存在。如果存在,此函数可以重建对象可能具有的任何资源。
使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。
9、__set_state
当调用var_export()时,这个静态 方法会被调用(自PHP 5.1.0起有效)。
本方法的唯一参数是一个数组,其中包含按array(’property’ => value, …)格式排列的类属性。
10、__invoke
当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用。
PHP5.3.0以上版本有效
11、__callStatic
它的工作方式类似于 __call() 魔术方法,__callStatic() 是为了处理静态方法调用,
PHP5.3.0以上版本有效
PHP 确实加强了对 __callStatic() 方法的定义;它必须是公共的,并且必须被声明为静态的。同样,__call() 魔术方法必须被定义为公共的,所有其他魔术方法都必须如此。
十、写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名
例如: http://www.sina.com.cn/abc/de/fg.
public string GetExtended(string url)
{
return url.Substring(url.LastIndexOf('.'));
}
例如: http://www.sina.com.cn/abc/de/fg.php?id=1 需要取出 php 或 .php
function getExt($url){
$arr = parse_url($url);
$file = basename($arr['path']);
$ext = explode(".",$file);
return $ext[1];
}
十一、php5的构造函数和析构函数是?
构造函数:__construct() 在类实例化对象的同时执行该函数;析构函数:distruct() 在类实例化的对象销毁时执行。
十二、写一个函数,算出两个文件的相对路径
如 $a = '/a/b/c/d/e.php';
$b = '/a/b/12/34/c.php';
计算出 $b 相对于 $a 的相对路径应该是 ../../c/d将()添上
function getRelativePath($a, $b) {
$returnPath = array(dirname($b));
$arrA = explode('/', $a);
$arrB = explode('/', $returnPath[0]);
for ($n = 1, $len = count($arrB); $n < $len; $n++) {
if ($arrA[$n] != $arrB[$n]) {
break;
}
}
if ($len - $n > 0) {
$returnPath = array_merge($returnPath, array_fill(1, $len - $n, '..'));
}
$returnPath = array_merge($returnPath, array_slice($arrA, $n));
return implode('/', $returnPath);
}
遍历文件夹及文件:
function show($dirs){
$dir = opendir($dirs);
echo "<ul>";
while($f=readdir($dir)){
if($f!='.' && $f!='..'){
echo "<li>{$f}</li>";
if(is_dir("$dirs/{$f}")){
show("$dirs/{$f}");
}
}
}
echo "</ul>";
}
getFiles("C:\\web\\HTML5Upload");
//getFiles($_SERVER['DOCUMENT_ROOT']);
十三、如何 实现网站静态化
使用php的ob缓存实现页面静态化 引出ob缓存,一键生成时过期时间一致。
方法一:使用现成的插件,比如:ISAPI_Rewrite、IIS Rewrite、Apache
HTTP服务器的mod_rewrite等,它们都是基于正则表达式解析器开发的重写引擎。它们的使用方法查看它们自带的帮助即可。
方法二:自己写的代码实现动态网页静态化,方法也有好几种:
1、创建FSO对象,利用此对象将所需的内容动态创建到文件中生成HTML页面;
2、利用模板技术,将模板中特殊代码的值替换为从表单或是数据库字段中接受过来的值 生成HTML文件;
3、使用Server.Transfer转换技术,
方法三:使用HttpWebRequest请求客户端的方式,获取返回资源,生成静态页面。一般这样只需要获取网页内容即可,其它资源可放置在服务器上,自动加载。(注:此方法缺点明显,需要大量更改匹配URL,建议慎用)
方法四:在asp中有IhttpModule接口。Ihttpmodule可以简单理解为一个可以在执行像.aspx,或者mvc中control/action前,添加我们自定义的操作的东西。
分类:服务器负载
确认服务器硬件是否足够支持当前的流量。
优化数据库访问。
禁止外部的盗链
控制大文件的下载
使用不同主机分流主要流量
使用流量分析统计软件。
客户端 $_SERVER[REMOTE_ADDR]
服务器 $_SERVER[SERVER_ADDR]
十六、include和require 的区别
include和require 都能把另外一个文件包含到当前文件中
include引入文件的时候,如果碰到错误,会给出提示,并继续运行下边的代码。
require引入文件的时候,如果碰到错误,会给出提示,并停止运行下边的代码。
十七、如何修改session的生存时间
一:在php.ini 中设置 session.gc_maxlifetime = 1440 //默认时间
二:代码实现
$lifeTime = 24 * 3600; // 保存一天
session_set_cookie_params($lifeTime);
session_start();
$html = file_get_contents('http://www.baidu.com/');
使用URL获取内容
使用sinope
十九、在HTTP 1.0中,状态码401的含义是什么;如果返回“找不到文件”的提示,用header函数
状态码401的含义是:未授权(Unauthorized)
如果返回“找不到文件”的提示 用:Header("http/1.0 403 Forbidden");
(一)、1字开头:这一类型 的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,史包含状态行和某些可选 的响应头信息,并以空行结束。
100 发出请求
101 切换协议
(二)、2字开头的状态码,请求已 成功被 器 接收、理解
200 交易成功
201 已创建
202 已接受
203 非权威性信息
204 无内存
205 重置内容
206 部分内容
207 多状态
(三)、3字开头:需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址在本次响应的location域中指明
301 永久移除
302 临时移除
(四)、4字开头:
1、语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求
2、请求参数有误
400 错误请求
401访问被拒绝
402 【为将来可能的需求而预留的】
403禁止访问
404 没有发现文件
(五)、代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以的软硬件资源无法完成对请求的处理,除非这是一个HEAD请求,澡是服务器应当包含一个解释当前错误状态以及这个善是临时的还是永久的解释 信息实体。浏览器应当向用户展示任何在当前响应中被 包含的实体
500 内部服务器错误
501 页眉值指定了未实现的配置
502 无效响应
503 服务器不可用
504 网关超时
505 服务器不支持
二十、谈谈对MVC的认识
MVC(Model-View-Controller),即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。
视图(View):代表用户交互界面,MVC设计模式对于视图的处理是限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程的处理。
模型(Model):业务流程/状态的处理以及业务规则的制定。业务流程的处理过程对其它层来说是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计可以说是MVC的核心。
控制(Controller):可以理解为从用户接收请求, 将模型与视图匹配在一起,共同完成用户的请求,但是它却不做任何的数据处理。
二十一、php设计模式
1、单例模式 2、工厂模式 3、观察者模式 4、命令链模式 5、策略模式
1、 单例模式:
a) 一个类在整个应用中,只有一个对象实例的设计模式
b) 类必须自行创建这个实例
c) 必须自行向整个系统提供这个实例
三私:私有静态成员变量、构造函数、克隆函数
一公:公共的静态方法
2、工厂模式
可以根据输入的参数或者应用程序配置的不同一创建一种专门用来实例化并返回其它类的实例的类
3、观察者模式
观察者模式提供了组件之间紧密耦合的另一种方法。
该模式:一个对象通过添加一个方法(该方法允许另一个对象,即观察者注册自己)全本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。
二十二、HTTP & HTTPS
http ()超文本传输协议 | https (Secure Hypertext Transfer Protocol)安全超文本传输协议 |
1、 效率更高 2、 使用端口80来和TCP/IP进行通信, 信息明文传输
| 1、 安全性更高 2、 端口443,使用SSL作为HTTP应用层的子层(SSL使用40位关键字作为RC4流的加密算法 SSL:安全保密协议,运行在TCP/IP层之上、应用层之下 3、 使用https需要到CA申请一个用于证明服务器用途类型的证书 |
|
|
1、 http的URL以http://开头,而https的URL以https://开头 2、 http是不安全的,而https是安全的 3、 http标准端口80,面https©的标准商品443 4、 在OSI网络模型中,http工作于应用层,https工作在传输层 5、 http无法加密,而https对传输的数据进行加密 6、 http无需证书,而https需要CA机构wosign颁发的SSL证书 |
二十三、MySql字符类型
二十四、《索引》
(1) 唯一索引:唯一的任务就是加快访问速度,唯一索引的目的是为了避免重复的数据。
(2) 普通索引:普通索引允许被索引的数据列包含重复的值。优点1、简化MySQL对这个索引的管理工作,使工作更有效率。2、MySQL会对新插入的数据自动检测是否有重复的值。 大多时候创建唯一索引的目的往往是为了避免重复的数据,而不是提高访问速度。
(3) 主索引 :即主键索引,关键字PRIMARY
(4) 外键索引:外键约束
(5) 复合索引:索引可以覆盖多列数据。如 INDEX(columnA,columnB)。这种索引的特点是MySQL可以有选择的使用这样的一个索引,比如:INDEX(A,B,C)可以当做A或(A,B )的索引来使用,但不能当做B或(B,C)来使用。
(6) 索引的长度:在为CHAR和VARCHAR类型的数据列定义索引时,可以把索引的长度限制为一个给定的字符个数,这个数字必须小于这个字段所允许的最大字符个数。
(7) 全文索引:针对内容开头的字符进行检索操作,如果检索的内容是多个字段构成、数据量较大,全文索引是必要的。注解:InnoDB数据表不支持全文索引。
二十五、索引的优缺点
1、优点:
a)可以保证数据库表中每一行的数据的唯一性
b)可以大大加快数据的索引速度
c)加速表与表之间的连接,物别是在实现数据的参考完事性方面特别有意义
d)在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间
f)通过使用索引,可以在时间查询的过程中,使用优化隐藏器,提高系统的性能
2、缺点:
a) 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
b) 索引需要占物理空间,除了数据表占用数据空间之外,每一个索引还要占用一定的物理空间,如果需要建立聚簇索引,那么需要占用的空间会更大
c) 以表中的数据进行增、删、改的时候,索引也要动态的维护,这就降低了整数的维护速度
4、 建立索引的原则
a) 在经常需要搜索的列上,可以加快搜索的速度
b) 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构
c) 在经常用在连接的列上,这些列主要是一外键,可以加快连接的速度
d) 在经经常需要根据范围进行搜索的列上创建索引,国为索引已经排序,其指定的范围是连续的
e) 在经常需要排序的列上,国为索引已经排序,这样井底可以利用索引的排序,加快排序井底时间
f) 在经常使用在where子句中的列上,加快条件的判断速度
二十六、Myisam 和 Innodb优缺点
| MyISAM | InnoDB |
构成上的区别: | 每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。 数据文件的扩展名为 .MYD(MYData) 索引文件的扩展名是 .MYI(MYIndex) | 基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB |
事务处理上方面: | MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持 | InnoDB提供事务支持事务, 外部键等高级数据库功能 |
SELECT UPDATE,INSERT,Delete操作 | MyISAM表格可以被压缩, 而且它们支持全文搜索 不支持热备,不支持事务
执行大量的SELECT,MyISAM是更好的选择 | 1.如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表 3. LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用 |
对AUTO_INCREMENT的操作 | 每表一个AUTO_INCREMEN列的内部处理。 |