目次
[转]PHP的执行流程,PHP扩展加载过程,php加载
ホームページ php教程 php手册 [转]PHP的执行流程,PHP扩展加载过程,php加载

[转]PHP的执行流程,PHP扩展加载过程,php加载

Jun 13, 2016 am 08:40 AM
mac

[转]PHP的执行流程,PHP扩展加载过程,php加载

原文:http://www.imsiren.com/archives/535

为了以后能开发PHP扩展..就一定要了解PHP的执行顺序..这篇文章就是为C开发PHP扩展做铺垫.
web环境 我们假设为 apache.
在编译PHP的时候,为了能够让Apache支持PHP,我们会生成一个mod_php5.so的模块.apache加载这个模块..
在url访问.php文件的时候就会转给mod_php5.so模块来处理.这个玩意是什么..就是我们常说的SAPI
英文名字是:Server abstraction API.
SAPI说的其实是一个统称,其下有 ISAPI,CLI SAPI, CGI等.
有了它,就可以很容易的跟其他东西交互.比如APACHE,IIS,CGI等.
好了回到正题.
apache启动后会将mod_pho5.so模块的hook handler注册进来.apache今天不是主角,所以不细说.
当APACHE检测到 访问的url是一个php文件时,这时候就会把控制权交给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 20 static void php_init_handler(server_rec *s, pool *p) {         register_cleanup(p, NULL, (void (*)(void *))apache_php_module_shutdown_wrapper, (void (*)(void *))php_module_shutdown_for_exec);         if (!apache_php_initialized) {                 apache_php_initialized = 1; #ifdef ZTS                 tsrm_startup(1, 1, 0, NULL); #endif                 sapi_startup(&apache_sapi_module);                 php_apache_startup(&apache_sapi_module);         } #if MODULE_MAGIC_NUMBER >= 19980527         {                 TSRMLS_FETCH();                 if (PG(expose_php)) {                         ap_add_version_component("PHP/" PHP_VERSION);                 }         } #endif }

该函数主要调用 两个函数
sapi_startup(&apache_sapi_module);
php_apache_startup(&apache_sapi_module);

1 2 3 4 5 6 7 8 9 10 11 12 13 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(); /* Could use shutdown to free the main cwd but it would just slow it down for CGI */   ..................           reentrancy_startup(); }

sapi_startup创建一个 sapi_globals_struct结构体.
sapi_globals_struct保存了apache请求的基本信息,如服务器信息,header,编码等.

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是一个HashTable,将其大小初始化为5.从字面意义上我猜测它保存的应该是客户端传递过来的内容类型.
php_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 {                 return SUCCESS;         } }

php_module_startup 内容太多..是介绍一下作用.
1. 初始化zend_utility_functions 结构.这个结构是设置zend的函数指针,比如错误处理函数,输出函数,流操作函数等.
2. 设置环境变量.
3. 加载php.ini配置.
4. 加载php内置扩展.
5. 写日志.
6. 注册php内部函数集.
7. 调用 php_ini_register_extensions,加载所有外部扩展
8. 开启所有扩展
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加载所有php的内置扩展,如array,mysql等.
调用 php_ini_register_extensions,加载所有外部扩展
main/php_ini.c

1 2 3 4 5 6 7 8 void php_ini_register_extensions(TSRMLS_D) {         zend_llist_apply(&extension_lists.engine, php_load_zend_extension_cb TSRMLS_CC);         zend_llist_apply(&extension_lists.functions, php_load_php_extension_cb TSRMLS_CC);           zend_llist_destroy(&extension_lists.engine);         zend_llist_destroy(&extension_lists.functions); }

zend_llist_apply函数遍历extension_lists 执行会掉函数 php_load_php_extension_cb
php_load_php_extension_cb

1 2 3 4 static void php_load_zend_extension_cb(void *arg TSRMLS_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(handle);
return FAILURE;
}
将 扩展信息 放到 Hash表module_registry中
Zend/zend_API.c

1 2 3 4 5 if (zend_hash_add(&module_registry, lcname, name_len+1, (void *)module, sizeof(zend_module_entry), (void**)&module_ptr)==FAILURE) {                 zend_error(E_CORE_WARNING, "Module '%s' already loaded", module->name);                 efree(lcname);                 return NULL; }

