在网上找了很多文章,试图解决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
,可以直接将自己想要的目录,虚拟映射到/
根下,相当于linux
的super block
下,但是这个工具解决不了/usr/include
软链的建立,因为是/
下的二级目录。
3.Big Sur系统
好家伙,升级Big Sur
之后,关闭SIP
也不好使了,完全无法建立/usr/include
软链,php扩展编译之路彻底被堵死的节奏。
考虑到PHP扩展主要就是phpize
和php-config
工具的设置,而这两个工具本质上其实就是shell脚本,所以完全可以自定义来解决/usr/include
依赖路径的问题,毕竟操作系统已经把php.h
放到MacOSX.sdk
下了。
而且这里还有一个变化,以前php.h
是直接在MacOSX.sdk/usr/include
下的,而现在放的更深了,在MacOSX.sdk/usr/include/php/main
下,所以还需要用比较新版本的phpize
和php-config
。
自从参考了这篇文章:macos高版本安装php扩展报错。我找到了灵感,于是一口气编译安装好了yac.so
和yaconf.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
效果:
3. 修改phpize
用来生成configure
工具,本质上只是一个shell脚本。
只要修改得当,就可以改变依赖/usr/include
的路径。
~/php-private$ vim phpize
以下是改动的diff效果:
改完之后执行一下
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]
。