2012-03-16 10 views
4

ApacheとMod_phpを使用してWindows(Windows 7 64ビット)でPHP 5.3.10を使用しています。私は使用すべきライブラリを決定する過程でPHP MysqlとWindowsのMysqli

イムので、私は、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++) { 
    [email protected]mysql_query("SELECT * from test",$dbh); 
    echo "ok"; 
    mysql_free_result($result); 
} 
のための2つのページを作成しました

どちらのテストでも、問題なく接続でき、情報を取得できます。

しかし、私が同時テスト(5人の同時ユーザー)を実行すると、MySqliは非常に遅くなります。

最悪の場合、私が同時テスト(同時ユーザー数10人)を実行すると、MySQLiがクラッシュします。

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人の同時ユーザーでも、すべてが完璧に動作します。

質問:私は何か間違っていますか?

それは

[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私のphp.iniの設定です:espectedとして、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

PDO 75426 249 1809

(マイナスが良い)。

まあ、明らかに答えはありません.MysqlIとPDOは大きな問題ではありません(開発プロセスを除いて)。 Linuxの場合、3つは同じですが、一般的なサーバー(同時ユーザーが多い)ではMysqlが最高、MysqlIは3%、PDOは10%遅いです。

しかし、実際のテストではありませんので、走行距離は異なる場合があります。しかし、結果は一般的な信念であるMysql> Mysqli> pdoと一貫しています。

+0

どのようなテーブルテストのサイズですか? –

+0

@ YourCommonSense MySQLはクエリの結果をキャッシュするので、テーブルのサイズは関係ありません(単一のユーザで機能するため)。問題はPHPやMySQLではなく、Apacheにあると私は信じています。 –

+0

3行、1つの整数、1つのvarchar(20) – magallanes

答えて

1

すべての違いをもたらすべきmysqliの単一の機能は、パラメータ化されたクエリです。 mysqlインターフェイスにはこれらがありません。つまり、クエリに値を補間することになるため、SQLインジェクションの脆弱性の可能性が大きくなります。クエリの連結を確保することは簡単ではないことが分かりますそれが聞こえるように。

ところで、あなたはPDOを考えましたか?これはmysqliと同じ機能を提供しますが、サポートされている(設定済みの)データベースに接続できるため、PostgreSQL、SQLite、SQL Serverなどに移行する場合は、SQLの方言のみの違いがありますすべてを別のAPIに移植するのではなく、心配する必要があります。 Apacheは、すべてをサポートしていない可能性

+0

私はMysqlとMysqlIをテストしていますので、PDOが遅く、MysqlがMysqlIより高速であることを読んでいます(数年前)。しかし、昨日、私はそれらの間に実際の違いはないことを指摘するベンチマークを読んだ。しかし、私はそれを再評価し、私は彼らがシーケンシャルベンチマークを行うことを発見した...またはあなたは無駄なベンチマークを行うと言うことができる。 AFAIK:Mysqlは廃止されましたが、少なくとも(私にとっては)うまく動作し、Wordpressでまだ使用されている奇妙な理由があります。明らかに奇妙な理由は正当化以上のものです。 – magallanes

+0

パラメータ化されたクエリはセキュリティ上の理由から必須です!私もpdoを好むので、pdoのパラメータ化のアプローチはmysqliのものよりも柔軟です。 – davogotland

0

は、私が

が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 &とIISの違いをクリアします。

+0

IISはWindowsサーバーを必要とするため、オプションではありません。 – magallanes

+0

@magallanes:Windows固有の機能を使用しない限り、IISを使用してWindows上でコードを記述し、Apacheホスト型サーバーにデプロイすることができます。あなたはWindows 7 64ビットを実行しているので、IISを実行することができます(私は家庭版だと思います) –

+0

IISはWindowsサーバーを必要としますが、サーバーはありませんが、最大10人の同時ユーザーハック)、ローカル(127.0.0.1)ユーザーは除きます。しかし、10人のユーザーがうまくいくとはいえ、1人の顧客で5分で最大になります。したがって、オプションではありません。一方、私はWindows(サーバーなし)でApacheを走らせて、好きなだけ多くのユーザーを自由に動かすことができます。 – magallanes