0

我想用 PHP 检查 Mysql 连接限制。我在循环中也插入了 mysql_connect mysql_pconnect 但它不会增加 Mysql 上的连接数....我也知道 php 不支持多线程

那么我该怎么做呢,我正在优化 mysql.ini 文件以实现最大连接,并希望通过压力测试来确保

4

3 回答 3

3

mysql_connect 的第四个参数是 $new_link。

默认情况下,如果在同一个请求中给出相同的参数,mysql_connect 不会创建新链接,这就是发生在你身上的事情。通过将 $new_link 设置为 true 来覆盖此行为。

http://php.net/manual/en/function.mysql-connect.php

不要使用 mysql_ 函数:Mysql 扩展已被弃用,将来将被删除。使用 Mysqli 或 PDO。

编辑:添加 mysql_ 警告

于 2013-05-08T15:16:41.250 回答
2

这是一个简单的 PHP 压力测试工具,它创建一个测试表,将 1000 个条目加载到其中,选择它们然后逐个删除它们。与 ab(apache 基准测试)一起运行,您可以模拟数据库上的密集负载并比较几台服务器的性能。将其保存为stress.php,更新连接信息,然后从浏览器运行它:

<pre>
<?php
$sStart = microtime(true);

function random_str(){

$result="";
for ($i = 1; $i <= 16; $i++) {
$base10Rand = mt_rand(0, 15);
$newRand = base_convert($base10Rand, 10, 36);
$result.=$newRand;
}
return $result;

}

if ($_REQUEST['db']=='mon2') {
    mysql_connect ("server_test1", "db_user", "db_pass" || die (print 'no db');
} elseif ($_REQUEST['db']=='scooter') {
    mysql_connect ("192.168.33.3331", "umbrella", "umbrella") || die (print 'no db');
} elseif ($_REQUEST['db']=='camilla') {
    mysql_connect ("192.168.33.3332", "umbrella", "umbrella") || die (print 'no db');
} else {
    die (print 'no server');    
}
echo number_format(microtime(true) - $sStart, 2) ."s connect done\n";flush();
mysql_select_db ("test") || die (print 'no select_db');
$tbl_number=rand(1000, 9999);

$query = "CREATE TABLE IF NOT EXISTS test_tbl_$tbl_number (test1 int(100) NOT NULL, test2 int(100) NOT NULL, test3 int(100) NOT NULL, test4 int(100) NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1;";
mysql_query($query) || die (print 'no query');
echo number_format(microtime(true) - $sStart, 2) ."s CREATE done\n";flush();
$aa=array();
for ($i=1; $i <= 1000; $i++) {
$a=random_str();
$aa[]=$a;
$b=random_str();
$c=random_str();
$d=random_str();
$query="INSERT INTO test_tbl_$tbl_number SET test1='$a', test2='$b', test3='$c', 
test4='$d'";
mysql_query($query) || die (print 'no insert');
}
echo number_format(microtime(true) - $sStart, 2) ."s INSERT (1.000) 
done\n";flush();

$query="SELECT SQL_NO_CACHE * FROM test_tbl_$tbl_number";
mysql_query($query) || die (print 'no select_db');
echo number_format(microtime(true) - $sStart, 2) ."s SELECT (1) done\n";flush();

foreach ($aa as $value) {
$query="DELETE FROM test_tbl_$tbl_number WHERE test1='$value'";
mysql_query($query) || die (print 'no delete');
}
echo number_format(microtime(true) - $sStart, 2) ."s DELETE (1.000) 
done\n";flush();

$query="DROP TABLE test_tbl_$tbl_number";
mysql_query($query) || die (print 'no drop');
echo number_format(microtime(true) - $sStart, 2) ."s DROP (1.000) done\n";flush();

?>
于 2013-09-25T11:11:43.147 回答
1

仅仅通过创建n与 MySQL 的连接并不意味着您将获得任何有意义的结果。如果您max_connections在 MySQL 中有 1000 个连接作为变量,并且您确实建立了 1000 个连接,则第 1001 个连接将被拒绝。

此外,可以有 999 个连接不消耗 MySQL 资源,其中 1 个可以运行超昂贵的查询。

关于 PHP 和多线程 - 遗憾的是,你知道错了。PHP 确实支持用户级多线程

于 2013-05-08T15:19:25.797 回答