ホームページ  >  記事  >  バックエンド開発  >  PHP拡張開発における関連開発技術の比較と紹介

PHP拡張開発における関連開発技術の比較と紹介

不言
不言オリジナル
2018-04-13 16:13:381891ブラウズ

この記事の内容は、PHP 拡張機能開発に関連する開発テクノロジーの比較と紹介です。必要な友人は参考にしてください。

PHP 拡張機能は、上級 PHP プログラマーにとって理解しておくべきスキルの 1 つです。 PHP 拡張機能開発の初心者が、成熟した拡張機能を開発して、PHP 開発の高度な分野に参入するにはどうすればよいでしょうか?この一連の開発チュートリアルでは、入門段階から上級段階まで段階的に説明します。
このチュートリアル シリーズは Linux (centos を推奨) で開発されており、PHP バージョンは 5.6 で、一定の Linux 操作経験と C/C++ の基礎があることを前提としています。
ご質問があり、連絡する必要がある場合は、QQ 技術交換グループ 32550793 に参加して私と連絡してください。

PHP 拡張機能を開発するには、いくつかの技術的な方法とフレームワークがあります。初心者にとって、学習への関心を高めるには、最も簡単に始められ、最も早く結果が得られるフレームワークを選択するのが最善です。誰もが自分に最適なものを見つけられるように、各技術フレームワークを 1 つずつ比較してみましょう。

1. ext-skel C言語開発を使用する

ext-skelは、公式のPHPソースコードで提供されているPHP拡張機能を生成するためのツールで、C言語フレームワークのPHP拡張機能スケルトンを生成できます。

PHP は公式には拡張機能開発者にとって非常に不親切です。ソース コードで提供される Zend API は非常に使いにくく、さまざまなマクロの記述方法が満載です。 Zend API には多くの落とし穴があり、一般の開発者が簡単に陥ってしまう可能性があります。さまざまな不可解なコア ダンプの問題が発生します。 Zend API にはドキュメントがほとんどなく、開発者がこのスキルを真に習得したい場合は、学習に多くの時間を費やす必要があります。

上記は swoole プラグイン開発者の心からの言葉です。この方法でプラグインを開発することは、初心者としての自信に深刻な打撃となることがわかります。幸いなことに、一部のマスターは、PHP 拡張機能を開発するための他の方法を用意してくれました。ZEND API を学習したり、C 言語に習熟する必要はありません。それでも PHP 拡張機能を開発でき、生成された拡張機能の実行速度は低下しません。 C言語で開発されたものとは大きく異なります。

2. Zephir PHP に似た言語開発を使用する

Zephir は、拡張 C 言語コードを自動的に生成する PHP に似た高級言語構文を提供し、PHP 拡張機能の作成を非常に簡単にします。しかし、この開発方法には、C/C++ 言語で開発されていないため、既存のさまざまな C/C++ 開発ライブラリを直接使用して強力な機能を実現する方法がないという問題があります。なので、ちょっと味気ない感じがします。

3. PHP-X を使用する C++ 言語開発

php-x は、有名な swoole 拡張機能開発者によって長年の開発経験に基づいて洗練された C++ ベースの拡張機能開発フレームワークのセットです。ドキュメントから判断すると、これは完全なデータ型を備えた比較的使いやすい開発フレームワークです。php cpp の開発スタイルに非常に似ていますが、私はまだそれを経験していません。
公式 php-x ドキュメントによると、開発された拡張機能は PHP7 以降のみをサポートしていますが、これは残念です。

4. phpcpp C++ 言語開発を使用する

PHP CPP は、シンプルで理解しやすく、強力で、コードのメンテナンスが容易で、実行速度が速い、私が推奨する PHP 拡張機能開発フレームワークです。

PHP CPP は、主に C++ 言語用の無料の PHP 開発拡張ライブラリです。これは、拡張機能をより興味深く、便利にするために、単純なコンピューター言語を使用して、開発者が保守および作成するのに便利です。理解しやすく、保守しやすく、美しくコーディングされています。 C++ で書かれたアルゴリズムは、PHP で書かれたアルゴリズムとほぼ同じに見えます。 PHP でプログラミングする方法を知っていれば、C++ で同じことを行う方法を簡単に学ぶことができます。

  • 利点 1: Zend エンジンの知識は必要ありません。

Zend エンジンの内部は複雑すぎます。Zend エンジンのコードは混乱しており、ほとんど文書化されていません。しかし、PHP-CPP ライブラリは、これらすべての複雑な構造を、非常に使いやすい C++ クラスとオブジェクトにすでにカプセル化しています。 Zend Engine を直接呼び出したり、Zend Engine のソース コードを見たりしなくても、C++ で驚くほど高速なアルゴリズムを作成できます。 PHP-CPP を使用すると、PHP の内部を処理することなくネイティブ コードを作成できます。

  • 利点 2: すべての重要な PHP 機能をサポート

