PHP 内核开发的一些备忘录

本人已经没有力气维护这篇文章了,所以大量内容已经过期。如果你想看我对 php 内核的贡献,可以看:https://github.com/php/php-src/commits?author=LamentXU123

我从事 php 语言的内核开发一年多了。一直有很多想法和经验总是忘记。遂写一篇类似与小记的博客记录一下。

我正在经历极其严重的存在主义危机......我不知道活着的意义是什么,我不知道我有什么用......哈哈。

AI 时代,没有人在意你对某一个“衰落”的语言的热爱。人们只想怎么把手里的 token 变成白花花的银子。

我想提醒大家。Amateur (adj.业余的)在当今意味着不专业,暗示着低水平。但他的拉丁词源,意味着热爱。这样的情感是多么强大的 AI 智能体都无法取得的。

请停止使用功利的眼光看待一切...... 请使那些,在 AI agent 的循环自慰下逐渐腐蚀和麻木的灵魂远离我们引以为傲的开源社区。TiA。

DONE

以下是我对 PHP 做的改动(不包含性能优化,重构以及 bugfix,仅为明显的行为改动)

PHP 8.6

RFC

安全漏洞

其他重大改动

其他微小改动

TODO

Zend 内核

新 API

这是因为内核里有很多扩展依赖 ext/hash,这本身没什么问题,但是这个依赖仅仅是要调用 ext/hash/php_hashphp_hash_bin2hex。这些功能很简单。所以我们可以把这些 bin2hex 的东西做成 Zend 里内置的 API,直接给 ext 使用。这样可以避免很多 ext 依赖于 ext/hash

现在,我们有很多 zend_str_* 的 helper 可以完成 zend_string 的拼接。但是对于 C char,利用这些 helper 会多进行一次内存的 allocation,导致性能下降,因此,所有对于 C char 拼接的场景我们都是用原始的 memchr 方式。这样会导致代码的可读性降低。我们可以实现这些 helper 来帮助我们进行 C char 的拼接。

API 改进

zval_try_get_* 替换 zval_get_*zval_get_*系列的函数,比如 zval_get_long,会直接强制把 zval 类型的参数转化为 long。这个强转甚至是静默的。所以在我看来任何人都不应该用这个函数(它应该被 deprecated)。我们应当审计所有该函数的应用场景并换成更严格的 zval_try_get_*,以在强制转换时抛出 TypeError/ValueError。

性能优化

php代码库中有很多地方采用 array_init 来初始化数组。这个函数会先计算参数的长度,分配内存再创建数组。很多情况下我们在初始化之前就知道数组的长度了。因此,可以使用 array_init_size 函数直接分配内存创建数组,省去计算长度的一部分以达到性能优化。

这些函数中都多多少少涉及到利用循环的方式动态扩容字符串/数组长度的行为。我们可以使用分配(pre-allocation)的方式一次性将长度计算完全后直接分配所有内存,避免在循环体中多次动态扩容,以在复杂场景(即,假设使用优化前版本需要循环很多次的场景)下带来巨量优化。

ext

检查所有 ext 的函数在参数中包含空 and/or 含 NUL 的字符串时是否能正常工作。如果不能,抛出 ValueError。

RFC

研究

posted @ 2026-04-23 23:26  LamentXU  阅读(115)  评论(0)    收藏  举报