php——面试准备

Question

  变量的写时复制与引用计数是怎么回事?

Answer

<?php
    $a = "abcdefg";
    //$a-> refcount=1  isreference = 0

    $b = $a;   //此时$b和$a同一个变量,$b只是临时的指向$a,此时并没有将$a复制一份赋值为$b
    //$a-> refcount=2  isreference = 0

    $a = "xyz"; //$a发生改变,此时才会将$a的内容复制一次,保存到一个新的空间,并让$b指向新的空间。
    //$a-> refcount=1  isreference = 0

    echo $a;// xyz
    echo $b;// abcdefg

  注意上面这个情况中,如果赋值时使用引用的话,就不会有写时复制这个操作

<?php
    $a = "abcdefg";
    //$a-> refcount=1  isreference = 0

    $b = &$a;   //此时$b和$a同一个变量,$b只是永久指向$a
    //之后,$b就是$a的别名,对其中一个操作,另外一个也会受影响
    //$a-> refcount=2  isreference = 1

    $a = "xyz"; //$a发生改变,此时才会发生复制操作。
    //$a-> refcount=2  isreference = 1

    echo $a;// xyz
    echo $b;// xyz

  使用unset只会删除指向zval的引用,并不会立即回收内存,只有当对这个zval的引用计数为0的时候,才会清理垃圾,回收内存。

 

Question

  定义字符串有哪些形式?

Answer

  有三种方式:

  1、单引号->不能解析字符串中的变量;不能解析转义字符;对于变量名称和转义字符都是原样输出;效率比双引号高。

  2、双引号->可以解析字符串中的变量(可以使用{$var}括起来),可以解析转义字符;效率比双引号低。

  3、heredoc、newdoc->适合大段的文本:

<?php
    $a = "aaaaaa";
    
    //heredoc,类似于双引号,结束标签必须顶格写,EOT后面不要有空格
    $str = <<< EOT
 this is $a;
 hello \t world;
EOT;
    
    echo $str;
    // 输出:
    // this is aaaaaa;
    // hello   world;

    //newdoc,类似单引号,不解析变量和转义字符
    $ss = <<< 'EOT'
 this is $a;
 hello \t world;
EOT;
    echo $ss;
    // 输出:
    // this is $a;
    // hello \t world;

  

Question

  php中有哪些全局数组?

Answer

  $GLOBAL、$_GET、$_POST、$_SESSION、$_COOKIE、$_REQUEST、$_SERVER、$ENV、$_FILES

  $_REQUEST = $_GET + $_POST + $COOKIE

  1、$_SERVER['HTTP_X_FORWARDED_FOR']        当有代理的时候,用户的真是IP

  2、$_SERVER['REMOTE_ADDR']    直接获取用户ip

  3、$_SERVER['SERVER_ADDR']    获取服务器ip

  

Question

  php框架中单入口文件的工作原理?优点?

Answer

  原理:用一个处理程序(index.php)去处理所有的http请求,根据请求时传递的参数(模块和操作),进行不同的操作。

  优点:可以统一的进行安全检查

  缺点:URL格式(可以URL重写) 

 

Question

  文件操作,有哪些方式,有什么特点:

Answer

  1、file_get_content("fileName");  将内容读出来放到内存中

  2、fread("filename", length);   一次读取length的内容

  3、readFIle(filename);将文件内容读出放到缓冲区中。

  4、file("filename");  将文件内容读出保存到数组中。

 

Question

  ==和===的区别?

Answer

  == :只比较值是否相等,不会比较类型,前面7中false都是用这个==比较。

  === :不仅会比较值是否相等、还会判断类型是否相等,某些函数的返回值使用===比较,比如strpos

 

Question

  哪些值会被认为是false?

Answer

  0、0.0、 NULL、 ' '、 ‘0’、 array()、 false

  上面这些值被认为是false,同时作为empty()来判断的时候,都返回true。

 

