- 博客(359)
- 收藏
- 关注
原创 PHP怎么用ffmpeg实现视频自动去水印
FFmpeg 没有"自动识别并去除水印"的能力。任何声称一键自动去水印的方案,背后要么是预先框定了水印坐标,要么是接了 OpenCV 之类的计算机视觉库做目标检测。搜"一条命令自动去水印",点进去会发现命令里明明白白写着——这四组数字是人眼量出来的,不是程序算出来的。本文讲的是:在 PHP 里怎么正确调度 FFmpeg 完成去水印,包括几种可用滤镜的真实效果与代价、水印坐标怎么确定、以及一个可运行的 PHP 封装;同时把"哪些是营销话术、哪些是技术事实"分清楚,让你答复需求方时不至于承诺做不到的事。
2026-10-13 02:47:02
7
原创 PHP怎么实现简单的购物车功能
购物车看起来是入门级功能:加商品、改数量、删商品、算总价。但它是安全问题最集中的业务模块之一——价格篡改、数量为负、库存超卖、会话并发,几乎每一个坑都能直接变成资损。所以这篇文章不会只给一段"能跑就行"的代码,而是把设计上的几个关键决策讲清楚。最常见的错误做法是这样:表单里放一个隐藏字段把单价一起提交上来(price=199),后端取出来乘数量。攻击者把199改成0.01提交,你就按一分钱卖出去。凡是能算出价格的信息,都必须从服务端取,客户端只能提交两样东西:商品 ID 和数量。
2026-10-13 02:46:16
9
原创 PHP怎么实现简单的用户注册功能
用户注册看起来是最简单不过的功能:一张表单、两条 SQL。但上线后最常见的几种事故都出在这里:数据库里躺着明文密码,一次拖库全部泄露;用户名里带个单引号就把 SQL 语句拼断了,或者更糟——被注入;同一个人连点两次提交按钮,库里出现两条一模一样的账号;有人把密码超过 72 个字符时的行为当成 bug 报上来。密码存储方式SQL 的构造方式唯一性约束缺失对输入长度和类型的假设。它们都不是"注册逻辑写错了",而是"边界没处理"。
2026-10-13 02:45:30
10
原创 PHP怎么处理ffmpeg转码时的临时文件
用 PHP 调 ffmpeg 转码,功能半天就能写完,麻烦全在后面:上线一周后发现磁盘满了,翻进去看到几十 GB 没有扩展名的残片;用户投诉视频播到一半播放器报错,下载下来一看,mp4 文件只有 2MB,实际应该有 200MB;某次 PHP 脚本执行超时被杀,ps 里却还挂着一排 ffmpeg 进程把 CPU 吃满。ffmpeg 是一个外部进程,它的生命周期和 PHP 脚本并不绑定。脚本超时被杀,ffmpeg 照样在跑;
2026-10-13 02:44:44
9
原创 PHP容器启动即退出?揭秘php-latest镜像的默认行为与稳定实践
典型症状是这样的:执行,命令几乎瞬间返回,docker ps里什么都没有;能看到容器状态是Exited (0);一行输出都没有。换成却一切正常,能进到一个php >提示符。于是很多人得出一个错误结论:"PHP 镜像坏了,起不来。官方 PHP 镜像的默认命令本来就是php -a(交互式 REPL)。交互式 shell 会一直等着从标准输入读命令,而docker run默认不把终端接进去,stdin 立刻是 EOF,REPL 读到文件结尾就正常退出——退出码 0,没有任何错误。容器不是"崩溃"了,它只是。
2026-10-13 02:43:58
8
原创 PHP处理表单提交数据怎么防注入
"防注入"这三个字在 PHP 社区里被讲了二十年,但线上事故依然层出不穷。原因不是大家不知道要防,而是很多人照着一条错误的规则在做——那条规则叫"过滤所有输入"。php// ❌ 这段代码在很多老项目里都能找到对 MySQL 的注入防御是无效的(尤其是GBK编码下的宽字节注入);用在输入侧会导致数据库里存着'这样的双重转义内容,前端展示时全是乱码符号;而真正危险的$_GET$_COOKIE$_FILES一个都没过滤。输入不做过滤,只在"使用点"按该位置的上下文做转义。
2026-10-13 02:43:12
7
原创 PHP处理日期时间怎么避免时区问题
时区问题最讨厌的地方是它不一定报错。它可能只是让"今天"变成了昨天、让订单时间差了 8 小时、让统计报表在跨月那天的数字对不上。数据库里存的时间和服务器上date命令的输出差 8 小时(或别的整数小时);用户在北京看到的时间正常,用户在其他时区看到的时间整体偏移;本地开发环境一切正常,上线后全线偏移——因为开发机与服务器上php.ini的设置不同;每年夏令时切换的那两天,某个定时任务的执行时间莫名其妙早了一小时;"加一个月"算出来的日期跳到了下下个月。时间的三种表示被混用了。
2026-10-13 02:42:26
10
原创 PHP处理文件读写怎么避免权限报错
—这大概是 PHP 项目从本地搬到服务器、或者从一台服务器搬到另一台服务器时最常见的一行报错。它最迷惑人的地方在于:代码一个字没改,本地 Windows 上跑得好好的,到了 Linux 上就写不进去;更诡异的是,明明返回true,真正写入时照样失败。权限问题的根源几乎从来不在 PHP 代码里,而在「进程以谁的身份运行」和「目标路径的属主 / 属组 / 权限位」这两件事的错配上。PHP 自己不做权限判断,它只是把open()系统调用的失败原样翻译成一条 warning,真正拒绝你的是内核。
2026-10-13 02:41:41
10
原创 PHP处理二进制数据怎么避免乱码
二进制数据"乱码"的表现形式五花八门,但症状往往高度一致:上传的图片存进数据库再取出来就打不开了,用十六进制编辑器一看,开头多了三个字节;一个本来能正常解析的压缩包,经过一次"顺手写的转码"后gzdecode报错;接口返回的 JSON 里带了个二进制字段,结果整个响应体变成了空白页。二进制数据被当成了文本处理。PHP 的字符串本质上就是字节数组(byte array),它本身没有字符集概念,这就给了二进制数据一个天然的容器;但同时,PHP 又提供了一大批"会悄悄做编码转换"的函数——mb_*系列、
2026-10-13 02:40:55
6
原创 PHP处理JSON Lines文件怎么读写
日志采集、数据导出、模型训练语料、大表分片导出,这些场景的数据文件越来越多地采用 JSON Lines 格式(也叫 NDJSON,Newline Delimited JSON)。每一行是一个完整、独立的 JSON 值,行与行之间用换行符分隔。用惯 JSON 数组的人第一次处理它,很容易踩到这样几个症状:把整个文件读进来得到null;用explode切分后末尾多出一个空元素导致报错;文件一大就;追加写入之后文件里的行粘成了一团。JSON Lines 是「流式」格式,而 JSON 数组是「整体」格式。
2026-10-13 02:40:09
9
原创 PHP写第一个网页为什么总是空白
第一次写 PHP 的人,几乎都会经历这样一个下午:照着教程敲完代码,保存成文件,用浏览器打开——一片空白。更让人困惑的是,浏览器什么错都不报,你反复检查代码,觉得每个字符都对。其实"空白"根本不是一种情况,而是至少五种完全不同的故障共用同一个表象你的文件根本没有被 PHP 执行,而是被当成普通文本发给了浏览器;代码执行了,但里面没有任何输出语句——PHP 是"你不说输出,它就不输出"的语言;代码里有致命错误,但错误信息被配置关掉了,浏览器只拿到一个空的 500 响应;
2026-10-13 02:38:38
47
原创 PHP写接口怎么调试才能快速定位问题
接口出问题时的典型症状:前端报或者,因为响应体前面多了一段报错文本;调用方说「返回 500」,你自己用浏览器打开又是正常的;改完代码刷新页面毫无变化,反复怀疑逻辑写错了,最后重启一下 PHP-FPM 就好了;还有一个最常见的——接口超时,设了 30 秒,脚本却卡了十分钟还活着。它们的证据其实都在日志和响应里,但你没有在看那些地方。调试接口的效率差异,不在于会不会用某个调试器,而在于有没有一套「每一层都有明确证据」的排查路径。
2026-10-13 02:37:52
70
原创 PHP写命令行脚本怎么传递参数
PHP 写 CLI(命令行接口,Command Line Interface)脚本,最让人抓狂的阶段往往是"参数收不到"。典型症状有三种:第一种,脚本在终端里跑,结果程序完全没反应,--type像是被空气吞了;第二种,参数放在前半段能收到,放在位置参数后面就收不到,比如里--type神秘失踪;第三种,函数里想读参数,写了$argv却提示未定义变量,明明在时代码还能跑。这三种症状背后是三个不同的事实:PHP 的getopt()在遇到第一个非选项参数时就停止解析;$argv。
2026-10-13 02:37:07
73
原创 PHP写后台怎么防止SQL注入攻击
SQL 注入(SQL Injection)到今天仍然是后台系统最容易被拿下的漏洞,原因不是它难防,而是它太容易在不经意间被重新引入:一个「排序字段」参数、一个「批量删除」的 ID 列表、一句为了偷懒拼出来的ORDER BY,都足以让前面所有的防护失效。更麻烦的是症状。一个注入点往往在测试环境完全看不出来——参数是正常的1,SQL 执行得飞快;只有攻击者传进一段带引号的内容时,行为才暴露出来。而在那之前,代码看起来「用了参数绑定」。
2026-10-13 02:36:21
37
原创 PHP中preg_replace函数替换特殊字符总出错怎么办
的报错和"不出错"都很折磨人:一种是直接看到或者;另一种更阴——函数不报任何错,静静返回null,业务数据被整条丢掉,等到用户投诉"某条记录不见了"才发现。前一类问题几乎都出在分隔符和转义上:正则表达式必须用一个分隔符包起来,而业务数据里偏偏经常出现同一个字符(比如 URL 里的想匹配用户输入里的特殊字符,却不做,正则直接被用户输入改写。后一类问题出在失败是静默的出错时返回null而不是抛异常,而null在很多代码里会被??或类型转换悄悄变成空字符串。此外还有一个历史遗留的大坑:老的e。
2026-10-13 02:35:35
10
原创 PHP中json_encode函数返回空值怎么解决
"接口返回空白"是 PHP 里最经典的一类问题。日志里接口状态码是 200,前端JSON.parse报,抓包看响应体是零字节——排查半天,最后发现代码里写的是。真相是:json_encode()失败时返回的是布尔值false,而echo false输出的是空字符串。于是"编码失败"这个明确的错误,被echo悄悄伪装成了"返回空值"。所以这个问题的本质不是"函数返回了空值",而是"你丢掉了它返回false这件事",以及后面那个真正的问题——为什么编码会失败。
2026-10-13 02:34:49
75
原创 PHP中file_exists函数判断远程文件是否存在为什么总返回false
一个很典型的场景:本地测试时判断得好好,于是照着写了去检查远程图片是否还在,结果无论那个地址是不是真的存在,返回值永远是 false。换成is_file()也一样,全都是 false。更让人困惑的是,连一条明确的报错都看不到,控制台干干净净,只有结果不对。这不是你的代码写错了,而是的工作方式和 HTTP 协议的能力天生对不上。底层调用的是文件系统的stat()家族函数,而 PHP 的 HTTP 流包装器(stream wrapper)根本不支持stat()。
2026-10-13 02:34:04
109
原创 PHP中base64_encode函数编码后怎么安全传输
大概是 PHP 里最容易被误解的函数。它的名字里有 "encode",输出又是一串看不懂的字母数字,很多人由此产生两个错误直觉:一是"编码过了就等于加密了",二是"编码过了就可以随便放进任何地方"。这两个直觉都会出事。第一个直觉导致有人把密码、身份证号之后存进数据库或写进日志,以为已经脱敏。第二个直觉导致 base64 串直接拼进 URL 之后对不上——因为标准 Base64 的字符集里有,这三个字符在 URL、文件名、HTTP 头里的语义各不相同。
2026-10-13 02:33:18
148
原创 PhpStudy环境中怎么安装Laravel框架完整操作
在 PhpStudy 这类集成环境里装 Laravel,失败原因几乎从来不是"Laravel 装不上",而是环境没对齐。跑到一半报扩展缺失;装完了访问站点看到一片目录列表或者 404;首页能开,点任何链接都是 500。三者对应的问题分别是扩展没开、站点根目录指错了、以及伪静态没配。还有一个高频的版本错位:PhpStudy 面板停在 PHP 7.4,却去装 Laravel 11,Composer 会直接告诉你"依赖无法解析到可安装的包集合"。这不是网络问题,是版本要求没满足——
2026-10-13 02:32:32
193
原创 PHP8怎么配置ffmpeg硬件加速转码
给视频转码加硬件加速,几乎每个做媒体处理的团队都试过。;;转码成功但画面全绿、花屏,或者播到一半卡住;容器里权限拒绝;花了半天配好,实测发现转码时间几乎没变。“硬件加速”在 ffmpeg 里不是一个开关,而是解码、滤镜、编码三个互相独立的环节。只打开其中一个,另外两个还在 CPU 上跑,瓶颈根本没被挪走;而三个都打开时,又会遇到硬件帧(hardware frame)在内存与显存之间的搬运问题。
2026-10-13 02:31:46
188
原创 PHP8.2的Random扩展怎么替代rand函数
rand()和mt_rand()用了二十年,问题一直存在但很少有人细究:它们的随机性来自一个全局的、进程级的状态,任何一处代码调用mt_srand()都会影响全局;它们的算法是可预测的梅森旋转(Mersenne Twister,MT),从输出反推出内部状态在密码学上并不困难;shuffle()又都悄悄依赖同一个全局状态,模块之间互相干扰。PHP 8.2 引入了 Random 扩展(Random extension),提供了一套面向对象的新 API:Random\Randomizer。
2026-10-12 02:46:09
528
原创 PHP8.2接口响应慢怎么定位性能瓶颈
"某个接口变慢了"是运维反馈里最含糊的一句话。它可能意味着 PHP 代码里有个慢查询,也可能意味着 PHP-FPM 的进程池太小导致请求排队,还可能意味着这个接口调用了一个超时时间设成默认值的第三方服务,而对方今天恰好抖动了一下。这三种原因的解决方向完全不同,猜错方向的优化就是白干。PHP 8.2 本身在性能上并没有什么新东西(JIT 是 8.0 引入的,纤维是 8.1 引入的),所以定位性能瓶颈依靠的不是语言版本,而是一套从外到内的分层测量方法。
2026-10-12 02:45:22
15
原创 PHP8.2怎么实现多个catch捕获不同异常
try/catch用起来简单,出事的时候却容易让人懵:明明写了 catch,异常还是冒到最外层;或者反过来,一个把本该暴露的TypeError吞掉了,程序带着坏数据继续往下跑,最后在一个完全不相关的地方报错。还有一类是 catch 块顺序写反,某个分支永远不执行,排查时看代码"明明写了"却毫无反应。先纠正标题里的版号。多个catch块捕获不同异常不是 PHP 8.2 的特性,它从 PHP 5.0 引入异常机制时就有了;
2026-10-12 02:44:36
11
原创 PHP8.2怎么使用模板方法模式定义流程
模板方法模式(Template Method Pattern)不是 PHP 8.2 的特性。它是《设计模式》里的行为型模式,靠继承和抽象类实现,与语言版本无关。标题里带"PHP8.2"的合理理解是"在 PHP 8.2 环境下怎么写",本文按这个角度展开,并顺带用上 PHP 8.2 新增的几项语言能力——readonly类、DNF 类型、独立的nullfalsetrue类型,让代码更紧凑也更安全。流程是固定的,但其中若干步骤在不同业务下实现不同。数据导入、支付下单、报表生成、消息推送都属于这一类。
2026-10-12 02:43:50
14
原创 PHP8.2字符串基础用法有哪些
字符串是 PHP 里使用频率最高的类型,但「会用」和「用对」之间差距很大。几个典型症状:用substr()截取中文标题,结果末尾出现乱码方块;strpos()明明找到了却判成没找到,因为返回的是0;升级到 PHP 8.2 之后日志里突然刷出;直接抛异常中断脚本。PHP 的字符串本质是字节序列(byte string),而不是字符序列。所有单字节函数(strlensubstrstr_splitstrtoupper)都在字节层面工作,遇到 UTF-8 中文就会出错——一个汉字占 3 个字节,
2026-10-12 02:43:04
61
原创 PHP8.2升级后网站报错怎么解决
把服务器上的 PHP 从 7.4 或 8.0 换到 8.2,重启 FPM,刷新页面——然后页面就出了问题。页面顶部出现几行文字,把布局顶乱了;接口返回的 JSON 前面多了几行提示,前端直接报"数据格式错误";日志里刷屏;某些页面直接 500,堆栈指向一行看起来很正常的代码。一类是 8.2 自己的新弃用(deprecated),另一类是你在 7.4 跳到 8.2 的途中,跳过了 8.0 和 8.1 两个大版本的行为变更。
2026-10-12 02:42:18
79
原创 PHP8.2兼容性问题怎么快速定位
把项目从 PHP 7.4 或 8.0 升到 8.2 之后,最典型的症状有三类:一是页面直接白屏、接口返回 500,但日志里那条指向的却不是你的业务代码,而是某个没人维护的老扩展;二是首页正常,一点进后台某个功能就报 "Call to undefined function";三是最难受的一类——什么都不报错,但金额算错了、分页少了一条、JSON 里的数字变成了字符串。为什么会出现这种情况?PHP 的版本升级从来不是"换个解释器"这么简单。
2026-10-12 02:41:32
14
原创 PHP8.1网站打开空白怎么开启错误提示
"网站打开是空白页"这种情况在升级到 PHP 8.1 之后出现得特别频繁。典型表现是:浏览器返回 HTTP 500,但响应体是空的,页面一片白;服务器上的error_log里翻不到东西,或者只有一行毫无信息量的"连接被重置";用php -l检查文件语法却全部通过。PHP 默认把错误信息写给"日志",而不是写给"浏览器"。当关闭时,一个致命错误(Fatal error)会让脚本立刻停止,此时如果输出缓冲区(output buffering)里还没有任何内容,浏览器就只能收到一个空的 500 响应。
2026-10-12 02:40:46
12
原创 PHP8.1的枚举怎么实现接口和序列化
枚举(enum)是PHP 8.1引入的语言特性,标题里的版号是正确的。// 旧时代的写法,$status 可以是任何 int,没有任何约束,传错东西直接TypeError。接口(因为要复用统一的展示逻辑)和序列化(因为要进 JSON 响应、进数据库、进缓存)。本文就围绕这两件事展开:枚举怎么实现接口、UnitEnumBackedEnum这两个内置接口有什么用、对枚举到底做了什么、纯枚举(pure enum)与带值枚举(backed enum)在序列化上的差异,以及怎么把枚举安全地送进数据库再取回来。
2026-10-12 02:40:00
72
原创 PHP8.1怎么使用JWT实现用户认证
用 JWT(JSON Web Token)做接口认证的项目,出问题的姿势高度雷同:本地一切正常,上线后要么是「令牌永远不过期」,要么是「用户改了密码,旧令牌照样能用」,最糟糕的一种是安全扫描直接报出「签名可绕过」。根因通常不在 JWT 本身,而在于把它当成了一个「加密过的 cookie」。JWT 的前两段(header 与 payload)只是 Base64URL 编码,任何人拿到令牌就能解开、看到里面的全部内容;安全边界完全落在第三段的签名上。一旦签名校验写错——用==比较、不限定算法、拿到false。
2026-10-12 02:39:14
10
原创 PHP8.1怎么使用GD库处理图片缩放裁剪
用 GD 做头像和商品缩略图,是 PHP 里最传统的需求,但它翻车的姿势一直很稳定:上传竖拍的手机照片,生成的头像倒着躺;透明 PNG 缩放后背景变成黑色;一片 4000×3000 的照片处理到一半进程被 OOM Killer 干掉;用缩出来的图边缘发虚。EXIF 方向没有读、Alpha 通道在新建画布时没保留、内存占用没按"解码后的像素"算过、缩放的函数选错。PHP 8.1 在这个领域还带来一个值得一提的变化——GD 开始支持 AVIF 格式,可以用读取、用。
2026-10-12 02:38:28
14
原创 PHP8.1安装后不生效怎么排查
"装好了 PHP 8.1,但就是不生效"是一句有歧义的话。它可能指三种情况:命令行的php -v还是旧版本;浏览器里的phpinfo()还是旧版本;或者版本号对了,但某个新语法、某个扩展就是不能用。三者原因完全不同,混在一起排查就是在原地打转。更麻烦的是,PHP 的"生效"取决于四个互相独立的环节:命令行的PATH顺序、Web 服务器指向的处理器(Apache 的模块、Nginx 转发的 FastCGI 端口、IIS 的处理程序映射)、php.ini。
2026-10-12 02:37:42
65
原创 PHP8.1字符串截取怎么避免乱码
标题里的「PHP 8.1」和这个问题的成因没有直接关系。字符串截取乱码是字符编码问题,substr()按字节切、按字符切这件事,从 mbstring 扩展存在的第一天起就是如此,PHP 8.1 并没有为字符串截取引入任何新函数。本文按"与版本无关、函数引入版本逐个标注"的方式写,PHP 7.4 / 8.x 全部适用。典型的翻车现场是这样的:列表页要显示中文标题的前 20 个字符,开发者写了,本地用英文标题测试一切正常,上线后遇到中文标题,页面上多出一个黑底问号�;更隐蔽的是接口场景——
2026-10-12 02:36:56
78
原创 PHP8.1字符串在Mac怎么使用
第一层是环境——从 macOS 12 (Monterey) 起系统不再预装 PHP,只剩一个引导安装命令行工具的桩程序,很多人装完 Homebrew 版 PHP 却没确认mbstring是否启用;第二层是文件系统——APFS 的文件名做过 Unicode 规范化,从磁盘读回来的字符串可能和你代码里写的字面量字节不一致===比较会莫名失败;第三层才是语言本身——PHP 8.1 的字符串函数大多是 8.0 及更早引入的,真正属于 8.1 的新语法(一等可调用语法、枚举、readonly)反而常被忽略。
2026-10-12 02:36:11
70
原创 PHP8.1和8.2的类型系统有什么改进
PHP 8.0 把联合类型(union type)带进了语言,从那之后类型系统进入了快速迭代期。8.1 和 8.2 两个版本又补上了一大批能力:交集类型、独立类型的nullfalsetrue、枚举、readonlynever、析取范式类型、readonly类。这两个版本各自引入了什么,边界并不总是凭直觉能分清的。比如readonly修饰属性是 8.1 引入的,而readonly修饰类要到 8.2 才有;never返回类型和纯交集类型A&B都是 8.1;DNF 类型(A&B)|C和独立类型true。
2026-10-12 02:35:24
136
原创 PHP8.0网站被攻击怎么排查防护
"网站被攻击了"这句话背后其实是好几类完全不同的事故。搜索引擎里被收录了几千个赌博关键词页面,是挂马和内容注入;服务器 CPU 长期 100%、带宽跑满,是资源滥用(多半在被挖矿);用户收到钓鱼邮件、数据库里出现陌生账号,是数据泄露;接口突然大面积超时,是DDoS 或 CC 攻击。这四类的排查重点和处置手段都不一样。PHP 8.0 并没有为安全引入什么专门机制,这个话题和版本基本无关。但它有几个和安全相关的行为变化值得知道——指令被移除(远程文件包含从机制上不再可能)、assert()
2026-10-12 02:34:30
137
原创 PHP8.0的联合类型怎么和泛型结合使用
PHP 8.0 引入联合类型(Union Types)之后,很多人产生了一个误会:以为 PHP 终于有泛型(Generics)了,于是写出这样的签名,等着运行时给个明确报错,结果要么类型检查永远通不过,要么报错信息里冒出一个莫名其妙的类名。误会的原因在于,"联合类型"和"泛型"解决的是两个完全不同的问题。联合类型回答的是"这个位置可以是哪几种类型中的一种",比如int|string;泛型回答的是"这个容器里的元素是什么类型",比如"一个装User的列表"。PHP 8.0 给的是前者,
2026-10-12 02:33:45
132
原创 PHP8.0的类找不到报错怎么修复
这句报错,本身几乎没有信息量——它只告诉你"没找到",不会告诉你"为什么没找到"。而在升级到 PHP 8.0 的过程中,这句话出现的频率会明显高于以前的版本,原因是一个很多人没注意到的变更:__autoload()函数在 PHP 8.0 被彻底移除了。是 PHP 5 时代唯一的自动加载机制。它曾经在 PHP 7.2 被标记为弃用,在 8.0 被移除。老项目如果还在用它,升级到 8.0 之后的症状是全局性的:所有通过该函数加载的类统统找不到,页面一片 "not found",但代码一行都没改。
2026-10-12 02:32:58
217
原创 PHP8.0的数据库连接失败怎么调试
典型场景是这样:代码在 PHP 7.4 上跑得好好的,环境换成 PHP 8.0 之后,页面直接白屏或者 500,日志里躺着一句。更让人困惑的是,同样的账号密码,用命令行客户端能连上,用 PHP 就是连不上。PHP 8.0 引入了两个影响很大的变化,它们让"以前被静默吞掉的连接失败"变成了会直接中断脚本的致命错误。第一个变化是 PDO 的默认错误模式从改成了——以前连接失败只是返回false,你不检查就一直往下跑,现在直接抛异常。第二个变化是错误抑制符不再能抑制致命错误的提示信息,所以很多靠。
2026-10-12 02:32:12
156
原创 PHP8.0的扩展缺失报错怎么安装
这三行长得像,病因完全不同。第一行是扩展压根没装;第二行是 PECL 扩展没装或没加载;第三行是扩展文件存在但加载失败(路径不对、ABI 不匹配、依赖的库缺失)。PHP 的扩展(extension)是独立的动态库文件(Linux 下是.so,Windows 下是),编译 PHP 时只有一部分会静态编进去,其余的要靠php.ini里的extension=指令在启动时动态加载。没装、没启用、启用失败。
2026-10-12 02:31:26
116
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