ホームページ > バックエンド開発 > PHPチュートリアル > PHP 用 C 拡張機能開発の初心者ガイド

PHP 用 C 拡張機能開発の初心者ガイド

WBOY
リリース: 2016-06-23 13:11:03
オリジナル
1078 人が閲覧しました

C 拡張機能を使用する理由

C は静的にコンパイルされ、その実行効率は PHP コードよりもはるかに高くなります。 C を使用して開発された同じオペレーション コードのパフォーマンスは、PHP のパフォーマンスよりも数百倍高くなります。 CURL などの IO 操作の場合、時間の消費は主に IOWait にあるため、C 拡張機能には明らかな利点はありません。

また、C 拡張機能はプロセスの開始時に読み込まれます。PHP コードはリクエストライフサイクルのデータのみを操作でき、C 拡張機能はより広い範囲で操作できます。

ソースコードダウンロード

PHP公式サイトより

http://php.net/downloads.php
ログイン後にコピー

Gitより

git clone https://github.com/php/php-src.git
ログイン後にコピー

git.php.netより

git clone http://git.php.net/repository/php-src.git
ログイン後にコピー

Githubより

  1. php-src プロジェクト ページを開きます
  2. 興味のあるブランチ
  3. [Download ZIP] をクリックします

ここに例として 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
ログイン後にコピー

ステップ 1

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 ツールの構成ファイルであり、さまざまなコンパイル オプションを変更するために使用されます。

ステップ 2

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 はダイナミック リンク ライブラリとしてロードされます。

ステップ 3

php_myext.h を変更し、拡張関数宣言部分である 45 行目の PHP_FUNCTION(confirm_myext_compiled) を見つけます

myext_helloworld の拡張関数であることを示す行 PHP_FUNCTION(myext_helloworld); を追加できます。と宣言されました。

ステップ 4

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) という行を追加します (後ろにセミコロンは付けません)。

ステップ 5

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 にデータを返すために使用されます。

ステップ 6

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" を追加します

ステップ 7

php -r "myext_helloworld(' test') ;"拡張機能が正常にロードされたかどうかを確認し、成功した場合は hello world! を出力します。

Reference

  • http://php.net/git.php
  • http://rango.swoole.com/アーカイブ/152
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート