macOS Big Sur安装PHP扩展

在网上找了很多文章,试图解决macOS安装扩展的问题,但是并不顺利。
都2021年了,macos居然还不能安装PHP扩展,天理不容啊。
(很多人用mac跑docker,然后在docker里面安装和使用php扩展无任何障碍。因为linux底层原生支持使用cgroup和namespace来支持容器化技术,所以docker本身基本没有什么开销,占用的资源基本上就是你docker跑的逻辑的占用。不想趟mac安装php扩展这个坑的人,愿意去趟docker这个坑的,可以去用docker。)

1. Mojave系统

这个系统时期,可以关闭SIP系统完整性保护,相对来说还是比较自由的;
在恢复模式下csrutil disable 之后,基本上可以为所欲为,完成/usr/include的软链。

sudo ln -s `xcrun --show-sdk-path`/usr/include /usr/include

之后就可以编译出来php扩展,避免了以下这个make错误:

/private/var/tmp/pear/temp/grpc/src/php/ext/grpc/byte_buffer.c:19:10: fatal error: 'php.h' file not found
#include 
         ^~~~~~~
1 error generated.
make: *** [src/php/ext/grpc/byte_buffer.lo] Error 1
ERROR: `make' failed

虽然/usr/lib/php/extensions/no-debug-non-zts-20180731 目录不能修改,但至少还可以改extension_dir到别处,然后再放置so文件,或者直接修改php.ini时用绝对路径引用扩展文件也是可以的。
不过SIP关闭之后,还得重启再修改回来,很麻烦。作为程序员,想了想,还是永久性关闭SIP算了,爱折腾的人喜欢自由。这一部分网上资料很多,我就不再详细介绍了。

2. Catalina系统

升级Catalina之后,默认的/usr/include软链没了,需要重新建立,然后又是一顿SIP操作。
这时macOS支持了/etc/synthetic.conf,可以直接将自己想要的目录,虚拟映射到/根下,相当于linuxsuper block下,但是这个工具解决不了/usr/include软链的建立,因为是/下的二级目录。

3.Big Sur系统

好家伙,升级Big Sur之后,关闭SIP也不好使了,完全无法建立/usr/include软链,php扩展编译之路彻底被堵死的节奏。
考虑到PHP扩展主要就是phpizephp-config工具的设置,而这两个工具本质上其实就是shell脚本,所以完全可以自定义来解决/usr/include依赖路径的问题,毕竟操作系统已经把php.h放到MacOSX.sdk下了。
而且这里还有一个变化,以前php.h是直接在MacOSX.sdk/usr/include下的,而现在放的更深了,在MacOSX.sdk/usr/include/php/main下,所以还需要用比较新版本的phpizephp-config
自从参考了这篇文章:macos高版本安装php扩展报错。我找到了灵感,于是一口气编译安装好了yac.soyaconf.go,手感不错。

案例:yac扩展安装

其他扩展安装过程类似。

1.下载代码

~$ mkdir ~/php-private
~$cd ~/php-private
~/php-private$ cp /usr/bin/php-config ~/php-private/  
~/php-private$ cp /usr/bin/phpize ~/php-private/  
~/php-private$ git clone https://github.com/laruence/yac.git

注意:
1.如果你是自己下载代码包,那么解压之后就是~/php-private/yac-master目录,多了一个分支后缀。
你可以mv yac-master yac ,这样可以和我下面的示例对齐效果。

2. 修改php-config

获取配置的工具,本质上只是一个shell脚本。
每次安装时都要使用;

~/php-private$ vim php-config

以下是改动部分的diff效果:

php-config的改动

3. 修改phpize

用来生成configure工具,本质上只是一个shell脚本。
只要修改得当,就可以改变依赖/usr/include的路径。

~/php-private$ vim phpize

以下是改动的diff效果:

phpize的改动

改完之后执行一下phpize

~/php-private$ cd yac
~/php-private/yac$ ../phpize 

4. ./configure

生成Makefile文件的,只要指定我们自己的php-config,就可以改变编译过程。
注意,这里一定要带参数,php-config不能用相对路径,只能用绝对路径;

~/php-private/yac$ ./configure --with-php-config=$HOME/php-private/php-config

6. make

和正常执行无差别。

~/php-private/yac$ make

yac为例,最后生成的扩展在~/php-private/yac/modules/yac.so

7. make install

由于我们无权限修改扩展文件所在的默认目录,所以这一步不能简单执行make install
可以通过自己修改/etc/php.ini的方式,来启用扩展yac.so
请自己修改一下$HOME,替换为真实路径。

~/php-private/yac$ sudo vim /etc/php.ini 
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
extension=$HOME/php-private/yac/modules/yac.so

8.检查是否生效

~/php-private/yac$ php -m 
[PHP Modules]
yac
yaconf

[Zend Modules]

附录

1. macOS_SDK_headers_for_macOS_10.14.pkg

升级Big Sur之后,在MacOSX.sdk下找不到Packges,也就找不到pkg这个文件,自己引入php.h的路子走不通,且系统已经将php.h搬到MacOSX.sdk/usr/include/php/main下了,所以还往MacOSX.sdk/usr/include下放php.h的做法并不可取。

2.pecl install yac

pecl工具的好处是,一键将扩展的下载、编译、安装全部搞定,比较轻松。但是在macOS下,因为要自定义中间过程,那么pecl也无法做到增加参数来修改这个过程,所以就无法使用了。不过在执行pecl的过程中,能看到其尝试到/usr/include/php/main 下找php.h,这也说明了上面第一个问题中pkg文件的做法已经过时了。
如果能修改系统的/usr/bin/phpize/usr/bin/php-config的话,那么pecl的安装就不受影响……但是macOS允许我们这么做吗?。

3.为啥不直接修改/usr/bin/php-config 和/usr/bin/phpize?

没有权限修改,加上sudo也不行,同时关闭SIP系统完整性保护也不行,我的是Big Sur(苹果做的真是绝了)。不过这都是macOS为了大家的资料安全做的设计,如果不关心这么多,就想放飞自我,可以尝试关闭SIP(csrutil disable)、关闭SSV(csrutil authenticated-root disable),这样你就可以有机会随意修改系统保护的目录了,但有黑苹果的风险。

4.配置源代码

如果对我的代码和过程感兴趣,可以参考:https://gitee.com/hikerwu/php-private.git
谢谢阅读,有问题欢迎反馈,邮箱:[email protected]

你可能感兴趣的:(macOS Big Sur安装PHP扩展)