昨日、同僚が PHP ディスカッション グループで、自分が取り組んでいるプロジェクトが MySQL クエリからあまりにも多くの結果 (最大 100,000) を返したため、PHP メモリが不足したと述べました。そのため、次のコード トラバーサルを実行した後、彼はこう尋ねました。 MySQL の結果が返される前に、データはすでにメモリ内にありますか? -
コードをコピーします コードは次のとおりです。
while ($ row = mysql_fetch_assoc($result)) {
// ...
}
コードをコピー コードは次のとおりです:
mysql_query()
mysql_unbuffered_query()
コードをコピー コードは次のとおりです:
/* {{{ proto resource mysql_query(string query [, int link_identifier])
SQL クエリを MySQL に送信します */
PHP_FUNCTION(mysql_query)
{
php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_STORE_RESULT);
}
/* }}} */ /* {{ { proto resource mysql_unbuffered_query(string query [, int link_identifier])
SQL クエリをフェッチせずに MySQL に送信しますそして結果行をバッファリングします */
PHP_FUNCTION(mysql_unbuffered_query)
{
php_mysql_do_query(INTERNAL_FU NCTION_PARAM_PASSTHRU, MYSQL_USE_RESULT)
}
/* }}} */
どちらの関数も php_mysql_do_query() を呼び出しますが、2 番目のパラメーター MYSQL_STORE_RESULT と MYSQL_USE_RESULT だけが異なります。 php_mysql_do_query() の実装を見てみましょう:
コードをコピーします コードは次のとおりです。
if(use_store == MYSQL_USE_RESULT) { Mysql_result=mysql_use_result(&mysql->conn)
} else {
mysql_result=mysql_store_result( &mysql->conn);
}
mysql_use_result() と mysql_store_result () の違いは、後者が MySQL の C API 関数全体を読み取ることです。結果セットは MySQL サーバーからクライアントに送信されますが、前者は結果セットのメタ情報を読み取るだけです。