• [转]swoole安装报错详解 mysqlnd_find_charset_nr in Unknow


    今天通过pecl安装 swoole

    pecl install swoole
    步骤很简单,但是最后安装成功后发现phpinfo()中未显示swoole扩展,执行:

    php -m | grep 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

    3、重新启动 php-fpm 

    问题解决,安装swoole过程中,如果有其它报错,也可以参考Github上关于swoole的issue,附上链接:

    Swoole安装问题,及websocket示例问题总结
    ---------------------
    作者:GallopYD
    来源:CSDN
    原文:https://blog.csdn.net/qq292913477/article/details/81985824
    版权声明:本文为博主原创文章,转载请附上博文链接!

    QQ:309488423 Email:leiliu_lucfer@163.com
  • 相关阅读:
    Element-Ui表单移除校验clearValidate和resetFields
    Vue组件之间传值(父子)
    最简单新手vuex案例(三、actions对象)
    最简单新手vuex案例(二、mutations对象)
    最简单新手vuex案例(一)
    vue如何把路由拆分多个文件
    Vue项目如何使用公共js方法呢?
    uva10815 by sixleaves
    uva12096 The SetStack Computer By sixleaves
    uva540 Team Queue by sixleaves
  • 原文地址:https://www.cnblogs.com/leiliu-lucifer/p/10157217.html
Copyright © 2020-2023  润新知