2016-06-28 2 views
1

私はmysqli_store_resultで読んでいますが、これはオプトインでオプトアウトではない理由を理解できません。マニュアルによれば、私はこれをメモリの重い操作に使うべきではないが、一度に50〜100行程度のテキストを取り出すだけで、いつも使うべきだという結論に至る。 1つのクエリごとに呼び出すこれは私にとっては不思議なようだ。私は何か誤解していることを私に示すので、これを言う。デフォルトでmysqli_store_resultを使用してください

私が理解する限り、 100行を読み込んでwhile ($stmt->fetch())を使用すると、実際にはネットワーク経由で100のread-next-requestをMySQLに送信しています(WebとDBは別のマシンにあると仮定します)。 mysqli_store_resultを使用する場合は、リクエストを1回だけ送信し、結果セットをWebサーバー上でループします。なぜ私はいつもこれをやっていないだろうか?私は何が欠けていますか?

サブクエリ:これは私のMySQLステータス変数 "handler read next"が非常に高く、store_resultヘルプと関係がありますか?

+0

imo、私はあなたの質問の「ネットワーク越し」の部分についてはわかりません。 PHPスクリプトは、データベースが正常に稼動しているサーバー上で実行されます。私は、PHPとデータベースエンジンの間のネットワークオーバーヘッドが重要ではないと考えています。つまり、100フェッチを低速関数呼び出しと考える傾向があります。また、データはデータベースエンジンによってバッファされています。したがって、どちらの側もデータを取得するために多くの作業を行う必要はありません。 –

+1

PHPスクリプトはWebサーバー上で実行され、データベースサーバー上では実行されません。アプリケーションが注目すべきサイズにスケールされていない場合、これらは通常は同じホストにすぎません。私はいくつかの簡単なテストを行い、結果を保存するかどうかの違いを測定することはできません。今私はそれが何の役目を果たすのか分かりません。 – nickdnk

+0

大きなデータベースについてのポイント –

答えて

-1

実際には、「100個のリクエスト」が発行されている場合もあれば、そうでない場合もあります。 PHPは、MySQLインターフェース層と対話しています。これはデータベースと通信しています。 (しかし、が「WireShark」などの均等なTCP/IPスニッフィングツールを使ってトラフィックを監視することができます...)

しかし、いくつかの "率直に、非常に奇妙な"特性に遭遇しました。配列全体に結果セットをフェッチし、ステートメントハンドルを閉じます。私のロジックは、その配列から行を削除します。 「充填が少なく、味が良い」

私は... ... mysqli_store_resultと私は完全に把握したことがありませんでした... でした。したがって、私はそれを放棄し、の仕事をした(つまり、 "PHP配列に格納...")、それと同じように満足できる方法を見つけ出しました。

+0

"結果セット全体を配列にフェッチする"(おそらくコードで?)あなたは何を意味するのかよく分かりません – nickdnk

+0

私のコード*(クラス...)*巻き上げmysqli_fetch_array()を使うには 'mysqli_fetch_array()' ... –

+0

を使い、store_resultをget_resultの形で使うか、プリペアドステートメントの代わりにmysqli_queryを使う必要があります。あなたの混乱はむしろ無関係または自己相反するものになります。 –

1

これはオプトインであり、オプトアウトではない理由です。が、それはそうである理由

まあを、私は答えることを試みることができる(あるいは、少なくとも、推測します)。

ほとんどのPHPと同様に、MysqliはCの関数を覆う薄いラッパーです。薄いので、それだけでは何も追加しません。また、基盤となるC APIは基本的な機能のみを提供し、すべての改善点を実装に残します。また、クライアント側で結果セットを取得するのを元に戻すことができないので、これはデフォルトではオプトインであると考えられます。

しかし、mysqli_query()の場合、バッファモードはデフォルトでオンになっていますが、準備/実行するのは面白いです。

私は明示的に1つのクエリごとに呼び出す必要があります。

是非!それはだけですあなたはすべての単一のクエリを呼び出す必要がありますか?何についてを呼び出す bind_param、bind_result、execute()?ご覧のとおり、mysqliは最も基本的なAPI関数を呼び出すことです。したがって、ある意味ではstore_result()と呼ぶのは論理的です。

私は、mysqliの上にラッパーを書くことになっているという唯一の結論が出ていると思います。あるいは、ほとんどすべての必要な機能を持つラッパーであるPDOを使うことができます実装されました。

+0

はい、もちろん、クエリごとに複数のものを呼び出す必要がありますが、他のすべての関数はタイミング(実行/フェッチ)または特定のクエリ(バインド/準備)に関連しています。私は、バッファリングされた読み込みをグローバルに(接続ごとに)可能にすることが合理的であることがわかります。 – nickdnk

+0

あなたはPDOを試してください:) –

関連する問題