Table des matières
PHP内核的学习--创建PHP扩展
Maison développement back-end tutoriel php PHP内核的学习--创建PHP扩展_PHP教程

PHP内核的学习--创建PHP扩展_PHP教程

Jul 13, 2016 am 09:57 AM
Noyau

PHP内核的学习--创建PHP扩展

PHP取得成功的一个主要原因之一是它拥有大量的可用扩展。web开发者无论有何种需求,这种需求最有可能在PHP发行包里找到。PHP发行包包括支持各种数据库,图形文件格式,压缩,XML技术扩展在内的许多扩展。
 
扩展API的引入使PHP3取得了巨大的进展,扩展API机制使PHP开发社区很容易的开发出几十种扩展。现在,两个版本过去了,API仍然和PHP3时的非常相似。扩展主要的思想是:尽可能的从扩展编写者那里隐藏PHP的内部机制和脚本引擎本身,仅仅需要开发者熟悉API。
 
有两个理由需要自己编写PHP扩展。第一个理由是:PHP需要支持一项她还未支持的技术。这通常包括包裹一些现成的C函数库,以便提供PHP接口。例如,如果一个叫FooBase的数据库已推出市场,你需要建立一个PHP扩展帮助你从PHP里调用FooBase的C函数库。这个工作可能仅由一个人完成,然后被整个PHP社区共享(如果你愿意的话)。第二个不是很普遍的理由是:你需要从性能或功能的原因考虑来编写一些商业逻辑。
 
假设你正在开发一个网站,需要一个把字符串重复n次的函数。下面是用PHP写的例子:
 
 
function util_str_repeat($string, $n){
    $result = "";
    for($i = 0; $i
        $result .= $string;
    }
    return $result;
}
 
util_str_repeat("One", 3);// returns "OneOneOne".
util_str_repeat("One", 1);// returns "One".
 
假设由于一些奇怪的原因,你需要时常调用这个函数,而且还要传给函数很长的字符串和大值n。这意味着在脚本里有相当巨大的字符串连接量和内存重新分配过程,以至显著地降低脚本执行速度。如果有一个函数能够更快地分配大量且足够的内存来存放结果字符串,然后把$string重复n次,就不需要在每次循环迭代中分配内存。
 
为扩展建立函数的第一步是写一个函数定义文件,该函数定义文件定义了扩展对外提供的函数原形。该例中,定义函数只有一行函数原形util_str_repeat() :
 
string util_str_repeat(string str, int n)
函数定义文件的一般格式是一个函数一行。你可以定义可选参数和使用大量的PHP类型,包括: bool, float, int, array等。
 
保存为util.def文件至PHP原代码目录树下(即与ext_skel文件放在同一目录下,我的目录是/usr/share/php5/)。
 
然后就是通过扩展骨架(skeleton)构造器运行函数定义文件的时机了。该构造器脚本就是ext_skel。假设你把函数定义保存在一个叫做util.def的文件里,而且你希望把扩展取名为util,运行下面的命令来建立扩展骨架:
 
sudo ./ext_skel --extname=util --proto=util.def
执行之后,我这里报了如下错误:
 
 
./ext_skel: 1: cd: can't cd to /usr/lib/php5/skeleton
Creating directory util
awk: cannot open /create_stubs (No such file or directory)
Creating basic files: config.m4 config.w32 .svnignore util.c./ext_skel: 216: ./ext_skel: cannot open /skeleton.c: No such file
 php_util.h./ext_skel: 234: ./ext_skel: cannot open /php_skeleton.h: No such file
 CREDITS./ext_skel: 238: ./ext_skel: cannot open /CREDITS: No such file
 EXPERIMENTAL./ext_skel: 242: ./ext_skel: cannot open /EXPERIMENTAL: No such file
 tests/001.phpt./ext_skel: 247: ./ext_skel: cannot open /tests/001.phpt: No such file
 util.php./ext_skel: 251: ./ext_skel: cannot open /skeleton.php: No such file
