我试图用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;";
给我一个空白页。
如果我尝试打开我的网页,我的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扩大最大包和等待时间,但没有任何帮助。 在这种情况下我该怎么办?谢谢
编辑:发现很多失败,我改变了什么来找到我的问题
答案 0 :(得分:0)
您的应用程序是否在Linux上运行?如果您的应用程序更频繁地创建和关闭连接,则可能会发生TCP连接需要几个步骤才能关闭连接,如果应用程序在关闭连接之前死亡,运行MySql的服务器会等待一段时间进行必要的TCP握手。
您可以尝试增加MySql max_connections绞车,增加更多连接空间。如果问题仍然存在,请尝试在/etc/sysctl.conf中调整以下内核参数
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_recycle = 1
同时请检查应用程序是否正确处理连接。