ホームページ バックエンド開発 PHPチュートリアル PHP カーネルの研究: HASH テーブルと変数_PHP チュートリアル

PHP カーネルの研究: HASH テーブルと変数_PHP チュートリアル

Jul 14, 2016 am 10:08 AM
hash php カーネル 変数 そして 存在する 属性 絶え間ない データ 研究 親切 表面

PHPハッシュテーブル

PHP では、変数、定数、クラス、属性に関係なく、すべてのデータはハッシュ テーブルを使用して実装されます。
まず HASH テーブルについて話しましょう
typedef 構造体バケット {
ulong h;
uint nKeyLength; //キーの長さ
void *pData; // Bucke によって保存されたデータへのポインタ
void *pDataPtr; //ポインタデータ
struct Bucket *pListNext //次の要素ポインタ
structbucket *pListLast; //前の要素ポインタ
構造体バケット *pNext
構造体バケット *pLast;
char arKey[1] /* 最後の要素である必要があります */
} バケツ
typedef struct _hashtable {
uint nTableSize //ハッシュテーブルのサイズ
uint nTableMask;//nTableSize-1 と等しい
uint nNumOfElements;//オブジェクトの数
ulong nNextFreeElement //次の空の要素の位置を指す nTableSize+1
Bucket *pInternalPointer; /* 要素の走査に使用されます */// 現在の走査されたポインターを保存します
Bucket *pListHead;//ヘッド要素ポインタ
Bucket *pListTail;//末尾要素ポインタ
Bucket **arBuckets;//ストレージのハッシュ配列データ
dtor_func_t pDestructor;//デストラクターに似ています
zend_boolpersistent;//PHP はメモリを均一に管理するのか、それとも通常の malloc を使用するのか
unsigned char nApplyCount;//現在のハッシュ バケットがアクセスされた回数、無限再帰ループを防ぐためにデータが走査されたかどうか
zend_bool bApplyProtection;
#if ZEND_DEBUG
一貫性がありません
#endif
} ハッシュテーブル
HASHテーブル初期化関数と組み合わせてみましょう
ZEND_API int _zend_hash_init(HashTable *ht, uint nSize, hash_func_t pHashFunction, dtor_func_t pDestructor, zend_bool 永続 ZEND_FILE_LINE_DC)
{
uint i = 3;
バケツ**tmp;
SET_INCONSISTENT(HT_OK);
if (nSize >= 0x80000000) { //HASH テーブルのサイズが 0x8 より大きい場合、0x8 に初期化されます
/* オーバーフローを防ぐ */
ht->nTableSize = 0x80000000;
} その他 {
while ((1U << i) < nSize) { //2 の n 乗に調整 i++; i++ Power i=3、nTableSize の最小値は 8 です
}
//計算効率を向上させるために、システムは nTableSize を nTableSize 以上の最小の 2 の整数乗に自動的に調整します。つまり、HashTable の初期化時に 2 の整数乗ではない nTableSize を指定すると、システムは nTableSize の値を自動的に調整します。
ht->nTableMask = ht->nTableSize - 1;
ht->pDestructor = pDestructor;//HashTable が追加、削除、または変更されたときに呼び出される関数ポインター
ht->arBuckets = NULL;
ht->pListHead = NULL;
ht->pListTail = NULL;
ht->nNumOfElements = 0;
ht->nNextFreeElement = 0;
ht->pInternalPointer = NULL;
ht->persistent =persistent; //persistent が TRUE の場合は、オペレーティング システム独自のメモリ割り当て関数を使用してバケットにメモリを割り当てます。それ以外の場合は、PHP のメモリ割り当て関数を使用します
ht->nApplyCount = 0;
ht->bApplyProtection = 1;
/* ecalloc() を使用して、Bucket* == NULL */
if (persistent) { //オペレーティング システムは、独自のメモリ割り当てメソッドを使用してメモリを割り当てます。calloc がメモリを割り当てた後、メモリは自動的に 0 に初期化されます。
tmp = (バケット **) calloc(ht->nTableSize, sizeof(バケット *));
if (!tmp) {
失敗を返す
}
ht->arBuckets = tmp;
} else {//PHP のメモリ管理メカニズムを使用してメモリを割り当てます
tmp = (バケット **) ecalloc_rel(ht->nTableSize, sizeof(バケット *));
if (tmp) {
ht->arBuckets = tmp;
}
}
//arBuckets のメモリを自動的に適用します。メモリ サイズは nTableSize と同じです
成功を返す
}
ソースコードを読んでいると、EG、PG、CGなどのマクロをよく見かけます
CGはcompile_globalの略です
EGはexcutor_globalの略称です
Gはグローバル変数を意味します
EGマクロを例に見てみましょう
#ifdef ZTS
# EG(v) TSRMG(executor_globals_id, zend_executor_globals *, v) を定義します
#その他
# EG(v) (executor_globals.v) を定義します
extern ZEND_API zend_executor_globals executor_globals
#endif
とてもシンプルで、グローバル変数を取得するマクロだけです
それでは、zend_executor_globals 構造体を見てみましょう
/Zend/zend.h で定義
typedef struct _zend_executor_globals zend_executor_globals;
は _zend_executor_globals のエイリアスです
同じファイル内で見つかりました
PHPのすべてのローカル変数、グローバル変数、関数、クラスハッシュテーブルはここで定義されています
struct _zend_executor_globals {
zval **return_value_ptr_ptr;
zval uninitialized_zval
zval *uninitialized_zval_ptr;
zval エラー_zval
zval *error_zval_ptr;
zend_ptr_stack arg_types_stack;
/* シンボル テーブル キャッシュ */
ハッシュテーブル *symtable_cache[SYMTABLE_CACHE_SIZE]
ハッシュテーブル **symtable_cache_limit
ハッシュテーブル **symtable_cache_ptr;
zend_op **opline_ptr;
HashTable *active_symbol_table //ローカル変数
HashTablesymbol_table; /* メインシンボルテーブル */ //グローバル変数
HashTable Included_files; /* ファイルはすでにインクルードされています */ // ファイルをインクルードします
JMP_BUF *救済
int エラー報告
int orig_error_reporting
int 終了ステータス
zend_op_array *active_op_array
HashTable *function_table; /* 関数シンボルテーブル */ //関数テーブル
HashTable *class_table; /* クラステーブル */ //クラステーブル
HashTable *zend_constants; /* 定数テーブル */ // 定数テーブル
zend_class_entry *スコープ;
zend_class_entry *named_scope; /* 呼び出し元クラスのスコープ */
zval *これ;
長い精度
int ティック数
zend_bool in_execution
ハッシュテーブル *in_autoload
zend_function *autoload_func
zend_bool full_tables_cleanup
/* 拡張情報サポート用 */
zend_bool no_extensions
#ifdef ZEND_WIN32
zend_bool がタイムアウトしました
OSVERSIONINFOEX Windows_version_info
#endif
ハッシュテーブルの正規リスト
ハッシュテーブル永続リスト
zend_vm_stack 引数_スタック
int user_error_handler_error_reporting
zval *user_error_handler
zval *ユーザー例外ハンドラー
zend_stack user_error_handlers_error_reporting
zend_ptr_stack user_error_handlers
zend_ptr_stack ユーザー例外ハンドラー
zend_error_handling_t エラー処理
zend_class_entry *例外クラス
/* タイムアウトのサポート */
int タイムアウト_秒
int ラムダ数
ハッシュテーブル *ini_directives;
ハッシュテーブル *modified_ini_directives;
zend_objects_store オブジェクトストア
zval *例外、*prev_例外
zend_op *opline_before_例外
zend_op 例外_op[3];
struct _zend_execute_data *current_execute_data
struct_zend_module_entry *current_module;
zend_property_info std_property_info;
zend_bool がアクティブです。
void *saved_fpu_cw;
無効 *予約済み[ZEND_MAX_RESERVED_RESOURCES]
};
まずはここで簡単に見てみましょう。後で使用するときに詳しく説明します
PHP の最も基本的な単位は変数です:
PHP で変数を定義するのはこれ以上に簡単です
として
$a=1;
?>
ただし、カーネルでは zval 構造で実装されます
変数が上記で定義されている場合、次のコードがカーネルで実行されます
zval *val
MAKE_STD_ZVAL(val); // メモリを申請します
ZVAL_STRING(val,"hello",1);//ZVAL_STRING を使用して値を「hello」に設定します
ZEND_SET_SYMBOL(EG(active_symbol_table),"a",val));//val ポインタをシンボルテーブルに追加します
マクロMAKE_STD_ZVALは次のように定義されています
#define MAKE_STD_ZVAL(zv)
ALLOC_ZVAL(zv); //最終的には (p) = (type *) emalloc(sizeof(type)) と等しくなります
INIT_PZVAL(zv);
INIT_PZVAL は
で定義されています
#define INIT_PZVAL(z) 初期化パラメータであることがわかります
(z)->refcount__gc = 1;
(z)->is_ref__gc = 0;
それでは、zvalとは何ですか
zend/zend.h 内
typedef struct _zval_struct zval; // _zval_struct のエイリアスであることが判明
_zval_structは次のように定義されています
typedef Union _zvalue_value {
long lval; //long 型データを保存する
double dval; //double 型のデータを保存します
構造体{
char *val // 本当の値はここにあります
; Int len // ここに長さを返します
}
ハッシュテーブル*ht;
zend_object_value obj // これはオブジェクトです
;
} zvalue_value
struct _zval_struct {
zvalue_value 値 // 保存された値
zend_uint refcount__gc;// 1 の場合は単独でのみ使用され、1 より大きい場合は
の形式で他の変数から参照されます。
zend_uchar type; //データ型 これが、PHP の型指定が弱い理由です
zend_uchar is_ref__gc; // 参照であるかどうかを示します
};
まだ十分に理解できない場合は...試してみましょう...C を使用して PHP 変数を作成します
ここでは拡張機能が必要です。PHP が C 拡張モジュールを使用する場合は、ここでは詳しく説明しません
キーコード
PHP_FUNCTION(test_siren){
zval *value;
char *s="PHP 変数を作成する";
値=(zval*)malloc(sizeof(zval));
memset(値,0,サイズ(値));
value->is_ref__gc=0; //非参照変数
Value->refcount__gc=1;//引用数 自分のみ
value->type=IS_STRING;// 型は文字列です
value->value.str.val=s;//value
value->value.str.len=strlen(s);//長さ
ZEND_SET_SYMBOL(EG(active_symbol_table),"a",value);
}
3行目と4行目はMAKE_STD_ZVALと同じ機能で、値にメモリ空間を割り当てます
5行目から9行目までの機能はZVAL_STRINGの機能と同じです
最後の行は、値として PHP で $a という変数を作成し、それをローカルのハッシュ テーブルに追加することです。
PHPではこうする
テストサイレン(1);
エコー $a
?>
「php変数の作成」と出力されます
わかりました、
完了
注、私は PHP 内で変数を作成するプロセスを皆さんに見てもらうためだけに、C 形式で変数を作成しました。
これを行うことは絶対に推奨されません。
メモリの割り当てと処理には、引き続き PHP の内部メモリ管理メカニズムを使用する必要があります。
http://www.bkjia.com/PHPjc/477783.html

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/477783.html技術記事 PHP HASH テーブル PHP では、変数、定数、クラス、属性に関係なく、すべてのデータがハッシュ テーブルを使用して実装されます。まず、HASH テーブルについて説明します。 typedef structbucket { /* 数値インデックスに使用されます */ ui。 ..
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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 にアップグレードする方法について説明します。

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 は、

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

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

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

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

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

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

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

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

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

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

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles