ホームページ バックエンド開発 PHPチュートリアル PHP の設定を解除するとメモリは解放されますか?_PHP チュートリアル

PHP の設定を解除するとメモリは解放されますか?_PHP チュートリアル

Jul 20, 2016 am 11:13 AM
dump get memory php unset var メモリ 私たち 見て 結局 解放された

まず例を見てみましょう

var_dump(memory_get_usage());
$a = "laruence";
var_dump(memory_get_usage());
unset($a);
var_dump(memory_get_usage()) ;

出力 (私のパソコンでは、システム、PHP バージョン、ロードされた拡張機能によって異なる場合があります):

int(90440)
int(90640)
int(90472

注 90472-90440=32 )さまざまな結論 PHP の unset は実際にはメモリを解放しないという人もいれば、PHP の unset は大きな変数 (多数の文字列、大きな配列) が解放された場合にのみ実際にメモリを解放するという人もいます。 PHP レベルでメモリについて説明します

それでは、これらの 32 バイトはどこに行ったのでしょうか?

この質問に答えるために、次の 2 つの側面から見てみましょう:
行きますか?

まず第一に、PHP は C 言語とは異なり、メモリ割り当て関連の API を明示的に呼び出した場合にのみメモリ割り当てが行われます
つまり、PHP では多くのメモリ割り当てが行われます。たとえば、次の場合:

$a = "laruence";

暗黙的なメモリ割り当てポイントは次のとおりです:

1. 変数名にメモリを割り当て、シンボル テーブルを格納します
2. にメモリを割り当てます。変数の値

したがって、見た目だけを見ることはできません
第二に、PHP の unset が実際にメモリを解放することを疑ってはいけません (もちろん、参照とカウントも組み合わせる必要があります。私の記事を参照してください)。この部分については前回の記事) この記事では PHP の原則 (変数の分離/参照) について詳しく説明していますが、このリリースは C プログラミングの意味でのリリースではなく、
PHP の場合は OS に戻されません。 、それ自体が C 言語のメモリ管理 API に似た一連のメモリ割り当てを提供します。これらの API は C API の意味に対応し、メモリはこれらの API を通じて PHP 内で管理されます。

emalloc を呼び出してメモリを適用すると、PHPたとえば、OS は大きなメモリ ブロックを必要とし、その一部を申請者に割り当てます。このように、メモリを適用するロジックがある場合でも、メモリを要求する必要はありません。頻繁なシステムコールを避けるために、OS からメモリを申請する必要があります。

たとえば次の例:

var_dump(memory_get_usage(TRUE)) // 取得されるのは real_size であることに注意してください
$a = "ラルエンス";
var_dump(memory_get_usage(TRUE));
unset($a);

出力:

int(262144)
int(262144) t(262144

)つまり、変数 $a を定義すると、PHP はシステムからの新しいメモリを適用しません

同じです。 このようにして、メモリを解放するために efree を呼び出すと、PHP はメモリを OS に返しませんが、このメモリを、小さなメモリの場合は保持している空きメモリ リストに追加します。 おそらく、それをメモリ キャッシュ リストに追加します (追記、私が確認した PHP5.2.4、5.2.6、5.2.8 などの PHP の一部のバージョンでは、 get_memory_usage() を呼び出すとき、メモリ キャッシュ リスト内の利用可能なメモリ ブロック サイズは減算されないため、設定解除後もメモリが変更されていないように見えます)。

それでは、これらの 32 バイトがどこに行くのか答えましょう。先ほど述べたように、多くのメモリ割り当てプロセスは明示的ではありません。次のコードを読むとわかります:

var_dump("I am www.7di.net");
var_dump(memory_get_usage());
$a = "ラルエンス";
var_dump(memory_get_usage());
unset($a);
var_dump(memory_get_usage());

出力:

string(43) "私は www .7di.net"
int(90808 ) //代入前
int(90976)
int(90808) //はい、メモリは正常に解放されます

90808-90808 = 0、通常、つまりこれらの 32 ワード このセクションは出力関数によって占有されます (厳密に言えば、出力ヘッダーによって占有されます)


増加するだけで減少しない配列

ハッシュテーブルは PHP の中核構造です (ハッシュテーブルを理解するには、私の以前の記事を参照してください) PHP 配列 (走査順序))、次のコードの場合、配列も彼女によって表され、シンボル テーブルも連想配列です:

var_dump("I am www.7di.net");
var_dump(memory_get_usage ( ));
$array = array_fill(1, 100, "laruence");
foreach ($array as $key => $value) {
${$value . $key} = NULL;
}
var_dump (memory_get_usage());
foreach ($array as $key=> $value) {
unset(${$value . $key});
}
var_dump(memory_get_usage());

100 個の変数を定義し、[Unset] を押して出力を確認しました:

string(43) "I am www.7di.net"
int(93560)
int(118848)
int(104448

すごい、なぜそこにあるのですかそれほどメモリが少ないのですか?
これは、Hashtable を定義するときに、未知の数の要素を保存するのに十分なメモリ ブロックを一度に割り当てることが不可能であるためです。そのため、PHP はメモリ ブロックのごく一部を HashTable に割り当てるだけです。 、容量が足りない場合は RESIZE して容量を拡張します

そして Hashtable、 容量を拡張することはできますが、容量を減らすことはできません。上記の例では、100 個の変数を保存したときに、シンボル テーブルでは不十分だったので、拡張を行いました。 これら 100 個の変数を順番に設定解除すると、変数によって占有されていたメモリは解放されます (118848 – 104448) が、シンボル テーブルは縮小されません。 つまり、少量のメモリがシンボル テーブル自体によって占有されることになります...

さて、PHP のメモリ管理についての予備的な理解はできましたか?

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/440396.html技術記事まず例を見てみましょう var_dump(memory_get_usage()); $a = "laruence"; var_dump(memory_get_usage());
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP クイックガイド CakePHP クイックガイド Sep 10, 2024 pm 05:27 PM

CakePHP はオープンソースの MVC フレームワークです。これにより、アプリケーションの開発、展開、保守がはるかに簡単になります。 CakePHP には、最も一般的なタスクの過負荷を軽減するためのライブラリが多数あります。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

See all articles