Cet article vous présente principalement l'écriture d'extensions PHP à partir de zéro. Nous commencerons par comment générer une extension PHP. J'espère que cela pourra vous aider.
PHP est écrit en langage C. Pour chaque PHPer, il existe une envie intérieure d’écrire des extensions. Cependant, il manque un bon point d’entrée. Lors de la recherche sur le développement d'extensions PHP sur Google, la plupart d'entre eux sont des articles copiés, et certaines personnes les ont même publiés sur leurs blogs sans même les exploiter. Il existe cependant plusieurs bons tutoriels, mais ils sont tous des produits de l’ère PHP 5 et comportent de nombreux pièges cachés. J'enregistrerai le processus consistant à marcher lentement sur la fosse, et peut-être que cela deviendra un « tutoriel » pour d'autres.
Générer une extension
Je pense que beaucoup de gens ont vu de nombreux tutoriels en ligne. La plupart d'entre eux nous apprennent à exécuter cette commande : $./ext_skel--extname=extname. Cependant, lorsque vous clonez le code source PHP, vous constaterez qu'il n'y a pas de fichier ext/ext_skel sous la branche master. Donc, je l'ai résumé :
Si vous téléchargez directement le code source de PHP, ou sous la version publiée, vous pouvez exécuter cette commande
$ cd ext $ ./ext_skel --extname=extname
Si vous téléchargez directement Sous la branche master , il n'y a que le fichier ext_skel.php Pour le moment, vous pouvez exécuter directement ce fichier PHP
$ cd ext $ php ext_skel.php --ext extname
Comme je l'ai développé directement sous la branche master, les éléments suivants sont tous dans la branche master par défaut. .opérations ci-dessous.
Une fois l'extension générée, nous verrons quatre fichiers et un dossier. A ce stade, nous n'avons besoin d'utiliser que deux fichiers, le fichier .c et le fichier .h.
Un petit trou
Après avoir généré l'extension, nous pouvons essayer de la compiler
$ phpize $ ./configure $ make &&make test
Nous serons surpris de constater qu'il y aura un avertissement lors de la compilation .
warning:implicitdeclaration of function 'ZEND_PARSE_PARAMETERS_NONE'isinvalid inC99 [-Wimplicit-function-declaration] ZEND_PARSE_PARAMETERS_NONE(); ^
1 avertissement généré.
Ensuite, vous exécutez make test et constatez qu'un test a échoué. C'est vrai, les fichiers générés par le script pour nous ont en fait échoué à nos propres tests. Tu trouves que c'est bizarre ? Examinons les informations spécifiques de l'avertissement. Fonction ZEND_PARSE_PARAMETERS_NONE introuvable. J'ai regardé le fichier et je l'ai trouvé à la ligne 15. Vous pouvez probablement deviner ce que cela signifie en regardant le nom de la fonction. Je suis donc allé chercher le code source PHP. Mais nous avons trouvé une telle définition macro.
#ifndefzend_parse_parameters_none #definezend_parse_parameters_none() zend_parse_parameters(ZEND_NUM_ARGS(),"") #endif
Après avoir remplacé les lettres majuscules d'origine, il n'y aura aucun avertissement. Cela peut être considéré comme le fonctionnaire creusant un petit trou pour nous. Bien qu'il existe des définitions de macros en majuscules, je ne sais pas pourquoi une erreur est signalée.
Définir une fonction
Je pense que lorsque la plupart des gens écrivent des extensions, ils espèrent certainement implémenter au moins une fonction. Ils n'ont pas seulement besoin de quelques variables globales pour écrire une extension (brouillard.
Ici PHP nous fournit une macro utile PHP_FUNCTION Il existe également deux fonctions définies dans le code généré. Vous pouvez vous référer à son utilisation. Cette macro sera éventuellement traduite en fonction. ). Il sera finalement traduit en voidzif_name(zend_execute_data*execute_data,zval*return_value)
En même temps, on voit qu'un tel tableau est défini
constzend_function_entry cesium_functions[]={ PHP_FE(cesium_test1,arginfo_cesium_test1) PHP_FE(cesium_test2,arginfo_cesium_test2) PHP_FE_END }; constzend_function_entry cesium_functions[]={ PHP_FE(cesium_test1,arginfo_cesium_test1) PHP_FE(cesium_test2,arginfo_cesium_test2) PHP_FE(name,NULL) PHP_FE_END };
Rappelez-vous, ne le faites pas. ajoutez un point - virgule ou une virgule à la fin . Enfin, nous pouvons afficher cette fonction
PHP_FUNCTION(name) { php_printf("Hellon"); }
Après compilation et installation, nous pouvons utiliser cette fonction
Recommandations associées :
PHP. Compilation d'extension Tencent CMEM
Génération automatique du framework d'extension pour extension php
Comment écrire une 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!