目次
「コピー」とは何ですか
コピー オン ライト アプリケーション シナリオ
「コピーオンライト」の原理
ホームページ バックエンド開発 PHPチュートリアル PHPコピーオンライトの詳しい説明

PHPコピーオンライトの詳しい説明

Mar 28, 2018 am 11:38 AM
php コピー 詳しい説明

この記事では主に PHP コピーオンライトの詳細な説明を共有します。皆さんのお役に立てればと思い、例から始めましょう。

<?php$foo = 1;
$bar = $foo;echo $foo + $bar;
ログイン後にコピー

変数 $foo は変数 $bar に割り当てられます。これら 2 つの変数は同じ値を持ちます。新しいメモリ空間を共有する必要はありません。 多くのシナリオで、PHP の COW はメモリを最適化します。例: 変数の複数の代入、関数パラメータの受け渡し、関数本体内の実際のパラメータの変更など。

「コピー」とは何ですか

これは、Niao 兄弟のブログから引用した例です。わかりやすくなったので、ここに直接投稿しました。

<?php
   $var = "laruence";
   $var_dup = $var;
   $var = 1;?>
ログイン後にコピー

明らかに、このコードが実行された後も、$var_dup の値は依然として「laruence」であるはずですが、これはどのように達成されるのでしょうか?これは PHP のコピーオンライトメカニズムです:

変数を変更する前に、PHP はまず変数の refcount をチェックします。refcount が 1 より大きい場合、実行が到達したときに、PHP は別のルーチンを実行します。最初の 3 行で、PHP は $var が指す zval の refcount が 1 より大きいことを検出し、次に PHP は新しい zval をコピーし、元の zval の refcount を 1 減らして、$var と zval を分離するようにsymbol_table を変更します。 $var_dup (分離) 。このメカニズムは、いわゆるコピー オン ライトです。

コピー オン ライト アプリケーション シナリオ

コピー オン ライト (COW とも略される) には、Linux のプロセス レプリケーションにおけるメモリ使用量の最適化など、C++ などのさまざまなプログラミング言語での多くのアプリケーション シナリオがあります。STL にも同様のアプリケーションがあります。等々。 COW は一般的に使用される最適化方法であり、次のように分類できます。 リソースの遅延割り当て。リソースは、実際に必要な場合にのみ占有され、通常、コピーオンライトによりリソースの使用量が削減されます。

PHP COW がメモリ使用量を最適化することを証明する例:

<?php
$j = 1;
var_dump(memory_get_usage());
 
$tipi = array_fill(0, 100000, &#39;php-internal&#39;);
var_dump(memory_get_usage());
 
$tipi_copy = $tipi;
var_dump(memory_get_usage());
 
foreach ($tipi_copy as $i) {
    $j += count($i);
}
var_dump(memory_get_usage());
ログイン後にコピー

実行結果:

$ php t . phpint(630904)int(10479840)int(10479944)int(10480040)
ログイン後にコピー

メモリは大幅に改善されません。

「コピーオンライト」の原理

同じ値の複数の変数で同じメモリを共有すると、メモリ領域が節約されますが、上記の例の場合、変数の値は変更されます。同じメモリが変更される場合、値が変更される (または変更される可能性がある) 場合、変更された値を「分離」する必要があります。この「分離」操作が「コピー」です。

PHP では、同じ zval アドレスが複数の変数で共有されているかどうかを区別するために、Zend エンジンは識別のために ref_count と is_ref という 2 つの変数を導入します:

ref_count と is_ref は zval 構造体で定義されています

is_ref は次のことを識別しますユーザーは & を必須の参照として使用します。

ref_count は、この zval が参照される変数の数を識別するために使用される参照カウントです。つまり、0 の場合は破棄されます。 $a=$ b; と $a=&$b; は PHP のメモリ使用量に違いがないことがわかります

の実装原理も理解できると思います。 PHP の COW: PHP の COW は参照カウント ref_count に基づいており、Is_ref が実装されています。変数ポインターがもう 1 つある場合、ref_count は 1 ずつ増加します。それ以外の場合は 1 減算され、0 に達すると破棄されます。 ; 同様に、必須参照 & がもう 1 つある場合、is_ref は 1 増加し、1 減少すると破棄されます。

関連する推奨事項:

コピー オン ライトの使用例チュートリアルを要約する

PHP でのコピー オン ライト (Copy On Write) の共有コード例

PHP 変数のカウンターとコピー オン ライトを参照する

以上がPHPコピーオンライトの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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)

CakePHP プロジェクトの構成 CakePHP プロジェクトの構成 Sep 10, 2024 pm 05:25 PM

この章では、CakePHP の環境変数、一般設定、データベース設定、電子メール設定について理解します。

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:27 PM

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

CakePHP ルーティング CakePHP ルーティング Sep 10, 2024 pm 05:25 PM

この章では、ルーティングに関連する次のトピックを学習します。

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

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

CakePHP データベースの操作 CakePHP データベースの操作 Sep 10, 2024 pm 05:25 PM

CakePHP でデータベースを操作するのは非常に簡単です。この章では、CRUD (作成、読み取り、更新、削除) 操作について理解します。

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

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

See all articles