PHPとの取引では、自分でPHP拡張機能を書くことを検討するようになるかもしれません。私がそうする動機を考えることができるいくつかの理由があります:
Zephirのようなより多くのPRO-PHPセマンティクスを使用します この記事で説明するPHP-CPPなど、より多くのPro-C/Cセマンティクスを使用します。
PHP-CPPには、Main.cppファイル、拡張機能をコンパイルするためのMakeファイル、および拡張ロード用の.iniファイルを含むスケルトン拡張プロジェクト、拡張機能を含むスケルトン拡張プロジェクトが提供されます。スケルトンプロジェクトは、個々のニーズに合わせてカスタマイズし、「make && sudo make install」コマンドでコンパイルおよびインストールできます。
PHP-CPPは、PHPから呼び出される4種類の関数署名をサポートし、アレイ形式の値でパラメーターを渡すことができます。また、関数のエクスポート/登録、関数パラメータータイプの仕様、およびオブジェクト指向の拡張機能の作成も可能です。注:インストールに関するPHP-CPPドキュメントでは、当面は「内部的にはZend Engineが非常に奇妙なシステムを使用してスレッドの安全性を確保する」ため、「単一スレッドPHPのインストールのみをサポートする」と述べています。将来のリリースは、マルチスレッドのPHPインストールをサポートする可能性がありますが、今のところこれを念頭に置いて、現在の制限に固執しましょう。幸いなことに、「シングルスレッドPHPインストール」は、PHPのほとんどのインストールのほとんどの場合に当てはまるはずです。
php-cppはc 11で記述されています。したがって、私のubuntu 12.04 LTSにインストールされている古いバージョンのgはサポートしていません。 Gコンパイラを上記のバージョン4.8.xにアップグレードする必要があります。アップグレードを行う手順を詳述する記事があります。そこに記載されている指示に従ってください。また、PHP-CPPコンピレーションでは、PHP.Hヘッダーファイルを使用します。このファイルは通常、PHP-DEVがインストールされていない限り、Ubuntuボックスにありません。このコマンドを発行して、PHP5関連の開発ファイルをインストールできます。
Gをアップグレードして必要なヘッダーファイルをインストールした後、次のコマンドを発行して、PHP-CPPライブラリファイル(libphpcpp.so)をコンパイルしてインストールできます。
<span>sudo apt-get install php5-dev</span>
PHP-CPP LIBの設置が完了しました。それは非常に簡単で、プログラミング部分に進むことができます。
<span>make && sudo make install</span>
skeleton(空)拡張プロジェクトファイル
PHP-CPPは、次の3つのファイルを含むスケルトン拡張プロジェクトを提供します。
main.cpp:get_module関数を含むメインCPPファイル(後で詳細に説明します)
yourextension.ini:拡張ロードのための1行のみが含まれています
これらはすべて私が行った変更です。メイクファイルの残りの部分はそのまま保持できます。
<span>sudo apt-get install php5-dev</span>
php-cppが提供する空のプロジェクトでは、このファイルには1つの関数のみが含まれています。Get_module()。
<span>make && sudo make install</span>
get_module()は、後者が必要なライブラリをロードしようとするときにPHPによって呼び出されます。 LIBのエントリポイントと見なされます。 get_module()関数のphp lib要件に準拠するために、extern "c"修飾子を使用して宣言されます。また、get_module()が公開されていることを確認するマクロphpcpp_exportを使用しています。したがって、php。
<span>extension=skeleton.so</span>
次に、必要なファイルを適切なフォルダーにコピーする必要があります。
(skeleton.iniが上記で変更したファイルであることを思い出してください。
「ネイティブ機能を登録する」に関するPHP-CPPドキュメントによると、PHPから呼び出される4種類の関数署名をサポートしています。
この場合、2番目の署名を使用しており、パラメーターはArrayフォーム(PHP機能)の値で渡されます。
作成したばかりの関数をテストするための簡単なスクリプトを書くことができます: 出力を見てください:
参照による関数パラメーター
main.cppでは、もう1つの関数swap():
また、パラメーターの数とそのタイプを指定することにより、関数をエクスポートします。
があります
2回目の呼び出しは何らかの形で予想外です。PHPに、2つの数字を交換することを伝えました!しかし、それは渡された2番目のパラメーターが文字列であり、とにかくスワッピングを行うという事実を無視するだけです!
3回目の呼び出しが機能します。最初のvar_dumpにはDateTimeオブジェクトが表示され、2番目のオブジェクトが整数が表示されます。これはどういうわけか非常に予想外です(少なくとも私にとって)。結局のところ、オブジェクトは数/文字列とはまったく異なります。しかし、この「スワップ」動作もPHPで実行可能であると考えた後、PHPの奇妙さに合っています。 では、「タイプ」の仕様が影響を与えないことを意味しますか?あまり。これをさらに詳しく説明するために、3番目の関数を作成します:
この機能を次のように登録します:
<span><span>#include <phpcpp.h></span>
</span>
<span>/**
</span><span> * tell the compiler that the get_module is a pure C function
</span><span> */
</span><span>extern "C" {
</span>
<span>/**
</span><span> * Function that is called by PHP right after the PHP process
</span><span> * has started, and that returns an address of an internal PHP
</span><span> * strucure with all the details and features of your extension
</span><span> *
</span><span> * @return void* a pointer to an address that is understood by PHP
</span><span> */
</span> PHPCPP_EXPORT <span>void *get_module()
</span> <span>{
</span> <span>// static(!) Php::Extension object that should stay in memory
</span> <span>// for the entire duration of the process (that's why it's static)
</span> <span>static Php::Extension extension("yourextension", "1.0");
</span>
<span>// @todo add your own functions, classes, namespaces to the extension
</span>
<span>// return the extension
</span> <span>return extension;
</span> <span>}
</span><span>} </span>
<span>static Php::Extension extension("skeleton", "1.0"); // To be humble, we can change the version number to 0.0.1</span>
最初に作成する関数は、「Hello、World」のわずかに変更されたバージョンになります。 Main.cppの完全なコードを最初に見てみましょう
get_module()関数では、拡張変数を宣言した後、エクスポート(helloworld())を希望する関数を追加し、phpスクリプト(helloworld)に表示できる名前を割り当てます。 <span>make && sudo make install</span>
<span>cp -f skeleton.so /usr/lib/php5/20121212
</span><span>cp -f skeleton.ini /etc/php5/cli/conf.d</span>
次に、参照によってパラメーターを渡す別の関数、SWAP()関数が表示されます。この関数では、パラメーターの数とそのタイプを指定しようとします。 <span>sudo apt-get install php5-dev</span>
<span>make && sudo make install</span>
最初の呼び出し(スワップ($ a、$ b))は、期待される結果を示しています:20 | 10。関数は、渡された2つの数値を交換します
<span>extension=skeleton.so</span>
<span><span>#include <phpcpp.h></span> </span> <span>/** </span><span> * tell the compiler that the get_module is a pure C function </span><span> */ </span><span>extern "C" { </span> <span>/** </span><span> * Function that is called by PHP right after the PHP process </span><span> * has started, and that returns an address of an internal PHP </span><span> * strucure with all the details and features of your extension </span><span> * </span><span> * @return void* a pointer to an address that is understood by PHP </span><span> */ </span> PHPCPP_EXPORT <span>void *get_module() </span> <span>{ </span> <span>// static(!) Php::Extension object that should stay in memory </span> <span>// for the entire duration of the process (that's why it's static) </span> <span>static Php::Extension extension("yourextension", "1.0"); </span> <span>// @todo add your own functions, classes, namespaces to the extension </span> <span>// return the extension </span> <span>return extension; </span> <span>} </span><span>} </span>
拡張プロジェクトファイル、関数署名、関数のエクスポート/登録、および関数パラメータータイプをカバーしました。
次の記事では、PHP-CPPのいくつかの重要な機能をさらに詳しく説明し、PHP-CPP。 PHP拡張開発に関するよくある質問(FAQ)
PHP-CPPとは何ですか?PHPとどのように異なりますか?
PHP-CPPを使用してPHP拡張機能を作成するには、いくつかのステップが含まれます。まず、拡張機能のためのディレクトリを作成し、ナビゲートする必要があります。次に、拡張機能用の「makefile」とcソースファイルを作成します。 「MakeFile」には拡張機能を構築するための手順が含まれ、Cソースファイルには拡張機能の実際のコードが含まれます。コードを書いた後、「Make」コマンドを使用して拡張機能を構築できます。コンパイルされた言語を扱う。ただし、GDB(GNUデバッガー)などのツールを使用して、拡張機能をデバッグできます。 GDBを使用すると、ブレークポイントを設定し、コードをステップスループし、バグを追跡しようとするときに非常に役立つ変数を検査できます。php-cppで例外を処理するにはどうすればよいですか?
はい、PHP-CPPはオブジェクト指向のプログラミングをサポートしています。 Cコードでクラスを定義でき、これらのクラスをPHPコードで使用できます。これにより、メンテナンスが簡単なクリーンでモジュラーコードを書き込むことができます。 CコードからPHP関数を呼び出すことができます。これにより、拡張機能内のPHPの組み込み関数のパワーを活用できます。
以上がPHP-CPP経由のPHP拡張開発の開始の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。