SAPI: PHP アーキテクチャを学習した学生は、このものの重要性を知っているはずです。これは、PHP がデータとやり取りできるようにするインターフェイスを提供します。他のアプリケーション。 この記事では、各 PHP SAPI については詳しく紹介せず、最も単純な CGI SAPI の SAPI の仕組みのみを説明します。
まず、PHP のアーキテクチャ図を見てみましょう:
図 1 PHP アーキテクチャ
SAPI は外部と通信するためのインターフェイスを提供します。PHP5.2 では、Apache 用の mod_php5、IIS 用の ISAPI、および Shell CLI がデフォルトで提供されます。 . SAPIの仕組みを紹介します。 CGI はシンプルですが、心配する必要はありません。SAPI の仕組みを深く理解するのに十分なほとんどのコンテンツが含まれています。
SAPI を定義するには、まず sapi_module_struct を定義し、PHP-SRC/sapi/cgi/cgi_main.c: を確認します。 リーリー
この構造体には、php_info() を呼び出すときに使用される名前などのいくつかの定数が含まれています。一部の初期化関数、終了関数、および一部の関数ポインタは、Zend にデータの取得方法と出力方法を指示するために使用されます。1. php_cgi_startup、アプリケーションが PHP を呼び出すと、この関数が呼び出されます。CGI の場合、この関数は単に PHP の初期化関数を呼び出します。
リーリー
3. PHP はリクエストごとにいくつかの初期化およびリソース割り当てトランザクションを処理します。この部分は、activate フィールドが定義されるものです。上記の構造から、CGI の場合は初期化ハンドルが提供されないことがわかります。 mod_php の場合は異なります。Apache プールにリソース デストラクターを登録し、スペースを適用し、環境変数を初期化する必要があります。
4. sapi_cgi_deactivate は、activate に対応する関数で、CGI の場合は、Zend 出力が閉じる前にバッファーを更新するだけです。データ:
リーリー5. sapi_cgibin_ub_write、このハンドラーは Zend にデータの出力方法を指示します。mod_php の場合、この関数は応答データを書き込むためのインターフェイスを提供しますが、CGI の場合は単に stdout に書き込みます。
リーリー実際の書き込みロジックは、fastcgi 互換の書き込みメソッドを単純に実装するために取り除かれています。
7.NULL、この部分は、Zend が実行されるスクリプト ファイルの状態を確認して、ファイルに実行権限があるかどうかなどを判断できるようにするために使用されます。CGI はこれを提供しません。
8. sapi_cgibin_getenv は、名前に基づいて環境変数を検索するためのインターフェースを Zend に提供します。mod_php5 の場合、スクリプト内で getenv を呼び出すと、このハンドルが間接的に呼び出されます。 CGI の場合、その動作メカニズムは CLI に非常に似ているため、直接呼び出しの親は Shell であるため、単純にシステムが提供する Genenv:
を呼び出します。 リーリー9. php_error、エラー処理関数。前回、php メールリストで、PHP のエラー処理メカニズムは完全に OO であると説明しました。つまり、エラーが発生したときにこの関数ハンドルを書き換えます。が発生すると例外がスローされます。 CGI は、PHP が提供するエラー処理関数を呼び出すだけです。
10. この関数は、CGI には提供されていない PHP の header() 関数を呼び出すときに呼び出されます。
11. sapi_cgi_send_headers、この関数はヘッダーが実際に送信されるとき、一般的には出力が送信される前に呼び出されます。 リーリー
12. NULL、これは各ヘッダーを個別に送信するために使用されます。CGI は提供しません13. sapi_cgi_read_post、このハンドルは POST データを取得する方法を指定します。CGI プログラミングを行ったことがある場合は、CGI が stdin から POST データを読み取ることがわかります。 リーリー
14. sapi_cgi_read_cookies、これは Cookie 値を取得する点を除き、上記の関数と同じです。 リーリー
15. sapi_cgi_register_variables は、CGI の場合、$_SERVER 変数に変数を追加するためのインターフェイスを提供するため、スクリプト内で $_SERVER['PHP_SELF'] にアクセスしてを取得できます。
このリクエストのウリ:リーリー
16. sapi_cgi_log_message、CGI の場合は単に stderr:に出力されます。 リーリー
CGI を分析すると、SAPI がどのように実装されているかがわかりました。mod_php、embed などの SAPI の実装メカニズムも想像できます。 :)この記事はとても詳しく書かれていますので、気に入っていただければ幸いです。 。