ホームページ >バックエンド開発 >PHPチュートリアル >PHPクエリデータベースによるメモリ不足の解決策

PHPクエリデータベースによるメモリ不足の解決策

*文
*文オリジナル
2017-12-25 16:02:212073ブラウズ

データベースへのクエリによって引き起こされるメモリ不足の問題を解決するにはどうすればよいですか?この記事では、PHP による大量の MySQL データのクエリによるメモリ不足の解決策を主に紹介し、MySQL クエリ時のメモリ不足の原因とその解決策を例とともに分析し、mysql_unbuffered_query 関数の使用スキルをより詳細に分析します。皆さんのお役に立てれば幸いです。

この記事では、例を使用して、PHP による大量の MySQL データのクエリによって引き起こされるメモリ不足の解決策を分析します。皆さんの参考に共有してください。具体的な分析は次のとおりです。

1. 問題

PHP を使用して大量の MySQL データをクエリすると、プログラムの実行がまだ完了しておらず、警告がポップアップ表示されます:
致命的なエラー: 許可されたメモリ サイズ100663296 バイトが使い果たされました (103 バイトを割り当てようとしました)
エラー メッセージ: PHP によって割り当てられた 100M メモリが完全に占有されています。

2. 解決策:

最も簡単な解決策は、実行可能ファイルの先頭にメモリを 256M 以上に追加することです。 space

しかし、次回より多くのデータを読みたい場合はどうすればよいでしょうか?何度も増やすことができず、PHP によってサーバーのメモリが消費されてしまいます。


これが関数です:

memory_get_usage() メソッドを使用して、php によって使用されるメモリ量を取得します。読み取られるデータ項目の数が増加するにつれて、PHP が使用するメモリが段階的に増加することがわかります。
PHPがmysqlにクエリを実行したときのデータはメモリに保存されていますか?いろいろ調べてみると、実はこういう意味だということが分かりました。

Mysql の C API 関数には、mysql_use_result() と mysql_store_result() が含まれます


mysql_store_result() は、mysqlServer からクライアントに結果セットを読み取りますが、mysql_use_result() は、PHP Mysql_query のメタ情報のみを読み取ります。 mysql_store_result() を呼び出し、結果セットを自動的に取得してキャッシュします

2. PHP の別の関数、mysql_unbuffered_query() は、大規模な結果セットを処理するときにかなりの時間を節約します。一方、結果セットは、SQL ステートメント全体が実行されるのを待たずに、最初の行がフェッチされた直後に操作できます。


そのため、大量のデータを読み取るときは、mysql_query() の代わりに mysql_unbuffered_query() を使用できます。

テストした結果、実際にそうなりました。すべてのデータをインポートした後、メモリは 1MB 以内に維持され、Mysql_unbuffered_query() は MySQL にクエリを送信しますが、mysql_query() のように結果セットを自動的に取得してキャッシュすることはありません。一方で、これにより、非常に大きな結果セットを処理するときにかなりのメモリが節約されます。一方、結果セットは、SQL ステートメント全体が実行されるのを待たずに、最初の行がフェッチされた直後に操作できます。複数のデータベース接続を使用する場合は、オプションのパラメータ link_identifier を指定する必要があります。 mysql_unbuffered_query() の利点には代償が伴います。mysql_num_rows() と mysql_data_seek() は、mysql_unbuffered_query() によって返された結果セットに加えて使用できません。さらに、キャッシュされていない SQL クエリによって生成されたすべての結果行は、新しい SQL クエリを MySQL に送信する前にフェッチする必要があります。 そのため、ビジネス ニーズに基づいて関数を適切に選択する必要があります


関連する推奨事項:

php フォームの繰り返し送信を解決および回避する方法


PHP セッション デッドロックを解決する方法_PHP チュートリアル

php は、MySQL にデータを挿入する際の Incorrect string value: 'xF0x9Fx92x8BTi...' の問題を解決します

以上がPHPクエリデータベースによるメモリ不足の解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。