Windows 中的 PHP Mysql 与 Mysqli

标签 php mysql mysqli

我在使用 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/

相关文章:

php - ubuntu 16.04 中 laravel 安装错误

php - 从 Magento 产品 View 中的可配置产品中获取所有简单产品

php - 使用 jquery autosuggest 从多个表中选择

php - 将 mysql 转换为 mysqli 检查查询

php - PDO 通过 MSSQL_* 函数连接到 MSSQL

php - SQL 模式 only_full_group_by 在 Lumen 5.7 中导致错误

mysql - 按字段中最常见的单词对 MySQL 查询进行排序

mysql - 登录过程(可能在 MySQL/PHP 中)

Python MySQLdb 游标.lastrowid

php - 如何优化这个复杂的 MySql 查询