【问题标题】:Why does PHPinfo have a header version and library version? What are the differences?为什么PHPinfo有头版本和库版本?有什么区别?
【发布时间】:2026-01-08 12:35:02
【问题描述】:

我有一个不一致的地方,我无法正确对齐它们的版本,所以我只想删除库版本。我可以这样做吗?当库来自我的发行版时,是 PHP 的标头版本吗?我可以升级 PHP 的库版本吗?如果是这样,怎么做?我正在使用 PHP 5.4.4

例如,

【问题讨论】:

  • 你叫什么标题版本?您的意思是“服务器”HTTP 标头中每个请求中返回的值吗?
  • 例如,在 PHP Info 中,给定的扩展有 2 个版本。
  • 你能举个例子吗?
  • @AlexHowansky 当然!我刚刚更新了我的帖子!
  • 谷歌搜索“php openssl header version”显示了针对此问题的多个建议...

标签: php openssl


【解决方案1】:

如果您从源代码重建 PHP,我发现了另一个可能导致不匹配的原因。这很简单,但如果您不熟悉在 Linux 上从源代码构建,不知道它会花费您很多时间。

答案在这里:https://serverfault.com/a/567705/305059 - 不幸的是,我无法对这个不太有用的答案投票,所以如果你在那里有声誉,请这样做。

您需要在“make”之前运行“make clean”才能重建所有二进制文件。奇怪的是,如果没有这一步,我得到的是更新的库版本,但是是旧的标头版本——所以我认为它一定是重建了一些东西,但不是所有的东西。我的重建涉及链接到另一个位置的 curl 版本(使用 ssl 构建),这可能是它背后的原因。

无论如何,我希望这对某人有所帮助。感谢@velcrow 关于服务器故障。

【讨论】:

    【解决方案2】:

    当库来自我的发行版时,是 PHP 的标头版本吗?

    这意味着它是针对 1.0.1 头文件编译的,但现在是针对 0.9.8 动态链接的。因此,您使用的版本比 PHP 编译时使用的版本旧。

    许多库将版本存储在头文件中。因此,当程序使用该库时,它可以执行类似int HEADER_FOO_VERSION = LIBRARY_VERSION 的操作,将版本号嵌入到程序中(例如,php)。现在,当该程序运行时,它会动态链接库,这可能与主机系统上的不同。

    那个库可能有一个函数调用,比如int get_library_version()。所以程序(PHP)可以检查HEADER_FOO_VERSION == get_library_version()。如果不同,则可能存在兼容性问题。 (当然,它不必分配给局部变量......我只是想把头版本号编译成php,并且无论哪个版本的库都保持不变正在运行时使用。)

    是否有问题取决于两个版本是否兼容。

    通常,如果库大于标题,则可以。如果库比它链接的版本旧,那肯定更有可能成为问题。当然,这是因为不可能知道未来的版本可能会有什么变化。

    因此,在您的情况下,我会尝试通过apt-getyum 等更新您系统的 SSL 库,以匹配 PHP 期望的版本。

    检查 php 在 Linux 上使用的版本:

    $ ldd `which php` | grep ssl
      libssl.so.1.0.0 => /lib/i386-linux-gnu/libssl.so.1.0.0
    

    请注意,which php 只是查找完整路径的捷径。您可以对任何您想检查的可执行文件进行硬编码:ldd /usr/sbin/httpd

    【讨论】:

    • @Strawberry,我添加了一个命令,可让您检查 PHP 使用的版本。也许它正在选择一个与您预期不同的库。
    • libssl.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007f48c32ef000)
    • 您可能还想对 Apache 的可执行文件(可能是 httpd)和 mod_php.so 或任何您的 Web 服务器版本进行命名。如果这些也链接到正确的版本,我不确定 PHP 从哪里得到它的数字。
    • 每次你做什么?现在您已经重建它,它可能应该尊重您的本地设置。也许在它被编译成内置于其核心的 SSL 之前。 (我不知道。)不过只要留意一下,下次升级SSL的时候看看。 (见我的编辑:你可以硬编码任何你想检查的可执行文件。)
    • 别担心,我是来帮助别人的,而不是增加我的电子分数。
    【解决方案3】:

    这在 openssl 的更新版本中很常见。发生的情况是库的较新版本存储在不同的文件夹中。位于 /usr/bin/openssl 的原始文件夹需要一个指向新文件夹 /usr/local/bin/openssl 的符号链接。这将使两者成为相同的版本或仅显示 OpenSSL 版本_(随便)

    通常无需担心这一点,因为它仍按预期方式工作。这在共享服务器上很常见。

    编辑:

    The information in this post is generic and can be different if you are running
    CentOS, RedHat, Ubuntu, or another Linux/BSD version. Check documentation or man
    pages for the best information
    

    如果您确实更新了 OpenSSL,某些版本的 *nix 需要您重建 PHP 和 Apache 才能更新

    【讨论】:

    • @Strawberry,这是有道理的。如果您要从我在 Apache 上的回答中运行相同的命令,您会看到它在 PHP 有机会加载新版本之前加载了旧版本的 SSL。这就是为什么php,CLI 版本报告了正确的版本。
    • @Strawberry 我们有同样的情况。我想问一下你是如何重建apache的?就像我需要重新配置什么的一样。谢谢。
    【解决方案4】:

    头版本是功能版本,而库版本是代码版本。

    标题定义了接口——它告诉你库中有哪些函数。如果一个头被更新了,那么你需要检查以确保所有的函数都是一样的,看看有没有增加或减少。

    但如果更新了库而不是标头,则意味着所有函数调用都相同,但可能会更改某些代码(例如,错误修复)。

    在您的示例中,PHP 看到了 OpenSSL 1.0.1 的功能,但 OpenSSL 正在加载的源代码的实际版本是 0.9.8o

    【讨论】:

    • 这是对所提问题的简明回答。
    【解决方案5】:

    我自己不知道答案,但是当在谷歌上搜索时,一些很好的资源解释了相同的......

    What's the difference between a header file and a library?

    文件的版本是用于创建库的phpinfo中提到的版本。

    希望对你有帮助,如果在 google 上搜索的话,有很多可用的资源。

    仍然希望收到有关该问题的详细信息

    【讨论】:

      最近更新 更多