国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php开源 > php教程 > php面试题与答案

php面试题与答案

来源:程序员人生   发布时间:2016-06-30 08:47:45 阅读次数:2500次

是甚么 ,在甚么地方用,注意甚么,特点,如何配置(相干关联),出现的问题(缺点),引出解决办法或另外一种方法

+-

PHPHypertext Preprocessor

 

1、getpost的区分

1. get是从服务器上获得数据,post是向服务器传送数据。
2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段逐一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内1起传送到ACTION属性所指的URL地址。用户看不到这个进程。
3. get方式,服务器Request.QueryString获得变量的值,对post方式,服务器Request.Form获得提交的数据。
4. get传送的数据量较小,不能大于2KBpost传送的数据量较大,1般被默许为不受限制。但理论上,IIS4中最大量为80KBIIS5中为100KB
5. get安全性非常低,post安全性较高。但是履行效力却比Post方法好。

 

2、sessioncookie的区分

1cookie数据寄存在客户的阅读器上,session数据放在服务器上。

2cookie不是很安全,他人可以分析寄存在本地的COOKIE并进行COOKIE欺骗
   斟酌到安全应当使用session

3session会在1定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
   斟酌到减轻服务器性能方面,应当使用COOKIE

4、单个cookie保存的数据不能超过4K,很多阅读器都限制1个站点最多保存20cookie

5、所以个人建议:
   将登陆信息等重要信息寄存为SESSION
   其他信息如果需要保存,可以放在COOKIE

6cookie5个参数(名,值,有效期,服务器路径,域名,规定是不是通过安全的 HTTPS 连接来传输 cookie)

 

3、数据库中的事务是甚么

事务是作为1个逻辑单元履行的1系列操作,1个逻辑工作单元必须有4个属性,称为 ACID(原子性、1致性、隔离性和持久性)属性,只有这样才能成为1个事务:
原子性
事务必须是原子工作单元;对其数据修改,要末全都履行,要末全都不履行。

1致性
事务在完成时,必须使所有的数据都保持1致状态。在相干数据库中,所有规则都必须利用于事务的修改,以保持所有数据的完全性。
事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。

隔离性
由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要末是另外一并发事务修改它之前的状态,
       要末是另外一事务修改它以后的状态,事务不会查看中间状态的数据。这称为可串行性,由于它能够重新装载起始数据,
       并且重播1系列事务,以使数据结束时的状态与原始事务履行的状态相同。
持久性
事务完成以后,它对系统的影响是永久性的。该修改即便出现系统故障也将1直保持。

 

begin 开始1个事务

rollback事务回滚

commit事务确认

注:rollbackcommit不能并列使用,当同时使用时,只有前面1个生效

 

MYSQL默许是自动提交的

可以通过set autocommit=0 来设置 制止自动提交

可以通过set autocommit=1 来设置 开启自动提交

 

4、PHP打印 日期

 

<?php
echo date('Y-m-d H:i:s', strtotime('⑴ day')); //前1天
echo '<br>';
echo date('Y-m-d H:i:s', strtotime('⑴ week'));//前1周
echo '<br>';
echo date('Y-m-d H:i:s');//现在时间
echo '<br>';
echo date('Y-m-d H:i:s', strtotime('next Monday'));//下1个星期1
echo '<br>';
echo date('Y-m-d H:i:s', strtotime('last Monday'));//上1个星期1

echo “现在的时间是:” .date(h:i:sa);  //a - 小写的上午和午后(am pm

?>

/*  时间差  */

<?php
$startdate = strtotime("2012-01-01");
$enddate = strtotime("2012-02⑴4");
$days = round(($enddate-$startdate) / 86400)+1;
echo $days;
?>

先用5升的水壶装满水,倒入6升的水壶中.6升的水壶中还空出 1升水体积.

2.再用把盛5升水水壶装满水,倒入容积6升的水壶中,壶中还剩4升水.

3.把容积6升水中的水倒掉,再把容积5升的水壶倒满水,把这些水倒入容积6升的壶中,容积5升的水壶中这时候恰好剩下3升水.

