この記事は、PHP ソース コードの README.SELF-CONTAINED-EXTENSIONS を翻訳したものです。本文中に「注」と記載されている内容は全て私が加筆したものです。内容は少し古く冗長で、深い内容はあまり取り上げられていませんが、入門学習としては参考にしていただけます。
スタンドアロン PHP 拡張機能は、PHP ソース コードとは独立して配布できます。このような拡張機能を作成するには、次の 2 つを準備する必要があります:
設定ファイル (config.m4)
モジュールのソース コード
次に、これらのファイルを作成して結合する方法について説明します。
拡張機能をシステム上で正常にコンパイルして実行するには、次のツールを準備する必要があります:
GNU autoconf
GNU automake
GNU libtool
GNU m4
上記は ftp://ftp.gnu.org/pub/gnu/ から入手できます。
注: 上記は Unix ライクな環境でのみ使用できるツールです。
スタンドアロン拡張機能を作成するのがいかに簡単かを示すために、まず PHP に既に埋め込まれている拡張機能をスタンドアロン拡張機能に変換してみましょう。 PHP をインストールし、次のコマンドを実行します。
$ mkdir /tmp/newext$ cd /tmp/newext
これで、空のディレクトリが作成されました。 mysql 拡張ディレクトリ内のファイルをコピーします:
$ cp -rp php-4.0.X/ext/mysql/* .# 注:看来这篇 README 真的需要更新一下了# PHP7 中已经移除了 mysql 扩展部分
展開はここで完了です。実行します:
$ phpize
これで、このディレクトリ内のファイルを任意の場所に独立して保存できるようになります。この拡張機能は完全に独立して存在できます。
ユーザーはコンパイル時に次のコマンドを使用する必要があります:
$ ./configure \ [--with-php-config=/path/to/php-config] \ [--with-mysql=MYSQL-DIR]$ make install
この方法で、MySQL モジュールは、組み込み MySQL クライアント ライブラリ、または MySQL ディレクトリにあるインストール済み MySQL を使用できます。
拡張機能の例に「foobar」という名前を付けましょう。
新しい拡張機能には、foo.c と bar.c の 2 つのリソース ファイル (およびいくつかのヘッダー ファイルが含まれていますが、これらは何よりも重要です)。
サンプル拡張機能は外部ライブラリを参照しません (これは重要です。これにより、ユーザーはいくつかのコンパイル オプションを指定する必要がなくなります)。
LTLIBRARY_SOURCES オプションは、リソース ファイルの名前を指定するために使用されます。リソース ファイルはいくつでも指定できます。
注: 上記は Makefile.in ファイルの構成オプションです。xdebug を参照してください。
m4 構成ファイルでは、いくつかの追加チェックを指定できます。スタンドアロン拡張機能の場合、マクロ呼び出しを数回行うだけで済みます。
PHP_ARG_ENABLE(foobar,whether to enable foobar,[ --enable-foobar Enable foobar])if test "$PHP_FOOBAR" != "no"; then PHP_NEW_EXTENSION(foobar, foo.c bar.c, $ext_shared)fi
PHP_ARG_ENABLE は、拡張機能が PHP_NEW_EXTENSION によって共有モードで開始できるように、正しい変数を自動的に設定します。
PHP_NEW_EXTENSION の最初のパラメータは拡張機能の名前で、2 番目のパラメータはリソース ファイルです。 3 番目のパラメーター $ext_shared は、PHP_NEW_EXTENSION の PHP_ARG_ENABLE/WITH によって設定されます。
常に PHP_ARG_ENABLE または PHP_ARG_WITH を使用して設定します。 PHP モジュールを公開する予定がない場合でも、これらの設定により、モジュールのメイン PHP モジュールとのインターフェイスの一貫性が保たれます。
注: PHP をコンパイルするときに --enabl-xxx と --with-xxx が使用されるのと同様に、モジュールが動的に拡張されるか PHP に静的にコンパイルされるかを定義するには、PHP_ARG_ENABLE と PHP_ARG_WITH を使用する必要があります。
ext_skel では、PHP モジュールの共通コードを作成することもでき、関数パラメーターを処理するための基本的な関数定義と C コードを作成することもできます。具体的な情報は READNE.EXT_SKEL にあります。
例はないので心配しないでください。PHP には参照できるモジュールが多数あります。簡単な開始点を選択して独自のコードを追加してください。
注: ext_skel は、基本モジュールに必要なリソース ファイルと設定ファイルを生成でき、自分で作成する必要はありません。
config.m4 ファイルとリソース ファイルを同じディレクトリに配置し、phpize を実行します (phpize は、PHP 4.0 以降の PHP をコンパイルするときにインストールされます)。
phpize がシステム環境変数にない場合は、絶対パスを指定する必要があります。例:
$ /php/bin/phpize
このコマンドは、必要なビルド ファイルを現在のディレクトリに自動的にコピーします。 config.m4 に基づいて設定ファイルを作成します。
上記の手順を実行すると、すでに独立した拡張機能が作成されています。
拡張機能は次のコマンドでコンパイルおよびインストールできます:
$ ./configure \ [--with-php-config=/path/to/php-config]$ make install
場合によっては独立しています拡張機能を共有する必要がある 他のモジュールをロードする準備ができました。次に、作成済みの foo モジュールに共有サポートを追加する方法を説明します。
config.m4 ファイルで、PHP_ARG_WITH/PHP_ARG_ENABLE を使用して拡張子を設定し、--with-foo=shared[,..] または --enable-foo=shared を使用できるようにします。自動的に [,..] のような命令がコンパイルパラメータとして使用されます。
config.m4 ファイルで、PHP_NEW_EXTENSION(foo,.., $ext_shared) を使用して拡張機能のビルドを有効にします。
次のコードを C 言語リソース ファイルに追加します。
#ifdef COMPILE_DL_FOOZEND_GET_MODULE(foo)#endif
この段落は上で説明しましたが、ここでは強調部分をもう 1 つだけ示します。
PECL に拡張された Web サイトを公開する予定がある場合は、考慮すべき点がいくつかあります。
添加 LICENSE 或 COPYING 到 package.xml
需要在扩展头文件中定义好版本信息,这个宏会被 foo_module_entry 调用来声明扩展版本:
#define PHP_FOO_VERSION "1.2.3"