PHPの基礎となる動作の仕組みと原理、PHPの基礎となる動作の仕組み
PHPはシンプルと言われますが、それを使いこなすのは簡単ではありません。それを使用できることに加えて、その根本的な動作原理を知る必要もあります。
PHP は Web 開発に適した動的言語です。具体的には、C言語を使用して多数のコンポーネントを実装するソフトウェアフレームワークです。より狭い意味で見ると、強力な UI フレームワークと考えることができます。
PHP の基礎となる実装を理解する目的は何ですか?動的言語をうまく使用するには、まずメモリ管理とフレームワーク モデルを理解する必要があります。拡張された開発を通じて、より強力な機能を実現し、プログラムのパフォーマンスを最適化できます。
1. PHPの設計コンセプトと特徴
- マルチプロセス モデル: PHP はマルチプロセス モデルであるため、異なるリクエストは互いに干渉せず、1 つのリクエストの失敗がサービス全体に影響を与えることはありません。もちろん、PHP の時代の発展により。はすでにマルチスレッド モデルをサポートしています。
- 型が弱い言語: C/C++、Java、C#、その他の言語とは異なり、PHP は型が弱い言語です。変数の型は最初は決定されず、暗黙的または明示的な型変換が行われるため、Web 開発では非常に便利で効率的です。詳細については、「変数」で説明します。に詳しく記載されています。
- エンジン (Zend) + コンポーネント (ext) モードは、内部結合を軽減します。
- 中間層 (sapi) は Web サーバーと PHP を分離します。
- 構文はシンプルで柔軟であり、あまり多くの仕様はありません。欠点があるとスタイルが混在しますが、プログラマがどんなに下手でも、突飛すぎて全体の状況を危険にさらすようなプログラムは書きません。
2. PHPの4層システム
PHP のコアアーキテクチャは以下のとおりです:

写真からわかるように、PHP は下から上への 4 層システムです:
- Zend エンジン: Zend は完全に純粋な C で実装されており、PHP のコア部分です。PHP コード (字句解析、構文解析、その他のコンパイル プロセス) を実行可能なオペコード処理に変換し、対応する処理メソッドを実装し、基本的なデータ構造 (次のような) を実装します。 hashtable、oo)、メモリの割り当てと管理、および外部呼び出しに対応する API メソッドの提供がすべての中核であり、すべての周辺機能が Zend を中心に実装されています。
- 拡張機能: Zend エンジンを中心に、拡張機能はコンポーネントベースの方法でさまざまな基本サービスを提供します。一般的な組み込み関数 (配列シリーズなど)、標準ライブラリなどはすべて拡張機能を通じて実装されます。機能拡張やパフォーマンスの最適化などを実現するために、必要に応じて拡張機能を追加します(たとえば、現在 Tieba で使用されている PHP 中間層やリッチテキスト解析などが拡張機能の代表的な適用例です)。
- Sapi: Sapi の正式名は、サーバー アプリケーション プログラミング インターフェイスです。Sapi は、PHP が周辺データと対話できるようにするための一連のフック関数を使用します。これは、PHP の非常にエレガントで成功した設計です。 sapi を使用すると、PHP 自体が上位層のアプリケーションから切り離され、分離されます。PHP は、異なるアプリケーションとの互換性を考慮する必要がなくなり、アプリケーション自体も独自の特性に応じて異なる処理方法を実装できます。
- 上位層アプリケーション: これは、私たちが通常作成する PHP プログラムです。Web サーバーを介して Web アプリケーションを実装したり、コマンド ラインでスクリプト モードで実行したりするなど、さまざまな Sapi メソッドを通じてさまざまなアプリケーション モードを取得できます。
PHP が車だとすると、車のフレームは PHP そのものであり、Zend は車のエンジンであり、Ext の下にあるさまざまなコンポーネントは車の車輪とみなすことができ、車はそう考えることができます。さまざまな種類の道路を走行し、PHP プログラムを実行することで車が道路を走行します。したがって、高性能エンジン + 適切なホイール + 適切なトラックが必要です。
3.サピ
前述したように、Sapi を使用すると、外部アプリケーションが一連のインターフェイスを通じて PHP とデータを交換し、さまざまなアプリケーションの特性に応じて特定の処理メソッドを実装できるようになります。
- apache2handler: これは、Apache を Web サーバーとして使用し、mod_PHP モードで実行する場合の処理方法であり、現在最も広く使用されています。
- cgi: これは、有名な fastcgi プロトコルである Web サーバーと PHP の間の別の直接対話方法であり、近年、fastcgi+PHP がますます使用されており、非同期 Web サーバーでサポートされている唯一の方法でもあります。
- cli: コマンドラインによって呼び出されるアプリケーションモード
まず、PHP コードを実行するプロセスを見てみましょう。

PHP 実行の中核は、オペコードである翻訳された命令です。
オペコードは、PHP プログラム実行の最も基本的な単位です。オペコードは 2 つのパラメータ (op1、op2)、戻り値、および処理関数で構成されます。 PHP プログラムは最終的に、一連のオペコード処理関数の順次実行に変換されます。
いくつかの一般的な処理関数:
1 |
ZEND_ASSIGN_SPEC_CV_CV_HANDLER : 变量分配 ( $a = $b )
|
2 |
ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER:函数调用 |
3 |
ZEND_CONCAT_SPEC_CV_CV_HANDLER:字符串拼接 $a . $b
|
4 |
ZEND_ADD_SPEC_CV_CONST_HANDLER: 加法运算 $a +2
|
5 |
ZEND_IS_EQUAL_SPEC_CV_CONST:判断相等 $a ==1
|
6 |
ZEND_IS_IDENTICAL_SPEC_CV_CONST:判断相等 $a ===1
|
5. ハッシュテーブル — コアデータ構造
HashTable は zend のコア データ構造であり、PHP のほぼすべての一般的な関数を実装するために使用されます。また、関数シンボル テーブルやグローバル変数など、zend 内での一般的なアプリケーションも使用されます。また、ハッシュ テーブルに基づいて実現します。
PHP のハッシュ テーブルには次の機能があります:
- 典型的なキー->値クエリをサポート
- 配列として使用可能
- ノードの追加と削除は O(1) の複雑さです
- キーは混合型をサポートします: 同時に連想数値の組み合わせのインデックス配列があります
- 値は混合型をサポートします: array ("string",2332)
- 線形トラバーサルのサポート: foreach など
Zend ハッシュ テーブルは、典型的なハッシュ テーブルのハッシュ構造を実装し、同時に二重リンク リストを付加することによって配列の順方向および逆方向の走査機能を提供します。その構造は以下に示すとおりです:

ご覧のとおり、ハッシュ テーブルにはキー -> 値の形式のハッシュ構造と二重リンク リスト モードの両方があり、高速検索と線形トラバーサルをサポートするのに非常に便利です。
- ハッシュ構造: Zend のハッシュ構造は典型的なハッシュ テーブル モデルであり、リンク リストを通じて競合を解決します。 Zend のハッシュ テーブルは自己成長するデータ構造であり、ハッシュ テーブルの数がいっぱいになると、動的に 2 倍に拡張され、要素の位置が変更されることに注意してください。初期サイズは8です。さらに、キー->値の高速検索を実行する場合、zend 自体も空間を時間に交換することでプロセスを高速化するいくつかの最適化を行っています。たとえば、変数 nKeyLength は各要素で使用され、キーの長さを識別して迅速に決定します。
- ダブルリンクリスト: Zend ハッシュテーブルは、リンクリスト構造を介した要素の線形走査を実装します。理論的には、走査には一方向リンク リストを使用するだけで十分です。二重リンク リストを使用する主な目的は、迅速に削除して走査を回避することです。 Zend ハッシュ テーブルは複合構造であり、配列として使用すると、一般的な連想配列をサポートし、連続したインデックス番号として使用したり、2 つを混合したりすることもできます。
- PHP 連想配列: 連想配列は典型的な hash_table アプリケーションです。クエリ プロセスは次の手順を実行します (コードからわかるように、これは一般的なハッシュ クエリ プロセスであり、検索を高速化するためにいくつかの素早い判断が追加されています):
01 |
getKeyHashValue h; |
02 |
index = n & nTableMask; |
03 |
Bucket *p = arBucket[index]; |
04 |
while (p) {
|
05 |
if ((p->h == h) && (p->nKeyLength == nKeyLength)) {
|
06 |
RETURN p->data;
|
07 |
}
|
08 |
p=p->next;
|
09 |
} |
10 |
RETURN FALTURE; |
- PHP インデックス配列: インデックス配列は、添え字を通じてアクセスされる共通の配列です。たとえば、$arr[0]、Zend HashTable は内部で正規化され、インデックス タイプのキーにもハッシュ値と nKeyLength (0) が割り当てられます。内部メンバー変数 nNextFreeElement は現在割り当てられている最大 ID であり、プッシュするたびに自動的に 1 ずつ増加します。この正規化プロセスにより、PHP は連想データと非連想データの混合を実現できます。プッシュ操作の特殊性により、PHP 配列内のインデックス キーの順序は添え字のサイズではなく、プッシュの順序によって決まります。たとえば、$arr[1] = 2; $arr[2] = 3; double 型のキーの場合、Zend HashTable はそれらをインデックス キーとして扱います
6.PHP変数
PHP は型付けが弱い言語であり、変数の型を厳密に区別しません。 PHP では、変数を宣言するときに型を指定する必要はありません。 PHP は、プログラムの実行中に変数の型の暗黙的な変換を実行する場合があります。他の厳密に型指定された言語と同様に、プログラム内で明示的な型変換を実行することもできます。 PHP 変数は、単純型 (int、string、bool)、コレクション型 (配列リソース オブジェクト)、および定数 (const) に分類できます。上記の変数はすべて、内部では同じ構造 zval を持ちます。
Zval は Zend のもう 1 つの非常に重要なデータ構造であり、PHP 変数の識別と実装に使用されます。そのデータ構造は次のとおりです。

- type: 変数のタイプを指定します (整数、文字列、配列など)
- refcount&is_ref: 参照カウントの実装に使用されます (詳細は後ほど説明します)
- value: 変数の実際のデータを保存するコア部分
PHP 変数の型と実際のストレージの対応関係は次のとおりです:
1
|
IS_LONG -> lvalue
|
2
|
IS_DOUBLE -> dvalue
|
3
|
IS_ARRAY -> ht
|
4
|
IS_STRING -> str
|
5
|
IS_RESOURCE -> lvalue
|
1 |
$res = $strA . $strB 和 $res = “ $strA $strB ”
|
2 |
这种情况下,zend会重新malloc一块内存并进行相应处理,其速度一般
|
3 |
$strA = $strA . $strB
|
4 |
这种是速度最快的,zend会在当前strA基础上直接relloc,避免重复拷贝
|
5 |
$res = $intA . $intB
|
6 |
这种速度较慢,因为需要做隐式的格式转换,实际编写程序中也应该注意尽量避免
|
7 |
$strA = sprintf (“%s%s”, $strA . $strB );
|
8 |
这会是最慢的一种方式,因为sprintf在PHP中并不是一个语言结构,本身对于格式识别和处理就需要耗费比较多时间,另外本身机制也是malloc。不过sprintf的方式最具可读性,实际中可以根据具体情况灵活选择。 |
PHP 配列は、Zend HashTable を通じて自然に実装されます。
foreach操作を実装するには?配列の Foreach は、ハッシュテーブル内の二重リンク リストを走査することによって完了します。インデックス配列の場合、foreach を介した走査は for よりもはるかに効率的であり、キー→値を検索する必要がなくなります。 count オペレーションは、HashTable->NumOfElements, O(1) オペレーションを直接呼び出します。 「123」のような文字列の場合、zend はそれを整数形式に変換します。 $arr[‘123’] と $arr[123] は同等です
リソースタイプ変数は、PHP で最も複雑な変数であり、複合構造でもあります。
PHP の zval は幅広いデータ型を表すことができますが、カスタム データ型を完全に記述することは困難です。これらの複合構造を表現する効率的な方法がないため、それらに対して従来の演算子を使用する方法はありません。この問題を解決するには、リソースと呼ばれる本質的に任意の識別子 (ラベル) を介してポインターを参照するだけで済みます。
zval では、リソースの場合、lval はリソースのアドレスを直接指すポインターとして使用されます。リソースは任意の複合構造にすることができます。よく知られている mysqli、fsock、memcached などはすべてリソースです。
リソースの使用方法:
- 登録: カスタム データ型の場合、それをリソースとして使用します。まず、これを登録する必要があります。そうすれば、zend はそれにグローバルに一意の識別子を割り当てます。
- リソース変数の取得: リソースに関して、zend は実際のデータの id->hash_tale を維持します。リソースの場合、その ID のみが zval に記録されます。フェッチするときは、id を通じて hash_table 内の特定の値を検索し、それを返します。
- リソースの破壊: リソースのデータ型は多様です。 Zend 自体にはそれを破壊する方法はありません。したがって、ユーザーはリソースを登録する際に破棄機能を提供する必要があります。リソースの設定が解除されると、zend は対応する関数を呼び出して破棄を完了します。グローバルリソーステーブルからも削除してください。
リソースは、それを参照しているすべての変数がスコープ外になった後だけでなく、リクエストが終了して新しいリクエストが生成された後でも、長期間存続することができます。これらのリソースは、特に破棄されない限り、SAPI のライフサイクル全体にわたって存続するため、永続リソースと呼ばれます。多くの場合、永続リソースによりパフォーマンスがある程度向上します。たとえば、一般的な mysql_pconnect では、永続リソースは pemalloc を通じてメモリを割り当て、リクエストが終了しても解放されないようにします。 zend の場合、この 2 つ自体には区別がありません。
ローカル変数とグローバル変数は PHP でどのように実装されますか?リクエストの場合、PHP はいつでも 2 つのシンボル テーブル (symbol_table と active_symbol_table) を参照でき、前者はグローバル変数を維持するために使用されます。後者は、現在アクティブな変数シンボル テーブルを指すポインターです。プログラムが関数に入ると、zend はシンボル テーブル x をそれに割り当て、active_symbol_table を a に指します。このようにして、グローバル変数とローカル変数の区別が行われます。
変数値の取得: PHP のシンボル テーブルは hash_table を通じて実装され、取得時に対応する zval がテーブルから検索され、識別子に従って返されます。
関数でグローバル変数を使用する: 関数では、明示的に global を宣言することでグローバル変数を使用できます。 active_symbol_tableのsymbol_tableに同じ名前の変数への参照を作成します。symbol_tableに同じ名前の変数が存在しない場合は、それが最初に作成されます。

