ホームページ > バックエンド開発 > PHPチュートリアル > PHP-CPP経由のPHP拡張開発の開始

PHP-CPP経由のPHP拡張開発の開始

Lisa Kudrow
リリース: 2025-02-21 09:06:11
オリジナル
416 人が閲覧しました

PHP-CPP経由のPHP拡張開発の開始

PHPとの取引では、自分でPHP拡張機能を書くことを検討するようになるかもしれません。私がそうする動機を考えることができるいくつかの理由があります:

    非常に特定の使用法(数学、統計、幾何学など)のためにPHP機能を拡張するため。
  • 純粋なPHP実装と比較して、パフォーマンスと効率が高くなる
  • 別の以前に把握した言語でプログラミングから得られた迅速さを活用する(私にとって、c)。
  • PHP拡張機能を構築するツールを選択することになると、2つの異なるアプローチが表示されます。

Zephirのようなより多くのPRO-PHPセマンティクスを使用します この記事で説明するPHP-CPPなど、より多くのPro-C/Cセマンティクスを使用します。

    私にとって、2番目のアプローチを選択するメインドライブは簡単です。C/Cでプログラミングの趣味を始めたので、C/Cでこれらの低レベルのモジュールを書くことがより快適に感じられます。 PHP-CPPの公式サイトには、他にもいくつかの理由があります。
  • キーテイクアウト
  • PHP-CPPは、C開発者がZend APIと直接連携する複雑さなしにPHP拡張機能を記述できるようにするPHP拡張機能を開発するためのライブラリです。 C 11で書かれており、十分に文書化されたユーザーフレンドリーなクラスのコレクションを提供しています。
PHP-CPPは急速に進化しており、GITを使用して最新のアップデートのリポジトリをクローンすることをお勧めします。互換性のために、シングルスレッドのPHPインストールをサポートし、バージョン4.8.x以上のGコンパイラへのアップグレードを必要とします。

PHP-CPPには、Main.cppファイル、拡張機能をコンパイルするためのMakeファイル、および拡張ロード用の.iniファイルを含むスケルトン拡張プロジェクト、拡張機能を含むスケルトン拡張プロジェクトが提供されます。スケルトンプロジェクトは、個々のニーズに合わせてカスタマイズし、「make && sudo make install」コマンドでコンパイルおよびインストールできます。

PHP-CPPは、PHPから呼び出される4種類の関数署名をサポートし、アレイ形式の値でパラメーターを渡すことができます。また、関数のエクスポート/登録、関数パラメータータイプの仕様、およびオブジェクト指向の拡張機能の作成も可能です。

インストールと構成
  • PHP-CPPは急速に進化しています。この記事の執筆時点では、バージョン0.9.1(約2日前に0.9.0がリリースされています)にあります。そのドキュメントによると、「これは今後のV1.0バージョンの準備をする機能フリーズリリースです」ので、すぐに1.0のメジャーリリースが見られると確信しています。 したがって、少なくともこの暫定期間中は、Gitを使用してリポジトリをクローンし、後でGit Pullを使用して最新のアップデートを取得することをお勧めします。
  • 注:インストールに関する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>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
コンピレーションは非常に高速になります。インストール後、libphpcpp.soファイルは/usr/libにコピーされ、すべてのphp-cppヘッダーファイルが/usr/includedおよび/usr/include/phpcppフォルダーにコピーされます。

PHP-CPP LIBの設置が完了しました。それは非常に簡単で、プログラミング部分に進むことができます。

<span>make && sudo make install</span>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
それを行う前に、PHP-CPPで使用されるいくつかの重要な概念と用語について説明します。完全なドキュメントは公式サイトにあり、実際のプログラミングを行う前に誰もがそれを読むことをお勧めします。

skeleton(空)拡張プロジェクトファイル

PHP-CPPは、次の3つのファイルを含むスケルトン拡張プロジェクトを提供します。

main.cpp:get_module関数を含むメインCPPファイル(後で詳細に説明します)

makefile:サンプルは、拡張機能をコンパイルするためのファイルを作成します