rm: cannot remove ‘function_entries’: No such file or directory
rm: cannot remove ‘function_declarations’: No such file or directory
rm: cannot remove ‘function_stubs’: No such file or directory
 [done].
 
To use your new extension, you will have to execute the following steps:
 
1.  $ cd ..
2.  $ vi ext/util/config.m4
3.  $ ./buildconf
4.  $ ./configure --[with|enable]-util
5.  $ make
6.  $ ./php -f ext/util/util.php
7.  $ vi ext/util/util.c
8.  $ make
 
Repeat steps 3-6 until you are satisfied with ext/util/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.
 
很明显是/usr/lib/php5/skeleton路径的错误,编辑ext_skel文件,将/usr/lib/php5/skeleton修改为/usr/share/php5/skeleton,然后移除掉生成的util文件夹,再次执行之前的命令,成功后提示如下:
 
 
Creating directory util
Creating basic files: config.m4 config.w32 .svnignore util.c php_util.h CREDITS EXPERIMENTAL tests/001.phpt util.php [done].
 
To use your new extension, you will have to execute the following steps:
 
1.  $ cd ..
2.  $ vi ext/util/config.m4
3.  $ ./buildconf
4.  $ ./configure --[with|enable]-util
5.  $ make
6.  $ ./php -f ext/util/util.php
7.  $ vi ext/util/util.c
8.  $ make
 
Repeat steps 3-6 until you are satisfied with ext/util/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.
 
然后采用静态编译的方式编译扩展。为了使扩展能够被编译,需要修改扩展目录util/下的config.m4文件。扩展没有包裹任何外部的C库,你需要添加支持–enable-util配置开关到PHP编译系统里(–with-extension 开关用于那些需要用户指定相关C库路径的扩展)。找到如下内容:
 
dnl PHP_ARG_ENABLE(util, whether to enable util support,
dnl Make sure that the comment is aligned:
dnl [  --enable-util           Enable util support])
将前面的dnl 去掉,修改为如下结果:
 
PHP_ARG_ENABLE(util, whether to enable util support,
Make sure that the comment is aligned:
[  --enable-util           Enable util support])
然后修改util.c文件,找到如下代码:
 
 
PHP_FUNCTION(util_str_repeat)
{
    char *str = NULL;
    int argc = ZEND_NUM_ARGS();
    int str_len;
    long n;
 
    if (zend_parse_parameters(argc TSRMLS_CC, "sl", &str, &str_len, &n) == FAILURE) 
        return;
 
    php_error(E_WARNING, "util_str_repeat: not yet implemented");
}
 
将其修改为如下代码:
 
 
PHP_FUNCTION(util_str_repeat)
{
    char *str = NULL;
    int argc = ZEND_NUM_ARGS();
    int str_len;
    long n;
    char *result; /* Points to resulting string */
    char *ptr; /* Points at the next location we want to copy to */
    int result_length; /* Length of resulting string */
 
    if (zend_parse_parameters(argc TSRMLS_CC, "sl", &str, &str_len, &n) == FAILURE)
        return;
 
    /* Calculate length of result */
    result_length = (str_len * n);
    /* Allocate memory for result */
    result = (char *) emalloc(result_length + 1);
    /* Point at the beginning of the result */
    ptr = result;
 
    while (n--) {
        /* Copy str to the result */
        memcpy(ptr, str, str_len);
        /* Increment ptr to point at the next position we want to write to */
        ptr += str_len;
    }
 
    /* Null terminate the result. Always null-terminate your strings
    even if they are binary strings */
    *ptr = '\0';
    /* Return result to the scripting engine without duplicating it*/
    RETURN_STRINGL(result, result_length, 0);
}
  里面的具体内容,就不在这里说了,之后会慢慢写到。
 
然后就是编译,安装。在util目录下,命令如下(命令可能都需要加sudo):
 
phpize
./configure
make
make test
make install
然后配置生成的扩展文件,在php5.5版本中,进入到/etc/php5/mods-available目录下,创建util.ini文件,写入如下内容:
 
