Windows中的PHP Mysql vs Mysqli

时间:2012-03-16 13:43:03

标签: 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)最小(ms)最大(ms)

MySQLi 66986 265 1762

MySQL 64521 234 1388

PDO 75426 249 1809

(减去更好)。

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

然而,这不是一个真正的测试,所以里程可以变化。但是,结果与流行的相信,Mysql&gt; Mysqli&gt; pdo。

一致

2 个答案:

答案 0 :(得分:1)

mysqli中的唯一功能应该是参数化查询。 mysql接口没有这些,这意味着你将自己将值插入到查询中,这反过来意味着你有很大的SQL注入漏洞的可能性 - 事实证明,保护你的查询连接并不是一件容易的事。听起来很好。

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

答案 1 :(得分:0)

Apache可能不支持所有内容,我遇到了许多与密码加密有关的问题&amp;关于Apache的解密,但找到了在IIS上托管它的解决方案......

尝试在IIS中运行您的应用程序... http://learn.iis.net/page.aspx/246/using-fastcgi-to-host-php-applications-on-iis/将帮助您在IIS 7上使用HOST PHP ... http://www.websitehosting.com/apache-vs-iis-web-server/将清除Apache与...之间的区别关于PHP的IIS ......