5、能够使HtmlPHP分离开的模板

 

smarty phptal templatePHPlib Template FastTemplate

 

Smarty , Dwoo , TinyButStrong , Template Lite , Savant , phemplate , XTemplate

 

6、$a='abcdef';请取出$a的值并打印出第1个字

echo $a[0];   echo $a{0};   echo chr(ord($a));

 

7、echo(),print(),print_r()的区分

echo
可以1次输出多个值,多个值之间用逗号分隔。echo是语言结构(language construct),而其实不是真实的函数,因此不能作为表达式的1部份使用。

print()
函数print()打印1个值(它的参数),如果字符串成功显示则返回true,否则返回false

printf()
printf()源于C语言中的printf()。该函数输出格式化的字符串。

print_r()var_dump()
print_r()可以把字符串和数字简单地打印出来,而数组则以括起来的键和值得列表情势显示,并以Array开头

有两个参数,第2个参数为true的时候,返回值,而不显示。

 

8、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");
?>

 

 

 

9、php5权限控制修饰符

public(公共), private(私用), protected(继承)

 

9点1:魔术方法

__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload

1__get__set
这两个方法是为在类和他们的父类中没有声明的属性而设计的
__get( $property ) 当调用1个未定义的属性时访问此方法
__set( $property, $value ) 给1个未定义的属性赋值时调用
这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)

2__isset__unset
__isset( $property ) 当在1个未定义的属性上调用isset()函数时调用此方法
__unset( $property ) 当在1个未定义的属性上调用unset()函数时调用此方法
__get方法和__set方法相同,这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)
3__call
__call( $method, $arg_array ) 当调用1个未定义的方法是调用此访求
这里的未定义的方法包括没有权限访问的方法

4__autoload
__autoload 函数,它会在试图使用还没有被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后1个机会加载所需的类。
注意: __autoload 函数中抛出的异常不能被 catch 语句块捕获并致使致命毛病。

5__construct__destruct
__construct 构造方法,当1个对象创建时调用此方法,使用此方法的好处是:可使构造方法有1个唯一无2的名称,不管它所在的类的名称是甚么.这样你在改变类的名称时,就不需要改变构造方法的名称
__destruct 析构方法,PHP将在对象被烧毁前(即从内存中清除前)调用这个方法
默许情况下,PHP仅仅释放对象属性所占用的内存并烧毁对象相干的资源.
析构函数允许你在使用1个对象以后履行任意代码来清除内存.
PHP决定你的脚本不再与对象相干时,析构函数将被调用.
在1个函数的命名空间内,这会产生在函数return的时候.
对全局变量,这产生于脚本结束的时候.如果你想明确地烧毁1个对象,你可以给指向该对象的变量分配任何其它值.通常将变量赋值勤为NULL或调用unset.

6__clone
PHP5中的对象赋值是使用的援用赋值,如果想复制1个对象则需要使用clone方法,在调用此方法是对象会自动调用__clone魔术方法
如果在对象复制需要履行某些初始化操作,可以在__clone方法实现

7__toString 
__toString方法在将1个对象转化成字符串时自动调用,比如使用echo打印对象时
如果类没有实现此方法,则没法通过echo打印对象,否则会显示:Catchable fatal error: Object of class test could not be converted to string in
此方法必须返回1个字符串

PHP 5.2.0之前,__toString方法只有结合使用echo() print()时 才能生效。PHP 5.2.0以后,则可以在任何字符串环境生效(例如通过printf(),使用%s修饰符),但 不能用于非字符串环境(如使用%d修饰符)。从PHP 5.2.0,如果将1个未定义__toString方法的对象 转换为字符串,会报出1个E_RECOVERABLE_ERROR毛病。

