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

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

WBOY
WBOYオリジナル
2016-06-23 13:11:031064ブラウズ

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