CC PHP - > Mysql中止与db的连接:错误消息

时间:2016-10-14 10:17:38

标签: php mysql pdo

我试图用PHP中的PDO连接mysql数据库。全部采用自建臂系统。

如果我在php中查询我的sql:

$sql="SELECT  volume FROM measurements ORDER BY ID DESC LIMIT 1;";

工作正常,但如果我添加一个额外的项目,如:

$sql="SELECT  volume , temp , humidity  FROM measurements ORDER BY ID DESC LIMIT 1;";

给我一​​个空白页。

  • PHP日志显示没有错误
  • 在php中激活其他错误消息 - >相同
  • webserver lighttpd,不会带来任何错误消息

如果我尝试打开我的网页,我的Mysql服务器会带来此错误消息: 2015-03-31T22:09:09.886345Z 26 [注意]中止连接XXX到db:'数据库'用户:'用户'主持人:' localhost' (读取通信包时出错)

如果我寻找netstat -a | grep mysql 他们向我展示了许多来自mysql的开放连接,如:

  

tcp 0 0 localhost:49050 localhost:mysql TIME_WAIT

这是我的最小PHP代码:

<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL | E_STRICT);

try {
    $conn = new PDO("mysql:host=127.0.0.1;dbname=fair_database", "root", "12345");
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql="SELECT  volume , temp , humidity, co2, pressure  FROM measurements ORDER BY ID DESC LIMIT 1;";

    foreach ($conn->query($sql) as $row) {
        $first_volume = number_format ( $row['volume'],1);
        $first_temp = number_format ( $row['temp'],1);
        $first_humidity = number_format ( $row['humidity'],1);
        $first_co2 = number_format ( $row['co2'],1);
        $first_pressure = number_format ( $row['pressure'],0);
    }
      $conn=null;
    }
catch(PDOException $e)
    {
        echo "Connection failed: " . $e->getMessage();
    }  
?>

并且为了进一步调试我添加了这个:

<?php

// ----------------------------------------------------------------------------------------------------
// - Display Errors
// ----------------------------------------------------------------------------------------------------
ini_set('display_errors', 'On');
ini_set('html_errors', 0);

// ----------------------------------------------------------------------------------------------------
// - Error Reporting
// ----------------------------------------------------------------------------------------------------
error_reporting(-1);

// ----------------------------------------------------------------------------------------------------
// - Shutdown Handler
// ----------------------------------------------------------------------------------------------------
function ShutdownHandler()
{
    if(@is_array($error = @error_get_last()))
    {
        return(@call_user_func_array('ErrorHandler', $error));
    };

    return(TRUE);
};

register_shutdown_function('ShutdownHandler');

// ----------------------------------------------------------------------------------------------------
// - Error Handler
// ----------------------------------------------------------------------------------------------------
function ErrorHandler($type, $message, $file, $line)
{
    $_ERRORS = Array(
        0x0001 => 'E_ERROR',
        0x0002 => 'E_WARNING',
        0x0004 => 'E_PARSE',
        0x0008 => 'E_NOTICE',
        0x0010 => 'E_CORE_ERROR',
        0x0020 => 'E_CORE_WARNING',
        0x0040 => 'E_COMPILE_ERROR',
        0x0080 => 'E_COMPILE_WARNING',
        0x0100 => 'E_USER_ERROR',
        0x0200 => 'E_USER_WARNING',
        0x0400 => 'E_USER_NOTICE',
        0x0800 => 'E_STRICT',
        0x1000 => 'E_RECOVERABLE_ERROR',
        0x2000 => 'E_DEPRECATED',
        0x4000 => 'E_USER_DEPRECATED'
    );

    if(!@is_string($name = @array_search($type, @array_flip($_ERRORS))))
    {
        $name = 'E_UNKNOWN';
    };

    return(print(@sprintf("%s Error in file \xBB%s\xAB at line %d: %s\n", $name, @basename($file), $line, $message)));
};

$old_error_handler = set_error_handler("ErrorHandler");

// other php code
?>

结果是一样的,只有空白页面而且没有php错误。其他错误将在php错误日志文件中记录正常。 : - (

我试图从mysql扩大最大包和等待时间,但没有任何帮助。 在这种情况下我该怎么办?谢谢

编辑:发现很多失败,我改变了什么来找到我的问题

1 个答案:

答案 0 :(得分:0)

您的应用程序是否在Linux上运行?如果您的应用程序更频繁地创建和关闭连接,则可能会发生TCP连接需要几个步骤才能关闭连接,如果应用程序在关闭连接之前死亡,运行MySql的服务器会等待一段时间进行必要的TCP握手。

您可以尝试增加MySql max_connections绞车,增加更多连接空间。如果问题仍然存在,请尝试在/etc/sysctl.conf中调整以下内核参数

net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_recycle = 1

同时请检查应用程序是否正确处理连接。