extension=util.so
然后enable util扩展
 
sudo php5enmod util
最后,重启php-fpm
 
sudo service php5-fpm restart
创建一个php文件,测试一下,测试文件如下:
 
for ($i = 1; $i
    print util_str_repeat("CraryPrimitiveMan ", $i);
    print "\n";
}
?>
执行结果如下:
 
CraryPrimitiveMan 
CraryPrimitiveMan CraryPrimitiveMan 
CraryPrimitiveMan CraryPrimitiveMan CraryPrimitiveMan
这样我们就成功创建了一个包含简单的PHP函数的扩展。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/984112.htmlTechArticlePHP内核的学习--创建PHP扩展 PHP取得成功的一个主要原因之一是它拥有大量的可用扩展。web开发者无论有何种需求,这种需求最有可能在PHP发...
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

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

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)

Comment installer le noyau Linux sur Ubuntu 22.04 Tutoriel détaillé ! Comment installer le noyau Linux sur Ubuntu 22.04 Tutoriel détaillé ! Mar 01, 2024 pm 10:34 PM

Pour installer le noyau Linux sur Ubuntu22.04, vous pouvez suivre les étapes suivantes : Mettre à jour le système : Tout d'abord, assurez-vous que votre système Ubuntu est le dernier, exécutez la commande suivante pour mettre à jour le package système : sudoaptupdatesudoaptupgrade Téléchargez le fichier du noyau : Visitez le Site Web officiel du noyau Linux () pour télécharger la version requise du noyau. Sélectionnez une version stable et téléchargez le fichier de code source (avec l'extension .tar.gz ou .tar.xz), par exemple : wget Décompressez le fichier : Utilisez la commande suivante pour décompresser le fichier de code source du noyau téléchargé : tar-xflinux-5.14 .tar.xz install build dependencies : installez les outils et les dépendances requis pour construire le noyau. Exécuter

Modifier la séquence de démarrage du noyau Linux Modifier la séquence de démarrage du noyau Linux Feb 23, 2024 pm 10:22 PM

Modifier la séquence de démarrage du noyau de Linux 1. Modifiez la séquence de démarrage du noyau de RHEL6/CentOS6 Vérifiez le fichier /etc/grub.conf pour déterminer la situation du noyau du système. Selon le document, il existe deux versions de noyau dans le système, à savoir 2.6.32-573.18.1.el6.x86_64 et 2.6.32-431.23.3.el6.x86_64. Les versions du noyau sont répertoriées de haut en bas. Dans le fichier grub.conf, vous pouvez décider quelle version du noyau utiliser au démarrage du système en ajustant les paramètres par défaut. La valeur par défaut est 0, ce qui signifie que le système démarrera la dernière version du noyau. Une valeur de 0 correspond au premier contenu répertorié dans le fichier grub.conf.

Le système Android est-il basé sur le noyau Linux ? Le système Android est-il basé sur le noyau Linux ? Mar 14, 2024 pm 03:12 PM

Le système Android est-il basé sur le noyau Linux ? Le système Android, l'un des systèmes d'exploitation mobiles les plus utilisés au monde, a toujours été considéré comme développé sur la base du noyau Linux. Mais quelle est la situation réelle ? Explorons cette question. Commençons par découvrir le noyau Linux. Le noyau Linux, en tant que noyau de système d'exploitation open source, a été publié pour la première fois par Linus Torvalds en 1991. Il constitue une bonne base pour de nombreux systèmes d'exploitation, notamment And

Analyse et analyse des fonctions principales du noyau Linux Analyse et analyse des fonctions principales du noyau Linux Mar 14, 2024 am 11:27 AM

