Maison  >  Article  >  développement back-end  >  [développement d'extensions php et embarqué] Chapitre 4 - Installation de l'environnement de build

[développement d'extensions php et embarqué] Chapitre 4 - Installation de l'environnement de build

黄舟
黄舟original
2017-02-09 11:27:471030parcourir

Installez l'environnement de construction

Maintenant, vous avez probablement au moins un php installé et vous l'utilisez pour le développement d'applications Web. Vous avez peut-être téléchargé la version win32 à partir de php.Net et l'avez exécutée. Apache pour iis ou Windows, ou utilisez le système de gestion de paquets de votre distribution *nix (Linux, bsd ou autre distribution compatible POSIX) pour installer un binaire créé par un tiers.

Construisez php

À moins que vous ne téléchargiez le package de code source et que vous ne le compiliez vous-même, vous manquerez certainement certains points de connaissances.

*nix tools

Le premier outil essentiel de l'ensemble d'outils de développement C est un compilateur pour C . Votre distribution peut en inclure un par défaut, et si vous avez de la chance, il s'agit de gcc (GNU Compiler Collection). Vous pouvez vérifier si le compilateur est installé en exécutant la version gcc ou la version cc, s'il est déjà installé. les informations sur la version du compilateur installé.

Si aucun compilateur n'est installé, vous pouvez télécharger et installer gcc de la manière officielle spécifiée par la distribution que vous utilisez. Cela signifie généralement en télécharger un rpm ou .deb. et exécutez une commande pour l'installer. Cela dépend de la version de distribution que vous utilisez, vous pouvez simplement utiliser les commandes suivantes pour essayer de l'installer : urpmi gcc, apt-get install gcc, pkg-add -r gcc , Ensure gcc.

En plus du compilateur, vous avez également besoin des programmes et outils suivants : make, autoconf, automake, libtool. Ces outils peuvent également être installés à l'aide du système de gestion de paquets de la distribution que vous utilisez, et. Comme lors de l'installation de gcc, ou téléchargez le package source directement depuis gnu.org et compilez-le vous-même

Les versions recommandées sont : libtool 1.4.3, autoconf 2.13, automake 1.4 ou 1.5. le logiciel peut également être utilisé. Il peut très bien fonctionner, mais ces versions ont été vérifiées par une utilisation à long terme.

Si vous prévoyez d'utiliser CVS pour consulter le dernier code de la version de développement PHP, vous aurez également besoin de bison. et flex pour construire l'interpréteur de langage. et d'autres packages. De même, ces deux packages peuvent être installés à l'aide du système de gestion de packages de votre distribution, ou vous pouvez télécharger le code source depuis gnu.org et le compiler vous-même.

Si vous le souhaitez. choisissez CVS, vous devez également installer le client cvs. De même, il est peut-être déjà installé sur votre distribution, ou vous pouvez le télécharger et le compiler vous-même. Contrairement à d'autres packages, vous devez télécharger ce package depuis cvshome.org.

Outils Win32

Traduction Si vous n'êtes pas familier avec l'environnement Windows, ignorez-le

Obtenez le code source PHP

Lors du téléchargement de PHP, vous disposez d'un. choix centralisé. Tout d'abord, si votre distribution le prend en charge, vous pouvez utiliser apt- Utilisez une commande comme get source php5 pour télécharger. L'avantage de cette méthode est que la version de distribution que vous utilisez peut avoir des problèmes qui nécessitent une modification de la source php. Si vous le téléchargez à partir d'ici, vous pouvez être sûr que ces problèmes ont été corrigés afin que votre build puisse exister. L'inconvénient est que la plupart des distributions seront retardées de plusieurs semaines par rapport à la version officielle de PHP

.

Une autre option est la préférence, téléchargez php-x.y.z.tar.gz (x.y.z sur www.php.net est la version actuelle). Ces versions de PHP ont été testées par d'innombrables utilisateurs PHP à travers le monde et sont les dernières.

Vous pouvez également télécharger des packages snap depuis snaps.php.net Sur ce site, php La dernière version de tout le code source du référentiel est empaquetée toutes les quelques heures. Certains commits des principaux développeurs PHP peuvent entraîner ce problème. être temporairement indisponible, mais si vous avez besoin des dernières fonctionnalités de PHP 6.0 avant la sortie officielle, c'est l'endroit le plus simple pour les obtenir.

Enfin, vous pouvez utiliser cvs pour obtenir directement la version de développement utilisée par le noyau php équipe de développement. Si vous souhaitez simplement développer des extensions et des programmes intégrés, plutôt que d'utiliser le package de version officiel et d'obtenir des instantanés, cela n'aura aucun avantage évident. Mais si vous envisagez de publier votre extension ou autre application dans la bibliothèque CVS, cela n'aura pas d'avantages évidents. est toujours utile pour se familiariser avec le processus de paiement.

Annotation : PHP est actuellement géré à l'aide de la bibliothèque Git Code, je n'entrerai pas dans les détails sur le paiement cvs. Veuillez visiter https://github.com/php. /php-src pour obtenir le dernier code source. Si vous souhaitez contribuer au code de PHP, vous pouvez consulter l'introduction sur la page d'accueil du projet.

Configurer PHP pour le développement

Comme nous. discuté au chapitre 1, que vous envisagiez de développer des extensions ou de vous plonger dans d'autres applications PHP, il existe deux commutateurs ./configure spéciaux que vous devez utiliser lors de la création de commutateurs PHP conviviaux pour les développeurs, ces deux commutateurs doivent être utilisés avec d'autres commutateurs que vous avez. à utiliser lors de la construction de php.

enable-debug

est activé sur certaines fonctions clés dans les arborescences sources php et zend Débogage. D'abord, il permet de signaler les fuites de mémoire après chaque requête

<.>Rappelant le chapitre 3 "Gestion de la mémoire", ZendMM libérera implicitement la mémoire allouée par chaque requête, mais elle ne sera pas allouée avant la fin du script. Mémoire libérée en exécutant une série de cas de tests de régression sur du code nouvellement développé, fuite. les points peuvent être facilement exposés afin qu'ils puissent être corrigés entre les versions. Jetons un coup d'œil à l'extrait de code suivant :

void show_value(int n)  
{  
    char *message = emalloc(1024);  
  
    sprintf(message, "The value of n is %d\n", n);  
    php_printf("%s", message);  
}
Si ce code stupide est exécuté lors de l'exécution de la requête php, il fuira. Normalement, ZendMM le libérera une fois l'exécution du script terminée.

Enable Lorsque -debug est activé, il fournira aux développeurs des messages d'erreur pour localiser le problème :

/cvs/php5/ext/sample/sample.c(33) :  Freeing 0x084504B8 (1024 bytes), script=-  
=== Total 1 memory leaks detected ===
Ce message court mais complet vous indique que ZendMM a nettoyé la mémoire après l'avoir sale, et vous donne Découvrez où le bloc de mémoire ayant fui est alloué. Grâce à ces informations, il est facile de localiser le problème, d'ouvrir le fichier, de trouver le. ligne correspondante, et ajoutez efree(message) à la position appropriée avant la fin de la fonction.

当然, 内存泄露并不是你会碰到的唯一难以追查的问题. 有时候, 问题是潜在的, 很少显现. 比如你通宵达旦的工作, 修改了很多的代码和源文件, 当所有事情做完后, 你自信的执行了make, 测试了一个简单的脚本, 接着就看到了下面的输出:

$ sapi/cli/php -r &#39;myext_samplefunc();&#39;  
Segmentation Fault

这只是表象, 那问题出在哪里呢? 查看你的myext_samplefunc()实现, 并没有显示出什么明显的线索, 使用gdb运行仅显示出一串未知的符号.

同样, enable-debug会帮到你. 通过在./configure时增加这个开关, 结果的php二进制将包含所有gdb以及其他core文件检查程序所需的调试符号, 这样可以显示出问题出在哪里.

使用这个选项重新构建, 通过gdb触发崩溃, 你现在可以看到下面的输出:

#0 0x1234567 php_myext_find_delimiter(str=0x1234567 "foo@#(FHVN)@\x98\xE0...",  
                                      strlen=3, tsrm_ls=0x1234567)  
    p = strchr(str, &#39;,&#39;);

目标就变得清晰了. str字符串并不是NULL终止的, 后面的垃圾可以证明这一点, 而非二进制安全的函数使用了它. strchr()实现尝试从头到尾的扫描传入的str, 但由于没有终止NULL字节, 它到达了不属于它的内存, 这就导致了段错误. 我们可以使用memchr()和strlen参数来修复这个问题防止崩溃.

enable-mantainer-zts

这个选项强制php构建启用线程安全资源管理(TSRM)/Zend线程安全(ZTS)层. 这个开关会增加处理时的复杂度, 但是对于开发者而言, 你会发现这是一件好事情. 关于ZTS的详细介绍以及为什么在开发时要开启这个选项, 请参考第一章.

enable-embed

如果你要开发一个嵌入php的其他应用, 就需要另外一个非常重要的开关. 这个开关打开后就会构建出一个类似开启了with-apxs后构建出的mod_php5.so动态链接库: libphp5.so, 它可以用于将php嵌入到其他应用中.

在Unix上编译

现在你已经有了所有需要的工具, 下载了php源码包, 认识了所有需要的./configure开关, 是时候真正的编译php了.

这里假设你下载的是php-5.1.0.tar.gz, 放在了你的主目录, 你将使用下面的命令序列解包源码包, 并切换到解压出的源码目录:

[/home/sarag]$ tar -zxf php-5.1.0.tar.gz  
[/home/sarag]$ cd php-5.1.0

如果你使用的不是gnu的tar, 命令可能需要略作修改:

[/home/sarag]$ gzip -d php-5.1.0.tar.gz | tar -xf -

现在, 用所需的开关和其他你想要开启或禁用的选项, 执行./configure命令:

[/home/sarag/php-5.1.0]$ ./configure enable-debug \  
enable-maintainer-zts disable-cgi enable-cli \  
disable-pear disable-xml disable-sqlite \  
without-mysql enable-embed

在一段时间的处理后, 在你的屏幕上输出了很多的信息, 最终完成了./configure阶段. 接下来你就可以开始编译了:

[/home/sarag]$ make all install

现在, 站起来喝杯咖啡吧. 编译的时间在性能高的机器上可能需要几分钟, 在旧的486上甚至可能需要半个小时. 构建处理完成后, 你就拥有了一个正确配置, 功能完整, 可用于开发的php.

在Win32上编译

译者不熟悉windows环境, 因此略过.

小结

现在php已经以正确的选项安装了, 你已经准备好开发一个真实的, 有功能的扩展了. 后面的章节, 就开始剖析php扩展. 即便你只计划将php嵌入到你的应用中, 而不对语言做任何扩展, 你也应该阅读这些章节, 因为它详细解释了php的运行机制.

以上就是 [翻译][php扩展开发和嵌入式]第4章-安装构建环境的内容,更多相关内容请关注PHP中文网(www.php.cn)!


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