最后
zend_startup_modules(TSRMLS_C); //对模块进行排序,并检测是否注册到module_registry HASH表里

zend_startup_extensions(); //执行extension->startup(extension);启动扩展…

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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)

Macのキーボードでパスワードを入力しても反応がありませんか? Macのキーボードでパスワードを入力しても反応がありませんか? Feb 20, 2024 pm 01:33 PM

はじめに: このウェブサイトでは、Mac のキーボードがパスワードを入力しても反応しないことに関する関連コンテンツを紹介しますので、お役に立てれば幸いです。 Apple Mac システムでパスワードを入力できない問題を解決するにはどうすればよいですか? このキーボードを他のコンピュータに接続して、正常に動作するかどうかを確認することもできます。別のコンピューターでも同じ問題が発生する場合は、キーボード自体に問題がある可能性が高くなります。キーボードを交換するか修理することを検討してください。 Mac コンピュータで初めて Alipay にログインすると、ログイン インターフェイスが表示され、パスワードを入力できません。パスワード入力フィールドには「コントロールをインストールするにはここをクリックしてください」と表示されるため、Alipay ログインにはセキュリティ コントロールのインストールが必要です。セキュリティ制御により、入力した情報 (金額、パスワードなど) を暗号化して保護し、アカウントのセキュリティを向上させることができます。ネクタイ

Mac コンピュータ名、ホスト名、Bonjour 名を簡単にカスタマイズするための 3 つのヒント Mac コンピュータ名、ホスト名、Bonjour 名を簡単にカスタマイズするための 3 つのヒント Mar 06, 2024 pm 12:20 PM

多くの Mac ユーザーはデバイスのデフォルト名をそのまま使用する傾向があり、それを変更することを決して考えないかもしれません。多くの人は、「Johnny's MacBook Air」または単に「iMac」など、初期設定の名前をそのまま使用することを選択します。 Mac の名前を変更する方法を学ぶことは、特に複数のデバイスを持っている場合に、デバイスをすばやく区別して管理するのに役立つため、非常に便利なスキルです。次に、macOS システムでコンピューター名、ホスト名、Bonjour 名 (ローカルホスト名) を変更する方法を段階的に説明します。 Mac 名を変更する必要があるのはなぜですか? Mac の名前を変更すると、あなたの個性が表れるだけでなく、ユーザー エクスペリエンスの向上にも役立ちます。 Mac をカスタマイズする: デフォルトの名前は好みに合わない場合がありますので、お好みの名前に変更してください。

Mac インストーラーのパスワードをお忘れですか? Mac インストーラーのパスワードをお忘れですか? Feb 20, 2024 pm 01:00 PM

はじめに: このウェブサイトでは、Mac インストール プログラムのパスワードを忘れた場合の関連コンテンツをご紹介しますので、お役に立てれば幸いです。 Apple コンピュータ インストール ソフトウェアのパスワードを忘れた場合の対処方法 まず、電話の設定で iCloud を見つけ、クリックして開きます。次に、アカウント番号とパスワードを入力します。ログインボタンの下に、IDまたはパスワードを忘れた場合を促す小さな文字が並んでいますので、これをクリックしてください。通常、ログインインターフェイスで間違ったパスワードを複数回入力すると、MacBook Pro はバインドされた Apple ID を使用してパスワードをリセットするように求めるメッセージを表示します。システムが要求する手順に従うだけで、パスワードのリセットを完了できます。 3. まず Mac をシャットダウンしてから再起動し、電源ボタンを押しながらすぐにキーボードの com を押し続けます。

Macにインストールするpkgファイル? Macにインストールするpkgファイル? Feb 20, 2024 pm 03:21 PM

はじめに: 今日、このサイトでは、Mac への pkg ファイルのインストールに関する関連コンテンツを共有します。現在直面している問題を解決できる場合は、このサイトをフォローして今すぐ開始することを忘れないでください。以前のバージョンの macos pkg をインストールしてオペレーティング システムをアップグレードすることはできません。ラップトップが古いオペレーティング システム バージョンを使用している場合は、最新のオペレーティング システム バージョンにアップグレードすることをお勧めします。古いバージョンでは最新の macOS システムのインストールがサポートされていない可能性があるためです。ディスクユーティリティで「消​​去」を選択し、フォーマットでMacos拡張子を選択し、暗号化オプションをチェックせず、apfsフォーマットを選択せず​​、最後に「消去」ボタンをクリックすると、消去を完了できない問題が解決されます。 macOSのインストール。アプリケーションのアイコンを「App」で始まるファイルにドラッグします。

