php 8.5 尚未发布,php_build_date 并非 php 内置常量,任何使用均属手动定义或构建脚本注入;phpinfo() 中的“build date”不可通过常量获取,可靠方式是在构建时主动注入时间戳。

PHP 8.5 没有 PHP_BUILD_DATE 常量
PHP 8.5 尚未发布(截至 2024 年中),当前最新稳定版是 PHP 8.3;所谓 PHP_BUILD_DATE 常量并不存在于任何正式 PHP 版本中——它不是 PHP 内置常量,也从未被 RFC 接受或写入源码。
你可能看到过类似代码,但那基本是手动定义的宏、构建脚本注入的 hack,或是混淆了 __DATE__ 这类 C 预处理器宏(仅在 PHP 源码编译时生效,不暴露给 PHP 用户空间)。
- PHP 所有公开常量都列在 官方保留常量文档,
PHP_BUILD_DATE不在其中 -
phpinfo()输出里显示的 “Build Date” 来自编译时环境变量或 configure 脚本记录,PHP 运行时不提供对应常量访问 - 即使你在 php.ini 或扩展里硬塞一个
define('PHP_BUILD_DATE', '...'),也不具备通用性,且无法保证时间准确
用 phpversion() 和 zend_version() 辅助判断构建年代
虽然拿不到精确编译时间,但可以间接推测:PHP 主版本号 + Zend 引擎版本 + 系统包信息,能帮你排除“是不是老旧二进制”这类实际问题。
例如某些 Linux 发行版的 PHP 包会把构建时间打在包元数据里,而 PHP 自身只保证运行时行为兼容,不承诺暴露构建时间戳。
立即学习“PHP免费学习笔记(深入)”;
-
phpversion()返回字符串如"8.3.6",仅反映版本,不带日期 -
zend_version()返回 Zend 引擎版本(如"4.3.6"),和 PHP 版本强绑定,可用于交叉验证是否为官方构建 - 真正想查编译时间?得看系统层面:
rpm -qi php-cli(RHEL/CentOS)、dpkg -s php8.3-cli(Debian/Ubuntu)或ls -la /usr/bin/php的 mtime(不准确,只是文件修改时间)
自己记录构建时间:唯一可靠的做法
如果你控制构建过程(比如自编译 PHP、打包 Docker 镜像、CI/CD 流水线),最务实的方式是主动注入时间戳,而不是依赖 PHP 自身提供。
这比折腾不存在的常量或解析 phpinfo() 输出稳定得多,也符合“配置即代码”的实践。
- 编译前在源码中 patch:
echo "#define PHP_BUILD_DATE \"$(date -u +%Y-%m-%d)\"" >> main/php_config.h,再加一行extern const char php_build_date[];并导出为PHP_BUILD_DATE常量(需改 C 代码,不推荐) - 更简单:构建时写入一个 PHP 文件,如
/usr/local/etc/php-build-info.php,内容为<?php define('PHP_BUILD_DATE', '2024-05-21T14:22:00Z');,然后在项目启动时require它 - Docker 场景下,直接用构建参数:
docker build --build-arg BUILD_DATE=$(date -u +%Y-%m-%dT%H:%M:%SZ) ...,再通过$_ENV['BUILD_DATE']读取
别信网上抄来的 get_cfg_var('build.date') 或 ini_get('build.date')
这些调用必然返回 false 或空字符串。PHP 的 php_ini_scanned_files()、ini_get_all() 都不包含构建时间相关配置项——build.date 不是合法 ini 指令,也不会被解析进配置表。
试图从 phpinfo() 页面抓取“Build Date”字段属于脆弱的字符串解析,容易因输出格式变更(比如 CLI vs FPM vs phpinfo() HTML 模式)、语言本地化(中文环境显示“构建日期”)、甚至 phpinfo() 被禁用而彻底失效。
-
phpinfo()是调试工具,不是 API,其输出结构无契约保证 - 正则匹配
/Build Date => ([^ 在 PHP 8.3 的 CLI 模式下会失败(该模式输出纯文本,无 HTML 标签,但字段名也不叫 “Build Date”) - 即便匹配成功,拿到的也只是 configure 时的
$DATE,未必等于真实编译完成时间(中间可能卡住几小时)
构建时间不是运行时必需信息,真需要,就自己记;不需要,就别找它。PHP 没义务告诉你它哪天被编译出来——毕竟它只关心能不能跑你的代码。










