首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在mysqlnd调用期间PHP 5.6段错误?

为什么在mysqlnd调用期间PHP 5.6段错误?
EN

Stack Overflow用户
提问于 2015-09-13 11:28:45
回答 1查看 871关注 0票数 1

我有nginx 1.6,mysql 5.5,php 5.6.11服务器配置。有时,PHP分段错误,总是当它空闲了几分钟(没有请求)。如果存在请求,则不会发生此分段错误。

我已经通过gdb实用程序运行了核心转储,结果如下:

代码语言:javascript
复制
root@server3:/# gdb /usr/local/php-5.6.11-fpm/sbin/php-fpm /tmp/coredump-php-fpm.5867
....
Reading symbols from /usr/local/php-5.6.11-fpm/sbin/php-fpm...done.
[New LWP 5867]

warning: Can't read pathname for load map: Input/output error.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7fff1effe000
Core was generated by `php-fpm: p'.
Program terminated with signal 11, Segmentation fault.
#0  0x00000000035417f0 in ?? ()
(gdb) bt
#0  0x00000000035417f0 in ?? ()
#1  0x00000000009a9548 in php_mysqlnd_net_send_ex_pub (net=0x350e010, buffer=0x7fff1ef47e10 "\001", count=1, conn_stats=0x353ee30, error_info=0x35323b8)
    at /usr/src/php-5.6.11/ext/mysqlnd/mysqlnd_net.c:442
#2  0x0000000000996420 in php_mysqlnd_cmd_write (_packet=0x34ca830, conn=0x3532280) at /usr/src/php-5.6.11/ext/mysqlnd/mysqlnd_wireprotocol.c:999
#3  0x00000000009702f5 in php_mysqlnd_conn_data_simple_command_send_request_pub (conn=0x3532280, command=COM_PING, arg=0x0, arg_len=0, silent=1 '\001', 
    ignore_upsert_status=1 '\001') at /usr/src/php-5.6.11/ext/mysqlnd/mysqlnd.c:356
#4  0x00000000009706c6 in php_mysqlnd_conn_data_simple_command_pub (conn=0x3532280, command=COM_PING, arg=0x0, arg_len=0, ok_packet=PROT_OK_PACKET, silent=1 '\001', 
    ignore_upsert_status=1 '\001') at /usr/src/php-5.6.11/ext/mysqlnd/mysqlnd.c:381
#5  0x000000000097bb98 in php_mysqlnd_conn_data_ping_pub (conn=0x3532280) at /usr/src/php-5.6.11/ext/mysqlnd/mysqlnd.c:1728
#6  0x000000000077c378 in pdo_mysql_check_liveness (dbh=0x3532830) at /usr/src/php-5.6.11/ext/pdo_mysql/mysql_driver.c:493
#7  0x000000000076aa10 in zim_PDO_dbh_constructor (ht=4, return_value=0x34ccdd8, return_value_ptr=0x7f3796811b80, this_ptr=0x34f8708, return_value_used=0)
    at /usr/src/php-5.6.11/ext/pdo/pdo_dbh.c:307
#8  0x0000000000acb14b in zend_do_fcall_common_helper_SPEC (execute_data=0x7f3796811eb8) at /usr/src/php-5.6.11/Zend/zend_vm_execute.h:558
#9  0x0000000000acb91b in ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER (execute_data=0x7f3796811eb8) at /usr/src/php-5.6.11/Zend/zend_vm_execute.h:693
#10 0x0000000000aca7b8 in execute_ex (execute_data=0x7f3796811eb8) at /usr/src/php-5.6.11/Zend/zend_vm_execute.h:363
#11 0x0000000000aca840 in zend_execute (op_array=0x7f3796841d80) at /usr/src/php-5.6.11/Zend/zend_vm_execute.h:388
#12 0x0000000000a862e6 in zend_execute_scripts (type=8, retval=0x0, file_count=3) at /usr/src/php-5.6.11/Zend/zend.c:1341
#13 0x00000000009ead57 in php_execute_script (primary_file=0x7fff1ef4a8d0) at /usr/src/php-5.6.11/main/main.c:2597
#14 0x0000000000b471c9 in main (argc=1, argv=0x7fff1ef4cc38) at /usr/src/php-5.6.11/sapi/fpm/fpm/fpm_main.c:1964

在通过PDO调用mysqlnd函数时,我看到了一些问题。但真的没别的了。该代码在较早的PHP版本(< 5.6 )上运行良好--我不认为这是我的代码的问题,而是PHP的一些问题?

PHP的编译方式如下:

代码语言:javascript
复制
./configure --prefix=/usr/local/php-5.6.11-fpm --enable-ftp --with-gd --enable-mbstring --enable-sockets --enable-zip --with-jpeg-dir=/usr/local/jpeg-9 --with-zlib --enable-embedded-mysqli --with-pdo-mysql --with-png-dir=/usr/local/libpng --with-openssl=/usr/local/openssl --with-freetype-dir=/usr/local/freetype --with-mcrypt=/usr/local/libmcrypt --with-mhash --enable-soap --enable-bcmath --with-mysqli=mysqlnd --with-mysql --enable-fpm --enable-debug

我会感谢任何提示或帮助,谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-13 17:36:00

好的,终于(经过几个小时的侦探工作)我找到了我自己的问题的答案。我会张贴它,因为它可能会帮助有同样问题的人。

其实我的案子有两个问题。造成这种行为的主要问题是在持续连接60秒后MySQL断开连接。我在生产服务器上设置了此设置,因为每秒有许多请求,所以60秒是合理的设置(相比之下,在my.cnf中设置为默认的8小时- wait_timeout = 28800)。

不过,我已经将其复制到开发服务器,在开发服务器中偶尔会发出请求。所以60秒的限制被击中了。我当时编译的PHP导致了SEGFAULT。

在我的搜索过程中,我还在PHP中找到了这个处理可能的MySQL库的手册页。因此,我使用了推荐的编译指令:

代码语言:javascript
复制
--with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-mysql=mysqlnd

然后被删除的Mysql连接停止SEGFAULT问题,这只会导致PDO引发的正确异常。

希望这对将来的人有帮助。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32549175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档