PHP头条
热点:

PHP面试题汇总,php试题汇总


最近一直在刷面试题,将看过的面试题整理一下。

基本语法

1.    PHP全称解释

答:Hypertext Preprocessor的缩写,超文本预处理器,是一种用来开发动态网站的服务器脚本语言。

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

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

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

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

3.    在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在哪个预定义变量中?

而链接到当前页面的URL记录在哪个预定义变量中?

答:echo $_SERVER[‘PHP_SELF’];   echo $_SERVER[‘HTTP_HOST’];

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

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

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

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

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

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

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

6.    在HTTP 1.0中,状态码401的含义是未授权;如果返回“找不到文件”的提示,则可用哪个函数?

答:header(‘HTTP/1.0 404 Not Found’);

7.    检测一个变量是否有设置的函数是?是否为空的函数是?

答:isset(), empty();

8.    echo count(‘123’);输出什么?

答:1    count—计算数组中的单元数目或对象中的属性个数。

Int count(mixed $var[, int $mode]),如果var不是数组类型或者实现了countable接口的对象,将返回1。若果var是null 结果是0。

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

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

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

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

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

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

11.  变量如何定义?如何检查变量是否定义?如何删除一个变量?判断一个变量是否为空的函数?

答:isset(),unset(),empty()。

12.  字符串怎么转成整数,有几种方法?

答:(1) 强制类型转换,(整型)字符串变量名

(2)直接转换:settype(字符串变量, 整型);

(3)intval(字符串变量);

(4)使用算数运算符,将字符串转换成整数。(‘123v4a5’ - 0)

13.  empty()函数在哪些情况下返回true?

答:布尔值false,整型值0,浮点型值0.0,空白字符串,字符串‘0’,array()空数组,NULL,没有任何属性的对象,没有赋值的变量。

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

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

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

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

答:(1)常量没有$符号;

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

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

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

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

16.  判断一个函数存在?

答:function_exists(string$function_name); 如果存在返回true,不存在返回false。

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

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

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

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

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

18.  如何设置PHP的错误级别

答:PHP错误级别的设置有两种。

一种是直接操作PHP.ini配置文件,定位到‘error_reporting’配置项,直接指定错误级别。

另一种是在程序中通过error_reporting()函数设置错误级别。error_reporting()函数的语法如下:int error_reporting(intlevel)。

19.  什么是魔术方法?常用的魔术方法有哪几个?

答:PHP将所有以__(两个下划线)开头的类方法保留为魔术方法。

常用的魔术方法有:__tostring(),__call(),__autoload(),__clone(),__get(),__set(),__isset(),__unset()。

20.  __autoload()方法的工作原理是什么?

答:使用这个魔术方法基本条件是类文件的文件名要和类的名字保持一致。

当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。这个函数会根据实例化的类名来查找这个类的路径,当判断这个类文件路径下确实这个类文件后,就执行include或者require来加载该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。

21.  JSON格式数据有哪些特点?

答:JSON(JavaScript ObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。

优点:(1)方便前台数据操作。

(2)数据体积小,传输快。

(3)客户端操纵XML的时候需要创建ActiveX对象,JSON则完全就是一个JS对象,不需要创建DOM。

22.  针对PHP网站的攻击方式有哪些?

答:命令注入,eval注入,客户端脚本攻击,跨网站脚本攻击,SQL注入攻击,Session会话劫持,Session固定攻击,HTTP响应拆分攻击,文件上传漏洞等。

23.  PHP重定向的方法?

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

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

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

24.  i++和++i的效率那个更高?

答:内建数据类型的情况,效率没有区别。

考虑自定义数据类型(主要是指类)的情况。前缀式(++i)可以返回对象的引用,而后缀式(i++)必须产生一个临时对象保存更改前对象的值并返回(实现过自定义类型++运算符定义的就知道),所以导致在大对象的时候产生了较大的复制开销,引起效率降低,因此处理使用者自定义类型(注意不是指内建类型)的时候,应该尽可能的使用前缀式地增/递减,因为他天生体质较佳。自定义数据类型的情况,++i效率较高。

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

答:设定PHP脚本的错误报告级别。error_reporting(6143)的作用是设定PHP脚本的错误报告级别为“所有错误”。

ini_set(‘display_errors’, 1); //作用是显示PHP脚本错误,相当于修改PHP.ini中的error_reporting。

26.  一个函数的参数不能是对变量的引用,除非在php.ini中把?设为on。

答:allow_call_time_pass_reference设置为on。 //是否启用在函数调用时强制参数被按照引用传递

27.  在PHP中heredoc是一种特殊的字符串,它的使用方法是?

答:以<<<EOT的开始,以EOT;结束的字符串。 结束标识符必须从行的第一列开始,并且除了后面的分号之外不能包含其他的字符,空格以及空白制表符都不可以。

28.  $a = ‘abcdef’; 请打印出$a的第一个字母。

答:echo $a{0} 或 substr($a, 0, 1);

29. <?php

classFoo{

?>

<?php

functionbar(){

print"bar";

}

}

?>

答:无法运行,类定义必须在一个PHP块中。

30. class a {

       protected $c;

       public function a()

       {

           $this->c = 10;

       }

    }

 

   class b extends a

    {

       public function print_data()

       {

           return $this->c;

       }

    }

    $b= new b();

echo $b->print_data();

 

答:10  在PHP5之前的版本中,构造函数的名称必须和类名相同,这种方法在PHP5中仍然可以使用。在PHP5之后的版本,构造函数用__construct()方法来声明,这样做的好处就是可以使构造函数与类名独立,当类名改变时不需要修改相应的构造函数名称。为了向下兼容,如果一个类名没有名为__construct()的方法,PHP将搜索一个与类名相同的构造方法,如果__construct()的方法与类名同名的构造方法同时存在,优先使用__construct()的方法。

31.  简述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。

32.  打开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等。

33.  PHP链接数据库的扩展有哪些?它们之间有什么不同?

答:mysql,mysqli,pdo。

 

34.   

流程控制

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’。

 

 

数组

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效率可建立组合索引,遵循‘最左前缀’原则。

字符串

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

www.phpzy.comtrue/php/24045.htmlTechArticlePHP面试题汇总,php试题汇总 最近一直在刷面试题,将看过的面试题整理一下。 基本语法 1.    PHP全称解释 答:Hypertext Preprocessor的缩写,超文本预处理器,是一种用来开发动态网站的...

相关文章

    暂无相关文章

PHP之友评论

今天推荐