美文网首页
PHP面试题集锦(3)

PHP面试题集锦(3)

作者: 史史小子 | 来源:发表于2017-08-29 19:23 被阅读72次

    1、$_GET,$_POST,$_REQUEST 三者的区别

    从一个简单的理解来看在PHP中$_GET $_POST $_REQUEST都是接受数据了,get接受的是url参数而post可以说是由表单post过来的数据,而request是可以接受两者的数据,这个就是他们基础的区别所在了,下面一起来看看它们的区别证明。

    PHP中有$_REQUEST与$_POST、$_GET用于接受表单数据。

    一、$_REQUEST与$_POST、$_GET的区别和特点

    $_REQUEST[]具用$_POST[] $_GET[]的功能,但是$_REQUEST[]比较慢。通过POST和GET方法提交的所有数据都可以通过$_REQUEST数组获得。

    二、$_POST、$_GET的区别和特点

    1. GET是从服务器上获取数据,POST是向服务器传送数据。

    2. GET是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。POST是通过HTTP POST机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。

    3. 对于GET方式提交表单数据,服务器端用$_GET[‘name’]获取变量的值,对于POST方式提交表单数据,服务器端用$_POST[‘name’]获取提交的数据,当然,两者都可以通过$_REQUEST[‘name’]获得表单数据。对于REQUEST方式提交表单数据,服务器端用$_REQUEST[‘name’]获取变量的值,但这种方式很少用。

    4. GET传送的数据量较小,不能大于2KB。POST传送的数据量较大,一般被默认为不受限制。但理论上,一般认为不能超过100KB。

    5. GET安全性非常低,POST安全性较高。

    6. GET表单值可以通过_GET获取;但通过action的url设置的参数总是获取不到的,<form method="get" action="a.asp?b=b"></form>

    跟<form method="get"action="a.asp"></form>是一样的,也就是说,在这种情况下,GET方式会忽略action页面后边带的参数列表。POST表单值可以通过_POST获取;但通过action的url参数设置的参数则可以不能通过_POST获取到。action=test.php?id=1这种就是GET方式传值,可以用$_REQUEST和$_GET接受传值,但不能用POST方式获取到值,即使表单是POST方式提交。所在,在提交表单时,如果action中同时有参数,最好只能通过POST表单方式,对于表单内数据,直接通过POST获取,对于action中参数,童工GET获取。

    在做数据查询时,建议用GET方式,而在做数据添加、修改或删除时,建议用POST方式。

    request是先读取 get再读post 的, 同时存在, 即覆盖掉前面的变量。

    2、$_SESSION,$_COOKIE 两者的区别与联系

    1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

    2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。

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

    4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

    cookie 和session 的联系:

    session是通过cookie来工作的

    session和cookie之间是通过$_COOKIE['PHPSESSID']来联系的,通过$_COOKIE['PHPSESSID']可以知道session的id,从而获取到其他的信息。

    3、include、require 有什么区别,include可以重复引入同一文件吗?

    :include如果引入的文件不存在,试图继续往下执行,报一个warning

    (如果你不介意之前的内容是否被包含,之后的内容都要执行,就使用include)

    而require如果引入的文件不存在,报fatal error,不再继续执行.

    (如果之前的内容一定要被包含,才允许继续执行之后的代码,就使用require)

    4.Include/require 与 include_once /require_once的区别

    _once 会自动判断文件是否已经引入,如果引入,不再重复执行.

    即:保证被包含文件只可能被引入一次.

    (如果包含的文件里有定义函数,那么被包含的文件只能被包含一次,如果多次包含,就会出现函数重定义的错误,php是不运行函数重定义的,会出现致命错误,之后代码不在运行)

    =======================================================

    有的文件不允许被包含多次?

    可以用_once来控制,

    但是,如果从文件的设计上,比较规范,能保证肯定不会出现多次包含的错误,

    这种情况下 建议用include

    因为include_once要检测之前有没有包含,效率没有include高

    5、写一个函数,显示前天的时间 (年-月-日 时:分:秒)

    $a = date("Y-m-d H:i:s", strtotime("-1 day"));

    6、写一个函数,验证邮箱的格式是否正确

    function  checkEmail($email){

              $pregEmail="/([\w\-]+\@[\w\-]+\.[\w\-]+)/";

              return    preg_match($pregEmail,$email);

    }

    7、有一个data.txt文件,一行作为一条记录,请写一个函数,分页显示data.txt文件的内容,每页10条记录。

    8、写一个自动加载类

    9、写一个函数,显示当前目录下的文件及目录

    function     my_scandir($dir)

    {

                 $files=array();

                  if($handle= opendir($dir) ) {

                            while( ($file= readdir($handle)) !== false ) {

                                      if($file!=".."&&$file!=".") {

                                               if(is_dir($dir."/".$file) ) {

                                                       $files[$file] = scandir($dir."/".$file);

                                                }else{

                                                       $files[] =$file;

                                          }

                                 }

                           }

                          closedir($handle);

                          return$files;

                    }

    }

    10、这是一个标准URL (http://127.0.0.1/test.php?type=1),请写一个函数,用最高效的方式获取所访问的文件的后缀名

    11、mysql数据库中,innodb 和 myisam 区别(只少5点)

    1、 存储结构

    MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。

    InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。

    2、 存储空间

    MyISAM:可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。

    InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。

    3、 事务支持

    MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。

    InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。

    4、 CURD操作

    MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。(因为没有支持行级锁),在增删的时候需要锁定整个表格,效率会低一些。相关的是innodb支持行级锁,删除插入的时候只需要锁定改行就行,效率较高

    InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令。

    5、 外键

    MyISAM:不支持

    InnoDB:支持

    12、有一张评论表comment(uid 用户ID,post_id 评论ID,article_id 文章ID),请写一条sql语句查询出提交评论最多的3个用户id

    select  user_id ,count(post_id) as sum_post  from comment  group by user_id  order by sum_post  desc

    13、怎么解决ajax跨域请求

    1、允许单个域名访问

    2、允许多个域名访问

    3、允许所有域名访问

    14、请讲下你对MVC的理解

    15、要实现一个在线倒计时抢购功能,需要注意哪些问题?怎么解决这些问题?

    16、请讲下你对高并发大访问量的网站解决方案

    首先,确认服务器硬件是否足够支持当前的流量。

    普通的P4服务器一般最多能支持每天10万独立IP,如果访问量比这个还要大,那么必须首先配置一台更高性能的专用服务器才能解决问题,否则怎么优化都不可能彻底解决性能问题。

    其次,优化数据库访问。

    前台实现完全的静态化当然最好,可以完全不用访问数据库,不过对于频繁更新的网站,静态化往往不能满足某些功能。

    缓存技术就是另一个解决方案,就是将动态数据存储到缓存文件中,动态网页直接调用这些文件,而不必再访问数据库,WordPress和Z-Blog都大量使用这种缓存技术。

    如果确实无法避免对数据库的访问,那么可以尝试优化数据库的查询SQL.避免使用Select * from这样的语句,每次查询只返回自己需要的结果,避免短时间内的大,尽量做到"所查即所得" ,遵循以小表为主,附表为辅,查询条件先索引,先小后大的原则,提高查询效率.

    第三,禁止外部的盗链。

    外部网站的图片或者文件盗链往往会带来大量的负载压力,因此应该严格限制外部对于自身的图片或者文件盗链,好在目前可以简单地通过refer来控制盗链,Apache自己就可以通过配置来禁止盗链,IIS也有一些第三方的ISAPI可以实现同样的功能。当然,伪造refer也可以通过代码来实现盗链,不过目前蓄意伪造refer盗链的还不多,可以先不去考虑,或者使用非技术手段来解决,比如在图片上增加水印。

    第四,控制大文件的下载。

    大文件的下载会占用很大的流量,并且对于非SCSI硬盘来说,大量文件下载会消耗CPU,使得网站响应能力下降。因此,尽量不要提供超过2M的大文件下载,如果需要提供,建议将大文件放在另外一台服务器上。

    第五,使用不同主机分流主要流量

    将文件放在不同的主机上,提供不同的镜像供用户下载。比如如果觉得RSS文件占用流量大,那么使用FeedBurner或者FeedSky等服务将RSS输出放在其他主机上,这样别人访问的流量压力就大多集中在FeedBurner的主机上,RSS就不占用太多资源了。

    17.你用什么方法检查 PHP 脚本的执行效率(通常是脚本执行时间)和数据库 SQL 的效率(通常是数据库 Query 时间), 并定位和分析脚本执行和数据库查询的瓶颈所在?

    1.PHP执行时间:  

    $begin=microtime(true); //获取程序开始执行的时间 

    // some code here 待执行的代码

     $stop=microtime(true); //获取程序执行结束的时间 

    list($m0,$s0)=explode(" ",$begin);

     list($m1,$s1)=explode(" ",$stop);

     $runtime=($s1+$m1-$s0-$m0)*1000; 

    echo    ‘当前脚本执行时间:’.$etime-$stime.'微秒';

     2.SQL执行时间(其实和上面一样):  

    $begin=microtime();

     mysql_query($sql);

     $stop=microtime(); 

    list($m0,$s0)=explode(" ",$begin);

     list($m1,$s1)=explode(" ",$stop); 

    $runtime=round(($s1+$m1-$s0-$m0)*1000,4); 

    echo '当前脚本执行时间:'.$runtime.'ms';

    相关文章

      网友评论

          本文标题:PHP面试题集锦(3)

          本文链接:https://www.haomeiwen.com/subject/ljdadxtx.html