php面试题汇总

1. php 的垃圾回收机制是什么?

php 的垃圾回收机制

PHP 可以自动进行内存管理,清除不需要的对象。

PHP 使用了引用计数 (reference counting) GC 机制。

每个对象都内含一个引用计数器 refcount,每个 reference 连接到对象,计数器加 1。当 reference 离开生存空间或被设为 NULL,计数器减 1。当某个对象的引用计数器为零时,PHP 知道你将不再需要使用这个对象,释放其所占的内存空间。面试题
php 的垃圾回收机制

PHP 可以自动进行内存管理,清除不需要的对象。

PHP 使用了引用计数 (reference counting) GC 机制。

每个对象都内含一个引用计数器 refcount,每个 reference 连接到对象,计数器加 1。当 reference 离开生存空间或被设为 NULL,计数器减 1。当某个对象的引用计数器为零时,PHP 知道你将不再需要使用这个对象,释放其所占的内存空间。
php 的垃圾回收机制

PHP 可以自动进行内存管理,清除不需要的对象。

PHP 使用了引用计数 (reference counting) GC 机制。

每个对象都内含一个引用计数器 refcount,每个 reference 连接到对象,计数器加 1。当 reference 离开生存空间或被设为 NULL,计数器减 1。当某个对象的引用计数器为零时,PHP 知道你将不再需要使用这个对象,释放其所占的内存空间。

   PHP 可以自动进行内存管理,清除不需要的对象。PHP 使用了引用计数 (reference counting) GC 机制。每个对象都内含一个引用计数器 refcount,每个 reference 连接到对象,计数器加 1。当 reference 离开生存空间或被设为 NULL,计数器减 1。当某个对象的引用计数器为零时,PHP 知道你将不再需要使用这个对象,释放其所占的内存空间。

2. 说说php-fpm.conf几个重要的参数

1. pm = dynamic #指定进程管理方式,有3种可供选择:static、dynamic和ondemand。
2. pm.max_children = 16 #static模式下创建的子进程数或dynamic模式下同一时刻允许最大的php-fpm子进程数量。
3. pm.start_servers = 10 #动态方式下的起始php-fpm进程数量。
4. pm.min_spare_servers = 8 #动态方式下服务器空闲时最小php-fpm进程数量。
5. pm.max_spare_servers = 16 #动态方式下服务器空闲时最大php-fpm进程数量。
6. pm.max_requests = 2000 #php-fpm子进程能处理的最大请求数。
7. pm.process_idle_timeout = 10s
8. request_terminate_timeout = 120

3. php-fpm慢执行日志如何设置

    在php-fpm的配置文件中设置如下

