PHP スクリプトを作成する場合、通常、スクリプトはすぐに実行を完了して終了するため、メモリ リークやガベージ コレクションについて心配する必要はありません。
しかし、実行時間が長く、データ量が多い場合、プログラムが一定時間実行されると、PHP スクリプトはメモリを大量に消費し、エラーで終了します (PHP 致命的エラー: 許容メモリ サイズ134217728 バイトを使い果たしました)。一般に、各ページの処理が完了した後、新しく作成された simple_html_dom オブジェクトは破棄されるはずですが、実際にはメモリ リークが発生していないことは明らかです。
PHPのガベージコレクションメカニズム
PHP 5.3 より前に使用されていたガベージ コレクション メカニズムは、単純な「参照カウント」です。つまり、メモリ オブジェクトが変数によって参照される場合、変数の参照が削除されると、カウンター + 1 が割り当てられます。カウンタ - 1 ; カウンタ = 0 の場合、メモリ オブジェクトが使用されていないことを示し、メモリ オブジェクトは破棄され、ガベージ コレクションが完了します。
「参照カウント」には問題があります。つまり、2 つ以上のオブジェクトが相互に参照してリングを形成する場合、この時点でメモリ オブジェクトのカウンタは 0 に減りません。は役に立たなくなりましたが、リサイクルできないため、メモリ リークが発生します。
PHP 5.3 以降、参照カウントに基づいた新しいガベージ コレクション メカニズムが使用され、メモリ リークを回避するためにメモリ オブジェクト内の参照リングの存在を検出するための複雑なアルゴリズムが実装されました。
メモリリークがないか確認してください
解放されるべきであるが解放されていないメモリがあるかどうかを確認するには、memory_get_usage 関数を呼び出してメモリ使用量を確認します。memory_get_usage 関数によって返されるメモリ使用量データはあまり正確ではありません。 php の xdebug 拡張機能を使用すると、より正確で有益なメモリ使用量の情報を取得できます。
リーリー上記は、循環参照を生成する例を構築します。 A オブジェクトのインスタンス a が作成されるたびに、a は B オブジェクトのインスタンス b を作成し、b に a を参照させます。このようにして、各 A オブジェクトは常に B によって参照され、各 B オブジェクトは同時にオブジェクト A によって参照されます。これが参照ループの作成方法です。
このコードを php5.2 環境で実行すると、メモリ使用量が単調に増加しており、A と B のデストラクタが実行された後、メモリが空になるまで「A/B desctruct」情報が出力されないことがわかります。使い果たされました。「PHP 致命的エラー: 許容メモリ サイズ 134217728 バイトが使い果たされました (40 バイトを割り当てようとしました)」。
このコードをphp5.3環境で実行すると、メモリ使用量が上下に跳ね上がりますが、制限を超えることはありません。また、プログラムは、デストラクターが呼び出されたことを示す「A/B desctruct」を大量に出力します。
私の同僚のプログラムにはこの種の参照ループがあり、彼のスクリプトは実際にはphp5.2.3で実行されます。 simple_html_dom ツールには、simple_html_dom と simple_html_dom_node という 2 つのクラスがあり、前者には配列メンバー変数ノードがあり、配列内の各要素は simple_html_dom_node オブジェクトであり、各 simple_html_dom_node オブジェクトにはメンバー変数 dom があり、その値は次のとおりです。以前の simple_html_dom オブジェクト - したがって、美しい参照ループが形成され、メモリ リークが発生します。解決策も非常に簡単です。つまり、simple_html_dom オブジェクトの使用が終了し、そのクリア関数を積極的に呼び出してそのメンバー変数ノードをクリアすると、ループが中断され、メモリ リークは発生しません。
その他
1.ガベージコレクションのタイミング
PHPでは参照カウントが0になるとすぐにメモリが解放されます。つまり、変数への循環参照がない場合、メモリは変数のスコープから出た直後に解放されます。循環リファレンス検出は特定の条件が満たされたときにトリガーされるため、上記の例では、使用されるメモリに大きな変動が見られます。 gc_collect_cycles 関数を使用して、循環参照を積極的に検出することもできます。
2. アンパサンドの影響
変数を明示的に参照すると、そのメモリの参照カウントが増加します:
リーリーこの時点ではunset($a)していますが、メモリ領域を指す$bへの参照が残っており、メモリは解放されません。
3. 未設定機能の影響
unset は変数をメモリ領域から切断し、メモリ領域の参照カウントを -1 減らすだけです。上記の例では、ループ本体内では $a=new A(); は行われません。 $a の参照カウントをゼロに減らします
;4. null 操作の影響
$a = null は、$a が指すデータ構造を直接 null にし、その参照カウントを 0 に返します。
5. スクリプト実行終了の影響
スクリプトの実行が終了すると、参照サイクルの有無に関係なく、スクリプトで使用されていたすべてのメモリが解放されます。

