- php的执行原理
php底层是使用C编写的,使用Zend Engine执行代码。执行流程:ZE调用词法分析器去掉php代码的空格、注释,分割成一个个token(单元/标记),再调用语法分析器将这些token编译为一个个opcode(操作码/字节码),最后交给ZE执行这些opcode,输出结果。 - ZE
ZE是PHP内核的核心部分,负责php代码的编译、解释与结果返回。php opcode是ZE虚拟机的指令。 - 什么是SAPI?
SAPI就是Server Application Programming Interface(服务端应用编程接口)的缩写,其为外部应用提供了许多接口调用。
- cgi与fast-cgi
对于cgi来说,请求到达web服务器,web服务器会fork出一个子进程,在子进程中,将http请求通过标准输入、环境变量传递给url指定的cgi程序,由其执行程序,通过标准输出返回结果给子进程,再由子进程返回给客户端,最后销毁子进程。
对于fast-cgi来说,请求到达web服务器,web服务器会通过fastcgi进程管理器调用早已启动的cgi解释器,通过 FastCGI 协议传递标准输入、环境变量,由其执行程序,通过标准输出、错误信息返回结果给web服务器,最后等待下一次请求。
FastCGI 与传统 CGI 模式的区别之一则是 Web 服务器不是直接执行 CGI 程序了,而是通过 Socket 与 FastCGI 响应器(FastCGI 进程管理器)进行交互,也正是由于 FastCGI 进程管理器是基于 Socket 通信的,所以也是分布式的,Web 服务器可以和 CGI 响应器服务器分开部署。Web 服务器需要将数据 CGI/1.1 的规范封装在遵循 FastCGI 协议包中发送给 FastCGI 响应器程序。 - php中尤为关键的数据结构 - HashTable(哈希表)
5.1 php中哈希表的时间复杂度为O(1),相当于y=1,不论哈希表中数据如何增加,获取数据的时间始终不变。(O(n)相当于y=x)
5.2 基本概念
键(key):php中的数组索引
槽(slot/bucket):保存数据的地方
哈希函数:将键映射到槽的index的算法
哈希冲突:将两个不同的key映射到同一个槽的index上
如何解决哈希冲突:链接法通过使用一个链表来保存slot值的方式来解决冲突,也就是当不同的key映射到一个槽中的时候使用链表来保存这些值。 所以使用链接法是在最坏的情况下,也就是所有的key都映射到同一个槽中了(相同的key会插入槽内的上一个元素,插入哈希表的下一个元素),这样哈希表就退化成了一个链表, 这样的话操作链表的时间复杂度则成了O(n),这样哈希表的性能优势就没有了, 所以选择一个合适的哈希函数是最为关键的。php使用链接法解决hash冲突。 - 参考
6.1 PHP的底层执行原理和周期
https://www.imooc.com/article/details/id/22937
6.2 深入理解php内核
http://www.php-internals.com/
6.3 时间复杂度和空间复杂度
https://blog.csdn.net/qiantujava/article/details/12898461
6.4 PHP 内核中的 HASHTABLE 分析
https://www.163100.com/php-hashtable-fenxi/
初步探索PHP-1
最新推荐文章于 2024-09-28 16:31:15 发布