在mac下编译phpredis的c扩展给MAMP使用

首先解释下标题中提到的N个名词:

  1. mac:macosx,一款苹果电脑公司推出的操作系统,作为软件从业人员如果现在连这个还不知道的话呢,建议改行了
  2. php:脚本语言,广泛应用于网站开发,成功案例有鼎鼎大名的国内永远访问超时或者500的facebook
  3. redis:新兴的NOSQL内存数据库代表,支持很多中数据存储格式,同时存取速度非常快,发展速度非常迅猛,开源项目,于2010年被VMWare收购
  4. phpredis:提供给php使用redis客户端扩展,采用c语言开发,速度是纯php开发的扩展predis的3倍
  5. MAMP:mac下的类似于LAMP或者WAMP的php、mysql、apache集成环境,一键安装,非常适合用来做为开发环境,但是自带的扩展数量有限

看了上面相信大家就能明白为什么要折腾编译个phpredis扩展给MAMP用了。但是要编译成功,确实不是一件容易的事情。在安装过程中,大致会碰到三个让人疑惑的地方。

  • 32位64位的问题,怎么编译成功了就是加载不上去啊,我都反复编译了不下10遍了!!!
  • 安装的MAMP里面的php是5.2的,系统又自带了个php,5.3的,哪是哪啊,真头疼!!!
  • 好不容易搞的有些些明白,php的路径知道了,怎么编译不出来啊,没有php的头文件!!!

从macox10.6雪豹开始,mac就进入了64位的世界了,但是以往的32位的程序都是能正常运行的,就像我们所下载使用的MAMP就是一个32位的程序集合。不过在默认情况下,如果我们从网上找来phpredis代码,直接编译,那么就会编译出一个仅支持64位下运行的程序,这样MAMP所带的32位的php程序是无法加载这个编译好的64位的so库文件的,我们需要让gcc编译出一个既支持32位又支持64位的so库文件来。那么到底一个编译好的文件是32位还是64位呢?可以用file命令来查看的

york:phpredis$ file modules/redis.so
modules/redis.so: Mach-O universal binary with 2 architectures
modules/redis.so (for architecture i386):       Mach-O bundle i386
modules/redis.so (for architecture x86_64):     Mach-O 64-bit bundle x86_64

上面就是一个例子,可以看出,编译出来的是同时支持i386(32位)和x86_64(64位)架构。那是如何做到这一点的呢?只要在打开命令行,执行其他事情之前敲入下面这几行命令就可以了。这一点,我们也可以在phpredis的帮助说明里面看到。

MACOSX_DEPLOYMENT_TARGET=10.6
CFLAGS="-arch i386 -arch x86_64 -g -Os -pipe -no-cpp-precomp"
CCFLAGS="-arch i386 -arch x86_64 -g -Os -pipe"
CXXFLAGS="-arch i386 -arch x86_64 -g -Os -pipe"
LDFLAGS="-arch i386 -arch x86_64 -bind_at_load"
export CFLAGS CXXFLAGS LDFLAGS CCFLAGS MACOSX_DEPLOYMENT_TARGET

但是问题来了,按照phpredis的帮助说明,并不能编译出一个能够给MAMP使用的扩展文件出来。因为如果我们敲入phpize命令,那调用的其实是mac系统自带的php5.3的程序命令,这样编译出来的so文件是php5.3版本适用的,MAMP并不能加载成功。下面我就把具体命令列举在这,使用这些命令的原因就是因为我们需要给操作命令指定详细的MAMP所带的php路径。假设您的MAMP跟我一样,放在了/Application目录下面。

git clone https://github.com/nicolasff/phpredis.git //随便找个目录把源代码拉下来
cd phpredis // 进入到phpredis目录
/Applications/MAMP/bin/php5/bin/phpize
./configure --with-php-config=/Applications/MAMP/bin/php5/bin/php-config
make

编译不成功?不成功就对了,因为您下载的MAMP程序集并没有把php的头文件放在他所自带的php-config所指定的目录里面。解决办法就是手动去下载相对应的头文件来,我们可以到php官网上面下载一个php源代码包,版本要是5.2的哦,千万别下错了,子版本号可能不受影响,我的MAMP自带的是5.2.6的php,但是我下载的是5.2.17这个版本的源代码。下载好了之后放到这个目录,形成像下面那张图片所示的目录结构,图片中php目录下面就是直接的源代码了。

/Applications/MAMP/bin/php5/include

MAMP php头文件

接下来,我们还需要运行下面这两行命令

cd /Applications/MAMP/bin/php5/include/php
./configure

这样就可以了,头文件算是配置好了,不过这个方法比较苯,给include目录留下了一堆用不到的.c文件。完成之后再编译phpredis,编译成功之后会在phpredis的目录下面生成modules/redis.so文件,我们再把这个文件复制到php.ini指定的扩展的目录下面

cp modules/redis.so /Applications/MAMP/bin/php5/lib/php/extensions/no-debug-non-zts-20050922/

然后在php.ini文件中加入下面这行把phpredis扩展打开就可以了

extension=redis.so

到此,大功告成,可以看看phpinfo里面是不是能找到redis字样了

This entry was posted in PHP, Redis and tagged , , , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>


Verify Code   If you cannot see the CheckCode image,please refresh the page again!