Heim > Artikel > Backend-Entwicklung > [PHP-Erweiterungsentwicklung und eingebettet] Kapitel 4 – Installation der Build-Umgebung
Installieren Sie die Build-Umgebung
Jetzt haben Sie wahrscheinlich mindestens ein PHP installiert und verwenden es für die webbasierte Anwendungsentwicklung. Möglicherweise haben Sie den Win32-Build von php.Net heruntergeladen und ausgeführt Apache für IIS oder Windows, oder verwenden Sie das Paketverwaltungssystem Ihrer *nix-Distribution (Linux, BSD oder eine andere POSIX-kompatible Distribution), um eine von einem Drittanbieter erstellte Binärdatei zu installieren.
PHP erstellen
Sofern Sie das Quellcodepaket nicht herunterladen und selbst kompilieren, werden Sie auf jeden Fall einige Wissenspunkte verpassen.
*nix tools
Das erste wesentliche Tool im C-Entwickler-Toolset ist ein Compiler für C . Ihre Distribution enthält möglicherweise standardmäßig einen, und wenn Sie Glück haben, ist es gcc (GNU Compiler Collection). Sie können überprüfen, ob der Compiler installiert ist, indem Sie die gcc-Version oder die cc-Version ausführen die installierten Compiler-Versionsinformationen.
Wenn Sie noch keinen Compiler installiert haben, können Sie gcc auf die offizielle Weise herunterladen und installieren, die von der von Ihnen verwendeten Distribution angegeben wird. Normalerweise bedeutet dies, dass Sie einen rpm oder . deb-Datei und führen Sie einen Befehl aus, um sie zu installieren. Dies hängt von der von Ihnen verwendeten Distributionsversion ab. Sie können einfach die folgenden Befehle verwenden, um zu versuchen, sie zu installieren: urpmi gcc, apt-get install gcc, pkg-add -r gcc, emerge gcc.
Neben dem Compiler benötigen Sie auch die folgenden Programme und Tools: make, autoconf, automake, libtool Diese Tools können auch über das Paketverwaltungssystem der von Ihnen verwendeten Distribution installiert werden. und Dasselbe wie bei der Installation von gcc, oder laden Sie das Quellcodepaket direkt von gnu.org herunter und kompilieren Sie es selbst
Die empfohlenen Versionen sind: libtool 1.4.3, autoconf 2.13, automake 1.4 oder 1.5 Diese Software kann ebenfalls verwendet werden. Sie kann sehr gut funktionieren, aber diese Versionen wurden durch Langzeitgebrauch verifiziert.
Wenn Sie CVS verwenden möchten, um den neuesten PHP-Entwicklungsversionscode auszuprobieren, werden Sie dies auch tun Sie benötigen Bison und Flex, um den Sprachinterpreter und andere Pakete zu erstellen. Ebenso können diese beiden Pakete mit dem Paketverwaltungssystem Ihrer Distribution installiert werden, oder Sie können den Quellcode von gnu.org herunterladen und ihn selbst kompilieren.
Wenn Sie sich für CVS entscheiden, müssen Sie auch den cvs-Client installieren. Möglicherweise ist er bereits in Ihrer Distribution installiert, oder Sie können ihn selbst herunterladen und kompilieren. Im Gegensatz zu anderen Paketen müssen Sie dieses Paket von cvshome.org herunterladen.
Win32-Tools
Übersetzung Wenn Sie mit der Windows-Umgebung nicht vertraut sind, überspringen Sie es
Holen Sie sich den PHP-Quellcode
Wenn Sie PHP herunterladen Wenn Ihre Distribution dies unterstützt, können Sie zunächst einen Befehl wie „get source php5“ zum Herunterladen verwenden. Der Vorteil dieser Methode besteht darin, dass die von Ihnen verwendete Distributionsversion möglicherweise einige Probleme aufweist, die eine Änderung erfordern Wenn Sie den PHP-Quellcode hier herunterladen, können Sie sicher sein, dass diese Probleme behoben wurden, sodass Ihr Build weniger Probleme aufweist als die offizielle PHP-Veröffentlichung 🎜>
Eine weitere Option ist die Einstellung php-x.y.z.tar.gz (x.y.z auf www.php.net ist die aktuelle Release-Version). Diese PHP-Releases wurden von unzähligen PHP-Benutzern auf der ganzen Welt getestet und sind die neuesten .Sie können Snap-Pakete auch von snaps.php.net herunterladen. Auf dieser Website wird die neueste Version des gesamten Quellcodes im Repository alle paar Stunden gepackt Es ist vorübergehend nicht verfügbar, aber wenn Sie die neuesten PHP 6.0-Funktionen vor der offiziellen Veröffentlichung benötigen, ist dies der einfachste Ort, um es zu erhalten.Schließlich können Sie cvs verwenden, um die von der verwendete Entwicklungsversion direkt abzurufen Wenn Sie nur Erweiterungen und eingebettete Programme entwickeln möchten, hat dies im Vergleich zur Verwendung des offiziellen Release-Pakets und dem Erhalt von Snapshots keine offensichtlichen Vorteile. Wenn Sie jedoch planen, Ihre Erweiterung oder andere Anwendung in der CVS-Bibliothek zu veröffentlichen , es ist immer noch nützlich, mit dem Checkout-Prozess vertraut zu sein.Anmerkung: PHP wird derzeit mit der Git-Code-Bibliothek verwaltet, ich werde nicht auf Details zum CVS-Checkout eingehen. Bitte besuchen Sie https://github.com /php/php-src, um den neuesten Quellcode zu erhalten. Wenn Sie Code zu PHP beitragen möchten, können Sie die Einführung auf der Homepage des Projekts lesen.PHP für die Entwicklung konfigurieren Wie wir in Kapitel 1 besprochen haben, müssen Sie beim Erstellen entwicklerfreundlicher PHP-Schalter zwei spezielle ./configure-Schalter verwenden, unabhängig davon, ob Sie Erweiterungen entwickeln oder in andere PHP-Anwendungen eintauchen möchten. Diese beiden Schalter sollten zusammen mit anderen verwendet werden Schalter, die Sie beim Erstellen von PHP verwenden. enable-debug ist für bestimmte Schlüsselfunktionen in den PHP- und Zend-Quellbäumen aktiviert. Zuerst wird die Meldung von Speicherverlusten nach jeder Anfrage aktiviert >In Erinnerung an Kapitel 3 „Speicherverwaltung“ gibt ZendMM implizit den von jeder Anfrage zugewiesenen Speicher frei, der jedoch nicht vor dem Ende des Skripts freigegeben wird. Durch die Ausführung einer Reihe von Regressionstestfällen für neu entwickelten Code , Leckstellen können leicht aufgedeckt werden, sodass sie zwischen Releases gepatcht werden können. Schauen wir uns den folgenden Codeausschnitt an:
Wenn dieser dumme Code während der Ausführung der PHP-Anfrage ausgeführt wird, ist er Normalerweise gibt ZendMM diesen frei, nachdem die Skriptausführung beendet ist.void show_value(int n) { char *message = emalloc(1024); sprintf(message, "The value of n is %d\n", n); php_printf("%s", message); }
Wenn -debug aktiviert ist, erhalten Entwickler Fehlermeldungen, um das Problem zu lokalisieren:
Diese kurze, aber vollständige Meldung teilt Ihnen mit, dass ZendMM den Speicher bereinigt hat, nachdem Sie ihn verschmutzt haben, und gibt an: Finden Sie heraus, wo der verlorene Speicherblock zugewiesen ist. Mithilfe dieser Informationen können Sie das Problem leicht lokalisieren, die Datei öffnen und Suchen Sie die entsprechende Zeile und fügen Sie efree(message) an der entsprechenden Position vor dem Ende der Funktion hinzu./cvs/php5/ext/sample/sample.c(33) : Freeing 0x084504B8 (1024 bytes), script=- === Total 1 memory leaks detected ===
当然, 内存泄露并不是你会碰到的唯一难以追查的问题. 有时候, 问题是潜在的, 很少显现. 比如你通宵达旦的工作, 修改了很多的代码和源文件, 当所有事情做完后, 你自信的执行了make, 测试了一个简单的脚本, 接着就看到了下面的输出:
$ sapi/cli/php -r 'myext_samplefunc();' 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, ',');
目标就变得清晰了. 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)!