8__sleep__wakeup
__sleep 串行化的时候用
__wakeup 反串行化的时候调用
serialize() 检查类中是不是有魔术名称 __sleep 的函数。如果这样,该函数将在任何序列化之前运行。它可以清除对象并应当返回1个包括有该对象中应被序列化的所有变量名的数组。
使用 __sleep 的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。另外,如果有非常大的对象而其实不需要完全贮存下来时此函数也很有用。
相反地,unserialize() 检查具有魔术名称 __wakeup 的函数的存在。如果存在,此函数可以重建对象可能具有的任何资源。
使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库连接和处理其它重新初始化的任务。

9__set_state
当调用var_export()时,这个静态 方法会被调用(自PHP 5.1.0起有效)。
本方法的唯1参数是1个数组,其中包括按array(’property’ => value, …)格式排列的类属性。

10__invoke
当尝试以调用函数的方式调用1个对象时,__invoke 方法会被自动调用。
PHP5.3.0以上版本有效
11__callStatic
它的工作方式类似于 __call() 魔术方法,__callStatic() 是为了处理静态方法调用,
PHP5.3.0以上版本有效
PHP 确切加强了对 __callStatic() 方法的定义;它必须是公共的,并且必须被声明为静态的。一样,__call() 魔术方法必须被定义为公共的,所有其他魔术方法都必须如此。

  

 

10、写1个函数,尽量高效的,从1个标准 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];
}

101、php5的构造函数和析构函数是?

构造函数:__construct()  在类实例化对象的同时履行该函数;析构函数:distruct() 在类实例化的对象烧毁时履行。

 

102、写1个函数,算出两个文件的相对路径
  如 $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']);

 

 

103、如何 实现网站静态化

 

 

使用php的ob缓存实现页面静态化 引出ob缓存,1键生成时过期时间1致。

 

方法1:使用现成的插件,比如:ISAPI_RewriteIIS RewriteApache
HTTP服务器mod_rewrite等,它们都是基于正则表达式解析器开发的重写引擎。它们的使用方法查看它们自带的帮助便可。

方法2:自己写的代码实现动态网页静态化,方法也有好几种:

1、创建FSO对象,利用此对象将所需的内容动态创建到文件中生成HTML页面;
2、利用模板技术,将模板中特殊代码的值替换为从表单或是数据库字段中接受过来的值 生成HTML文件;
3、使用Server.Transfer转换技术,


方法3:使用HttpWebRequest要求客户真个方式,获得返回资源,生成静态页面。1般这样只需要获得网页内容便可,其它资源可放置在服务器上,自动加载。(注:此方法缺点明显,需要大量更改匹配URL,建议慎用)

方法4:在asp中有IhttpModule接口。Ihttpmodule可以简单理解为1个可以在履行像.aspx,mvccontrol/action前,添加我们自定义的操作的东西。

 

104、大流量的网站如何解决访问量的问题

 

分类:服务器负载

确认服务器硬件是不是足够支持当前的流量。

优化数据库访问。

制止外部的盗链

控制大文件的下载

使用不同主机分流主要流量

使用流量分析统计软件。

 

105、PHP获得客户端和服务器IP

客户端 $_SERVER[REMOTE_ADDR]
服务器 $_SERVER[SERVER_ADDR]

 

106、includerequire 的区分

includerequire 都能把另外1个文件包括到当前文件中

include引入文件的时候,如果碰到毛病,会给出提示,并继续运行下边的代码。

require引入文件的时候,如果碰到毛病,会给出提示,并停止运行下边的代码。

 

107、如何修改session的生存时间

1:在php.ini 中设置 session.gc_maxlifetime = 1440 //默许时间

2:代码实现
$lifeTime = 24 * 3600;  // 保存1天
session_set_cookie_params($lifeTime);
session_start();

 

108、php根据URL取得网页内容

$html = file_get_contents('http://www.baidu.com/');  

使用URL获得内容

使用sinope

 

109、在HTTP 1.0中,状态码401的含义是甚么;如果返回“找不到文件”的提示,用header函数

 

状态码401的含义是:未授权(Unauthorized)

如果返回找不到文件的提示 用:Header("http/1.0 403 Forbidden");

(1)、1字开头:这1类型 的状态码,代表要求已被接受,需要继续处理。这类响应是临时响应,史包括状态行和某些可选 的响应头信息,并以空行结束。

