Mac环境下利用本地php5.6安装扩展出现的Operation not permitted解决

2017-04-10

利用本地的Mac的php5.6来安装php扩展,发现其实安不上。
无论怎么修改php.ini中的配置,都会提示”xxx.so文件不在/usr/xxx/xx/xx(扩展目录)中”,加了sudo,或者以管理员方式修改都不可以。
这是怎么回事呢?该如何修改呢?

事实上, 这是由Mac 10.11新增的Rootless引起的。那么什么是 Rootless 呢? 简单的来说, Rootless 机制限制了 Root 账户的权限, 使其没有了对系统的完全控制权。
收到影响的有以下几点:

  • 禁止直接对 /System, /bin, /sbin, /usr 目录的修改(/usr/local 目录除外). 只有通过苹果开发者认证的 app 才有权限对其修改。
  • 禁止注入系统进程. 某些需要注入系统进程(finder, messages 等等系统级别的进程)的程序, debugger 无法使用了。
  • 禁止加载内核扩展(kexts), 除非它们被苹果开发者正确的签名。

这些修改最明显的好处就是: 恶意 app 无法通过用户授权的方式从而获得所有系统权限了。

当然, 它带来的副作用也是巨大的, 一些合法的 app 也无法获得系统权限了. 比如: Homebrew, CocoaPods 以及所有需要在 /usr/bin 目录下有可执行权限的 app。

解决策略

利用homebrew 安装php5.6,然后修改环境变量,让homebrew下载的php5.6作为系统默认的php版本,然后再下扩展。

  • homebrew 安装php5.6
  • 修改环境变量,将homebrew安装的php5.6的路径写到前面Mac自带php的前面。export PATH=XXXXX:$PATH(ps:具体什么路径homebrew安装运行结束的时候会有提示的)
  • 以homebrew 安装的php为默认php来安装扩展。