Question

  什么是错误控制符?

Answer

  使用@,将@放在一个表达式之前,即使表达式有错误,那么错误也不回显示。

 

Question

  php中的预定义常量有哪些?

Answer

  __FILE__    运行的文件名称

  __DIR__ 返回文件所在的目录

  __LINE__ 返回执行到哪一行

  __FUNCTION__  返回所在的函数名称

  __CLASS__  返回类名

  __METHOD__  返回类名::方法名

  __NAMESPACE__ 返回当前的命名空间

 

Question

  const和define的区别和共同点??

Answer

  区别:

    1、const是语言结构、速度比define效率高;const可以在类中声明类常量。

    2、define是函数,所以速度较慢,不能再类中声明常量。

  共同点:

    1、在声明常量时,都要指定值。

    2、常量值不能改变。

 

Question

  介绍一下cgi、 fast-cgi、php-cgi、php-fpm

Answer

  CGI、FAST-CGI、PHP-CGI、PHP-FPM的关系

 

Question

  为什么要使用会话控制机制?有哪些方式?

Answer

  因为http协议的无状态性,即同一个客户端连续两次向同一个服务器发起请求,该服务器并不知道这两个请求是来自同一个客户端,会将两次请求隔离开,认为是两次无关的请求。

  会话控制就可以实现服务器连续跟踪用户的发起的请求。能够明确的区分请求是否来自同一用户,可以实现状态的保持(比如登录)。

  实现方式:

  1、使用get参数传递(包含在URL中),缺点:暴露在地址栏,不安全;参数容易丢失,导致数据丢失。

  2、Cookie:存储在客户端的一个文件,该文件记录了客户端的状态以及其他信息。

  3、Session:存储在服务器端的一个文件,记录客户端的状态以及其他信息。

 

Question

  设置使用cookie的时候,需要注意什么?

Answer

  0、设置cookie之前,不要有任何输出,因为设置cookie是在http协议的头部信息中设置,先于报文主体发送。

  1、修改、添加、删除cookie值,或者cookie过期,请使用setcookie函数。

  2、读取cookie使用$_COOKIE全局数组形式,注意$_COOKIE是只读的,unset($_COOKIE['item'])不会生效。

  3、cookie过期时间不能超过30天。

 

Question

  cookie的优点和缺点?

Answer

  优点:cookie数据保存在客户端,不会占用服务器资源,当用户数量庞大的时候,好处显而易见。

  缺点:cookie数据文件保存在客户端,所以可能会被窃取或者修改,造成数据的不安全,所以隐私数据不应该放在cookie中。同时,客户端可以禁用cookie,禁用之后,cookie就不能使用了。

 

Question

  设置session时,需要注意什么?

Answer

  0、和设置cookie一样,设置session时,不要有任何输出,因为设置cookie是在http协议的头部信息中设置,先于报文主体发送。

  1、开启session会话使用session_start函数。

  2、修改和添加session可以直接使用$_SESSION['item']来操作。

  3、清空session可以使用session_destory()

 

Question

  session的优点和缺点?

Answer

  优点:因为数据保存在服务器端,数据比较安全。不会被用户禁用,即使禁用了cookie,也可以使用URL传递session_id。

  缺点:session文件保存在服务器中,所以当用户量加大的时候,会占用服务器很大的内存,影响服务器性能。分布式时,存在问题,但是可以使用memcache或者redis解决。

 

Question

  session和cookie的关系?

Answer

  1、session可以理解为会话cookie,即——有效时间是关闭当前窗口的cookie。

  2、session是基于cookie的,在创建session的时候,服务器会返回给客户端一个session_id,这个session_id是保存在客户端的cookie中的。但是其他数据仍旧是保存在服务器端,只是session_id保存在客户端。客户端每次发起请求之前,会先从cookie中读出session_id,然后发给服务器,服务器收到session_id之后,通过session_id去查找服务器上面的session文件,找到之后,读取其中的状态信息。所以,session是基于cookie的。

 