100 发出要求

101 切换协议

(2)、2字开头的状态码,要求已 成功被 器 接收、理解

200 交易成功

201 已创建

202 已接受

203 非权威性信息

204 无内存

205 重置内容

206 部份内容

207 多状态

(3)、3字开头:需要客户端采取进1步的操作才能完成要求。通常,这些状态码用来重定向,后续的要求地址在本次响应的location域中指明

301 永久移除

302 临时移除

(4)、4字开头:

1、语义有误,当前要求没法被服务器理解。除非进行修改,否则客户端不应当重复提交这个要求

2、要求参数有误

 

400 毛病要求

401访问被谢绝

402 【为将来可能的需求而预留的】

403制止访问

404 没有发现文件

(5)、代表了服务器在处理要求的进程中有毛病或异常状态产生,也有多是服务器意想到以的软硬件资源没法完成对要求的处理,除非这是1个HEAD要求,澡是服务器应当包括1个解释当前毛病状态和这个善是临时的还是永久的解释 信息实体。阅读器应当向用户展现任何在当前响应中被 包括的实体

500 内部服务器毛病

501 页眉值指定了未实现的配置

502 无效响应

503 服务器不可用

504 网关超时

505 服务器不支持

 

210、谈谈对MVC的认识

MVCModel-View-Controller),即把1个利用的输入、处理、输出流程依照ModelViewController的方式进行分离,这样1个利用被分成3个层——模型层、视图层、控制层。

视图(View):代表用户交互界面,MVC设计模式对视图的处理是限于视图上数据的收集和处理,和用户的要求,而不包括在视图上的业务流程的处理。

模型(Model):业务流程/状态的处理和业务规则的制定。业务流程的处理进程对其它层来讲是黑箱操作,模型接受视图要求的数据,并返回终究的处理结果。业务模型的设计可以说是MVC的核心。

控制(Controller):可以理解为从用户接收要求, 将模型与视图匹配在1起,共同完成用户的要求,但是它却不做任何的数据处理。

 

2101、php设计模式

1、单例模式 2、工厂模式 3、视察者模式 4、命令链模式 5、策略模式

 

1、 单例模式

a) 1个类在全部利用中,只有1个对象实例的设计模式

b) 类必须自行创建这个实例

c) 必须自行向全部系统提供这个实例

 

3私:私有静态成员变量、构造函数、克隆函数

1公:公共的静态方法

2工厂模式

可以根据输入的参数或利用程序配置的不同1创建1种专门用来实例化并返回其它类的实例的类

3、视察者模式

视察者模式提供了组件之间紧密耦合的另外一种方法。

该模式:1个对象通过添加1个方法(该方法允许另外一个对象,即视察者注册自己)全本身变得可视察。当可视察的对象更改时,它会将消息发送到已注册的视察者。这些视察者使用该信息履行的操作与可视察的对象无关。

 

2102、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个用于证明服务器用处类型的证书

 

 

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证书

 

2103、MySql字符类型

 

2104、《索引》

(1) 唯1索引:唯1的任务就是加快访问速度,唯1索引的目的是为了不重复的数据。

(2) 普通索引:普通索引允许被索引的数据列包括重复的值。优点1、简化MySQL对这个索引的管理工作,使工作更有效力。2MySQL会对新插入的数据自动检测是不是有重复的值。 大多时候创建唯1索引的目的常常是为了不重复的数据,而不是提高访问速度。

(3) 主索引  :即主键索引,关键字PRIMARY

(4) 外键索引:外键束缚

(5) 复合索引:索引可以覆盖多列数据。如 INDEXcolumnA,columnB)。这类索引的特点是MySQL可以有选择的使用这样的1个索引,比如:INDEXA,B,C)可以当作A或(AB )的索引来使用,但不能当作B或(BC)来使用。

(6) 索引的长度:在为CHARVARCHAR类型的数据列定义索引时,可以把索引的长度限制为1个给定的字符个数,这个数字必须小于这个字段所允许的最大字符个数。

