Maison >développement back-end >tutoriel php >Introduction détaillée à Hello World dans l'extension php
Avant-propos
C'est un mémo que je voulais écrire depuis longtemps. Il existe des centaines d'articles sur l'écriture d'extensions PHP, mais beaucoup. d'entre eux sont très vieux. Certains exemples ne fonctionnent pas. C'est un peu gênant.
Cet article est utilisé pour enregistrer vos propres notes sous forme de mémo.
Adresse de téléchargement : lien rapide de téléchargement php
Cet article sélectionne le package d'installation php-5.6.7.
Après cela, installez php.
//跑到ext目录cd php-5.6.7/ext///执行一键生成骨架的操作./ext_skel --extname=helloworld
Si vous voyez l'invite suivante indiquant le résultat de la création
cd helloworld ls
vous trouverez le fichiers suivants :
config.m4 config.w32 CREDITS EXPERIMENTAL helloworld.c helloworld.php php_helloworld.h tests
Supprimez le dnl avant le code suivant. (dnl est équivalent à // de php)
##动态编译选项,通过.so的方式链接,去掉dnl注释PHP_ARG_WITH(helloworld, for helloworld support, Make sure that the comment is aligned: [ --with-helloworld Include helloworld support])##静态编译选项,通过enable来启用,去掉dnl注释PHP_ARG_ENABLE(helloworld, whether to enable helloworld support, Make sure that the comment is aligned: [ --enable-helloworld Enable helloworld support])
Généralement, vous pouvez choisir l'un des deux (cela dépend de vos préférences personnelles, le commentaire d'activation doit être supprimé dans ce tutoriel).
phpize ./configure --enable-helloworldmakemake install
Puis ajoutez une extension au php.ini
vim /usr/local/php/etc/php.ini// 添加扩展extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/"extension = "helloworld.so"// 重启php-fpm/etc/init.d/php-fpm restart
Retournez dans le dossier où l'extension a été écrite et exécutez le commande test
php -d enable_dl=On myfile.php
Voir les mots suivants indique que la victoire n'est pas loin :
confirm_helloworld_compiled Congratulations! You have successfully modified ext/helloworld/config.m4. Module helloworld is now compiled into PHP.
confirm_helloworld_compiled est une fonction de test générée automatiquement par ext_skel.
ps : Si deux versions de php sont installées localement et que l'extension est écrite en php7, vous risquez de rencontrer les problèmes suivants :
/mydata/src/php-7.0.0/ext/helloworld/helloworld.c: 在函数‘zif_confirm_helloworld_compiled’中: /mydata/src/php-7.0.0/ext/helloworld/helloworld.c:58: 错误:‘zend_string’未声明(在此函数内第一次使用) /mydata/src/php-7.0.0/ext/helloworld/helloworld.c:58: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其 /mydata/src/php-7.0.0/ext/helloworld/helloworld.c:58: 错误:所在的函数内也只报告一次。) /mydata/src/php-7.0.0/ext/helloworld/helloworld.c:58: 错误:‘strg’未声明(在此函数内第一次使用)
Cause : L'environnement de compilation n'est pas php7.
Solution : Il n'y a pas de type zend_string dans php5, remplacez-le par char ou modifiez l'environnement de votre version php en php7
Modifiez helloworld.c, ajoutez le. Fonction implémentée suivante
##zend_function_entry helloworld_functions 补充要实现的函数const zend_function_entry helloworld_functions[] = { PHP_FE(confirm_helloworld_compiled, NULL) /* For testing, remove later. */ PHP_FE(helloworld, NULL) /* 这是补充的一行,尾巴没有逗号 */ PHP_FE_END /* Must be the last line in helloworld_functions[] */};
Recherchez "PHP_FUNCTION(confirm_helloworld_compiled)", démarrez une autre fonction pour écrire l'entité fonction :
PHP_FUNCTION(helloworld) { php_printf("Hello World!\n"); RETURN_TRUE; }
Parcourez à nouveau la compilation :
./configure --enable-helloworld && make && make install
Testez si c'est vraiment réussi :
php -d enable_dl=On -r "dl('helloworld.so');helloworld();"//输出Hello World!
Succès !
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!