我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

苏南大叔已经陆陆续续讲过很多篇关于php扩展的事情了,几乎在每篇扩展中,都会提及phpize这个命令。整体上来说,看起来似乎phpize这个命令也没有什么作用,仅仅是用于显示PHPAPI的版本号,实际上,还承担着一部分写配置文件的作用。每个扩展编译的过程中,都会使用到它。

苏南大叔:mac系统,phpize命令详解,phpize命令是怎么回事? - phpize
mac系统,phpize命令详解,phpize命令是怎么回事?(图12-1)

前言

extension源码目录,执行phpize命令的时候,从终端的回显上可以看到phpapi的版本,如果这个显示的版本,和phpinfo()里面显示的版本不一致的话,或者phpize处理api是个空值的话,我们就可以意识到:最终编译得到so文件,可能是不能使用的。

苏南大叔:mac系统,phpize命令详解,phpize命令是怎么回事? - phpize
mac系统,phpize命令详解,phpize命令是怎么回事?(图12-2)

苏南大叔:mac系统,phpize命令详解,phpize命令是怎么回事? - 002
mac系统,phpize命令详解,phpize命令是怎么回事?(图12-3)

查看本机的PHPAPI版本

可以通过phpinfo查看,也可以通过命令行查看。相关截图如下:

苏南大叔:mac系统,phpize命令详解,phpize命令是怎么回事? - phpize_info
mac系统,phpize命令详解,phpize命令是怎么回事?(图12-4)

php -i|grep -E "PHP API"

苏南大叔:mac系统,phpize命令详解,phpize命令是怎么回事? - ini_version
mac系统,phpize命令详解,phpize命令是怎么回事?(图12-5)

确定本机的php相关h文件的位置

如果你执行phpize到时候,显示PHPAPI为空的话,那么就可以说,你本机相关的库文件缺失。那么江湖流传的方法是:到xcode里面去寻找对应的include/php文件,并将其软链接到系统目录下。但是,这真的是解决方案嘛?事实证明,可能是,也可能不是。

因为你系统使用的php版本,和这个xcode里面的php库文件版本很可能是不一致的。编译得到的so文件是不能使用的。可能会有下面的类似提示信息。

苏南大叔:mac系统,phpize命令详解,phpize命令是怎么回事? - error_api
mac系统,phpize命令详解,phpize命令是怎么回事?(图12-6)

在最新版本的xcode.app目录里面,目录路径如下图所示。要注意路径里面有个带快捷方式的,一个不带快捷方式的。如果以后mac的自带php7以上版本了,这个方案就可能是正确的了。而目前自带的php5.6.30(20131106)。而对应的php库文件的版本是20160303。所以,大家看到这里的文字的时候,请根据自己的实际情况来理解。

如果版本一致,那么恭喜你,可以顺利编译。如果不一致,请查看下面的解决方案。

phpize得到的api版本号为空

苏南大叔:mac系统,phpize命令详解,phpize命令是怎么回事? - error_phpize_null
mac系统,phpize命令详解,phpize命令是怎么回事?(图12-7)

那么请检查本机的如下路径,是不是存在着相关的php库文件。苏南大叔的两个mac里面,一个存在着对应的目录,另外一个不存在。所以,这个可能是和系统版本有关系。

cd /usr/include/php/

苏南大叔:mac系统,phpize命令详解,phpize命令是怎么回事? - ls
mac系统,phpize命令详解,phpize命令是怎么回事?(图12-8)

修正user/include/php/下的文件(方案一)

如果你确定xcode下的php库文件版本和你自己本机的php版本一致的话,那么可以直接做软连接即可。或者,把对应的文件复制过来。具体的方案,还是因人而异。下面给出一个可能的方案。

ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include /usr/include

注意上述语句中的MacOSX10.13.sdk字样,您的系统可能不适用。如果你查看过对应的xcode.app里面的内容的话,可能会发现,这个目录是个软连接。指向的是没有版本号的那个文件夹,那么您可以直接换成MacOSX.sdk即可,或者换成符合您系统内实际情况的那个版本号。

ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include /usr/include

苏南大叔:mac系统,phpize命令详解,phpize命令是怎么回事? - error_autoconf_3
mac系统,phpize命令详解,phpize命令是怎么回事?(图12-9)

这里的这个方案,不一定是最佳方案。仅供参考。

修正user/include/php/下的文件(方案二)

如果xcode.app下面的库文件版本号和php版本号不一致,那么您可以选择升级php,或者使用对应的库文件。对应的库文件地址,可以到 http://php.net/downloads.php 上,下载对应源码得到(如果没有你需要的版本,自己换下载链接中的版本号即可)。而在实际应用中,我们还需要用下载得到的源码和xcode.app下面的php目录,进行合并处理,才能得到最终我们所需要的库文件集合。

苏南大叔经验总结上来说,鉴于mac系统下面的『替换』和『合并』的概念,和我们的既往经验差别太大。请大家千万不要使用mac系统的文件夹拖拽来进行『合并』,它和我们在window下面,甚至操作ftp,所得到的经验是完全不一样的。具体的内容,苏南大叔以后再开文章来吐槽。这个合并操作请使用命令行cp来合并。

sudo mkdir php
cp -r php_xcode/ php/
cp -r php_download/ php/

然后,请把合并得到的目录,放到/user/include/php下面(也可以使用软连接哦)即可,extension的编译就可以继续进行了。

写在最后的分析过程

我们可以查看phpize的源码,我们就可以指定phpize只是一个壳,具体的php信息来着/user/include/php/main/php.h

苏南大叔:mac系统,phpize命令详解,phpize命令是怎么回事? - ini_version_2
mac系统,phpize命令详解,phpize命令是怎么回事?(图12-10)

苏南大叔:mac系统,phpize命令详解,phpize命令是怎么回事? - ini_version_3
mac系统,phpize命令详解,phpize命令是怎么回事?(图12-11)

下图是个临时对比图。

苏南大叔:mac系统,phpize命令详解,phpize命令是怎么回事? - error_api_3
mac系统,phpize命令详解,phpize命令是怎么回事?(图12-12)

最后总结

总结一下,苏南大叔写过好多篇php扩展编译安装的事情了,不知道大家都看出来规律了没有。要不,点击这里复习一下?

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php    phpize