yourextension.ini:拡張ロードのための1行のみが含まれています

  • makefile
  • *nix開発に精通している場合、このmakefileに精通しています。このファイルをカスタマイズして、ニーズに合わせていくつかのわずかな変更を加える必要があります。
  • 名前を変更= yourextensionは、name = skeletonのように、より意味のあるものになります。
ini_dir = /etc/php5/conf.dを変更して、システムの構成を一致させます。私の場合、それはini_dir = /etc/php5/cli/conf.dです。最初にPHPのCLI環境の拡張機能を有効にするために、INIパスを変更しました。

これらはすべて私が行った変更です。メイクファイルの残りの部分はそのまま保持できます。

    yourextension.ini
  • このファイルをskeleton.iniに変更し、このファイルの唯一の行を変更しました。
<span>sudo apt-get install php5-dev</span>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

main.cpp

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>
ログイン後にコピー
ログイン後にコピー
これまでのところ、私たちは私たちのニーズに合わせて空のプロジェクトにいくつかの変更を加えました。このプロジェクトをコンパイルしてインストールして、拡張機能をインストールできます。

次に、必要なファイルを適切なフォルダーにコピーする必要があります。

<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によってCLIにロードされていることを確認できます-i |グレップスケルトン、および端末には次のようなものが表示されます。

<span>static Php::Extension extension("skeleton", "1.0"); // To be humble, we can change the version number to 0.0.1</span>
ログイン後にコピー

