一、安装PECL
//php版本 > 7 7以下版本忽略
$ wget http://pear.php.net/go-pear.phar
$ php go-pear.phar
//php版本 < 7
$ yum install php-pear//否则会报错PHP Parse error: syntax error, unexpected //'new' (T_NEW) in /usr/share/pear/PEAR/Frontend.php on //line 91
二、安装swool
$ sudo pecl install swoole
查看是否安装成功 php -m | grep swoole
会碰到各种错 本人碰到的扩展 一个都不能 少 一个个安装
使用yum安装gcc:yum install gcc 使用:which gcc 查看是否安装成功
使用yum安装g++:yum install gcc-c++ 使用:which g++ 查看是否安装成功
使用yum安装gdb:yum install gdb 使用:which gdb 查看是否安装成功
yum install openssl yum install openssl-devel
nghttp2 扩展
wget https://github.com/nghttp2/nghttp2/releases/download/v1.34.0/nghttp2-1.34.0.tar.gz
tar zxvf nghttp2-1.34.0.tar.gz
cd nghttp2-1.34.0
./configure
make && make install
安装 mysqlnd要和自己的PHP版本对应
yum install php70w-mysqlnd.x86_64
完了要重启 systemctl restart mysqld
三、错误三
php.ini加了扩展
php -m 查看 或phpinfo() 查看没有
检测swoole执行 php --ri swoole
发现报错如下:
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/swoole.so' - /usr/lib64/php/modules/swoole.so: undefined symbol: mysqlnd_find_charset_nr in Unknown on line 0
仔细看报错发现这条报错是由swoole.so报出来的,说明在加载swoole.so的时候报的找不到 mysqlnd_find_charset_nr ,这是一个以 mysqlnd 打头的一个关键字,而 mysqlnd 又是 PHP 的一个扩展,通过阅读 swoole/swoole.mysql.c 的源码我们发现有如下一段:
const MYSQLND_CHARSET* cset = mysqlnd_find_charset_nr(client->connector.character_set);
if (cset == NULL)
{
swoole_php_fatal_error(E_ERROR, "unknown mysql charset[%s].", client->connector.character_set);
RETURN_FALSE;
}
从上面的源码我们可以看出,原来 swoole 是需要依赖 msyqlnd 这个扩展的,我们发现 phpinfo() 里面 msyqlnd 扩展是存在的为什么还会报这个错呢。
最后发现 PHP默认加载的扩展都在 /usr/lib64/php/modules/ 这个目录里在,这里面的 .so 文件是默认加载的,关于这些扩展的配置不是在 /etc/php.ini 中,而是在 /etc/php.d/ 这个目录中,这个目录当中的所有的 .ini 文件是在 /etc/php.ini 加载完成后再加载的,而我们的 extension=swoole.so 的配置是写在 /etc/php.ini 的文件末尾,所以是先加载了 swoole.so 然后再加载 mysqlnd.so,这就导致了 swoole 找不到 mysqlnd_find_charset_nr 。
解决方法:
1、将/etc/php.d/ 目录中的mysqlnd.ini文件删除
2、在 /etc/php.ini 的 extension=swoole.so 上面一行添加 extension=mysqlnd.so
3、重新启动 php-fpm
这样可以解决问题了,同样可能还会遇到以下报错:
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/swoole.so' - /usr/lib64/php/modules/swoole.so: undefined symbol: php_sockets_le_socket in Unknown on line 0
解决的方法也是类似的:
1、将/etc/php.d/ 目录中的sockets.ini文件删除
2、在 /etc/php.ini 的 extension=swoole.so 上面一行添加 extension=sockets.so
最终顺序
extension=mysqlnd.so
extension=sockets.so
extension=swoole.so
3、重新启动 php-fpm systemctl restart php-fpm.service