(7) 全文索引:针对内容开头的字符进行检索操作,如果检索的内容是多个字段构成、数据量较大,全文索引是必要的。注解:InnoDB数据表不支持全文索引。

 

 

2105、索引的优缺点

1、优点:

a)可以保证数据库表中每行的数据的唯1性

b)可以大大加快数据的索引速度

c)加速表与表之间的连接,物别是在实现数据的参考完事性方面特别成心义

d)在使用分组和排序子句进行数据检索时,一样可以显著减少查询中分组和排序的时间

f)通过使用索引,可以在时间查询的进程中,使用优化隐藏器,提高系统的性能

2、缺点:

a) 创建索引和保护索引要耗费时间,这类时间随着数据量的增加而增加

b) 索引需要占物理空间,除数据表占用数据空间以外,每个索引还要占用1定的物理空间,如果需要建立聚簇索引,那末需要占用的空间会更大

c) 以表中的数据进行增、删、改的时候,索引也要动态的保护,这就下降了整数的保护速度

4、 建立索引的原则

a) 在常常需要搜索的列上,可以加快搜索的速度

b) 在作为主键的列上,强迫该列的唯1性和组织表中数据的排列结构

c) 在常常用在连接的列上,这些列主要是1外键,可以加快连接的速度

d) 在经常常需要根据范围进行搜索的列上创建索引,国为索引已排序,其指定的范围是连续的

e) 在常常需要排序的列上,国为索引已排序,这样井底可以利用索引的排序,加快排序井底时间

f) 在常常使用在where子句中的列上,加快条件的判断速度

 

 

2106、Myisam Innodb优缺点

 

<
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生

 

MyISAM

InnoDB

构成上的区分:

 每一个MyISAM在磁盘上存储成3个文件。第1个文件的名字以表的名字开始,扩大名指出文件类型。
  .frm文件存储表定义。

数据文件的扩大名为 .MYD(MYData)

索引文件的扩大名是 .MYI(MYIndex)

基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的大小只受限于操作系统文件的大小,1般为 2GB

事务处理上方面:

 MyISAM类型的表强调的是性能,其履行数度比InnoDB类型更快,但是不提供事务支持

 InnoDB提供事务支持事务,

外部键等高级数据库功能

SELECT   UPDATE,INSERTDelete操作

MyISAM表格可以被紧缩,

而且它们支持全文搜索

 不支持热备,不支持事务

 

履行大量的SELECTMyISAM是更好的选择

1.如果你的数据履行大量的INSERTUPDATE,出于性能方面的斟酌,应当使用InnoDB
 2. DELETE  FROM table时,InnoDB不会重新建立表,而是1行1行的删除。

  3. LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对使用的额外的InnoDB特性(例如外键)的表不适用

AUTO_INCREMENT的操作

每表1个AUTO_INCREMEN列的内部处理。
  MyISAMINSERTUPDATE操作自动更新这1列。这使得AUTO_INCREMENT列更快(最少10%)。在序列顶的值被删除以后就不能再利用。(AUTO_INCREMENT列被定义为多列索引的最后1列,可以出现重使用从序列顶部删除的值的情况)。
  AUTO_INCREMENT值可用ALTER TABLEmyisamch来重置
  AUTO_INCREMENT类型的字段,InnoDB中必须包括只有该字段的索引,但是在MyISAM表中,可以和其他字段1起建立联合索引
  更好和更快的auto_increment处理

如果你为1个表指定AUTO_INCREMENT列,在数据词典里的InnoDB表句柄包括1个名为自动增长计数器的计数器,它被用在为该列赋新值。

  自动增长计数器仅被存储在主内存中,而不是存在磁盘上

  关于该计算器的算法实现,请参考

  AUTO_INCREMENT列在InnoDB里如何工作

表的具体行数

 select count(*) from table,MyISAM只要简单的读出保存好的行数,注意的是,当count(*)语句包括   where条件时,两种表的操作是1样的

InnoDB 中不保存表的具体行数,也就是说,履行select count(*) from table