PHPは、特にWeb開発の分野で、最新のプログラミングで強力で広く使用されているツールのままです。 1)PHPは使いやすく、データベースとシームレスに統合されており、多くの開発者にとって最初の選択肢です。 2)動的コンテンツ生成とオブジェクト指向プログラミングをサポートし、Webサイトを迅速に作成および保守するのに適しています。 3)PHPのパフォーマンスは、データベースクエリをキャッシュおよび最適化することで改善でき、その広範なコミュニティと豊富なエコシステムにより、今日のテクノロジースタックでは依然として重要になります。

PHPでは、弱い参照クラスを通じて弱い参照が実装され、ガベージコレクターがオブジェクトの回収を妨げません。弱い参照は、キャッシュシステムやイベントリスナーなどのシナリオに適しています。オブジェクトの生存を保証することはできず、ごみ収集が遅れる可能性があることに注意する必要があります。

\ _ \ _ Invokeメソッドを使用すると、オブジェクトを関数のように呼び出すことができます。 1。オブジェクトを呼び出すことができるように\ _ \ _呼び出しメソッドを定義します。 2。$ obj(...)構文を使用すると、PHPは\ _ \ _ Invokeメソッドを実行します。 3。ロギングや計算機、コードの柔軟性の向上、読みやすさなどのシナリオに適しています。

繊維はPhp8.1で導入され、同時処理機能が改善されました。 1)繊維は、コルーチンと同様の軽量の並行性モデルです。 2)開発者がタスクの実行フローを手動で制御できるようにし、I/O集約型タスクの処理に適しています。 3)繊維を使用すると、より効率的で応答性の高いコードを書き込むことができます。

PHPコミュニティは、開発者の成長を支援するための豊富なリソースとサポートを提供します。 1)リソースには、公式のドキュメント、チュートリアル、ブログ、LaravelやSymfonyなどのオープンソースプロジェクトが含まれます。 2)StackOverFlow、Reddit、およびSlackチャネルを通じてサポートを取得できます。 3)開発動向は、RFCに従うことで学ぶことができます。 4)コミュニティへの統合は、積極的な参加、コード共有への貢献、および学習共有への貢献を通じて達成できます。

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHPは、シンプルな構文と高い実行効率を備えたWeb開発に適しています。 2。Pythonは、簡潔な構文とリッチライブラリを備えたデータサイエンスと機械学習に適しています。

PHPは死にかけていませんが、常に適応して進化しています。 1)PHPは、1994年以来、新しいテクノロジーの傾向に適応するために複数のバージョンの反復を受けています。 2)現在、電子商取引、コンテンツ管理システム、その他の分野で広く使用されています。 3)PHP8は、パフォーマンスと近代化を改善するために、JITコンパイラおよびその他の機能を導入します。 4)Opcacheを使用してPSR-12標準に従って、パフォーマンスとコードの品質を最適化します。

PHPの将来は、新しいテクノロジーの傾向に適応し、革新的な機能を導入することで達成されます。1)クラウドコンピューティング、コンテナ化、マイクロサービスアーキテクチャに適応し、DockerとKubernetesをサポートします。 2)パフォーマンスとデータ処理の効率を改善するために、JITコンパイラと列挙タイプを導入します。 3)パフォーマンスを継続的に最適化し、ベストプラクティスを促進します。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。
