PHP 边边角角

💡 原文中文,约6400字,阅读约需16分钟。
📝

内容提要

本文介绍Ubuntu下通过PPA快速安装PHP 7.2/7.4及常用扩展,并概述PHP的优缺点:支持命名空间、trait、类型系统、Composer、FFI,性能较PHP 5.6提升约3倍;不足是不支持泛型、运行时类型检查、多核,性能弱于编译型语言。还讲解PHP生命周期、框架请求流程、php://input、502排查、安全配置,以及Nginx与PHP-FPM的Socket和IP两种监听方式。

🔎

延伸解读

PHP 7.4 性能提升的关键因素

文章指出 PHP 7.4 性能约为 PHP 5.6 的 3 倍,比 PHP 7.0 快近 18%。主要提升来自 PHP 7.0 的 zval 重构,减少了变量存储字节和内存占用,并改善了数组结构,使数组元素和哈希映射表分配在同一内存块,提高 CPU 缓存命中率。PHP 7.4 引入的 preload 特性进一步加快代码执行,而 PHP 8.0 将引入 JIT,性能会有更大提升。

502 错误的常见原因与排查方向

文章分析 502 Bad Gateway 通常由 upstream 出错引起,对 PHP 而言常见原因是脚本执行超过 timeout 设置或 timeout 过大,导致 PHP 进程长时间不能释放。控制脚本执行时间的配置有 php.ini 的 max_execution_time 和 php-fpm.conf 的 request_terminate_timeout。解决时除了适当增大执行时间,更应从根本定位脚本执行过长的原因,如循环嵌套过多或数据库死锁,高并发下还需考虑 max_children 设置。

php://input 与 $_POST 的适用场景

php://input 是一个只读流,用于获取整个 HTTP 请求体(除去头部)的原始内容,不限制 Content-Type。而 $_POST 仅支持 application/x-www-form-urlencoded 和 multipart/form-data 两种编码。因此,当 AJAX 请求使用 application/json 等类型时,$_POST 为空,必须使用 php://input。但需注意,当编码为 multipart/form-data 时,php://input 无效,此时应使用 $_FILE

Nginx 与 PHP-FPM 的两种监听方式对比

Nginx 的 fastcgi_pass 可配置为 UNIX Domain Socket 或 IP 地址。UNIX Domain Socket 适用于 Nginx 和 PHP-FPM 在同一服务器,数据不经过网络协议栈和网卡,直接进程间拷贝,可避免 TCP 层 TIME_WAIT 连接过多的问题。IP 地址方式则无论是否同机都支持。选择时需根据部署环境权衡,同机部署优先考虑 UNIX Socket 以减少网络开销。

❓

Q&A

如何在Ubuntu上快速安装PHP 7.2或7.4及其常用扩展?

使用PPA源:sudo add-apt-repository ppa:ondrej/php && sudo apt-get update,然后安装PHP及扩展,例如对于PHP 7.2:sudo apt-get -y install php7.2,再安装常用扩展如php7.2-fpm、php7.2-mysql、php7.2-curl等。PHP 7.4类似,替换版本号即可。

PHP 7相比PHP 5.6有哪些性能提升?

PHP 7.4的性能大约是PHP 5.6的3倍,比PHP 7.0也快了近18%。主要提升来自PHP 7.0的zval重构,减少了变量存储字节和内存占用,改善了数组结构,改进了函数调用机制。PHP 7.4还引入了preload特性进一步加快代码执行速度。

PHP有哪些优点和不足?

优点:完善的面向对象支持(命名空间、接口、trait、类型系统)、Composer依赖管理、FFI支持、更安全的libsodium库、性能不断提升。不足:不支持泛型、运行时类型检查、多核,性能相比编译语言差很远,且PHP本身和扩展用C开发,深入理解门槛高。

php://input和$_POST有什么区别?

php://input是只读流,用于获取整个HTTP请求体(除去头部),支持任何Content-Type,而$_POST只支持application/x-www-form-urlencoded和multipart/form-data两种编码。对于application/json等类型,必须使用php://input。但multipart/form-data时php://input无效,需用$_FILES。

PHP-FPM的502错误常见原因和解决方法?

502错误通常由upstream出错引起,常见原因是PHP脚本执行超时或超时设置过大导致进程无法释放。解决方法:适当增大php.ini中的max_execution_time或php-fpm.conf中的request_terminate_timeout;定位并优化执行时间过长的脚本;高并发时调整max_children。

Nginx与PHP-FPM的两种监听方式有什么区别?

两种方式:UNIX Domain Socket和IP地址。UNIX Domain Socket适用于Nginx和PHP在同一服务器,不经过网络协议栈,避免TCP层的TIME_WAIT问题;IP地址方式(如127.0.0.1:9000)支持Nginx和PHP是否同机。配置时,php-fpm.conf中listen设置socket路径或IP端口,nginx.conf中fastcgi_pass对应设置。

🏷️

标签

➡️

继续阅读