前言

PHP编程中要使用到Socket通信,但本地PHP环境中的Socket扩展尚未安装。

在安装的过程中我也遇到了一些列问题,借此机会稍做记录,也方便之后查找。

开发环境:OS X 10.11NPM

正文

1 打开Socket扩展,发现报错

使用Socket之前,需要打开PHP中的Socket扩展。即:在php.ini文件,去掉这行代码前的注释:

1
extension=php_sockets.dll

修改php.ini文件后再加载配置,却发现报错:

1
[20-Jan-2017 17:46:03] NOTICE: PHP message: PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/extensions/no-debug-non-zts-20121212/php_sockets.dll' - dlopen(/usr/lib/php/extensions/no-debug-non-zts-20121212/php_sockets.dll, 9): image not found in Unknown on line 0

这说明我的本地环境还未安装Socket扩展。

2 在PHP源代码包中寻找Socket扩展

我的源代码包目录在/usr/include/php/,先进入该目录:

1
$ cd /usr/include/php/

再进入ext目录:

1
$ cd ext

查看ext目录下的文件,找到sockets文件夹,进入该文件夹:

1
$ cd sockets

然而我本地的源码包Socket扩展貌似不全,只有包含一个php_sockets.h头文件。无奈之下,只好前往php.net下载一个与我本地PHP版本相同的源码包进行安装。

3 寻找phpize

phpize工具一般在PHP安装目录下,如果找不到也可以使用find命令来寻找:

1
$ sudo find / -iname "phpize"

我的phpize所在位置为:/usr/bin/phpize

4 执行phpize工具

进入所下载的PHP源码包的/ext/sockets/目录,执行phpize工具:

1
$ /usr/bin/phpize

我本地执行phpize后报错如下:

Cannot find autoconf. Please check your autoconf installation

这是因为autoconf尚未安装,可以借助Homebrew安装autoconf

1
$ brew install autoconf

如果还为安装Homebrew可以借助如下命令安装:

1
$ ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"

执行phpize工具成功后,在目录下会生成对应的configure文件。

5 通过configure进行配置

成功生成configure文件后,可通过configure进行配置。执行如下命令:

1
$ ./configure --prefix=/usr/local/php --with-php-config=/usr/bin/php-config --enable-sockets

--with-php-config所跟随的参数是本地php-config所在位置。

再执行:

1
$ make && make install

我执行该命令并未成功,发生报错:

cp: /usr/lib/php/extensions/no-debug-non-zts-20121212/#INST@3994#:Operation not permitted

这是因为MacOS X 10.11版本使用Rootless机制,降低了root用户的权限,致使系统文件夹不可操作。可以参照《苹果OSX 10.11关闭rootless内核保护教程 Mac关闭rootless教程》将Rootless暂时关闭。

然而缺少的扩展千千万,每次都需要选择关闭Rootless,太过于麻烦。于是我选择抛弃OS X自带的PHP,使用Homebrew安装自己所需的PHP版本。

6 使用Homebrew安装PHP

OS X下安装Homebrew的方法已在《Mac下Nginx的安装和配置》中提到,不再重复赘述。

关于Homebrew安装PHP在《全新安装Mac OSX 开发者环境 同时使用homebrew搭建 PHP,Nginx ,MySQL,Redis,Memcache … … (LNMP开发环境)》这篇文章页描述得十分清楚了,我在此记录一下我在安装的过程中踩的一些坑。

6.1 环境变量的变更

由于OS X中自带了PHP,所以我们用Homebrew安装了其它PHP版本后需要修改系统的环境变量,指定PHP的解析路径,由此来替代系统中自带的PHP

因为对OS X系统还较为生疏,在查找资料的过程中有教程指引需要在~/.bashrc文件中添加一行:export PATH="$(brew --prefix php56)/bin:$PATH"

根据该教程修改PATH后,source了一下~/.bashrc,再重新打开php-fpm,然而解析出的PHP依然是系统自带的版本。

发生这一错误是有两个原因:

  1. export PATH="$(brew --prefix php56)/bin:$PATH"仅指定了PHP的解析路径,由于我们大开的是php-fpm,需再添加一句export PATH="$(brew --prefix php55)/sbin:$PATH"来指定对应的php-fpm的解析路径;
  2. 因为我的系统中已经存在~/.bash_profile文件,所以将不再读取~/.bashrc文件,因此所有在~/.bashrc添加的配置信息都是无效的;

Mac OS X 环境变量文件加载顺序

Mac系统的环境变量,加载顺序为:

/etc/profile > /etc/paths > ~/.bash_profile > ~/.bash_login > ~/.profile > ~/.bashrc

~/.bash_profile文件存在,则不再读取后面几个文件。

6.2 是否需要动态修改扩展配置?

在修改php.ini中的扩展配置前,先使用php -m命令Show compiled in modules。若列表中包含了所要添加的扩展名称,就无需在php.ini中打开扩展了。

参考资料

  1. 《PHP安装扩展make install报错》
  2. 《mac下phpize报错Cannot find autoconf. Please check your autoconf installation解决方法》
  3. 《 CentOS 配置PHP支持socket扩展》
  4. 苹果OSX 10.11关闭rootless内核保护教程 Mac关闭rootless教程