问题:用 xampp 套件的 php 测试程序,程序中用到了 memcache,xampp 中未编译这个 extension,因此无法运行。
如果为了 memcache,重新编译 Apache、PHP 和 MySQL,太费时间,没有收获,而且重要的是逃避了问题,没有解决。
这回找到了解决方法,可以用此方法编译其他 PECL 的 PHP Extension,使 xampp 的 PHP 有更多功能!
闲言少叙,直奔主题:给 xampp 套件的 PHP 安装 memcache 扩展。
流程:
下载 http://pecl.php.net/get/memcache-2.2.5.tgz,得到最新的 PHP memcache PECL extension。
解压后,是一些源码,不能直接 configure 和 make。
config9.m4 CREDITS memcache_consistent_hash.c memcache_queue.c memcache_standard_hash.c
config.m4 example.php memcache.dsp memcache_queue.h php_memcache.h
config.w32 memcache.c memcache.php memcache_session.c README
需要先用 phpize 配置一下,不过,我这次并不是平常的 phpize,因为我在 VMware 的 CentOS 上用的是 xampp 的集成环境,用这个环境下的 phpize 会提示缺少文件。
[leakon memcache-2.2.5]$ /opt/lampp/bin/phpize
grep: /opt/lampp/include/php/main/php.h: No such file or directory
grep: /opt/lampp/include/php/Zend/zend_modules.h: No such file or directory
grep: /opt/lampp/include/php/Zend/zend_extensions.h: No such file or directory
Configuring for:
PHP Api Version:
Zend Module Api No:
Zend Extension Api No:
提示缺少 3 个文件,这些文件在 xampp 中都没有,因为 xampp 提供的是运行环境,不是开发环境。
这样的目录结构(include/php/*)只有在安装好的 php 目录中才有,其实如果从源码直接复制更容易,不过那不是好方法。
下一个新版 PHP 源码,本地编译安装。
下载 http://cn2.php.net/get/php-5.2.11.tar.gz/from/cn.php.net/mirror。
configure 的时候不必跟上很多参数,我们只是要一个目录结构,而且是目录里面的源码,扩展和模块什么的都无所谓,只要能编译即可。
编译完成后,找到安装路径 /home/leakon/local/php5,可以看到 include 目录及其下面的目录结构。
回到 lampp 目录,下面并没有 include 目录,那我们创建一个:
[leakon ~]$ cd /opt/lampp/
[leakon lampp]$ mkdir include && cd include
[leakon include]$ ln -s /home/leakon/local/php5/include/php php
这样,建立一个指向 php 安装目录的符号链接。
再回到 memcache-2.2.5 源码目录,重新配置:
[leakon memcache-2.2.5]$ /opt/lampp/bin/phpize
Configuring for:
PHP Api Version: 20041225
Zend Module Api No: 20060613
Zend Extension Api No: 220060519
然后可以 configure 了:
[leakon memcache-2.2.5]$ ./configure –prefix=/home/leakon/local/pecl-memcache –with-php-config=/opt/lampp/bin/php-config
完成后 make 就可以啦,再完成后,编译的 so 文件生成到了 memcache-2.2.5/modules 目录下,有 2 个:
memcache.la memcache.so
memcache.so 是我们要用的。
然后,修改 php.ini,添加 extension=leakon-modules/memcache.so
这个过程,还有点小波折。
本来我把 memcache.so 放到了 /home/leakon/modules/ 下,然后设置 extension=”/home/leakon/modules/memcache.so”
结果用 php -m 找不到 memcache 模块。
我的 php 报错输出到单独的文件中,tail 那个文件,看到:
PHP Startup: Unable to load dynamic library ‘/opt/lampp/lib/php/extensions/no-debug-non-zts-20060613//home/leakon/modules/memcache.so’
原来是扩展的加载路径是相对的,不管你怎么设置,都在 /opt/lampp/lib/php/extensions/no-debug-non-zts-20060613/ 之下。
知道原因就好解决了,要么 cp memcache.so 到 no-debug-non-zts-20060613 目录下,要么做个 symbol link 链接到 /home/leakon/modules/,然后在 php.ini 修改正确的路径即可。
我记得很早写过一个编译 xdebug 的文章,刚才又看了一下,跟这回是一样的情况,也是在 xampp 的集成套件下编译 php extension。只是那次失败了,这次成功了。原文在这里:http://www.leakon.com/archives/44 。
搞了几个小时,总算时间没白费~~