Maison  >  Article  >  développement back-end  >  Comparaison et introduction des technologies de développement associées pour le développement d'extensions PHP 1

Comparaison et introduction des technologies de développement associées pour le développement d'extensions PHP 1

不言
不言original
2018-04-17 14:10:511176parcourir

Cet article présente principalement la comparaison et l'introduction du développement d'extensions PHP et des technologies de développement associées. Il a une certaine valeur de référence. Maintenant, je le partage avec tout le monde. Les amis dans le besoin peuvent s'y référer

L'extension PHP est avancée. PHP Une des compétences que les programmeurs doivent comprendre. Comment un développeur d'extensions PHP débutant peut-il développer une extension mature et entrer dans le domaine avancé du développement PHP ? Cette série de didacticiels de développement vous guidera étape par étape, de l'entrée aux étapes avancées.
Cette série de didacticiels est développée sous Linux (centos est recommandé), la version PHP est 5.6 et il est supposé que vous avez une certaine expérience d'exploitation Linux et des bases c/c++.
Si vous avez des questions et avez besoin de communiquer, veuillez rejoindre le groupe d'échange technique QQ 32550793 pour communiquer avec moi.

Il existe plusieurs méthodes techniques et frameworks pour développer des extensions PHP. Pour les débutants, il est préférable de choisir un framework qui est le plus simple à démarrer et qui produit les résultats les plus rapides, afin d'augmenter l'intérêt pour l'apprentissage. Comparons chaque framework technique un à un afin que chacun puisse trouver celui qui lui convient le mieux.

1. Utiliser le développement du langage C ext-skel

ext-skel est un outil de génération d'extensions PHP fourni dans le code source officiel de PHP. Il peut générer un squelette d'extension PHP d'un langage C. cadre.

PHP est officiellement très hostile aux développeurs d'extensions. L'API Zend fournie dans le code source est extrêmement difficile à utiliser. L'API est complexe et compliquée, et regorge de diverses méthodes d'écriture de macros. Il existe de nombreux pièges dans l'API Zend, et les développeurs ordinaires peuvent facilement y tomber. Divers problèmes de vidage de mémoire inexplicables se produisent. L'API Zend n'a presque aucune documentation et les développeurs doivent passer beaucoup de temps à apprendre s'ils veulent vraiment maîtriser cette compétence.

Ce qui précède sont les paroles sincères des développeurs de plug-ins swoole. On peut voir que l'utilisation de cette méthode pour développer des plug-ins sera un coup dur pour notre confiance en nous en tant que débutants. Heureusement, certains maîtres ont préparé pour nous d'autres méthodes pour développer des extensions PHP. Nous n'avons pas besoin d'apprendre l'API ZEND ou de maîtriser le langage C, et nous pouvons toujours développer des extensions PHP, et la vitesse d'exécution des extensions générées ne sera pas grande. très différents de ceux développés en langage C.

2. Utilisez le développement de langage de type Zephir PHP

Zephir fournit une syntaxe de langage de haut niveau similaire à PHP pour générer automatiquement du code en langage C étendu, ce qui rend l'écriture d'extensions PHP très simple. Cependant, cette méthode de développement pose un problème, c'est-à-dire que parce qu'elle n'est pas développée en langage c/c++, il n'y a aucun moyen d'utiliser directement diverses bibliothèques de développement c/c++ existantes pour réaliser des fonctions puissantes. Donc ça semble un peu insipide.

3. Développement à l'aide du langage PHP-X C++

php-x est un cadre de développement d'extensions basé sur C++ affiné par le célèbre développeur d'extensions swoole sur la base de années d'expérience en développement. À en juger par la documentation, il s'agit d'un framework de développement relativement simple à utiliser, avec des types de données complets, et très similaire au style de développement de PHP CPP, mais je n'ai pas encore expérimenté son utilisation.
Selon la documentation officielle de php-x, l'extension développée ne supporte que PHP7 et supérieur, ce qui est dommage.

