由于习惯了使用xampp进行开发,没有使用mac自带的 php 和 apache,简直是为安装 mongodb 扩展带来了极大的痛苦。但在钻研之下,最终还是找到了解决方案,在此做一下记录。

本次所使用的 xampp 版本是 XAMPP 7.3.1-0
其中 PHP 的版本为 7.3
macOS 版本:macOS Mojave 10.14.2

# 查看官方文档

通过PHP官方文档 能看到在 macOS 底下安装总共有3种方式:

  • 通过 PECL 安装
  • 通过 Homebrew 安装
  • 手动安装

我没尝试过 Homebrew 安装,因为通过这种方式安装的话,他会把 mongodb 安装到 macOS 自带的 php 之中。

我尝试过通过 PECL 安装,在这种情况下需要注意的是,每个已安装的 php 都有自己的 pecl 命令。 所以在使用了 xampp 的情况下,如果想要执行 sudo pecl install monogodb 需要进入到 /Applications/XAMPP/xamppfiles/bin 目录。然后使用 sudo ./pecl install mongodb 来进行安装。

但是通过 PECL 安装的方式,不知道为什么,总是会报错!错误的图片忘记保存了TAT,所以放弃这种方式安装。

# 手动安装

根据手动安装官方文档的指示,我把官方文档中的指令摘抄了出来:

git clone https://github.com/mongodb/mongo-php-driver.git
cd mongo-php-driver
git submodule update --init
phpize
./configure
make all
sudo make install

值得注意的是,每个已安装的 php 都有自己的 phpize 命令

phpize 这个命令是用来准备php扩展的编译环境的。官档传送门

我们现在假设把 mongodb 的驱动下载到了 /Users/xxx/mongo-php-driver 里面。 所以安装的命令行过程会像是这样:

git clone https://github.com/mongodb/mongo-php-driver.git
cd mongo-php-driver
git submodule update --init
sudo /Applications/XAMPP/xamppfiles/bin/phpize

接下来进行编译:

sudo ./configure --with-php-config=/Applications/XAMPP/bin/php-config --with-mongodb-sasl=no --with-openssl-dir
sudo make clean
sudo make all
sudo make install
  • --with-php-config 用于指定使用哪一个 php 版本进行编译,要指定成xampp里面的php-config

  • --with-mongodb-sasl=no 用于指定sasl扩展,由于在我的 mac 上没有,所以指定成了no,并且,我不需使用 Kerberos 的认证方式来连接 mongodb,如果有需要的话,可以将它配置到sasl头文件所在的路径

  • --with-openssl-dir 用于指定 OpenSSL 的头文件,他会在系统底下自己找。我不加这个参数的时候,编译会报错。

这部分的内容总结来自于 mongo-php-driver/issue

记得在 php.ini 中添加 extension=mongodb.so

但是当我运行一些 php 程序时,在 php 的错误日志中,找到了这么一段错误信息:

[27-Jan-2019 12:27:17 UTC] PHP Warning:  PHP Startup: Unable to load dynamic library 'mongodb.so' (tried: /Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-20180731/mongodb.so (dlopen(/Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-20180731/mongodb.so, 9): Symbol not found: __cg_jpeg_resync_to_restart
  Referenced from: /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
  Expected in: /Applications/XAMPP/xamppfiles/lib/libjpeg.8.dylib
 in /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO), /Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-20180731/mongodb.so.so (dlopen(/Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-20180731/mongodb.so.so, 9): image not found)) in Unknown on line 0

在网上查了很多资料,这其中最关键的字眼应该是 Symbol not found: __cg_jpeg_resync_to_restart

很多人都是通过安装了 icu4c 解决了问题:

brew install icu4c
brew link icu4c --force

然而在我这里好像不起作用。后来还是在 mongo-php-driver/issue 中,找到了问题的“解决方案”。

之所以打上引号,是因为 mongo-php-driver 的开发成员觉得这是一个妥协的方案,不是最佳的方案,不知道会产生什么影响。

具体的做法是:

打开 /Applications/XAMPP/xamppfiles/bin/envvars 文件,将其中的 export 语句注释掉。(部分)文件内容如下:






 

if test "x$DYLD_LIBRARY_PATH" != "x" ; then
  DYLD_LIBRARY_PATH="/Applications/XAMPP/xamppfiles/lib:$DYLD_LIBRARY_PATH"
else
  DYLD_LIBRARY_PATH="/Applications/XAMPP/xamppfiles/lib"
fi
# export DYLD_LIBRARY_PATH

就我目前的开发使用来说,这句修改至今还未产生任何影响。

xampp!重启!

一切正常!