PHP拡張モジュールの開発


まず、私たちはPHPのソースバッグが必要です。ないなら次のほうにしましょう。とにかく近いです。http://www.php.netはい、D
Linux/BSDの下のステップ
[yingyuan@research src]$ pwd
/home/yingyuan/data1/src
[yingyuan@research src]$ ls
php-4.3.4.tar.gz
[yingyuan@research src]$ tar zxvf php-4.3.4.tar.gz
...
[yingyuan@research src]$ cd php-4.3.4
今はPHPソースコードのルートディレクトリに着きました。以下は$PHP_と略称します。SRC_ホーム・ゲームよく見てください。ここにはこのようないくつかのサブディレクトリがあります。これらのサブディレクトリは、拡張モジュールをコンパイルするために必要なヘッダファイルを含んでいます。
[yingyuan@research php-4.3.4]$ cd ext
[yingyuan@research ext]$ ls
... ext_skel ext_skel_win32.php ...
このディレクトリには多くのサブディレクトリがあります。各サブディレクトリはPHPの拡張モジュールです。このほかに二つのファイルがあります。skyelはshellスクリプトで、PHP拡張モジュールを生成できるフレームを実行します。ext_skelwin 32.phpは、Windows下のPHP拡張モジュールフレームを生成するために使用されます。私の心の中はひそかに喜びを隠して、ext_skelwin 32.php,哈,Windows下のPHP拡張モジュールを開発するとEasyになります。そうですが、CygWinを入れるのを忘れないでください。http://www.cygwin.com/)この太った可愛いアシスタントさん。私のように時間がもったいない人はもちろん入れません。だから私はLinux/BSDでext_を使います。skyelはフレームを生成してWindowsの下にコピーします。
皆さん、私たちは仕事を始めました。まず私たちはどこにいるかを見てください。
[yingyuan@research ext]$ pwd
/home/yingyuan/data1/src/php-4.3.4/ext
もし私達が広いPHP拡張モジュールを書くなら、モジュール名はmyextといいます。次のコマンドを実行します。
[yingyuan@research ext]$ ./ext_skel --extname=myext           
Creating directory myext
Creating basic files: config.m4 .cvsignore 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.m4
3.  $ ./buildconf
4.  $ ./configure --[with|enable]-myext
5.  $ make
6.  $ ./php -f ext/myext/myext.php
7.  $ vi ext/myext/myext.c
8.  $ make
Repeat steps 3-6 until you are satisfied with ext/myext/config.m4 and
step 6 confirms that your module is compiled into PHP. Then, start writing
code and repeat the last two steps as often as necessary.
ヒントによると、ext_skyelはモジュールmyextの骨格を作成しました。カタログmyextの下のファイルconfig.m 4、php_myext.h、myext.c、myext.php。他の書類については、考えるのがおっくうです。
ヒントによって、次のように操作します。
[yingyuan@research ext]$ cd ..
[yingyuan@research php-4.3.4]$ vi ext/myext/config.m4
m 4ファイルの作成説明については、ここで共有する時間がないので、興味があります。http://www.gnu.org/software/m4/manual/index.html 見てください
ここで説明する必要があります。PHPコンパイルの時、ある拡張モジュールをアクティブにしたいです。二つの方法があります。違いは前者は外部関連の文書を引用することができます。例えば、with-mysql=/usr/local/mysqlなど、後者はできません。これはあなたの必要に応じて、例えばxmlパーサー拡張を書きます。外部システムのlibxmlをあなたの拡張コードに引用したいなら、あなたのコードがいつも必要なlibxmlファイルを成功的に見つけることができるようにするために、with-xxxxx方式を使って、ユーザーがコンパイルする時にlibxmlファイルの位置を指定してください。私達はここで--enabel-xxxxを使いましょう。私達のmyextは確かにいい引用がないからです。
このようないくつかの行を見つけました。
dnl PHP_ARG_ENABLE(myext, whether to enable myext support,
dnl Make sure that the comment is aligned:
dnl [  --enable-myext           Enable myext support])
if test "$PHP_MYEXT" != "no"; then
  dnl Write more examples of tests here...
...
変更:
PHP_ARG_ENABLE(myext, whether to enable myext support,
[  --enable-myext           Enable myext support])
if test "$PHP_MYEXT" == "yes"; then
  dnl Write more examples of tests here...
...
まず、PHP自動コンパイルシステムは私たちの拡張モジュールを見て見ぬふりをしないでください。そして、ユーザーが私たちの拡張モジュールを明確に要求する時にコンパイルする必要があります。これは以上の修正の原因です。
次に行く:
[yingyuan@research php-4.3.4]$ ./buildconf
You should not run buildconf in a release package.
use buildconf --force to override this check.
システムが不満を言っています。リリース版はbuildconfを実行できません。
[yingyuan@research php-4.3.4]$ ./buildconf --force
[yingyuan@research php-4.3.4]$ ./configure --help | grep myext
  --enable-myext           Enable myext support
