gpt4 book ai didi

Windows 中的 PHP Mysql 与 Mysqli

转载 作者:可可西里 更新时间:2023-11-01 07:41:34 24 4
gpt4 key购买 nike

我在使用 Apache 和 Mod_php 的 Windows(Windows 7 64 位)中使用 PHP 5.3.10。

我正在决定我应该使用哪个库,所以我正在测试 Mysql 和 MySQLi

我为测试创建了两个页面

$mysqli = new mysqli("127.0.0.1", "root2", "secretsquirrel", "test");
for ($i=0;$i<100;$i++) {
$result = $mysqli->query("SELECT * from test");
// var_dump($result);
echo "ok $i";
$result->close();
}

$dbh=mysql_connect("127.0.0.1","root2","secretsquirrel",true);  
mysql_select_db("test",$dbh);
for ($i=0;$i<100;$i++) {
$result=@mysql_query("SELECT * from test",$dbh);
echo "ok";
mysql_free_result($result);
}

在这两个测试中,我都可以毫无问题地连接并且可以获取信息。

但是,如果我进行并发测试(5 个并发用户),MySqli 会非常慢。

最糟糕的是,如果我进行并发测试(10 个并发用户),那么 MySQLi 会导致 Apache 崩溃。

Faulting application name: httpd.exe, version: 2.2.22.0, time stamp: 0x4f4a84ad
Faulting module name: php5ts.dll, version: 5.3.10.0, time stamp: 0x4f2ae5d1
Exception code: 0xc0000005
Fault offset: 0x0000c7d7
Faulting process id: 0x1250
Faulting application start time: 0x01cd037de1e2092d
Faulting application path: C:\apache2\bin\httpd.exe
Faulting module path: C:\php53\php5ts.dll
Report Id: 1fb70b72-6f71-11e1-a64d-005056c00008

使用 MySql,即使有 1000 个并发用户,一切也能完美运行。

问题:我做错了什么?

这是我的php.ini配置

[MySQLi]
mysqli.max_persistent = -1
;mysqli.allow_local_infile = On
mysqli.allow_persistent = On
mysqli.max_links = -1
mysqli.cache_size = 2000
mysqli.default_port = 3306
mysqli.default_socket =
mysqli.default_host =
mysqli.default_user =
mysqli.default_pw =
mysqli.reconnect = Off

ps: 看来,PDO 是最差的

代码:(可能是测试有误?)

$dbo = new PDO("mysql:host=127.0.0.1;dbname=test", "root2", "secretsquirrel" );
for ($i=0;$i<100;$i++) {
$dbo->query("SELECT * from test");
echo "ok $i";
}

结果比MySQLi差

更新:

我在 Linux (redhat) 中做了同样的事情,而 MysqlI/PDO 更稳定。

(1000个并发调用,少了没有区别)。

模块总和(ms) Min(ms) Max(ms)

MySQLi 66986 265 1762

MySQL 64521 234 1388

PDO 75426 249 1809

(减号更好)。

好吧,显然没有答案,windows下的MysqlI和PDO是一个很大的没有(除非要开发程序)。对于 linux,这三个是相同的,但是对于一个流行的服务器(很多并发用户),Mysql 是最好的,MysqlI 接近(慢 3%)而 PDO 是一个大问题(慢 +10%)。

但是,这不是真正的测试,因此里程数可能会有所不同。然而,结果与流行的看法一致,Mysql>Mysqli>pdo。

最佳答案

mysqli 中唯一一个应该使所有不同的特性是参数化查询。 mysql 接口(interface)没有这些,这意味着你将自己将值插入到查询中,这反过来意味着你有很大的 SQL 注入(inject)漏洞的潜力——事实证明,保护你的查询串联并不是那么简单听起来。

顺便说一句,你考虑过 PDO 吗?它提供与 mysqli 相同的功能,但它可以连接到任何受支持(和配置)的数据库,因此如果您决定在任何时候迁移到 PostgreSQL、SQLite 或 SQL Server,您只有 SQL 方言的差异不用担心,而不是将所有内容移植到不同的 API。

关于Windows 中的 PHP Mysql 与 Mysqli,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9738359/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com