(skeleton.iniが上記で変更したファイルであることを思い出してください。

これまでのところ、PHP-CPPを使用して最初のPHP拡張機能を編集してインストールしました。もちろん、この拡張機能はまだ何もしません。次に、PHP拡張機能の構築プロセスをさらに理解するために、最初のいくつかの機能を作成します。

「こんにちは、テイラー」関数

PHP-CPP経由のPHP拡張開発の開始最初に作成する関数は、「Hello、World」のわずかに変更されたバージョンになります。 Main.cppの完全なコードを最初に見てみましょう

「ネイティブ機能を登録する」に関するPHP-CPPドキュメントによると、PHPから呼び出される4種類の関数署名をサポートしています。

この場合、2番目の署名を使用しており、パラメーターはArrayフォーム(PHP機能)の値で渡されます。

ただし、HelloWorldでは、最初のパラメーターをつかむためにC Type STD :: STRINGを特別に使用しました。 また、C STD libを使用して、歓迎のメッセージを出力しました。

get_module()関数では、拡張変数を宣言した後、エクスポート(helloworld())を希望する関数を追加し、phpスクリプト(helloworld)に表示できる名前を割り当てます。

ここで、拡張機能をコンパイルしてインストールしましょう。すべてがスムーズに進むと、新しいSkeleton.SOファイルが拡張機能ディレクトリにコピーされます。
<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()関数が表示されます。この関数では、パラメーターの数とそのタイプを指定しようとします。

main.cppでは、もう1つの関数swap():

を追加します

また、パラメーターの数とそのタイプを指定することにより、関数をエクスポートします。

<span>sudo apt-get install php5-dev</span>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
明示的にそれを言っています:

<span>make && sudo make install</span>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
2つのパラメーター(aとb);

があります

彼らは(価値ではなく)参照によって渡されるべきです;
  • それらはタイプの数値でなければなりません。
  • 更新された拡張機能をコンパイルしてインストールし、いくつかのコードスニペットを記述して、この新しい機能の仕組みを確認しましょう。
  • スワップ($ a)は失敗します。これは予想され、予想外です。予想される部分は、2つのパラメーターが必要であり、1つだけが指定されていることです。しかし、関数のスワップを呼び出して、十分なパラメーターのようなものを促すときに、そのエラーをPHPによってキャプチャするべきではありませんか?
最初の呼び出し(スワップ($ a、$ b))は、期待される結果を示しています:20 | 10。関数は、渡された2つの数値を交換します

2回目の呼び出しは何らかの形で予想外です。PHPに、2つの数字を交換することを伝えました!しかし、それは渡された2番目のパラメーターが文字列であり、とにかくスワッピングを行うという事実を無視するだけです!

まあ、ある意味では、それはまだ予想されています。 PHPは、数値タイプと文字列タイプを実際に区別しません。この動作はPHP標準に準拠しています。また、この動作により、関数(TEMP)で使用される一時変数にC内部タイプを使用しませんでしたが、PHP ::値を変数タイプとして使用しました。
<span>extension=skeleton.so</span>
ログイン後にコピー
ログイン後にコピー

3回目の呼び出しが機能します。最初のvar_dumpにはDateTimeオブジェクトが表示され、2番目のオブジェクトが整数が表示されます。これはどういうわけか非常に予想外です(少なくとも私にとって)。結局のところ、オブジェクトは数/文字列とはまったく異なります。しかし、この「スワップ」動作もPHPで実行可能であると考えた後、PHPの奇妙さに合っています。

では、「タイプ」の仕様が影響を与えないことを意味しますか?あまり。これをさらに詳しく説明するために、3番目の関数を作成します:

この機能を次のように登録します:

テストコードは次のようになります:

上記のコードセグメントは、タイプ制限に関する1つの重要な側面を示しています。スカラー型宣言は実際には実装されていません。 PHP、したがって、PHP-CPPはオブジェクト型宣言のみを強制します。また、パラメーターの数は、PHP側では実際には実施されていません。
<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環境で動作するようにPHP-CPPを準備する手順を示しました。また、PHP-CPP(およびCセマンティクス)を使用してPHP拡張機能を作成するためのいくつかの基本的な手順についても説明しました。

拡張プロジェクトファイル、関数署名、関数のエクスポート/登録、および関数パラメータータイプをカバーしました。

次の記事では、PHP-CPPのいくつかの重要な機能をさらに詳しく説明し、PHP-CPP。 PHP拡張開発に関するよくある質問(FAQ)

PHP-CPPとは何ですか?PHPとどのように異なりますか?

​​

PHP-CPPは、PHP拡張機能を開発するためのライブラリです。十分に文書化されたユーザーフレンドリーなクラスのコレクションを提供し、C開発者はZend APIと直接連携する複雑さなしにPHP拡張機能を記述できるようにします。解釈された言語であるPHPとは異なり、PHP-CPPを使用すると、コンパイルされた言語であるCでコードを記述できます。これにより、コンパイルされたコードは通常解釈コードよりも速く実行されるため、パフォーマンスの改善につながる可能性があります。 GitHubからPHP-CPPリポジトリをクローンする必要があります。クローニング後、ディレクトリに移動して「make」コマンドを実行します。ビルドプロセスが完了したら、[インストール]コマンドを使用してライブラリをインストールします。ライブラリをインストールするには、ルート権限が必要です。

PHP-CPPを使用して基本的なPHP拡張機能を作成するにはどうすればよいですか?

​​

PHP-CPPを使用してPHP拡張機能を作成するには、いくつかのステップが含まれます。まず、拡張機能のためのディレクトリを作成し、ナビゲートする必要があります。次に、拡張機能用の「makefile」とcソースファイルを作成します。 「MakeFile」には拡張機能を構築するための手順が含まれ、Cソースファイルには拡張機能の実際のコードが含まれます。コードを書いた後、「Make」コマンドを使用して拡張機能を構築できます。コンパイルされた言語を扱う。ただし、GDB(GNUデバッガー)などのツールを使用して、拡張機能をデバッグできます。 GDBを使用すると、ブレークポイントを設定し、コードをステップスループし、バグを追跡しようとするときに非常に役立つ変数を検査できます。

はい、PHP-CPPはPHP 7と互換性があります。ただし、PHP-CPPの最新バージョンを使用していることを確認する必要があります。 7.

php-cppで例外を処理するにはどうすればよいですか?

​​

php-cppは、php :: exceptionというクラスを提供します。これは、cコードから例外をスローするために使用できます。これらの例外は、他のPHP例外と同様に、PHPコードでキャッチして処理できます。

PHP-CPPを使用してオブジェクト指向のエクステンションを作成できますか?

はい、PHP-CPPはオブジェクト指向のプログラミングをサポートしています。 Cコードでクラスを定義でき、これらのクラスをPHPコードで使用できます。これにより、メンテナンスが簡単なクリーンでモジュラーコードを書き込むことができます。 CコードからPHP関数を呼び出すことができます。これにより、拡張機能内のPHPの組み込み関数のパワーを活用できます。

以上がPHP-CPP経由のPHP拡張開発の開始の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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