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

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

前言

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

mac系统,phpize的那些事儿 - phpize

mac系统,phpize的那些事儿 - 002

查看本机的PHPAPI版本

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

mac系统,phpize的那些事儿 - phpize_info

php -i|grep -E "PHP API"

mac系统,phpize的那些事儿 - ini_version

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

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

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

mac系统,phpize的那些事儿 - error_api

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

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

phpize得到的php api版本号为空

mac系统,phpize的那些事儿 - error_phpize_null

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

cd /usr/include/php/

mac系统,phpize的那些事儿 - ls

修正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的那些事儿 - error_autoconf_3

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

修正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的那些事儿 - ini_version_2

mac系统,phpize的那些事儿 - ini_version_3

下图是个临时对比图。

mac系统,phpize的那些事儿 - error_api_3

最后总结

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

本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享。
转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议。
程序如此灵动~》下所有原创文章,如被用于商业用途,请您按规定支付稿费。