PHP-CPP を使用すると、通常の PHP スクリプトと同じように簡単に変数、配列、関数、オブジェクト、クラス、インターフェイス、例外、名前空間を処理できます。これに加えて、スレッド、ラムダ、非同期プログラミングなどの C++ のすべての機能を使用できます。

  • 利点 3: PHP 5.X、PHP7 拡張機能開発をサポート

PHP-CPP には、PHP 5 をサポートする拡張機能開発フレームワークのセットが 2 つあります。それは同じです。したがって、複数のバージョンと互換性のある PHP 拡張機能を開発したい場合、互換性を持たせるために余分な時間はかかりません。

5. 各開発フレームワークの hello world 拡張ソースコードの比較

各フレームワークの hello world 拡張ソースコードを以下にリストします。ソースコードの長さと複雑さから、直感的に理解できます。
ext-skel によって生成された c 拡張ソース コードは明らかに非常に読みにくく、理解するのが非常に困難です。
zephir の拡張ソース コードは PHP 構文に最も似ており、始めるのが最も簡単ですが、成熟した C/C++ ライブラリ コードを追加するのは困難です。
PHP-X と PHP CPP のソース コード スタイルは非常に似ており、どちらも標準の C++ 言語であり、理解しやすいです。拡張機能を開発するこれら 2 つの方法が最も適していることは想像に難くありません。C++ カプセル化を使用して開発を簡素化できるだけでなく、市販のさまざまな成熟した C++ ライブラリを直接呼び出してサービスを提供できるからです。

ext-skelのHello Worldソースコード

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_helloworld.h"

static int le_helloworld;

PHP_FUNCTION(confirm_helloworld_compiled)
{
    char *arg = NULL;
    int arg_len, len;
    char *strg;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
        return;
    }

    len = spprintf(&strg, 0, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "helloworld", arg);
    RETURN_STRINGL(strg, len, 0);
}

PHP_MINIT_FUNCTION(helloworld)
{
    return SUCCESS;
}

PHP_MSHUTDOWN_FUNCTION(helloworld)
{

    return SUCCESS;
}

PHP_RINIT_FUNCTION(helloworld)
{
    return SUCCESS;
}

PHP_RSHUTDOWN_FUNCTION(helloworld)
{
    return SUCCESS;
}

PHP_MINFO_FUNCTION(helloworld)
{
    php_info_print_table_start();
    php_info_print_table_header(2, "helloworld support", "enabled");
    php_info_print_table_end();

}

const zend_function_entry helloworld_functions[] = {
    PHP_FE(confirm_helloworld_compiled,    NULL)        /* For testing, remove later. */
    PHP_FE_END    /* Must be the last line in helloworld_functions[] */
};

zend_module_entry helloworld_module_entry = {
    STANDARD_MODULE_HEADER,
    "helloworld",
    helloworld_functions,
    PHP_MINIT(helloworld),
    PHP_MSHUTDOWN(helloworld),
    PHP_RINIT(helloworld),        /* Replace with NULL if there's nothing to do at request start */
    PHP_RSHUTDOWN(helloworld),    /* Replace with NULL if there's nothing to do at request end */
    PHP_MINFO(helloworld),
    PHP_HELLOWORLD_VERSION,
    STANDARD_MODULE_PROPERTIES
};

#ifdef COMPILE_DL_HELLOWORLD
ZEND_GET_MODULE(helloworld)
#endif

zephirのHello Worldソースコード

namespace Test;
class Hello
{
    public function say()
    {
        echo "Hello World!";
    }
}

PHP-XのHello Worldソースコード

#include <phpx.h>
using namespace std;
using namespace php;

//声明函数
PHPX_FUNCTION(say_hello);

//导出模块
PHPX_EXTENSION()
{
    Extension *ext = new Extension("hello-world", "0.0.1");
    ext->registerFunction(PHPX_FN(say_hello));
    return ext;
}

//实现函数
PHPX_FUNCTION(say_hello)
{
    echo("hello world");
}

PHP CPPのHello Worldソースコード

#include 619f335ddca2117bde26fa8c0e35995e
void say_hello(Php::Parameters &params)
{
    Php::out << "hello world" << std::endl;
}
extern "C" {
    PHPCPP_EXPORT void *get_module() 
    {
        static Php::Extension extension("helloworld", "1.0");
        extension.add("say_hello", say_hello);
        return extension;
    }
}

参考文献

PHP-X に基づいて PHP 拡張機能をすばやく開発する方法
PHP-X 中国語ヘルプ
5 分で PHP 拡張機能開発のクイックスタート
zephir 中国語 Web サイト
zephir 英語公式 Web サイト
Zephir のインストールとデモ開発
phpcpp 英語公式 Web サイト
phpcpp英語ヘルプ
phpcpp 中国語ヘルプ


以上がPHP拡張開発における関連開発技術の比較と紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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