我已经成功在开发服务器上配置和编译了 php,并且运行良好,但在与系统管理员朋友交谈后,他告知我,不建议在生产(甚至开发)系统中自定义编译最新版本。他指出,他们自定义配置和编译了 PHP 5.3.6,结果发现低级 Postgres 驱动程序存在一些问题,因此他们不得不恢复到 5.3.3。
因此,我正在考虑返回 yum 来安装 PHP,但是我有几个自定义配置设置,想知道是否可以通过 YUM 传递或配置 PHP 的编译方式?
我当前的配置行:
Configure Command => './configure' '--with-libdir=lib64' '--prefix=/usr/local/_custom/app/php' '--with-config-file-path=/usr/local/_custom/app/php/etc' '--with-config-file-scan-dir=/usr/local/_custom/app/php/etc/modules' '--disable-all' '--with-apxs2=/usr/sbin/apxs' '--with-curl=/usr/sbin/curl' '--with-gd' '--with-iconv' '--with-jpeg-dir=/usr/lib' '--with-mcrypt=/usr/bin' '--with-pcre-regex' '--with-pdo-mysql=mysqlnd' '--with-png-dir=/usr/lib' '--with-zlib' '--enable-ctype' '--enable-dom' '--enable-hash' '--enable-json' '--enable-libxml' '--enable-mbstring' '--enable-mbregex' '--enable-pdo' '--enable-session' '--enable-simplexml' '--enable-xml' '--enable-xmlreader' '--enable-xmlwriter'
答案1
下载包的 src.rpm,它包含原始源代码和编译自定义 rpm 所需的所有文件:
- php.spec - rpmbuild 所需的 spec 文件
- php-xxx.tar.gz-原始源代码
- 各种补丁(.diff、.patch)
- 要添加的文档文件(如果存在)
要构建 rpm - 您将需要包含 rpmbuild 程序的 rpm-build 包。
也可以使用 yumdownloader(来自 yum-utils 包)来完成:
yum install yum-utils rpm-build
yumdownloader --source php
安装 src.rpm:
rpm -Uvh *.src.rpm
cd 到 rpmbuild SPEC 目录;
RHEL5,旧 Fedora
cd /usr/src/redhat/SPEC/
苏斯:
cd /usr/src/packages/SPEC/
RHEL6、较新的 Fedora:
cd ~/rpmbuild/SPEC/
php.spec 文件包含有关如何构建包以及将包含哪些组件的详细信息。它还包含有关依赖项和正确构建新包所需的包的数据。因此,rpmbuild 会提醒您任何缺失的包。
您需要:
- 从 php.net 下载更新的 php 源代码并将其放入 SOURCES 目录
- 在 php.spec 文件中的“Version:”字符串中指定新版本,并在“Release:”字符串中使用较低的值并在其中添加自定义名称,例如“Release: 0.mike”
- 检查 .spec 文件是否有可能的附加更改(可能有一些安全补丁在当前版本中不需要,如果文件已经打过补丁,rpmbuild 会告诉您)。如果您遇到任何问题,可能需要注释一些“Patch xx:”字符串和一些“%patch xx”。
运行 rpmbuild:
rpmbuild --target x86_64 -ba php.spec
--目标 x86_64- 指定平台(可以是 i386、x86_64、amd64 等)
-ba- “build all”,将同时构建最终的 .rpm 和新的 src.rpm 包
您可以在 ../RPM/ 和 ../SRPM/ 目录中找到构建的软件包。
此方法可确保包含供应商补丁、目录。文件结构层次结构相同、组件兼容、依赖关系得到满足,并且旧版本将被安全替换。此外,您还可以保证将来的更新。
附言:我不同意“生产中的新版本很糟糕”的说法。我为十几家公司提供支持服务,也有共享主机,我总是喜欢使用新版本。php 唯一的问题是从一个 subversion 转移到另一个 subversion(例如从 5.1.x 到 5.2.x,从 5.2.x 到 5.3.x)——有一些常规更改和弃用/删除的功能。但更新版本更快、更安全、维护得更好、更受追捧。
pss 我这辈子永远不会手动编译任何东西并将文件放在 /usr/local/ 中,我已经在几天内学会了我需要的 rpm,现在一切都运行顺利。
答案2
不可以,很遗憾您无法使用 yum 指定自定义配置命令。yum 和其他类似软件包安装程序提供的软件是根据供应商规范预先构建的。
我还建议不要仅仅因为某个软件有最新版本就使用它,尤其是在生产系统上。我也遇到过和你朋友类似的问题,一些奇怪的错误出现了,我花了几个小时、几天、几周的时间去追踪它……或者最终恢复到旧版本。
我会像你一样进行自定义 php 构建,这也是我们公司所做的。当新的稳定版 php 发布时,我们会在 /usr/local/php-xxx 中构建它,测试它,然后更新二进制符号链接和共享库,/etc/ld.so.conf.d
这样就好了。开发人员总是对特定功能有要求,因此我们必须拥有自定义构建的自由和灵活性。您可以关注 CentOS 推荐/分发的 php 版本,并在那时进行更新。
答案3
Yum 不是编译器
您可以尝试手动编译 PHP:
cd /tmp;
wget http://ua.php.net/get/php-5.2.17.tar.gz/from/ua2.php.net/mirror; # latest 5.2
tar -xzvf php-YOU_VER.tar.gz;
cd php-YOU_VER;
./configure --enable-cgi --disable-cli --with-png-dir=/usr/local --with-jpeg-dir=/usr/local --with-gd --enable-ftp --with-curl --with-zlib --enable-zip --with-iconv --enable-mbstring --with-mysql --with-freetype-dir=/usr/local --with-ttf --enable-gd-native-ttf --with-mysqli --with-libdir=lib64;
make;
make install;
答案4
就像 GioMac 所说的那样,并添加它。方法是从 yum repos 中获取您编译的 php 版本的源 rpm,然后提取 src rpm 并向其中添加您的自定义。构建 rpm 并执行
yum localinstall <rpm>
但这仍然没有解决系统管理员最初的担忧。您对 php 的自定义可能存在未在开发框中显示的错误。因此,解决该问题的一种方法是在测试环境中对其进行测试,一旦满意,就将其推送到生产环境。
yum 不是编译器。因此,通过 yum 安装并不能解决代码中存在的任何问题。yum 只是使解决软件包依赖关系变得更容易。我看到的一个好处是,在将软件包发布到 repo 的稳定分支之前,会对其进行某种程度的测试。因此,如果您想自己编译它,那么您将失去稳定分支的好处。如果您只想进行配置更改,那么您也可以在安装后通过编辑 php.ini 文件进行更改。