C は静的にコンパイルされ、その実行効率は PHP コードよりもはるかに高くなります。 C を使用して開発された同じオペレーション コードのパフォーマンスは、PHP のパフォーマンスよりも数百倍高くなります。 CURL などの IO 操作の場合、時間の消費は主に IOWait にあるため、C 拡張機能には明らかな利点はありません。
また、C 拡張機能はプロセスの開始時に読み込まれます。PHP コードはリクエストライフサイクルのデータのみを操作でき、C 拡張機能はより広い範囲で操作できます。
http://php.net/downloads.php
git clone https://github.com/php/php-src.git
git clone http://git.php.net/repository/php-src.git
ここに例として zip を示します:
wget http://museum.php.net/php5/php-5.3.16.tar.gztar zxvf php-5.3.16.tar.gzmv php-5.3.16 php-src
PHP ソース コード ディレクトリを入力します:
cd php-src
Git を使用する利点は、相互に切り替えるのが便利であることです。さまざまなバージョン
git clone http://git.php.net/repository/php-src.gitPHP 5.4: git checkout PHP-5.4 PHP 5.5: git checkout PHP-5.5 PHP 5.6: git checkout PHP-5.6 PHP 7.0: git checkout PHP-7.0 PHP HEAD: git checkout master
cd ext
PHP 拡張機能スケルトンを生成する:
./ext_skel --extname=myext
ext_skel は、PHP を生成するために PHP によって提供される公式ツールです拡張スケルトンコード
正常に作成された後基本ファイルを選択すると、次のようなプロンプトが表示されます:
Creating directory myextCreating basic files: config.m4 config.w32 .svnignore myext.c php_myext.h CREDITS EXPERIMENTAL tests/001.phpt myext.php [done].To use your new extension, you will have to execute the following steps:1. $ cd ..2. $ vi ext/myext/config.m43. $ ./buildconf4. $ ./configure --[with|enable]-myext5. $ make6. $ ./php -f ext/myext/myext.php7. $ vi ext/myext/myext.c8. $ makeRepeat steps 3-6 until you are satisfied with ext/myext/config.m4 andstep 6 confirms that your module is compiled into PHP. Then, start writingcode and repeat the last two steps as often as necessary.
生成されたファイルを表示します:
tree myext|-- CREDITS|-- EXPERIMENTAL|-- config.m4|-- config.w32|-- myext.c|-- myext.php|-- php_myext.h`-- tests `-- 001.phpt1 directory, 8 files
config.m4 は、AutoConf ツールの構成ファイルであり、さまざまなコンパイル オプションを変更するために使用されます。
config.m4 を変更します
cd ..vi ext/myext/config.m4
dnl PHP_ARG_WITH(myext, for myext support,dnl Make sure that the comment is aligned:dnl [ --with-myext Include myext support])
を
PHP_ARG_WITH(myext, for myext support,[ --with-myext Include myext support])
に変更します。以下は、php カーネルにコンパイルされたことを意味します。 with はダイナミック リンク ライブラリとしてロードされます。
php_myext.h を変更し、拡張関数宣言部分である 45 行目の PHP_FUNCTION(confirm_myext_compiled) を見つけます
myext_helloworld の拡張関数であることを示す行 PHP_FUNCTION(myext_helloworld); を追加できます。と宣言されました。
myext.c を変更します。これは 42 行目以降の拡張関数の実装部分であり、PHP_FE(myext_helloworld, NULL) を追加します
const zend_function_entry myext_functions[] = { PHP_FE(confirm_myext_compiled, NULL) /* For testing, remove later. */ PHP_FE(myext_helloworld, NULL) PHP_FE_END /* Must be the last line in myext_functions[] */};
このコードは、関数ポインタを Zend エンジンに登録するためのものです, PHP_FE(myext_helloworld, NULL) という行を追加します (後ろにセミコロンは付けません)。
myext.c の最後に myext_helloworld の実行コードを追加します。
PHP_FUNCTION(myext_helloworld){ char *arg = NULL; int arg_len, len; char *strg; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) { return; } php_printf("Hello World!\n"); RETURN_TRUE;}
zend_parse_parameters は PHP によって渡されたパラメータを受け入れるために使用され、RETURN_XXX マクロは PHP にデータを返すために使用されます。
myext ディレクトリで次の手順で実行します。
phpize./configuremakemake install
./configure の実行時にこのエラーが発生した場合: configure: error: Cannot find php-config Cwith-php-config=PATH を使用してください。これは、php-config 設定ファイルがデフォルトのディレクトリにないことを意味します。 ./configure --with-php-config=/usr/local/php/bin/php-config を再実行します。 PHP のインストール ディレクトリ。bi ディレクトリにある php-config または php-config5 というファイル
次に、php.ini を変更して、extension = "myext.so" を追加します
php -r "myext_helloworld(' test') ;"拡張機能が正常にロードされたかどうかを確認し、成功した場合は hello world! を出力します。