4. Utilisez le développement du langage PHPCPP C++

PHP CPP est mon cadre de développement d'extensions PHP recommandé. Il est simple et facile à comprendre, puissant, efficace en matière de développement, facile à maintenir et rapide. exécution.

PHP CPP est une bibliothèque d'extensions de développement PHP gratuite, principalement pour le langage C++. Elle peut étendre et créer des collections de classes. Elle utilise un langage informatique simple pour rendre les extensions plus intéressantes et plus utiles, et plus pratiques pour les développeurs. un code facile à comprendre, facile à maintenir et beau dans le code. Les algorithmes écrits en C++ semblent presque identiques aux algorithmes écrits en PHP. Si vous savez programmer en PHP, vous pouvez facilement apprendre à faire de même en C++.

  • Avantage 1 : Aucune connaissance du moteur Zend n'est requise.

Les composants internes du moteur Zend sont trop compliqués. Le code du moteur Zend est en désordre et pour la plupart non documenté. Mais la bibliothèque PHP-CPP encapsule déjà toutes ces structures complexes dans des classes et objets C++ très simples à utiliser. Vous pouvez écrire des algorithmes incroyablement rapides en C++ sans avoir à appeler directement le Zend Engine ou même à consulter le code source du Zend Engine. Avec PHP-CPP, vous pouvez écrire du code natif sans avoir à gérer les composants internes de PHP.

  • Avantage 2 : prend en charge toutes les fonctionnalités PHP importantes

En utilisant PHP-CPP, vous pouvez gérer les variables aussi facilement qu'en utilisant des scripts et des tableaux PHP normaux , fonctions, objets, classes, interfaces, exceptions et espaces de noms. Au-delà de cela, vous pouvez utiliser toutes les fonctionnalités du C++, y compris les threads, les lambdas et la programmation asynchrone.

  • Avantage trois : prend en charge PHP 5. 5.X, PHP7, bien qu'il existe deux codes-cadres, les interfaces sont les mêmes. Donc, si vous souhaitez développer une extension PHP compatible avec plusieurs versions, cela ne vous coûtera pas beaucoup de temps supplémentaire pour la rendre compatible.

    5. Concours de codes sources d'extension Hello World de divers frameworks de développement

    Les codes sources d'extension Hello World de chaque framework sont répertoriés ci-dessous. À partir de la longueur et de la complexité du code source, vous pouvez avoir une sensation intuitive.
    Le code source de l'extension c généré par ext-skel est évidemment très peu lisible et extrêmement difficile à comprendre.
    Le code source étendu de Zephir est le plus similaire à la syntaxe PHP et est le plus simple à utiliser, mais il est difficile d'ajouter du code de bibliothèque c/c++ mature.
    Les styles de code source de PHP-X et PHP CPP sont très similaires. Ce sont tous deux des langages C++ standard et sont faciles à comprendre. Il n'est pas difficile d'imaginer que ces deux méthodes de développement d'extensions doivent être les plus adaptées, car nous pouvons non seulement utiliser l'encapsulation C++ pour simplifier le développement, mais aussi appeler directement diverses bibliothèques C++ matures du marché pour nous servir.

    Code source Hello World d'Ext-Skel

    #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

    Code source Hello World de Zephir

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

    Code source Hello World de PHP-X

    #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");
    }

    Code source Hello World de PHP CPP

    #include <phpcpp.h>
    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;
        }
    }

    Références

    Comment Développez rapidement une extension PHP basée sur PHP-X
    Aide PHP-X en chinois
    Démarrage rapide en 5 minutes du développement d'extension PHP
    Site Web chinois de Zephir
    Site officiel en anglais de Zephir
    Installation et démonstration de Zephir développement
    site officiel de phpcpp anglais
    aide en anglais de PHPCPP
    aide en chinois de PHPCPP

    Recommandations associées :

    Résumé du tutoriel de développement d'extension PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn