【転送】PHP実行処理、PHP拡張機能ロード処理
今後 PHP 拡張機能を開発するには、PHP の実行シーケンスを理解する必要があります。この記事は、C で PHP 拡張機能を開発するための道を開くことを目的としています。
PHP をコンパイルするときは、Web 環境が Apache であることを前提としています。 、Apache に PHP をサポートさせるために、mod_php5.so モジュールを生成します。Apache はこのモジュールをロードします...
.php ファイルが URL でアクセスされると、mod_php5.so モジュールに転送されます。これは何ですか... よくあることです。 SAPI
英語名は、Server abstraction APIです。
SAPIは、実際には、ISAPI、CLI SAPI、CGIなどがある総称です。
それには、たとえば、APACHE、IIS、CGI などと簡単に対話できます。
さて、本題に戻ります。
Apache が起動すると、Apache ではない mod_pho5.so モジュールのフック ハンドラーが登録されます。今日は主人公なので詳細は説明しません。
アクセスされた URL が php ファイルであることを APACHE が検出すると、この時点で制御が sapi に渡されます。
sapi に入った後、 sapi/apache/mod_php5.c ファイルの php_init_handler 関数が最初に実行されます
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 ... void *) shutdown_for_exec);
if (!apache_php_initialized) {
tsrm_startup(1, 1、0、NULL); (&apache_sapi_module);
}
}
#endif
}
この関数は主に 2 つの関数を呼び出します
sapi_startup(&apache_sapi_module);php_apache_startup( &apache_sapi_module);
1
2
3
4
5
6
7
8
9
10
11
1213
14
15
SAPI_API void sapi_startup(sapi_module_struct *sf)
{
sf->ini_entries = NULL;
sapi_module = *sf;
...................
sapi_globals_ctor(&sapi_globals);
......
virtual_cwd_startup(); /* shutdown を使用してメイン cwd を解放することもできますが、CGI の速度が低下するだけです */
..................
reentrancy_startup() ;
}
sapi_startup创建一sapi_globals_struct構造体.
sapi_globals_struct保存apache请要求の基本情報、服务器情報、ヘッダー、编码など
1
2
3
4
5
6
static void sapi_globals_ctor(sapi_globals_struct *sapi_globals TSRMLS_DC)
{
memset (sapi_globals, 0, sizeof (*sapi_globals));
zend_hash_init_ex(&sapi_globals->known_post_content_types, 5, NULL, NULL, 1, 0);
php_setup_sapi_content_types(TSRMLS_C);
}
known_post_content_types は 1 つの HashTable、将その大小初期化は 5 です。 _setup_sapi_content_types関数数sapi_post_entryをsapi_globals里に追加
sapi_startup実行完了後に再実行php_apache_startup
1
2
3
4
5
6
7
8
static int php_apache_startup(sapi_module_struct *sapi_module)
{
if ( php_module_startup(sapi_module, &apache_module_entry, 1) == FAILURE) {
return FAILURE;
} else {
成功を返します。
}
}
php_module_startup には内容が多すぎます。
1. zend_utility_functions 構造体を初期化します。この構造体は、エラー処理関数、出力関数、ストリーム操作関数などを設定します。
3. php.ini 設定をロードします。
4. PHP 組み込み拡張機能をロードします。
6. PHP 内部関数セットを登録します。
7. すべての外部拡張機能をロードします。拡張機能
9. クリーンアップ操作
3、4、7、8 に焦点を当てます
php.ini 設定をロードします
if (php_init_config(TSRMLS_C) == FAILURE) {return FAILURE;}
php_init_config 関数はすべてをチェックしますphp の ini 設定を実行し、ロードされたすべてのモジュールを見つけて php_extension_lists 構造体に追加します。
PHP 組み込み拡張機能をロードします
zend_register_standard_ini_entries を呼び出して、配列、mysql などのすべての PHP 組み込み拡張機能をロードします php_ini_register_extensions を呼び出して、すべての外部拡張機能をロードします
main/php_ini.c
2
3
4
5
6
7
8
void php_ini_register_extensions(TSRMLS_D)
{
php_load_zend_exテンション_cb TSRMLS_CC);
zend_llist_apply(&extension_lists.functions, php_load_php_extension_cb TSRMLS_CC);
zend_llist_destroy(&extension_lists.functions);}
zend_llist_apply 関数は extension_lists 実行会議を走査します。関数 php_load_php_extension_cb
php_load_php_extension_cb
1 2
3
static void php_load_zend_ex_cb( voidtension *arg TS RMLS_DC)
{
zend_load_extension(*(( char **) arg));
}
拡張機能をロードするには ext/standard/dl.c zend_load_extension を呼び出します。
この関数はスキップされます。この関数は最後に
if ((module_entry = zend_register_module_ex(module_entry TSRMLS_CC)) == NULL を呼び出します) {DL_UNLOAD (ハンドル);
return FAILURE;}拡張情報をハッシュテーブル module_registry に入れるZend/zend_API.c
1
2
3
5
の場合(zend_hash_add( & module_regization, LCName, name_len+1, (void *) module, sizeof (zend_module_entry), (void **) & module_ptr) {
(E_CORE_W Arning, "モジュール '%s' はすでにロードされています) ", module-& gt ;name);
efree(lcname); _C); // モジュールを並べ替えて、モジュールに登録されているかどうかを確認します_registry HASH テーブル
zend_startup_extensions () // 拡張機能の実行 -> スタートアップ(拡張機能);拡張機能を開始します...

ホット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)

ホットトピック











多くの場合、キーワードと追跡パラメーターで散らかった長いURLは、訪問者を阻止できます。 URL短縮スクリプトはソリューションを提供し、ソーシャルメディアやその他のプラットフォームに最適な簡潔なリンクを作成します。 これらのスクリプトは、個々のWebサイトにとって価値があります

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

これは、LaravelバックエンドとのReactアプリケーションの構築に関するシリーズの2番目と最終部分です。シリーズの最初の部分では、基本的な製品上場アプリケーションのためにLaravelを使用してRESTFUL APIを作成しました。このチュートリアルでは、開発者になります

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

2025 PHP Landscape Surveyは、現在のPHP開発動向を調査しています。 開発者や企業に洞察を提供することを目的とした、フレームワークの使用、展開方法、および課題を調査します。 この調査では、現代のPHP Versioの成長が予想されています

この記事では、Laravel Webフレームワークの通知システムを検討します。 Laravelの通知システムを使用すると、さまざまなチャネルでユーザーに通知を送信できます。今日は、通知ovを送信する方法について説明します
