使用swoole官网提供的pecl方式安装swoole,中间遇到过缺少依赖类库,根据提示安即可。 安装完成之后把在php.ini文件中添加extension=swoole,然后执php -m看看是否成功加载swoole扩展。 结果报错了。。
1 2 |
$ php -m PHP Warning: PHP Startup: Unable to load dynamic library 'swoole.so' (tried: /usr/lib64/php/modules/swoole.so (/usr/lib64/php/modules/swoole.so: undefined symbol: curl_CURLFile_class), /usr/lib64/php/modules/swoole.so.so (/usr/lib64/php/modules/swoole.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0 |
看起来这个错误的意思是没找到curl库。 ??? 但是明明已经安装了curl啊。然后在php.ini文件中找是否开启了curl,结果发现没有extension=curl。 甚至php -m中列出来的所有扩展,在php.ini文件中都没有列出extension。 这是什么情况?。
然后仔细看了下php.ini文件,发现在模块设置的上面有这么一句话:
“Note: packaged extension modules are now loaded via the .ini files found in the directory /etc/php.d; these are loaded by default.”
这个意思很明显了,php会加载/etc/php.d里面的.ini配置文件, 那些没写在php.ini文件的扩展可能都写在了/etc/php.d/里面, 然后进到这个目录里面一看, 果然,这里面有很多.ini文件。并且这些文件的前面都带着一个数字, 比如20-gd.ini、20-curl.ini。 按照数字的大小顺序,肯定是小的文件先被加载,所以我直接在php.ini文件中添加extension=swoole,那么必然会先加载swoole模块,然后在加载php.d文件中的文件, 这样的话 如果swoole依赖curl,而且因为都是动态库加载, 那么curl必须要先比swoole加载才行。否则就会在swoole的类库中报错提示curl不存在。 至此,我只要在/etc/php.d文件夹中创建一个50-swoole.ini ,然后在这个文件中写入extension=swoole, 当然,需要把php.ini文件中已经写入的extension=swoole删除。
最后在执行 php-m就不会报错了。
总结:使用依赖的时候要注意加在顺序, 如果还有类似的错误,可以尝试调整扩展的加载顺序。