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:
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

浙公网安备 33010602011771号