request_slowlog_timeout = 1    //超过一秒钟就要记录日志
slowlog = /usr/local/php-fpm/var/log/www-slow.log    //日志放到该路径下

 4. 列举出PSR系列规范

      PSR 是由 PHP FIG 组织制定的 PHP 规范,是 PHP 开发的实践标准。下面列出几个PSR编码标准。

    1. PSR-0 :自动加载标准(2014/10/21被废弃,由PSR-4替代)(Autoloading Standard

    2. PSR-1 :基本编码规范(Basic Coding Standard

    3. PSR-2 :编码规范指南(Coding Style Guide

    4. PSR-3 :日志接口(Logger Interface

    5. PSR-4 :自动加载标准(Autoloading Standard

    6. PSR-6 :缓存接口(Caching Interface

    7. PSR-7 :HTTP消息接口(HTTP Message Interface

     更多PSR规范查看 https://www.php-fig.org/psr/

    

5. isset() 和 empty() 区别

  Isset()判断变量是否存在,可以传入多个变量,若其中一个变量不存在则返回假,empty()判断变量是否为空为假,只可传一个变量,如果为空为假则返回真。

 6. 你所知道的php数组相关的函数?

函数 用途
array() 创建数组
array_combine() 通过合并两个数组来创建一个新数组
range() 创建并返回一个包含指定范围的元素的数组
compact() 建立一个数组
array_chunk() 将一个数组分割成多个子数组
array_merge() 把两个或多个数组合并成一个数组
array_slice() 在数组中根据条件取出一段值,返回数组
array_diff() 返回两个数组的差集数组
array_intersect() 计算数组的交集
array_search() 在数组中搜索给定的值
array_splice() 移除数组的一部分且替代它
array_key_exists() 判断某个数组中是否存在指定的key
shuffle() 把数组中的元素按随机顺序重新排列
array_flip() 交换数组中的键和值
array_reverse() 将原数组中的元素顺序翻转,创建新的数组并返回
array_unique() 移除数组中重复的值

7. require() ,include()的区别

    require() : 如果文件不存在,会报出一个fatal error,脚本停止执行 。通常放在 PHP 程序的最前面,PHP 程序在执行前,就会先读入 require 所指定引入的文件,使它变成 PHP 程序网页的一部份。
  include() : 如果文件不存在,会给出一个 warning,但脚本会继续执行,这种情况只出现在PHP 4.3.5之前。这个函数一般是放在流程控制的处理部分中。PHP 程序网页在读到 include 的文件时,才将它读进来。这种方式,可以把程序执行时的流程简单化。

    推荐使用require_once()和include_once(),可以检测文件是否有重复包含。

8. Http协议中Get , Post方法的区别

    1、GET在浏览器回退时是无害的,而POST会再次提交请求。
  2、GET产生的URL地址可以被Bookmark,而POST不可以。
  3、GET请求会被浏览器主动缓存(Cache),而POST不会,除非手动设置。
  4、GET请求只能进行Url编码,而POST支持多种编码方式。GET编码类型application/x-www-form-urlencoded,POST编码类型 application/x-www-form-urlencoded 或 multipart/form-data,为二进制数据使用多重编码。
  5、GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
  6、GET请求在URL中传送的参数是有长度限制的(Get方法可提交最大的数据容量是2k),而POST没有限制。
    7、对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
    8、GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
    9、GET参数通过URL传递,POST放在Request body中。
   10、GET产生一个TCP数据包,POST产生两个TCP数据包。这是因为对于GET方式的请求,浏览器会把Http header和Data一并发送出去,服务器响应200(返回数据),而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。当然对于POST是否发送两个TCP数据包也跟浏览器有关。具体GET和POST等HTTP方法可以查看RFC7231 https://tools.ietf.org/html/rfc7231#page-25

9. 如何实现页面静态化,优点是什么

   页面静态化分为两种 一种伪静态,即url重写,一种纯静态化。

  一、静态化的优点:

    1. 有利于搜索引擎收录网站页面的信息:搜索引擎更喜欢静态的,更变于抓取,搜索引擎SEO排名会更容易提高。

    2. 静态网页化网页稳定 。

    3. 可以提高网页加载速度。

    4. 减轻服务器负担,浏览器不需要频发调用数据库。

    5. 数据库出错不会影响正常访问。

  二、伪静态

     PHP伪静态:是利用Apache mod_rewite实现url重写的方法重写访问地址,能够通过URL的PATHINFO模式来改动它。让它看上去更像一个静态页面。从而有更大的几率被搜索引擎抓取和收录,仅是对搜索引擎比較友好,伪静态化。

  三、纯静态化

            纯静态化,就是生成HTML文件的方式,我们须要开启PHP自带的缓存机制,即ob_start()函数来开启缓存。而且在ob_start()之前不能有不论什么输出,否则运行失败,然后我们用ob_get_contents()函数来获取缓存中的内容,该函数会返回一个字符串。第三个函数就是ob_end_clean(),它用来清空缓存中的内容而且关闭,成功返回True,失败返回False。

if(file_exists("match.html") && (time()-filemtime("index.html"))<6400)
{
    //如果存在对应的静态文件,则直接访问
    require_once("index.html");
}else{
    //这里用数组来仿真数据库操作,现实一般都是操作数据库得到对应数据
    $student = ["huangxing","chenyuwei",'xufei','zhangjingwen','xuepei'];
    ob_start();
    //载入模板
    require_once("muban.php");
    file_put_contents("match.html",ob_get_clean());
    require_once('index.html');

10. SESSION 与 COOKIE的区别是什么

  1. Cookie保存在客户端, 由于http无状态协议,不能区分用户是否是从同一个网站上来的,同一个用户请求不同的页面不能看做是同一个用户,Cookie就可以跟踪会话

    2. Session存储在服务器端,Cookie保存在客户端。通过SessionID来区分不同的客户, Session比较安全,Cookie用某些手段可以修改,不安全。Session依赖于Cookie进行传递。禁用Cookie后,session不能正常使用。

     Session的缺点保存在服务器端,每次读取都从服务器进行读取,对服务器有资源消耗。Session保存在服务器端的文件或数据库中,默认保存在文件中,文件路径由php配置文件的session.save_path指定。

  3. session中保存的是对象,cookie中保存的是字符串。

  4. 通常session cookie是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你一个新的sessionid,这样我们信息共享的目的就达不到了。

    5. 我们把浏览器的cookie禁止后,web服务器会采用URL重写的方式传递Sessionid,我们就可以在地址栏看到 sessionid=KWJHUG6JJM65HS2K6之类的字符串。

11. print、echo、print_r有什么区别?

     echo和print都可以做输出,不同的是echo不是函数,没有返回值,而print是一个函数有返回值,所以相对而言如果只是输出echo会更快,而print_r通常用于打印变量的相关信息,通常在调试中使用。print 是打印字符串, print_r 则是打印复合类型 如数组, 对象。

12. 抽象类(abstract)与接口(interface)的区别

  1. 接口中不可以声明变量,但可以声明类常量.抽象类中可以声明各种变量。

  2. 接口没有构造函数,抽象类可以有。

      3. 一个类可以继承多个接口,但只能继承一个抽象类。

  4. 对接口的继承是通过关键字implements。对抽象类的使用是通过关键字extends,当然接口也可以通过关键字extends继承。

  5. 接口和抽象类不能是实例化。

13. XML 与 HTML 的主要区别

 1. XML是区分大小写字母的,HTML不区分。

 2. 在HTML中,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略或者之类的结束 标记。在XML中,绝对不能省略掉结束标记。

 3. 在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个 / 字符作为结尾。这样分析器就知道不用 查找结束标记了。

 4. 在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。

 5. 在HTML中,可以拥有不带值的属性名,在XML中所有的属性都必须带有相应的值。

 

14. php性能优化建议

1.对接口的继承使用implements,抽象类使用extends.

2.接口中不可以声明变量,但可以声明类常量.抽象类中可以声明各种变量

3.接口没有构造函数,抽象类可以有

4.接口中的方法默认为public,抽象类中的方法可以用public,protected,private修饰

5.一个类可以继承多个接口,但只能继承一个抽象类


作者:米琪卡哇伊
链接:https://www.imooc.com/article/30716
来源:慕课网

1.对接口的继承使用implements,抽象类使用extends.

2.接口中不可以声明变量,但可以声明类常量.抽象类中可以声明各种变量

3.接口没有构造函数,抽象类可以有

4.接口中的方法默认为public,抽象类中的方法可以用public,protected,private修饰

5.一个类可以继承多个接口,但只能继承一个抽象类


定义为抽象的类不能被实例化.任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
Print、echo、print_r有什么区别?

① echo和print都可以做输出,不同的是,echo不是函数,没有返回值,而print是一个函数有返回值,所以相对而言如果只是输出echo会更快,而print_r通常用于打印变量的相关信息,通常在调试中使用。

② print 是打印字符串

③ print_r 则是打印复合类型 如数组 对象

    1. 使用高版本php,提高性能的最简单的方式是不断升级、更新PHP版本,高版的php7性能明显比老版本快,比如最新php8中的JIT处理PHP脚本编译的方式理论上能够提高应用程序的速度。。

    2. 使用分析器。网站运行缓慢的原因颇多,Web应用程序极其复杂,让人扑朔迷离。而一种可能性在于PHP代码本身。这个分析器可以帮助你快速找出造成瓶颈的代码,提高网站运行的总体性能。

Xdebug PHP extension提供了强大的功能,可以用来调试,也可以用来分析代码。方便开发人员直接跟踪脚本的执行,实时查看综合数据。还可以将这个数据导入到可视化的工具 KCachegrind中。

    3. PHP函数分为内置和用户函数,如果可以的话尽量使用内置函数,因为内置函数直接调用C代码,而用户函数需要生成中间代码(opcode),减少函数调用,避免递归,减少解释深度

15. 如何防止重复提交

  1. 查询操作 
   查询一次和查询多次,在数据不变的情况下,查询结果是一样的select是天然的幂等操作。

  2. 删除操作 
   删除操作也是幂等的,删除一次和多次删除都是把数据删除。(注意可能返回结果不一样,删除的数据不存在,返回0,删除的数据多条,返回结果多个) 

  3.唯一索引或唯一组合索引来防止新增脏数据
   比如:支付宝的资金账户,支付宝也有用户账户,每个用户只能有一个资金账户,怎么防止给用户创建资金账户多个,那么给资金账户表中的用户ID加唯一索引,所以一个用户新增成功一个资金账户记录。

  4. token机制,防止页面重复提交

   token机制的做法是在服务器端生成一个唯一的随机标识号Session Token (令牌),同时在当前用户的Session域中保存这个Token,然后将Token发送到客户端的Form表单中,在Form表单中使用隐藏域来存储这个Token,表单第一次提交的时候连同这个Token一起提交到服务器端,然后在服务器端判断客户端提交上来的Token与服务器端生成的Token是否一致,第一次是一致的,然后服务器端的Token值被更新,此时如果再次提交表单,那么表单发送服务端的还是之前的Token,服务端的Token已经发生变化,两者不相同了,服务器就认为是重复提交了,此时服务器端就可以不处理重复提交的表单。

16. php垃圾回收哪些资源不能回收

  持久数据库连接比较特殊,它们不会被垃圾回收系统销毁,参见https://www.php.net/manual/zh/features.persistent-connections.php

17. 如何把一个GB2312格式的字符串装换成UTF-8格式

    iconv('GB2312','UTF-8','转换文字');

18. 说说OPcache是什么及其原理

  OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是避免每次加载和解析PHP脚本的开销,解析器可以直接从共享内存读取已经缓存的字节码(Operate Code)。

  PHP 5.5.0 及后续版本中已经绑定了 OPcache 扩展。 对于 PHP 5.2,5.3 和 5.4 版本可以使用PECL 扩展中的 OPcache 库。

      在php.ini文件中,找到[opcache]可以设置。

   常用配置如下:

#启用opcache
opcache.enable=1
#使用共享内存大小 opcache.memory_consumption=200
#字符串缓存大小 opcache.interned_strings_buffer=8
#最大缓存文件数量 opcache.max_accelerated_files=8000
#出现异常,立即释放全部内存 opcache.fast_shutdown=1
#最大允许占用内存百分比,超过此限制会重启进程 opcache.max_wasted_percentage=20

启动成功,查看phpinfo查看开启状态。

原文地址:https://www.cnblogs.com/songgj/p/9146735.html