Apple Mac で入力するときにページをめくるにはどうすればよいですか? Apple Mac で入力するときにページをめくるにはどうすればよいですか? Feb 20, 2024 pm 12:54 PM

はじめに: 今日、このサイトでは、Apple Mac で入力するときにページをめくる方法に関する関連コンテンツを共有します。現在直面している問題が解決できる場合は、このサイトをフォローして今すぐ開始することを忘れないでください。 Apple MacBook ラップトップでタッチパッドを使用するためのヒント Apple コンピュータで 2 本指スライドを設定する手順は次のとおりです: コンピュータのデスクトップで [設定] アイコンを見つけてクリックします。設定インターフェースで「タッチパッド」を選択し、「スクロールしてズーム」をクリックします。スクロールズームオプションの「スクロール方向:ナチュラル」にチェックを入れれば設定完了です。 Apple コンピュータで 2 本指のスワイプ方法を設定するのは簡単です。まず、コンピュータの電源を入れ、画面上部の「設定」アイコンをクリックします。設定インターフェイスで、「タッチパッド」オプションを選択します。次に、「スクロールズーム」をクリックし、「スクロール方向」がチェックされていることを確認します。

音声メッセージを自動的にテキストに変換するように WeChat Mac を設定する方法 - 音声からテキストへの変換を設定する方法 音声メッセージを自動的にテキストに変換するように WeChat Mac を設定する方法 - 音声からテキストへの変換を設定する方法 Mar 19, 2024 am 08:28 AM

最近、一部の友人が、音声メッセージを自動的にテキストに変換するための WeChat Mac の設定方法について編集者に相談しました。以下は、音声メッセージを自動的にテキストに変換するための WeChat Mac の設定方法です。必要な友人は来て、詳細を学ぶことができます。ステップ 1: まず、Mac バージョンの WeChat を開きます。図に示すように: ステップ 2: 次に、「設定」をクリックします。図に示すように: ステップ 3: 次に、「一般」をクリックします。図に示すように: ステップ 4: 次に、「チャットの音声メッセージを自動的にテキストに変換する」オプションをチェックします。図に示すように: ステップ 5: 最後に、ウィンドウを閉じます。図に示すように:

Macはファイルをハードドライブにカットできますか? Macはファイルをハードドライブにカットできますか? Feb 20, 2024 pm 01:00 PM

はじめに: この記事では、Mac でファイルをハードディスクにカットする関連コンテンツを紹介します。 Mac コンピュータで写真をモバイル ハード ドライブにエクスポートする方法 Finder または写真アプリケーションを使用して、写真をモバイル ハード ドライブにエクスポートできます。 Finder を使用して写真をエクスポートする場合は、まずモバイル ハード ドライブが Mac に接続されており、Mac で正常に認識されていることを確認してください。 Mac からハード ドライブに写真を転送する手順は簡単です。まず、モバイル ハード ドライブをコンピュータに接続し、[ランチャー] アイコンを開きます。次に、ポップアップウィンドウで[写真]アイコンを見つけてクリックします。開いた[写真]ウィンドウで[Shift]キーを押したままにします

Mac で HEIC 写真を JPG に変換する 3 つの方法 Mac で HEIC 写真を JPG に変換する 3 つの方法 Mar 15, 2024 pm 08:43 PM

デフォルトでは、iPhone はカメラから HEIC 形式で写真を取得します。 HEIC は High Efficiency Image Container の略で、PNG や JPG ファイルよりも多くのピクセル データを保持できるため、他の形式に比べて iPhone ストレージ上の占有スペースが大幅に少なくなります。これらのファイルは iPhone で最もよく機能しますが、Apple 以外のデバイスと共有すると画像がぼやけたり粗くなったりすることが多いため、インターネットではあまり受け入れられていません。 HEIC 画像が他のデバイスと互換性があることを確認するには、画像を JPG 形式に変換する必要がある場合があります。この記事では、MacでHEIC画像をJPGに変換する方法を紹介します。 MacでHEIC写真をJPGに変換する方法【3つの方法】

See all articles