Question

  如果客户端禁用了cookie怎么办?

Answer

  禁用cookie之后,不能使用cookie,但是可以使用session。

  可以看上面一个问题,通过url中传递session_id来使用session即可。格式如下:

方式1
<a href="next.php?<?php echo session_name().'='.session_id()?>"> Next </a>

方式2
<a href="next.php?<?php echo SID?>"> Next </a>

 

Question

  session相关的配置项

Answer

  session.auto_start    是否自动打开session

  session.cookie_domain   设置session有效域

  session.cookie_lifetime   设置session有效期,0表示关闭窗口前有效。

  session.cookie_path

  session.name     创建session时,分配名称,默认是PHPSESSID

  session.save_path  保存session_id文件路径

  session.use_cookie  是否使用cookie来保存session_id

  session.use_trans_sid  是否在URL中使用SID来传递session_id。

  session.gc_probability / session.gc_divisor  启动垃圾回收的概率(访问session.gc_divisor次,会有session.gc_probability次回收操作)

  session.gc_maxlifetime  超过该时间的session被视为垃圾而删除(依赖于上面设置的概率)。

  session.save_handler  session存储的方式,默认是file,可以使memcache、sqlite

 

Question

  在多台服务器使用LVS负载均衡的时候,怎么保证能拿到session?

Answer:  

  使用redis或者memcache来存储session,多个服务器都将session保存在一个缓存服务器,读取session的时候,也从一个缓存服务器中读取。

  使用session_set_save_handler设置保存session的方式。

  

 

Question

  多进程高并发的向同一个文件写数据,php实现

Answer

  多进程高并发写文件,使用互斥锁即可

<?php
    function WriteFile($file = '', $content = '') {
        if (empty($file)) die("文件名不能为空");

        if ( ! file_exists($file)) die("文件不存在");

        if ( ! is_writable($file)) die("文件不可写");

        $file_handle = fopen($file, 'a');
        if ( ! $file_handle) die("打开文件失败");

        //阻塞式锁(排它锁)
        if ( ! $lock = flock($file_handle, LOCK_EX)) die("锁定文件失败");

        //非阻塞式锁(排它锁)
        //if ($lock = flock($file_handle, LOCK_EX | LOCK_NB)) die("锁定文件失败");


        //即使要写入的内容可能为空,但仍要写入,因为写入之后,文件的修改时间就会修改
        //某些场景中,文件的修改时间也很重要
        if (FALSE === fwrite($file_handle, $content) ) {
            die("数据写入文件失败");
        }
        fflush($file_handle); //将缓冲区的数据写入文件

        flock($file_handle, LOCK_UN);  //解锁
        
        fclose($file_handle);
    }

    writeFile("a.txt", "hello");
?>

  

 

Question

   多进程高并发的读文件,读文件的同时,预防文件被修改,使用php实现?

Answer

<?php
    //避免与内置函数readfile重名
    function Read_File($file = '') {
        if (empty($file)) die("文件名不能为空");

        if ( ! file_exists($file)) die("文件不存在");

        if ( ! is_readable($file)) die("文件不可读");

        $file_handle = fopen($file, 'r');
        if ( ! $file_handle) die("打开文件失败");

        //阻塞式锁(共享锁)
        if ( ! $lock = flock($file_handle, LOCK_SH)) die("锁定文件失败");

        //小文件,可以直接读入内存,可能存在内存占用的问题
        $content = file_get_contents($file);

        flock($file_handle, LOCK_UN);  //解锁

        fclose($file_handle);

        return $content;
    }

    echo Read_File("a.txt");
?>

 

Question

   发表的文章里面包含富文本

Answer

  直接使用PDO的预处理即可。

 

Question

 

Answer

 

 

posted @ 2018-08-16 12:08  寻觅beyond  阅读(379)  评论(0)    收藏  举报
返回顶部