ホームページ  >  記事  >  バックエンド開発  >  [php 拡張機能の開発と組み込み] 第 4 章 - ビルド環境のインストール

[php 拡張機能の開発と組み込み] 第 4 章 - ビルド環境のインストール

黄舟
黄舟オリジナル
2017-02-09 11:27:47990ブラウズ

ビルド環境をインストールします

これで、おそらく少なくとも 1 つの php がインストールされており、それを Web ベースのアプリケーション開発に使用しているでしょう。php.Net から win32 ビルドをダウンロードし、iis または Windows バージョンの Apache で実行している可能性があります。または、*nix (Linux、bsd、またはその他の POSIX 準拠ディストリビューション) ディストリビューションのパッケージ管理システムを使用して、サードパーティによって作成されたバイナリをインストールします。

Build php

ソース パッケージをダウンロードして自分でコンパイルする場合を除きます。間違いなくいくつかの知識が欠けています。

*nix ツール

C 開発者ツールキットの最初の必須ツールは C 用のコンパイラーです。ディストリビューションにはデフォルトで含まれている可能性があり、運が良ければそれが gcc (GNU) です。コンパイラ コレクション) を実行すると、コンパイラがインストールされているかどうかを確認できます。インストールされている場合は、インストールされているコンパイラのバージョン情報が返されます。 コンパイラがインストールされていない場合は、ダウンロードしてインストールできます。通常、これは、使用しているディストリビューションのバージョンに応じて、.rpm または .deb ファイルをダウンロードし、それをインストールするコマンドを実行することを意味します。次のコマンドを使用するだけです。インストール: urpmi gcc、apt-get install gcc、pkg-add -r gcc、emerge gcc。

コンパイラーに加えて、次のプログラムとツールも必要です: make、autoconf、automake、libtool これらのツールは次のこともできます。 gcc をインストールするときと同じように、使用しているディストリビューションのパッケージ管理システムを使用してインストールすることも、gnu.org からソース コード パッケージを直接ダウンロードして自分でコンパイルすることもできます

推奨バージョンは次のとおりです: libtool 1.4.3。 、autoconf 2.13、automake 1.4 または 1.5。これらのソフトウェアの新しいバージョンを使用しても問題なく動作する可能性がありますが、これらのバージョンは長期使用によって検証されています。

CVS を使用して最新の PHP 開発バージョン コードをチェックする場合は、他のパッケージと同様に、これら 2 つのパッケージは、ディストリビューションのパッケージ管理システムを使用してインストールすることも、gnu.org からソース コードをダウンロードして自分でコンパイルすることもできます。 CVS を選択する場合は、CVS クライアントをインストールする必要があります。これもディストリビューションにすでにインストールされている場合があります。他のパッケージとは異なり、このパッケージは cvshome.org.

Win32 ツールからダウンロードする必要があります。

翻訳 Windows 環境に慣れていない場合は、スキップしてください。

php ソース コードを入手します。

php をダウンロードするときは、まず、ディストリビューションがサポートしている場合は、apt- を使用できます。 getsource php5 をダウンロードしてください。この方法の利点は、使用しているディストリビューション バージョンには、php ソース コードの変更が必要な問題が含まれている可能性があることです。これらの問題は確実に修正されています。欠点は、ほとんどのディストリビューションが PHP の正式リリースよりも数週間遅れることです。

別のオプションとして、www.php.net から php-x.y.z.tar.gz をダウンロードします (x.y.z は現在のリリース バージョン)。これらの PHP リリースは世界中の無数の PHP ユーザーによってテストされており、最新です。

このサイトでは、すべてのソース コードの最新バージョンをダウンロードすることもできます。 PHP リポジトリは数時間ごとにパッケージ化されます。.php カーネル開発者による特定のコミットにより一時的に利用できなくなる可能性がありますが、正式リリース前に最新の php 6.0 機能が必要な場合は、これが最も簡単に入手できる場所です

。最後に、CVS を使用して、PHP コア開発チームが使用する開発バージョンを直接取得できます。拡張機能や組み込みプログラムを開発するだけの場合、公式リリース パッケージを使用してスナップショットを取得することに比べて明らかなメリットはありません。ただし、拡張機能や他のアプリケーションを CVS ライブラリにリリースする予定がある場合は、チェックアウト プロセスに慣れておくと役立ちます。

翻訳注: 現在、PHP はコード ライブラリの管理に Git を使用しています。詳細については説明しません。 CVS チェックアウト。最新のソース コードを入手するには、https://github.com/php/php -src にアクセスしてください。PHP にコードを提供したい場合は、プロジェクトのホームページの概要を確認してください。開発

第 1 章で説明しましたが、拡張機能の開発を計画している場合でも、PHP アプリケーションの他の側面に飛び込む場合でも、開発者向けの php を構築するときに使用する必要がある特別な ./configure スイッチが 2 つあり、これら 2 つのスイッチは一緒に使用する必要があります。 php のビルド時に使用する他のスイッチと

enable-debug

を組み合わせて、zend ソース ツリーの特定の主要な関数のデバッグを有効にします。

第 3 章「メモリ」を思い出してください。 「管理」に従って、ZendMM は各リクエストに割り当てられたメモリを暗黙的に解放しますが、スクリプトの終了前に解放されるメモリはありません。新しく開発されたコードに対して一連の回帰テスト ケースを実行することで、リーク ポイントを簡単に明らかにできます。次のコードのスニペットを見てみましょう:

void show_value(int n)  
{  
    char *message = emalloc(1024);  
  
    sprintf(message, "The value of n is %d\n", n);  
    php_printf("%s", message);  
}

この愚かなコードが php リクエストの実行中に実行されると、通常、ZendMM は 1024 バイトのメモリを解放します。スクリプトの実行が終了します。

enable-debug がオンになっている場合、問題を特定するためのエラー メッセージが開発者に提供されます:

/cvs/php5/ext/sample/sample.c(33) :  Freeing 0x084504B8 (1024 bytes), script=-  
=== Total 1 memory leaks detected ===

この短いが完全なメッセージは、メモリをダーティにした後に ZendMM がメモリをクリーンアップしたことを示し、場所を示します。この情報を使用すると、問題の場所を特定し、ファイルを開いて対応する行を見つけ、関数の終了前の適切な位置に efree(message) を追加することが簡単になります。

当然, 内存泄露并不是你会碰到的唯一难以追查的问题. 有时候, 问题是潜在的, 很少显现. 比如你通宵达旦的工作, 修改了很多的代码和源文件, 当所有事情做完后, 你自信的执行了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)!


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。