1. まず書いてくださいインターネットの急速な発展とランプ アーキテクチャの人気に伴い、PHP はますます多くの拡張機能をサポートしており、これが PHP の開発を直接促進しています。 ただし、PHP にはスクリプト言語に関する避けられない問題もあり、そのパフォーマンスは C などのコンパイル言語とは大きく異なるため、パフォーマンスの問題を考慮する場合は、PHP 拡張機能を使用して問題を解決するのが最善です。 それでは、PHP拡張機能を作成する方法を説明します。例から始めましょう (この記事には C の基礎が必要です)。 2. 問題を解決するシステムにおいて、配列の二乗和が頻繁に必要な場合は、次のように書くことができます。
実際の実行中、PHP zend エンジンはこの段落を C 言語に翻訳し、毎回メモリ割り当てが必要になります。したがって、パフォーマンスは比較的悪いです。さらに、パフォーマンスの考慮事項に基づいて、これを行うための拡張機能を作成できます。 3. 拡張機能を書く拡張機能を構築するには、少なくとも 2 つのファイルが必要です。 1 つはコンフィギュレーター ファイルで、この拡張機能をコンパイルするために少なくともどの依存ライブラリが必要かをコンパイラーに指示します。2 つ目は実際の実行ファイルです。 3.1 フレームワークを生成する複雑に聞こえますが、実際には、拡張フレームワークを理解するのに役立つツールがあります。 PHP ソース コードには ext_skel というツールがあり、拡張フレームワークの生成に役立ちます。
次に、それを使用して拡張された array_square_sum を生成します。 ($はプロンプトコマンドを表します)
liujun@ubuntu:~/test/php-5.5.8/ext$ ll array_square_sum/
3.2 設定ファイル config.m4 dnl PHP_ARG_WITH(array_square_sum、array_square_sum サポート用,
php_arg_with(array_square_sum、array_square_sum supportの場合、コメントが調整されていることを確認してください: [ - with-array_square_sumにはarray_square_sum supportを含む])
これは、./configure の処理中にこの拡張設定ファイルに到達したときに、PHP_ARG_ENABLE の 2 番目のパラメーターが表示されるときに、enable-sample オプションを呼び出すことができるための最小要件です。エンドユーザーの場合、ヘルプ情報として /configure --help が表示されます 3.3 ヘッダーファイルphp_array_square_sum.h を変更し、confirm_array_square_sum_compiled をconfirm_array_square_sum に変更します。これは、今後実際に呼び出す関数の名前です。もちろん、confirm_array_square_sum_compiled を削除せずに、関数confirm_array_square_sum を直接追加することもできます。
3.3 ソースコードarray_square_sum.c を変更し、confirm_array_square_sum_compiled をconfirm_array_square_sum に変更します。これは、この拡張機能を登録するための関数です。3.2 でconfirm_array_square_sum を直接追加した場合は、このステップで直接confirm_array_square_sum を追加します。
をコピーして
次に、最も重要なステップは、confirm_array_square_sum を書き換えることです。現時点では、confirm_array_square_sum_compiled をconfirm_array_square_sum に書き換えるだけです (confirm_array_square_sum_compiled は 3.1 では削除されていないため、confirm_array_square_sum を追加する必要があります)。
PHP は弱い型付け言語であり、そのデータは zval 構造体に保存されます ( 詳細については、「php extensiondevelopment.pdf」などの専門的な情報を参照してください)。
zend_parse_parameters(int num_args TSRMLS_DC, char *type_spec, …);
カーネル内のマクロを使用して、zend_parse_parameters() 関数の最初のいくつかのパラメータを ZEND_NUM_ARGS() TSRMLS_CC の形式で直接生成できます。2 つの間にはスペースがありますが、カンマはないことに注意してください。名前からわかるように、ZEND_NUM_ARGS() はパラメータの数を表します。次に、共通パラメータのタイプ (C 言語の printf に似ています)、その後に共通パラメータのリストが続きます。
3.4 設定ファイルを生成する 次に ~/php/bin/phpize を実行します
3.5 コンピレーション システムのデフォルトの php-config-path が現在使用している php パスではない可能性があるため、コンパイル時に php-config PATH を使用することが最善です。
4. 拡張機能を使用する 4.1. 設定拡張PHP 設定 php.ini を変更し、設定内容を追加します。
4.2. モジュールを追加する PHP 拡張機能は通常 $PHP_PATH/lib/php/extensions/no-debug-non-zts-yyyymmdd にあります。見つからない場合は、Baidu または Google にアクセスしてください。そこには多数の .so ファイルがあります。3.5で作成したarray_sum_square.soをコピーするだけです。
fastcgi モードを使用する場合は、php を再起動する必要があるため、php には array_square_sum という拡張子が付いている必要があります。 詳細については、phpinfo を確認してください (分からない場合は、Baidu または Google を使用してください )。 4.2. コードを書く拡張機能を作成すると操作効率が向上するため、ここでは拡張機能を使用した場合と PHP コードを直接使用した場合のパフォーマンスを比較およびテストします。複数回実験すると誤差が減るため、100,000 個の数値の二乗和を求めるには 2,000 回実験してください。コードは次のとおりです:
この拡張機能は、php を直接使用するよりも 15 倍高速であることがわかります。ビジネス ロジックが複雑になるにつれて、この差別化はさらに大きくなります。 次に、C 言語を使用してこれを直接実行します。これもテストするコードです (テスト条件はまったく同じです):
実行して効果を確認すると、C を直接使用した場合の時間はわずか 0.261746 で、C 拡張機能を使用した場合の 13.09%、PHP を直接使用した場合の 0.87% であることがわかります。もちろん、IO などの複雑な操作が含まれる場合、C/C++ は PHP よりも数万倍高速になります (テスト済み)。
したがって、インデックス作成や単語分割など、実際に非常に高いパフォーマンス要件を必要とするサービスの場合は、C を使用して基礎となるサービスのセットを作成し、PHP を使用してカプセル化された呼び出しを行うことができます。 |