PHP7カーネルの詳細説明を参照
問題
参照 (REFERENCE) は PHP5 ではフラグでしたが、PHP7 以降はそれを新しい型 IS_REFERNCE に変更しました。参照は非常に一般的なアプリケーションであるため、この変更により多くの変更がもたらされ、PHP7 の開発時に誤ってこの型の処理を忘れる原因にもなり、多くの問題が発生しました。バグがたくさんあります。
最も単純なケースは、さまざまな型を扱う場合です。今後、この新しい型についてさらに考慮する必要があります。たとえば、PHP7 では、このコード形式は非常にわかりにくくなります。共通:
try_again:swtich (Z_TYPE_P(zv)) { case IS_TRING: ブレーク; case IS_ARRAY: ブレーク; ... case IS_REFERENCE: zv = Z_REFVAL_P(zv); // 逆参照 goto try_again; ブレーク ;}
独自の拡張機能を作成し、この新しい型を考慮することを忘れると、問題が発生します。
なぜですか?
では、この新しい型は非常に多くの問題を引き起こすため、なぜ参照を型に変換するためにそれを使用します? なぜ単にフラグを使用しないのでしょうか?
一言で言えば、これを行う必要があるのは私たちです。 -_
#前述したように、Hashtable は zval を直接格納します。シンボル テーブル、2 つの zval が値を共有するにはどうすればよいですか? 文字列などの複合型の場合は問題ありませんが、問題を解決するための参照であることを示すフラグ ビットを zend_refcounted 構造体に追加できるようです。 Change On Write によるコピーも発生しますが、PHP7 では、IS_LONG などの一部の型は zval に直接格納されることがわかっていますが、参照型には参照カウントが必要です。そのため、IS_LONG および IS_REFERNCE である zval をどのように表現すればよいでしょうか?
このため、この新しい型を作成しました:図に示すように、Reference は新しい型です: zend_reference.IS_REFERNCE 型の zval の場合、zval.value.ref は zend_reference へのポインターであり、これには次のものが含まれます。参照カウントと zval。zval の特定の値は .
の zval.value.ref->val に格納されます。したがって、IS_LONG の参照には、zend_reference を指す IS_REFERNCE 型の zval を使用します。この zend_reference->val は、IS_LONG 型の zval です。
Change On Write
PHP は参照カウントを使用して単純なガベージ コレクションを実行します。次のコードを考えてみましょう:
<?php1. $val = "laruence";2. $ref = &$val;3. $copy = $val;?>
$ref と $val は同じものを指します。 zval の参照については、PHP5 では、参照カウント 2 と参照フラグ 1 によってこの状況を表しました。 $val を $copy(line) にコピーするとき3) $val が 1 より大きいカウントの参照であることがわかり、書き込み時の変更、つまり分離が必要なので、この zval をコピーする必要があります。
PHP7 では、状況はさらに大きくなります。まず、$ref(2行目)に参照を代入すると、IS_REFERNCE型が生成され、このとき参照する変数が2つあるため、zend_reference構造体の参照カウントはzval.value.ref->gcとなります。 refcount は 2.
その後、$ に割り当てられます。コピーすると (3 行目)、$val が参照であることがわかり、$copy は zval.value.ref->val を指します。これは zval です。その文字列値は laruence であり、zval の参照を 1 ずつカウントします。つまり、zval.value.ref->val.value.str.gc.refcount は 2 です。コピーは発生しません。
これは効果的に問題を解決します。前の章で説明した PHP5 の古典的な問題。たとえば、前の章の問題を PHP7 で実行すると、得られる結果は次のとおりです:
$ php-7.0/sapi/cli/php /tmp/1.phpUsed 0.00021380008539Used 0.00020173048281
コピーが発生していないことがわかります。パフォーマンスに問題はありません。
推奨チュートリアル :PHP>>
以上がPHP7カーネルの詳細説明を参照の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

システムが再起動した後、UnixSocketの権限を自動的に設定する方法。システムが再起動するたびに、UnixSocketの許可を変更するために次のコマンドを実行する必要があります:sudo ...

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。
