Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysql连接在几次连接后花费的时间太长_Php_Mysql_Centos - Fatal编程技术网

Php mysql连接在几次连接后花费的时间太长

Php mysql连接在几次连接后花费的时间太长,php,mysql,centos,Php,Mysql,Centos,我在Centos 7上安装了Mysql 5.7,这是我的.cnf: datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock key_buffer_size = 512M query_cache_type = 1 query_cache_size = 1024M tmp_table_size = 32M innodb_buffer_pool_size = 2048M ##innodb_additional_mem_pool_size = 1

我在Centos 7上安装了Mysql 5.7,这是我的.cnf:

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

key_buffer_size = 512M
query_cache_type = 1
query_cache_size = 1024M
tmp_table_size = 32M
innodb_buffer_pool_size = 2048M
##innodb_additional_mem_pool_size = 10M
innodb_log_buffer_size = 8M
max_connections = 250
sort_buffer_size = 64M

long_query_time = 5
slow_query_log = 1
skip-name-resolve
正如您所看到的,我已经跳过了名称解析,不管怎样,我创建了test.php:

<?php

for ($i = 0;$i<1000;$i++) {
    $t1 = microtime(true);
    $conn = new \mysqli("xx.xx.xx.xxx","xxxxxxx","xxxxxx","xxxx");
    $t2 = microtime(true);
    echo "connection: ". floatval($t2 - $t1). PHP_EOL;

    $t3 = microtime(true);
    $query = $conn->query("SELECT 1");
    $t4 = microtime(true);
    echo "query: ".$i.") ". floatval($t4-$t3) . PHP_EOL;
    $conn->close();
}
每次我运行这个test.php的结果都是一样的,总是在第65次循环后将连接时间增加到不可接受的次数。我真的很困惑。有人知道吗


致以最诚挚的问候。

您不应该创建这么多连接,而应该只创建一个:

$conn = new mysqli("xx.xx.xx.xxx","xxxxxxx","xxxxxx","xxxx");

for ($i = 0;$i<1000;$i++) {
    $t1 = microtime(true);

    $t2 = microtime(true);
    echo "connection: ". floatval($t2 - $t1). PHP_EOL;

    $t3 = microtime(true);
    $query = $conn->query("SELECT 1");
    $t4 = microtime(true);
    echo "query: ".$i.") ". floatval($t4-$t3) . PHP_EOL;
}

$conn->close();
$conn=newmysqli(“xx.xx.xx.xxx”、“xxxxxxx”、“xxxxxx”、“xxxxx”);
对于($i=0;$iquery(“选择1”);
$t4=微时间(真);
回显“查询:.$i.”。浮动增值税($t4-$t3)。PHP_EOL;
}
$conn->close();

我们解决了这个问题,这与mysql服务器本身无关。问题是centos7的主机名,因为主机名不是真实的,所以操作系统试图解决这些问题,并且花费了太长的时间,出现了两个孤岛:

1) 使用localhost和

hostnamectl --transient set-hostname "localhost"
2) 将您的假主机名重拨到localhost,假设mysql-server1.mydomain.com是服务器的主机名

echo 127.0.0.1 mysql-server1.mydomain.com > /etc/hosts

我知道我不需要新的连接,但我模拟了我的http API,实际上我有一个http API,如果你向它发出GET请求,它会连接到DB并插入一个新行,但我对它进行了负载测试,我发现它的连接在一些请求之后花费了太多时间来设置
$conn=null紧跟在
$conn->close()之后
强制php释放变量。我这样做了,结果是一样的,真奇怪每次尝试第65个循环后速度会变慢:)我认为这与服务器设置有关,或者mysql 5.7的新功能尝试设置
$query=null当连接关闭时名称:(,这一次不是第65次循环,可能是关于我的客户机服务器每秒打开套接字有限制还是有限制?似乎有限制,我不是专家,但可能是关于centos或mysql 5.7
echo 127.0.0.1 mysql-server1.mydomain.com > /etc/hosts