Analyse et analyse des fonctions principales du noyau Linux Le noyau Linux est un système vaste et complexe, dans lequel la fonction principale joue un rôle essentiel. Elle est le point d'entrée de l'ensemble du système et est responsable de l'initialisation de divers sous-systèmes, pilotes et modules du noyau. démarrez tout le système d’exploitation. Cet article analysera et analysera la fonction principale du noyau Linux, et démontrera ses fonctions clés et son flux d'exécution à travers des exemples de code spécifiques. Dans le noyau Linux, le point d'entrée de la fonction main est start_k dans le fichier init/main.c.

Explorez les langages de programmation utilisés sous le capot du noyau Linux Explorez les langages de programmation utilisés sous le capot du noyau Linux Mar 20, 2024 am 08:06 AM

Titre : Exploration du langage de programmation utilisé à la base du noyau Linux En tant que noyau de système d'exploitation open source, stable et fiable, le noyau Linux possède un large éventail d'applications dans le domaine informatique. Pour avoir une compréhension approfondie du noyau Linux, vous devez impliquer le langage de programmation utilisé à son niveau sous-jacent. En fait, le noyau Linux est principalement écrit en langage C, qui est un langage de programmation efficace, flexible et facile à maintenir, très adapté au développement de systèmes d'exploitation. Cet article explorera le bas du noyau Linux d'un point de vue détaillé

Explication détaillée de l'emplacement de stockage du code source du noyau Linux Explication détaillée de l'emplacement de stockage du code source du noyau Linux Mar 14, 2024 pm 06:12 PM

Explication détaillée de l'emplacement de stockage du code source du noyau Linux Le code source du noyau Linux est la partie essentielle du système d'exploitation Linux. Il contient le code d'implémentation de diverses fonctions du système d'exploitation. Pour comprendre où est stocké le code source du noyau Linux, nous devons d’abord comprendre la structure organisationnelle du noyau Linux. Le code source du noyau Linux est généralement stocké dans le répertoire /usr/src/linux ou /usr/src/linux-. Dans ce répertoire, il y a beaucoup

Tutoriel de compilation et d'installation du noyau Ubuntu. Tutoriel de compilation et d'installation du noyau Ubuntu. Feb 19, 2024 pm 02:54 PM

La compilation et l'installation du noyau Ubuntu nécessitent certaines compétences professionnelles et une expérience pratique. Voici les étapes générales, mais veuillez procéder avec prudence car ce processus peut comporter certains risques. Avant de commencer, assurez-vous de sauvegarder les données et les systèmes importants. Obtenez le code source : visitez le site Web officiel d'Ubuntu () ou le site Web des développeurs du noyau () pour télécharger le dernier code source du noyau. Décompressez le code source dans un répertoire approprié, tel que /usr/src. Installer les dépendances de compilation : installez les dépendances requises pour construire le noyau. Ouvrez un terminal et exécutez la commande suivante : sudoapt-getinstallbuild-essentiallibncurses-devbisonflexlibssl-devlibelf-d

Les performances de Win10 sont-elles améliorées par rapport à Win7 ? Les performances de Win10 sont-elles améliorées par rapport à Win7 ? Dec 23, 2023 am 09:04 AM

Le système le plus populaire est désormais le système Win10. Bien sûr, il y a aussi des utilisateurs qui se préparent à effectuer une mise à niveau. Ce qui préoccupe le plus ces utilisateurs, c'est de savoir si les performances de Win10 sont améliorées par rapport à Win7 ? En fait, dans l’ensemble, il y a encore quelques améliorations et la compatibilité est également bonne. Les performances de Win10 sont-elles améliorées par rapport à Win7 ? Réponse : Les performances de Win10 sont améliorées par rapport à Win7. L'amélioration globale n'est pas très grande, car les performances sont principalement liées au matériel. Cependant, le système Win10 a subi de nombreuses optimisations afin de pouvoir fournir une meilleure assistance. De plus, Microsoft ne prend plus en charge les mises à jour Win7, Win10 sera donc le système le plus courant à l'avenir. Caractéristiques comparatives de win10 par rapport à win7 : 1. Configuration : win7 est lancé depuis plus de dix ans et a traversé beaucoup de choses.

See all articles