尝试为 php pecl 扩展模块 (geoip) 构建 rpm 时找不到 .so

Posted

技术标签:

【中文标题】尝试为 php pecl 扩展模块 (geoip) 构建 rpm 时找不到 .so【英文标题】:Can't find the .so while trying to build an rpm for php pecl extension module (geoip) 【发布时间】:2015-10-01 19:16:58 【问题描述】:

我正在尝试制作一个 RPM,以便在 AWS 机器上轻松部署 geoip php 模块。 RPM 和其他内容将托管在只有这些机器才能访问的私有存储库中。这是我正在使用的软件的要求,所以让我们把它留在我需要它

我的第一次尝试是

$ pecl makerpm geoip
WARNING: "pear makerpm" is no longer available; an improved version is available via "pear make-rpm-spec", which is available by installing PEAR_Command_Packaging

很公平,让我们安装这个PEAR_Command_Packaging 交易并继续...

$ pecl install PEAR_Command_Packaging
No releases available for package "pecl.php.net/PEAR_Command_Packaging"
install failed

好的,我可以发誓我被告知要安装这个,但让我们试试pear

$ pear install PEAR_Command_Packaging
Failed to download pear/PEAR_Command_Packaging within preferred state "stable", latest release is version 0.3.0, stability "alpha", use "channel://pear.php.net/PEAR_Command_Packaging-0.3.0" to install
install failed

稳定性alpha 嗯……好吧,让我们看看它们有多活跃! 根据their site 的说法,该项目不活跃,最后一次活动是在 2012 年 4 月 ...那不会。

随着这条路的关闭,我查看了pecl 命令本身,它似乎提供了下载构建安装。我不想要install,因为我只是在这里制作RPM,但downloadbuild 看起来很方便:

$ pecl download geoip-1.0.8
downloading geoip-1.0.8.tgz ...
Starting to download geoip-1.0.8.tgz (10,061 bytes)
.....done: 10,061 bytes
File /home/user/workspace/geoip-rpm-spec/geoip-1.0.8.tgz downloaded

为构建做准备...

$ pecl bundle geoip
downloading geoip-1.0.8.tgz ...
Starting to download geoip-1.0.8.tgz (10,061 bytes)
.....done: 10,061 bytes
Package ready at '/home/user/workspace/geoip-rpm-spec/geoip'

现在,我们开始建造!

$ pecl build geoip/package.xml 
running: phpize
Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226
building in /var/tmp/pear-build-userttUJNa/geoip-1.0.8
... <snip/>
running: find "/var/tmp/pear-build-userttUJNa/install-geoip-1.0.8" | xargs ls -dils
264791  4 drwxrwxr-x 3 user user  4096 Oct  1 18:33 /var/tmp/pear-build-userttUJNa/install-geoip-1.0.8
265361  4 drwxrwxr-x 3 user user  4096 Oct  1 18:33 /var/tmp/pear-build-userttUJNa/install-geoip-1.0.8/usr
265362  4 drwxrwxr-x 3 user user  4096 Oct  1 18:33 /var/tmp/pear-build-userttUJNa/install-geoip-1.0.8/usr/lib64
265363  4 drwxrwxr-x 3 user user  4096 Oct  1 18:33 /var/tmp/pear-build-userttUJNa/install-geoip-1.0.8/usr/lib64/php
265409  4 drwxrwxr-x 3 user user  4096 Oct  1 18:33 /var/tmp/pear-build-userttUJNa/install-geoip-1.0.8/usr/lib64/php/5.6
265444  4 drwxrwxr-x 2 user user  4096 Oct  1 18:33 /var/tmp/pear-build-userttUJNa/install-geoip-1.0.8/usr/lib64/php/5.6/modules
265358 68 -rwxr-xr-x 1 user user 67772 Oct  1 18:33 /var/tmp/pear-build-userttUJNa/install-geoip-1.0.8/usr/lib64/php/5.6/modules/geoip.so

那么,我应该可以在/var/tmp/pear-build-userttUJNa/install-geoip-1.0.8/usr/lib64/php/5.6/modules/geoip.so 找到我的geoip.so,对吧?

$ ls -al /var/tmp/pear-build-userttUJNa/install-geoip-1.0.8
ls: cannot access /var/tmp/pear-build-userttUJNa/install-geoip-1.0.8: No such file or directory
$ ls -al /var/tmp/pear-build-userttUJNa
ls: cannot access /var/tmp/pear-build-userttUJNa: No such file or directory

错了!

build 步骤声称要创建的 .so 在哪里?该文件在这台机器上没有。 我能够获得该死的 .so 的唯一方法是运行 install 命令,但 this 不是需要该模块的机器。

我在这里做错了吗?

【问题讨论】:

【参考方案1】:

更新: 更多的谷歌搜索出现了答案。我在这里使用geoip 作为示例,因为它是我正在使用的,但是您几乎可以将它用于任何扩展,几乎不需要修改。

    pecl download geoip-1.0.8下载源码(或其他扩展,或其他版本) pecl bundle geoip提取扩展源 cd geoip &amp;&amp; phpize 切换到源目录并创建 autoconf 脚本 ./configure --prefix=/home/user/rpmbuild/blah --exec-prefix=/home/user/rpmbuild/bleh配置 make .so 现在在 modules 目录中 利润!

这是老套路:

目前看来可行的是运行构建步骤,以便使用configure 脚本填充下载的模块,切换到模块目录并运行configure --prefix=some_local_dir,然后运行make。 现在我实际上可以看到geoip.so 文件,但感觉它更像是一种技巧/解决方法,而不是实际的解决方案。

【讨论】:

以上是关于尝试为 php pecl 扩展模块 (geoip) 构建 rpm 时找不到 .so的主要内容,如果未能解决你的问题,请参考以下文章

PECL PEAR php扩展模块的简便安装方式

pecl 轻松安装php扩展

gentoo geoip安装[关闭]

sh 使用gd,mcrypt,mysql,pdo,apcu,opcache,bz2,zlib,ftp,pecl-geoip,imagemagick在CentOS上将PHP升级到5.6

是否可以在 PHP 中模拟 PECL 扩展?

使用包含的 php pecl 扩展