PHP 没有我遇到过的任何硬件限制,但肯定会阻止您在较旧的 *nix 系统上编译较新版本的 PHP 的一件事是软件。
现代版本的 PHP 无法在较旧的 *nix 系统上编译,因为它们没有构建 PHP 所需的工具(现代 C 编译器、glibc 的半新版本、GNU make、Bison 和许多PHP 扩展将具有与旧系统上安装的不兼容的较新库版本的先决条件。
这很可能就是他们这么说的原因。我曾尝试在 RedHat 7.3 上编译 PHP 5.4,但运气不佳,因为所有用于编译软件的系统库和工具都太旧了。使用 OpenSSL 扩展,旧系统通常甚至没有正确的头文件以及 PHP 在编译期间期望的函数原型。
所以是的,在旧系统上编译 PHP 很困难或不可能(曾经尝试在旧机器上构建新版本的 libc ???简直是一场噩梦!)。
例如,我使用 PHP 5.6.22 并开始在 Red Hat Linux 版本 7.3 (Valhalla) 上编译,并没有走多远...
第一个简单的错误:
checking for zlib version >= 1.2.0.4... 1.1.4
configure: error: libz version greater or equal to 1.2.0.4 required
它本身很容易编译,但是系统上没有安装我想要的许多其他扩展库,并且尝试编译每个库可能是它自己的一个兔子洞。
所以我拿出了我们不必开始的那些,能够./configure就好了,但不是太远进入make...
php-5.6.22/ext/openssl/openssl.c: In function `php_openssl_get_stream_from_ssl_handle':
php-5.6.22/ext/openssl/openssl.c:581: warning: passing arg 1 of `SSL_get_ex_data' discards qualifiers from pointer target type
php-5.6.22/ext/openssl/openssl.c: In function `php_openssl_get_evp_cipher_from_algo':
php-5.6.22/ext/openssl/openssl.c:1092: warning: return makes pointer from integer without a cast
php-5.6.22/ext/openssl/openssl.c:1095: warning: return makes pointer from integer without a cast
php-5.6.22/ext/openssl/openssl.c:1098: warning: return makes pointer from integer without a cast
php-5.6.22/ext/openssl/openssl.c: In function `openssl_x509v3_subjectAltName':
php-5.6.22/ext/openssl/openssl.c:1874: `GENERAL_NAMES' undeclared (first use in this function)
...
php-5.6.22/ext/openssl/openssl.c: In function `zif_openssl_digest':
php-5.6.22/ext/openssl/openssl.c:5112: void value not ignored as it ought to be
make: *** [ext/openssl/openssl.lo] Error 1
因此,使用 OpenSSL 就完蛋了(顺便说一下,它的版本是 0.9.6b,太旧了!)。我可能可以像以前那样编译更新的 OpenSSL 而不会遇到麻烦,但是这个 7.3 系统也很特别。我们付出了很多努力来将新版本的不受支持的软件(库和编译器)引入该系统以使其保持活力,但在旧版本上我的运气要差得多。
所以,是的,在旧系统上运行更新的 PHP 可能需要几天的时间,这需要在如何构建和安装库路径之外的库方面拥有大量经验和知识(因此它们不会干扰系统上的其他东西),然后让新内容动态链接到这些内容。