Я использую PHP 5.3.10 в Windows (Windows 7 64bit), используя Apache и Mod_php.
Я нахожусь в процессе, чтобы решить, какую библиотеку я должен использовать, поэтому я тестирую 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 одновременных вызовов, при меньшем нет разницы).
Сумма модуля (мс) Мин (мс) Макс (мс)
MySQLi 66986 265 1762
MySQL 64521 234 1388
PDO 75426 249 1809
(минус лучше).
Ну, видимо, ответа нет, под windows MysqlI и PDO это большое нет (разве что для процесса разработки).Для linux эти три одинаковы, однако для популярного сервера (много одновременных пользователей) Mysql - лучший, MysqlI - близко (3% медленнее), а PDO - большое нет (+ 10% медленнее).
Однако это не настоящий тест, поэтому пробег может варьироваться.Тем не менее, результаты соответствуют распространенному мнению, Mysql> Mysqli> pdo.