この出力から、私たちの拡張モジュールはすでに利用可能です。
[yingyuan@research php-4.3.4]$ ./configure --enable-myext
...
[yingyuan@research php-4.3.4]$ make
...
[yingyuan@research php-4.3.4]$ ./sapi/cli/php -f ext/myext/myext.php 
Functions available in the test extension:
confirm_myext_compiled

Congratulations! You have successfully modified ext/myext/config.m4. 
Module myext is now compiled into PHP.
これで私達のデモ関数はすでに効果が現れました。これからあなた達の質問を聞きます。
Q 1:私は必ずmake全体のPHPコードパックが必要です。make私の拡張モジュールですか?A 1:いいえ。あなたはconfig.m 4ファイルさえ修正しなくてもいいです。方法は手作業でモジュールをコンパイルします。ディレクトリに切り替えます。PHP_。SRC_HOME/extcc-fpic-DCOMPILE_DL=1-DCOMPILE_DLmodule_name-I/usr/local/include-I.-I.-I./Zend-I./main-I./TSRM-c-o cc-shar-L/usr/local/lib-rdynamic-o
本例では、
[yingyuan@research php-4.3.4]$ cd ext
[yingyuan@research ext]$ cc -fpic -DCOMPILE_DL=1 -DCOMPILE_DL_MYEXT -I/usr/local/include /
-I. -I.. -I../Zend -I../main -I../TSRM -c -o myext/myext.o myext/myext.c
[yingyuan@research ext]$ cc -shared -L/usr/local/lib -rdynamic -o myext/myext.so myext/myext.o
Q 2:どのように私の拡張モジュールのためにGUN AutoMake互換の自動コンパイルファイルA 2を生成しますか?SRC_ホーム/scrīpts/phpize。実は$PHP_SRC_ホーム/scrīpts/他に面白いものがあります。:D
Q 3:どのようにC++でPHP拡張モジュールA 3を書きますか?これはCとC++の名称変換問題に関連しています。Cに定義されたヘッダファイルをextern「C」で囲む必要があります。ここではより詳細な情報を提供しません。
Windows下の手順
前に言ったPHPソースコードパックが必要です。php 4 ts.libも必要です。後者はPHPのWindowsインストールパッケージで見つけることができます。ここではVC 6でPHP拡張モジュールの開発について話します。恐怖心を持たないでください。マイクロソフトはもっと簡単になります。もっと複雑ではありません。Win 32 Dylamic-Link Libraryプロジェクトmyxtを新設し、Empty Projectを選択します。そしてext_をskelで作成した二つのファイルphp_myext.h、myext.cをプロジェクトに追加し、下記の設定をする。
メニュー項目Build>>Set Active Configrationを開きます。ここには二つのオプションがあります。Win 32 ReleaseとWin 32 Debug、ここでWin 32 Releaseを選択します。
メニュー項目Tools>>Optionsを開いて、Directores属性ページを選択します。ここでヘッダファイルとライブラリファイルの検索パスを設定できます。Show directores forドロップリストからLibrary filesを選択して、php 4 ts.libがあるディレクトリをudcに追加します。例えば、PHP/PHP-45.11.Show directores Inclesリストから選択します。PHPヘッダのファイルがあるパスに加えて、例えば:C:/PHP/PHP-4.4 C:/PHP/PHP-4.4/manC:/PHP/PHP-4.34/TSRMC:/PHP/PHP-4.34/Zend
メニュー項目Project>>Settingsを開いて、C/C++属性ページを選択します。CategoryプルダウンリストでCode Generationを選択し、Use run-time libraryプルダウンリストでMultihreaded DLL(Win 32 Releaseバージョンに対応)またはDebug Multitchreaded DLL(Win 32 Debugバージョンに対応)を選択します。Categoryのプルダウンリストの中でProprocessorを選択して、Processor definesにZEEND_を追加します。DEBUG=0、COMPILE_DLSIPLOOKUP,ZTS=1,ZEND_WIN 32,PHP_WIN 32。もしあなたがプロジェクトを調整しているなら、ZEENDを入れてもいいです。DEBUGは1に設定されています。ここではAdditional include directoresに検索ヘッダファイルを設定することもできますが、以上の手順で設定されていますので、必要はありません。最後に私達はProject Optionsにオプション/Tcを追加しました。これはコンパイラに私達のソースファイルをCプログラムとして処理します。
メニュー項目Project>>Settings...で、Link属性ページを選択します。Object/library modulesにphp 4 ts.libを追加します。その後Buildを行って、私達のDLLファイルを生成します。間違いがあったら焦らずに自分を信じてGoogleを信じてください。
いくつかの提案
PHPマニュアルは拡張モジュールを開発する一番いい教材です。もしここで気があれば必ず見てください。これは怠けてはいけません。PHP拡張モジュール開発サイトhttp://pecl.php.net 行ってみてもいいですどうやってResourceを作成するか、関数から値を返すかなど、どうやって着手すればいいか分かりません。一番早い方法はPHP_をひっくり返すことです。SRC_ホーム/ext下の拡张モジュールのソースコードは、多くのものが参考になります。