TooptimizePHPcodeforreducedmemoryusageandexecutiontime,followthesesteps:1)Usereferencesinsteadofcopyinglargedatastructurestoreducememoryconsumption.2)LeveragePHP'sbuilt-infunctionslikearray_mapforfasterexecution.3)Implementcachingmechanisms,suchasAPC

PhpisusedForsedingEmailsDueToitsIttegration withServerMailServicesAndExternalSmtpproviders、自動化とMarketingCampaign.1)SetupYourphpenvironment withebeBironment witheBiserverandphp、保証

メールを送信する最良の方法は、PHPMailerライブラリを使用することです。 1)Mail()関数を使用することはシンプルですが信頼できないため、電子メールがスパムを入力するか、配信できない場合があります。 2)PHPMailerは、より良い制御と信頼性を提供し、HTMLメール、添付ファイル、SMTP認証をサポートします。 3)SMTP設定が正しく構成されていることを確認し、暗号化(StartTLSやSSL/TLSなど)を使用してセキュリティを強化します。 4)大量の電子メールについては、メールキューシステムを使用してパフォーマンスを最適化することを検討してください。

customedersandaddadvancedfeaturesinphpemailentalitylivainability.1)customederadddetadata fortrackingandcategorization.2)htmLemailsallowStingtintintintintintinteractivity.3)添付物質の添付物質の添付

PHPとSMTPを使用してメールを送信することは、PHPMailerライブラリを介して実現できます。 1)PHPMailerをインストールして構成する、2)SMTPサーバーの詳細を設定する、3)電子メールコンテンツを定義し、4)メールを送信してエラーを処理します。この方法を使用して、電子メールの信頼性とセキュリティを確保します。

BestappRoachforseminginphpisusingthephpmailerlibrarydueToitsReliability、featurrichness、andeaseofuse.phpmailerSupportssmtpは、detairederorhandlingを提供します

依存関係注射(DI)を使用する理由は、コードのゆるい結合、テスト可能性、および保守性を促進するためです。 1)コンストラクターを使用して依存関係を注入します。2)サービスロケーターの使用を避け、3)依存関係噴射コンテナを使用して依存関係を管理する、4)依存関係を注入することでテスト可能性を向上させる、5)注入依存性を回避、6)パフォーマンスに対するDIの影響を考慮します。

phpperformancetuningisucial cuseenhancess andandandadsand。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

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

WebStorm Mac版
便利なJavaScript開発ツール

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