Table des matières
构建一个基本的扩展骨架
配置文件config.m4
编译扩展

PHP扩展开发(一)

Jun 23, 2016 pm 01:27 PM

首先需要确定系统中安装了gcc编译器,合适版本的bison等,下面是从源码编译安装PHP需要执行的基本命令:

# cd php-src# ./buildconf# ./configure --enable-debug --enable-maintainer-zts --enable-cli# make# make install
Copier après la connexion

构建一个基本的扩展骨架

在PHP扩展开发时,使用ext_skel完成扩展的结构骨架创建。

$ ./ext_skel./ext_skel --extname=module [--proto=file] [--stubs=file] [--xml[=file]]           [--skel=dir] [--full-xml] [--no-help]  --extname=module   这里的module是要创建的扩展名称  --proto=file       这里的file文件包含了要创建的函数的原型  --stubs=file       generate only function stubs in file  --xml              generate xml documentation to be added to phpdoc-cvs  --skel=dir         创建扩展骨架的目录  --full-xml         generate xml documentation for a self-contained extension (not yet implemented)  --no-help          don't try to be nice and create comments in the code and helper functions to test if the module compiled
Copier après la connexion

注意: ext_skel命令文件在源文件的ext目录下。

这里的--extname参数是要创建的扩展名称,扩展名称为 小写字母 + 下划线 组成,并且,
在ext目录中必须是唯一的。

例如,这里要创建一个名为ext_demo_1的PHP扩展:

/vagrant/ext$ ./ext_skel --extname=ext_demo_1Creating directory ext_demo_1Creating basic files: config.m4 config.w32 .svnignore ext_demo_1.c php_ext_demo_1.h CREDITS EXPERIMENTAL tests/001.phpt ext_demo_1.php [done].To use your new extension, you will have to execute the following steps:
Copier après la connexion
  • $ cd ..

  • $ vi ext/extdemo1/config.m4

  • $ ./buildconf

  • $ ./configure --[with|enable]-extdemo1

  • $ make

  • $ ./php -f ext/extdemo1/extdemo1.php

  • $ vi ext/extdemo1/extdemo1.c

  • $ make

    Repeat steps 3-6 until you are satisfied with ext/extdemo1/config.m4 and
    step 6 confirms that your module is compiled into PHP. Then, start writing
    code and repeat the last two steps as often as necessary.

  • 现在,在ext目录下出现了一个新建的扩展目录ext_demo_1:

    /vagrant/ext/ext_demo_1$ lsconfig.m4   CREDITS       ext_demo_1.c    php_ext_demo_1.hconfig.w32  EXPERIMENTAL  ext_demo_1.php  tests
    Copier après la connexion

    这时,该扩展是无法编译通过的,需要先编辑config.m4文件才行。

    配置文件config.m4

    配置文件config.m4告诉UNIX构建系统扩展支持的configure选项以及扩展需要的额外的库,
    包含哪些源文件等,该文件使用的是GNU的autoconf语法,以dnl开头的行为注释,使用中括号([和])包含的为字符串。

    autoconf语法参见 AUTOCONF文档

    PHP_ARG_ENABLE(ext_demo_1, whether to enable ext_demo_1 support,[  --enable-ext_demo_1           Enable ext_demo_1 support])if test "$PHP_EXT_DEMO_1" != "no"; then  PHP_SUBST(EXT_DEMO_1_SHARED_LIBADD)  PHP_NEW_EXTENSION(ext_demo_1, ext_demo_1.c, $ext_shared)fi
    Copier après la connexion

    上述为autoconf的配置文件,第一个宏PHP_ARG_ENABLE,含有三个参数:

    • extdemo1 这是第一个参数,为./configure建立了名为enable-ext_demo_1的选项

    • 第二个参数将会在./configure命令处理到该扩展的配置文件时,显示该参数的内容

    • 第三个参数是./configure命令的帮助,在使用./configure --help的时候显示

    第二个宏为PHP_NEW_EXTENSION,该宏声明了扩展的模块和必须要编译作为扩展一部分的源码文件。
    如果需要多个源文件,则使用空格分隔,第三个参数$ext_shared与调用
    PHP_SUBST(EXT_DEMO_1_SHARED_LIBADD)有关。

    PHP_NEW_EXTENSION(ext_demo_1, ext_demo_1.c, $ext_shared)
    Copier après la connexion

    编译扩展

    修改完config.m4文件之后,接下来编译PHP和扩展。

    /vagrant$ ./configure --disable-libxml --enable-ext_demo_1 --disable-dom --disable-simplexml --disable-xml --disable-xmlreader --disable-xmlwriter --without-pear --prefix=/usr/local/php/vagrant$ make/vagrant$ sudo make installInstalling PHP SAPI module:       cgiInstalling PHP CGI binary: /usr/local/php/bin/Installing PHP CLI binary:        /usr/local/php/bin/Installing PHP CLI man page:      /usr/local/php/man/man1/Installing build environment:     /usr/local/php/lib/php/build/Installing header files:          /usr/local/php/include/php/Installing helper programs:       /usr/local/php/bin/  program: phpize  program: php-configInstalling man pages:             /usr/local/php/man/man1/  page: phpize.1  page: php-config.1/vagrant/build/shtool install -c ext/phar/phar.phar /usr/local/php/binln -s -f /usr/local/php/bin/phar.phar /usr/local/php/bin/pharInstalling PDO headers:          /usr/local/php/include/php/ext/pdo/
    Copier après la connexion

    此时,PHP安装在了/usr/local/php目录下,进入该目录,可以看到如下文件:

    /usr/local/php$ lsbin  include  lib  man
    Copier après la connexion

    进入/usr/local/php/bin目录,执行以下命令:

    /usr/local/php/bin$ ./php --info|grep demoConfigure Command =>  './configure'  '--disable-libxml' '--enable-ext_demo_1' '--disable-dom' '--disable-simplexml' '--disable-xml' '--disable-xmlreader' '--disable-xmlwriter' '--without-pear' '--prefix=/usr/local/php'ext_demo_1ext_demo_1 support => enabled
    Copier après la connexion

    可以看到,phpinfo()中扩展支持已经启用了,按照上述步骤安装的扩展中包含了一个测试扩展是否能够正常工作的函数,
    该函数名为confirm_ext_demo_1_compiled(arg),执行结果如下:

    /usr/local/php/bin$ ./php -r "echo confirm_ext_demo_1_compiled('mylxsw');"Congratulations! You have successfully modified ext/ext_demo_1/config.m4. Module mylxsw is now compiled into PHP.
    Copier après la connexion

    可以看到,ext_demo_1扩展安装成功了,关于扩展开发更多内容,请移步 AICODE.CC.

    Déclaration de ce site Web
    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

    Outils d'IA chauds

    Undresser.AI Undress

    Undresser.AI Undress

    Application basée sur l'IA pour créer des photos de nu réalistes

    AI Clothes Remover

    AI Clothes Remover

    Outil d'IA en ligne pour supprimer les vêtements des photos.

    Undress AI Tool

    Undress AI Tool

    Images de déshabillage gratuites

    Clothoff.io

    Clothoff.io

    Dissolvant de vêtements AI

    Video Face Swap

    Video Face Swap

    Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

    Outils chauds

    Bloc-notes++7.3.1

    Bloc-notes++7.3.1

    Éditeur de code facile à utiliser et gratuit

    SublimeText3 version chinoise

    SublimeText3 version chinoise

    Version chinoise, très simple à utiliser

    Envoyer Studio 13.0.1

    Envoyer Studio 13.0.1

    Puissant environnement de développement intégré PHP

    Dreamweaver CS6

    Dreamweaver CS6

    Outils de développement Web visuel

    SublimeText3 version Mac

    SublimeText3 version Mac

    Logiciel d'édition de code au niveau de Dieu (SublimeText3)

    Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Apr 05, 2025 am 12:04 AM

    JWT est une norme ouverte basée sur JSON, utilisée pour transmettre en toute sécurité des informations entre les parties, principalement pour l'authentification de l'identité et l'échange d'informations. 1. JWT se compose de trois parties: en-tête, charge utile et signature. 2. Le principe de travail de JWT comprend trois étapes: la génération de JWT, la vérification de la charge utile JWT et l'analyse. 3. Lorsque vous utilisez JWT pour l'authentification en PHP, JWT peut être généré et vérifié, et les informations sur le rôle et l'autorisation des utilisateurs peuvent être incluses dans l'utilisation avancée. 4. Les erreurs courantes incluent une défaillance de vérification de signature, l'expiration des jetons et la charge utile surdimensionnée. Les compétences de débogage incluent l'utilisation des outils de débogage et de l'exploitation forestière. 5. L'optimisation des performances et les meilleures pratiques incluent l'utilisation des algorithmes de signature appropriés, la définition des périodes de validité raisonnablement,

    Comment fonctionne le détournement de session et comment pouvez-vous l'atténuer en PHP? Comment fonctionne le détournement de session et comment pouvez-vous l'atténuer en PHP? Apr 06, 2025 am 12:02 AM

    Le détournement de la session peut être réalisé via les étapes suivantes: 1. Obtenez l'ID de session, 2. Utilisez l'ID de session, 3. Gardez la session active. Les méthodes pour empêcher le détournement de la session en PHP incluent: 1. Utilisez la fonction Session_RegeReate_id () pour régénérer l'ID de session, 2. Stocker les données de session via la base de données, 3. Assurez-vous que toutes les données de session sont transmises via HTTPS.

    Décrivez les principes solides et comment ils s'appliquent au développement de PHP. Décrivez les principes solides et comment ils s'appliquent au développement de PHP. Apr 03, 2025 am 12:04 AM

    L'application du principe solide dans le développement de PHP comprend: 1. Principe de responsabilité unique (SRP): Chaque classe n'est responsable d'une seule fonction. 2. Principe ouvert et ferme (OCP): les changements sont réalisés par extension plutôt que par modification. 3. Principe de substitution de Lisch (LSP): les sous-classes peuvent remplacer les classes de base sans affecter la précision du programme. 4. Principe d'isolement d'interface (ISP): utilisez des interfaces à grain fin pour éviter les dépendances et les méthodes inutilisées. 5. Principe d'inversion de dépendance (DIP): les modules élevés et de bas niveau reposent sur l'abstraction et sont mis en œuvre par injection de dépendance.

    Comment déboguer le mode CLI dans phpstorm? Comment déboguer le mode CLI dans phpstorm? Apr 01, 2025 pm 02:57 PM

    Comment déboguer le mode CLI dans phpstorm? Lors du développement avec PHPStorm, nous devons parfois déboguer PHP en mode interface de ligne de commande (CLI) ...

    Comment définir automatiquement les autorisations d'UnixSocket après le redémarrage du système? Comment définir automatiquement les autorisations d'UnixSocket après le redémarrage du système? Mar 31, 2025 pm 11:54 PM

    Comment définir automatiquement les autorisations d'UnixSocket après le redémarrage du système. Chaque fois que le système redémarre, nous devons exécuter la commande suivante pour modifier les autorisations d'UnixSocket: sudo ...

    Expliquez la liaison statique tardive en PHP (statique: :). Expliquez la liaison statique tardive en PHP (statique: :). Apr 03, 2025 am 12:04 AM

    Liaison statique (statique: :) ​​implémente la liaison statique tardive (LSB) dans PHP, permettant à des classes d'appel d'être référencées dans des contextes statiques plutôt que de définir des classes. 1) Le processus d'analyse est effectué au moment de l'exécution, 2) Recherchez la classe d'appel dans la relation de succession, 3) il peut apporter des frais généraux de performance.

    Comment envoyer une demande post contenant des données JSON à l'aide de la bibliothèque Curl de PHP? Comment envoyer une demande post contenant des données JSON à l'aide de la bibliothèque Curl de PHP? Apr 01, 2025 pm 03:12 PM

    Envoyant des données JSON à l'aide de la bibliothèque Curl de PHP dans le développement de PHP, il est souvent nécessaire d'interagir avec les API externes. L'une des façons courantes consiste à utiliser la bibliothèque Curl pour envoyer le post� ...

    See all articles