私は以前に .net と Java の開発を行ったことがあり、いくつかの PHP Web サイトも書いたことがあります。3 つの主要なプログラミング言語すべてに触れてきたようです。しかし、プログラミングプロセス全体、特に基礎となるメカニズムについての全体的な理解が不足していると感じることが増えてきました。たとえば、ネットワーク プログラミング、コンパイルの原則、サーバー側、データベース ストレージ エンジンの原則などです。そこで私はいくつかの本を読みました。古典的なものには、apue、unp、tcp/ip、nginx、mysql の innodb ストレージ エンジンが含まれており、jvm について深く理解しています。開発にどのような言語が使用されても、その背後には Linux、シェル、C/C++、nginx サーバー、mysql が存在することが徐々にわかりました。おそらく、これらの核となる原則を習得することによってのみ、プログラマーは核となる競争力を持つことができます。
BAT のバックエンド部分はこれらのコア技術と切り離せないものですが、フロントエンド (ビジネス ロジック層) は異なります。たとえば、淘宝網は主に Java を使用し、百度は主に PHP を使用します。 Tencent はツールを管理するグループであり、主に C/C++ テクノロジーを使用しています。 Tencent の主な製品は、Windows 上のさまざまなクライアント (QQ、インプット メソッド、音楽...最も重要なのはゲーム) とサーバーです。比較的言えば、Web 製品は比較的少数です (QQ Space、Friends Network など)。これらの Web 製品は比較的成熟しており、改良はたまにしか行われません。新しい製品が登場しない限り、人材の需要は大きくありません。
機械学習とビッグデータマイニングの分野における人材の需要は現在比較的強いようですが、関連テクノロジーは依然として Linux と JVM 上に構築される必要があります。一部の企業では Java 人材の需要がさらに高まるでしょう。
C 言語のコンパイルと接続のプロセス、JVM での Java の実行メカニズムを理解したところで、PHP の実行プロセス、メカニズム、原理について突然興味が湧きました。いくつかのブログを見つけて、大まかなアイデアを掴みました。まずそれを下に置きます:
PHP の基本的な動作原理
はじめに
以下のプロセスを見てみましょう:
-
PHP 関連のプロセスを手動で開始したことはありません。PHP は Apache の起動とともに実行されます。PHP は mod_php5.so モジュール (具体的には、SAPI、サーバー アプリケーション プログラミング インターフェイス) を通じて Apache に接続されます。PHP には合計 3 つのモジュールがあります。 、Zend エンジン、および拡張レイヤーは、リクエスト、ファイル ストリーム、エラー処理、およびその他の関連操作を処理するために使用されます。Zend エンジン (ZE) は、ソース ファイルをマシン言語に変換して仮想マシン上で実行するために使用されます。拡張層は、PHP が特定の操作を実行するために使用する関数、ライブラリ、およびストリームのセットです。たとえば、MySQL データベースに接続するには mysql 拡張機能が必要ですが、ZE がプログラムを実行するときに、いくつかの拡張機能に接続する必要がある場合があります。このとき、ZE は制御を拡張機能に渡し、特定のタスクの処理後に制御を返します。 ; 最後に、ZE はプログラムの実行結果を PHP カーネルに返し、PHP カーネルはその結果を SAPI 層に送信し、最終的にブラウザに出力します。
詳しく見る
待ってください、それはそれほど単純ではありません。上記のプロセスは単なる簡略化されたバージョンです。舞台裏で他に何が起こっているのかをもう少し詳しく見てみましょう。
-
Apache が開始されると、PHP インタープリターも開始されます。PHP の開始プロセスには 2 つのステップがあります。最初のステップは、SAPI ライフサイクル全体にわたって有効となるいくつかの環境変数を初期化することです。いくつかの変数が設定されています。
PHPを始める第一歩
最初のステップと 2 番目のステップが何かわからない場合は、心配しないでください。これについては次に詳しく説明します。まず、最初の最も重要なステップを見てみましょう。覚えておくべきことは、操作の最初のステップはリクエストが到着する前に行われるということです。
-
Apache を起動すると、PHP インタープリタも起動し、PHP は各拡張機能の MINIT メソッドを呼び出して、これらの拡張機能を使用可能な状態に切り替えます。 php.ini ファイルでどのような拡張子が開かれているかを確認してください。MINIT は「モジュールの初期化」を意味します。各モジュールは、他のリクエストを処理するための一連の関数、クラス ライブラリなどを定義します。
典型的な MINIT メソッドは次のとおりです:
PHP_MINIT_FUNCTION(拡張機能名){
/* 関数、クラスなどを初期化します */
}
PHP起動ステップ2
-
ページリクエストが発生すると、SAPI レイヤーは制御を PHP レイヤーに引き渡します。したがって、PHP は、このリクエストに応答するために必要な環境変数を設定します。同時に、実行中に生成された変数名と値を保存する変数テーブルも作成します。 PHP は各モジュールの RINIT メソッド、つまり「リクエストの初期化」を呼び出します。典型的な例はセッション モジュールの RINIT です。セッション モジュールが php.ini で有効になっている場合、$_SESSION 変数は初期化され、モジュールの RINIT メソッドが呼び出されたときに関連するコンテンツが読み込まれます。準備プロセスはプログラムの実行の間に自動的に開始されます。
典型的な RINIT メソッドは次のとおりです:
PHP_RINIT_FUNCTION(拡張機能名) {
/* セッション変数の初期化、変数の事前設定、グローバル変数の再定義など */
}
PHP を閉じるための最初のステップ
PHP の起動と同様に、PHP のシャットダウンも 2 つのステップに分かれています:
-
ページが実行されると (ファイルの最後に到達するか、exit または die 関数で終了するかに関係なく)、PHP はクリーンアップ プロセスを開始します。各モジュールの RSHUTDOWN メソッドを順番に呼び出します。 RSHUTDOWN は、プログラムの実行中に生成されたシンボル テーブルをクリアする、つまり各変数の unset 関数を呼び出すために使用されます。
一般的な RSHUTDOWN メソッドは次のとおりです:
PHP_RSHUTDOWN_FUNCTION(拡張機能名) {
/* メモリ管理を行い、最後の PHP 呼び出しなどで使用されたすべての変数の設定を解除します */
}
PHP ステップ 2 を閉じる
最後に、すべてのリクエストが処理され、SAPI を閉じる準備が整い、PHP が 2 番目のステップの実行を開始します。
-
一般的な RSHUTDOWN メソッドは次のとおりです:
PHP_MSHUTDOWN_FUNCTION(拡張機能名) {
/* 空きハンドラーや永続メモリなど */
}
このようにして、PHP のライフサイクル全体が終了します。 「開始ステップ 1」と「終了ステップ 2」は、サーバーからの要求がない場合にのみ実行されることに注意してください。
以下にいくつかの図を使って説明します。
PHP の基本的な動作原理
写真からもわかるように、PHPは下から上まで4層構造になっています
①ゼンドエンジン
Zend は完全に純粋な C で実装されており、PHP コード (字句解析や構文解析などの一連のコンパイル プロセス) を実行可能なオペコード処理に変換し、対応する処理メソッドを実装し、基本的なデータ構造 (ハッシュテーブルなど) を実装します。 、oo)、メモリの割り当てと管理、および外部呼び出しに対応する API メソッドを提供します。これはすべての周辺機能が zend を中心に実装されています。
②拡張機能
zend エンジンを中心に、拡張機能はコンポーネントベースの方法でさまざまな基本サービスを提供します。一般的なさまざまな組み込み関数 (配列シリーズなど) や標準ライブラリなどはすべて拡張機能を通じて実装されます。機能拡張やパフォーマンスの最適化などを実現します(例えば、現在 Tieba で使用されている PHP 中間層やリッチテキスト解析などが拡張の代表的な応用例です)。
③サピ
Sapi の正式名はサーバー アプリケーション プログラミング インターフェイスであり、Sapi は PHP 自体の非常にエレガントで成功した設計です。上位層のアプリケーションは分離され、分離されます。PHP は異なるアプリケーションとの互換性を考慮できなくなり、アプリケーション自体も独自の特性に応じて異なる処理方法を実装できます。後ほどサピ編で紹介します
④上位層アプリケーション
これは、私たちが通常作成する PHP プログラムです。Web サーバーを介して Web アプリケーションを実装したり、コマンド ラインでスクリプト モードで実行したりするなど、さまざまな Sapi メソッドを通じてさまざまなアプリケーション モードを取得できます。
建築思想:
エンジン(Zend)+コンポーネント(ext)モデルにより内部結合を軽減中間層 (sapi) は Web サーバーと php
を分離します
************************************************* * ************************php を車に例えると、
車のフレームワークはphpそのもの
Zend は車のエンジンです
Ext の下にあるさまざまなコンポーネントは車の車輪です
サピは道路に見立てられ、車はさまざまな種類の道路を走行できます
PHP プログラムの実行は、道路を走る車のようなものです。
したがって、次のものが必要です: 優れたエンジン + 適切な車輪 + 正しい滑走路
Apacheとphpの関係
Apache による php の解析は、多くのモジュールの中の php モジュールを通じて完了します。
インストールしたバージョンが Apache2 と Php5 であると仮定すると、Apache のメイン設定ファイル http.conf を編集し、次の行を追加する必要があります。
Unix/Linux 環境の場合:
LoadModule php5_module modules/mod_php5.so
AddType application/x-httpd-php .php
注: modules/mod_php5.so は、X システム環境における mod_php5.so ファイルのインストール場所です。
Windows環境の場合:
LoadModule php5_module d:/php/php5apache2.dll
AddType application/x-httpd-php .php
注: d:/php/php5apache2.dll は、Windows 環境における php5apache2.dll ファイルのインストール場所です。
これら 2 つの構成は、接尾辞が php である今後受信する URL ユーザー リクエストは、処理のために php5_module モジュール (mod_php5.so/php5apache2.dll) を呼び出す必要があることを Apache サーバーに伝えます。
Apache ライフサイクル
Apachのリクエスト処理プロセス
Apacheリクエスト処理ループの詳細説明
Apache リクエスト処理サイクルの 11 段階は何を行うのでしょうか? (これらの 11 のステージは、nginx の 11 の処理ステージに対応しますか? 7mz19O1xLXa0ru49r3Xts6ho7bU09rEx9Cpz+u63NTnvfjI67SmwO3H68fztcTEo7/pw LTLtaOs1eK49r3Xts6/ydLUsbvA+9PDoaM8L3A+CjxwPgogICAgMqGiVVJJIFRyYW5zbGF 0 aW9uvde2ziA8YnI+CiAgICBBcGFjaGXU2rG+vde2zrXE1vfSqrmk1/ejur2rx+vH87XEVV JM07PJ5LW9sb612M7EvP7Ptc2zoaPEo7/pv8nS1NTa1eK917bOsuXI67mz19OjrNa00NDX1 Ly6tcTTs8nkwt+ 8raGjbW9kX2FsaWFzvs3Kx8D708PV4rj2vde2zrmk1/e1xKGjPC9wPgo8cD4KICAgIDOhokhlYWRlciBQYXJzaW5nvde2ziA8YnI+CiAgICBBcGFjaGXU2rG+vde2zrXE1vfSqrmk 1/ejurzssunH6 8fztcTNt7K/oaPTydPaxKO/6b/J0tTU2sfrx/O0psDtwfezzLXEyM66ztK7uPa148nP1rTQ0 mlmvs3Kx8D708PV4rj2vde2zrmk1/e1xKGjPC9wPgo8cD4KICAgIDShokFj Y2VzcyBDb250cm9svde2ziA8YnI+CiagICBBcGFjaGXU2rG+vde2zrXE1vfSqrmk1/ejurj5vt3F5NbDzsS8/rzs sunKx7fx1MrQ7bfDzsrH68fztcTXytS0oaNBcGFjaGW1xLHq17zC37ytyrX P1sHL1MrQ7brNvty++Na4we6ho21vZF9hdXRoel9ob3N0vs3Kx8D708PV4rj2vde2zrmk1/e1xKGjPC9wPgo8cD4 KICAgIDWhokF1dGhlbnRpY2F0aW9uvde2ziA8YnI+CiAgICAgQXBhY2hl1Nqxvr3Xts 61xNb30qq5pNf3o7qwtNXVxeTWw87EvP7J6LaotcSy38LUttTTw7unvfjQ0MjP1qSjrLKiyei2qNPDu 6fD+8f40/Kho8Sjv+m/ydLU1NrV4r3Xts6y5cjrubPX06OsyrXP1tK7uPbIz 9akt723qKGj PC9wPgo8cD4KICAgIDahokF1dGhvcml6YXRpb26917bOIDxicj4KICAgIEFwYWNoZdTasb69 17bOtcTW99KquaTX96O6uPm +3cXk1sPOxLz+vOyy6crHt/HUytDtyM/WpLn9tcTTw7un1rTQ0Mfrx /O1xLLZ1/eho8Sjv+m/ydLU1NrV4r3Xts6y5cjrubPX06OsyrXP1tK7uPbTw7unyKjP3rncwO21xLe9t6ihozwvcD4KPHA+CiAgICA3oaJNSU1FIFR5cGUgQ2hlY2tpbme917bOIDxicj4KICAgIEFwYWNoZdTasb6917bOtcTW99KquaTX96O6uPm+3cfrx/PXytS0tcRNSU1FwODQzbXEz+C52Lnm1PKjrMXQtqi9q9KqyrnTw7XExNrI3bSmwO26r8r9oaOx6te8xKO/6W1vZF9uZWdvdGlhdGlvbrrNbW9kX21pbWXKtc/WwcvV4rj2ubPX06GjPC9wPgo8cD4KICAgIDihokZpeFVwvde2ziA8YnI+CiAgICDV4srH0ru49s2o08O1xL3Xts6jrNTK0O3Eo7/p1NrE2sjdyfqzycb31q7HsKOs1MvQ0MjOus6x2NKqtcS0psDtwfezzKGjus1Qb3N0X1JlYWRfUmVxdWVzdMDgJiMyMDI4NDujrNXiysfSu7j2xNy5u7K2u/HIzrrO0MXPorXEubPX06Os0rLKx9fus6PKudPDtcS5s9fToaM8L3A+CjxwPgogICAgOaGiUmVzcG9uc2W917bOIDxicj4KICAgIEFwYWNoZdTasb6917bOtcTW99KquaTX96O6yfqzybe1u9i/zbuntsu1xMTayN2jrLi61PC4+L/Nu6e2y7eiy83Su7j2x6G1sbXEu9i4tKGj1eK49r3Xts7Kx9X7uPa0psDtwfezzLXEusvQxLK/t9ahozwvcD4KPHA+CiAgICAxMKGiTG9nZ2luZ73Xts4gPGJyPgogICAgQXBhY2hl1Nqxvr3Xts61xNb30qq5pNf3o7rU2rvYuLTS0b6tt6LLzbj4v827p7bL1q6687zHwrzKws7xoaPEo7/pv8nE3NDeuMS78tXfzOa7u0FwYWNoZbXEserXvMjV1r68x8K8oaM8L3A+CjxwPgoxMaGiQ2xlYW5VcL3Xts4gPGJyPgogICAgQXBhY2hl1Nqxvr3Xts61xNb30qq5pNf3o7rH5cDtsb60zsfrx /PKws7xtKbA7c3qs8nWrrrz0sXB9LXEu7e+s6OsscjI587EvP6hosS/wry1xLSmwO278tXfU29ja2V0tcS52LHVtci1yKOs1eLKx0FwYWNoZdK7tM7H68fztKbA7bXE1+668 9K7uPa917bOoaM8L3A +CjxwPgo8c3Ryb25nPkxBTVC83Lm5o7o8L3N0cm9uZz48L3A+CjxwPgo8aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20140607/201406070911023 27.gif" alt=" b簗 ﹊萟?璅裣i啔a篧conf? {鷌?*??sNa pull?'睝_椐鷌荒铻 Yu?凓i僃i?耉谖y?m4簖喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">html
王興斌のブログ http://blog.csdn.net/wanghao72214/article/details/3916825

去年12月1日,OpenAI推出人工智能聊天原型ChatGPT,再次赚足眼球,为AI界引发了类似AIGC让艺术家失业的大讨论。ChatGPT是一种专注于对话生成的语言模型。它能够根据用户的文本输入,产生相应的智能回答。这个回答可以是简短的词语,也可以是长篇大论。其中GPT是GenerativePre-trainedTransformer(生成型预训练变换模型)的缩写。通过学习大量现成文本和对话集合(例如Wiki),ChatGPT能够像人类那样即时对话,流畅的回答各种问题。(当然回答速度比人还是

深入解析MySQLMVCC原理与实现MySQL是目前最流行的关系型数据库管理系统之一,它提供了多版本并发控制(MultiversionConcurrencyControl,MVCC)机制来支持高效并发处理。MVCC是一种在数据库中处理并发事务的方法,可以提供高并发和隔离性。本文将深入解析MySQLMVCC的原理与实现,并结合代码示例进行说明。一、M

解读Struts2框架的原理及实现方式引言:Struts2作为一种流行的MVC(Model-View-Controller)框架,被广泛应用于JavaWeb开发中。它提供了一种将Web层与业务逻辑层分离的方式,并且具有灵活性和可扩展性。本文将介绍Struts2框架的基本原理和实现方式,同时提供一些具体的代码示例来帮助读者更好地理解该框架。一、框架原理:St

ChatGPT 无疑是最近网络中最靓的仔,小汪哥通过这段时间的使用,加上对一些资料的查阅,了解了一些背后的原理,试图讲解一下ChatGPT应用的底层原理。如果有不正确的地方,欢迎指正。阅读本文可能为会你解答以下问题:为什么有的ChatGPT 收费,有的不收费?为什么ChatGPT是一个字一个字地回答的?为什么中文问题的答案有时候让人啼笑皆非?为什么你问它今天是几号,它的回答是过去的某个时间?为什么有的问题会拒绝回答?“ChatGPT 国内版” 运行原理随着ChatGPT的爆火,出现了很多国内版,

深入理解Java反射机制的原理与应用一、反射机制的概念与原理反射机制是指在程序运行时动态地获取类的信息、访问和操作类的成员(属性、方法、构造方法等)的能力。通过反射机制,我们可以在程序运行时动态地创建对象、调用方法和访问属性,而不需要在编译时知道类的具体信息。反射机制的核心是java.lang.reflect包中的类和接口。其中,Class类代表一个类的字节

深入理解Maven生命周期的作用与原理Maven是一款非常流行的项目管理工具,它使用一种灵活的构建模型来管理项目的构建、测试和部署等任务。Maven的核心概念之一就是生命周期(Lifecycle),它定义了一系列阶段(Phase)和每个阶段的目标(Goal),帮助开发人员和构建工具按照预定的顺序执行相关操作。Maven的生命周期主要分为三套:Clean生命周

PHP邮件队列系统的原理和实现方式是什么?随着互联网的发展,电子邮件已经成为人们日常生活和工作中必不可少的通信方式之一。然而,随着业务的增长和用户数量的增加,直接发送电子邮件可能会导致服务器性能下降、邮件发送失败等问题。为了解决这个问题,可以使用邮件队列系统来通过串行队列的方式发送和管理电子邮件。邮件队列系统的实现原理如下:邮件入队列当需要发送邮件时,不再直

了解PHP底层开发原理:基础知识和概念介绍作为一名PHP开发者,了解PHP底层开发原理是非常重要的。正因为如此,本文将介绍PHP底层开发的基础知识和概念,帮助读者更好地理解和应用PHP。一、什么是PHP?PHP(全称:HypertextPreprocessor)是一门开源的脚本语言,主要用于Web开发。它可以嵌入到HTML文档中,通过服务器解释执行,并生成


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

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

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

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

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

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ホットトピック



