ビルド環境をインストールします
これで、おそらく少なくとも 1 つの php がインストールされており、それを Web ベースのアプリケーション開発に使用していることになるでしょう。win32 ビルドを php.Net からダウンロードし、iis または Windows 上で実行している可能性があります。 Apache のバージョンを使用するか、*nix (Linux、bsd、またはその他の POSIX 準拠ディストリビューション) ディストリビューションのパッケージ管理システムを使用して、サードパーティが作成したバイナリをインストールします。
Build php
ソース パッケージを自分でダウンロードする場合を除き、コンパイルします。
*nix ツール
C 開発者ツール セットの最初の必須ツールは、C 用のコンパイラです。運が良ければ、ディストリビューションにデフォルトで含まれている可能性があります。それは gcc (GNU コンパイラ) です。 gcc version または cc version を実行すると、コンパイラーがインストールされているかどうかを確認できます。インストールされている場合は、インストールされているコンパイラーのバージョン情報が返されます。 コンパイラーをインストールしていない場合は、gcc をダウンロードしてください。通常、これは、使用しているディストリビューションのバージョンに応じて、.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 開発バージョン コード、bison、および flex も必要です。他のパッケージと同様、これら 2 つのパッケージは、配布パッケージ管理システムを使用してインストールすることも、gnu.org からソース コードをダウンロードして自分でコンパイルすることもできます。
CVS を選択した場合は、CVS クライアントもインストールする必要があります。これはディストリビューションに既にインストールされている場合もありますが、他のパッケージとは異なり、このパッケージは cvshome.org からダウンロードする必要があります。
Win32 ツール
翻訳者は Windows 環境に慣れていないため、スキップします
php のソース コードを入手します
php をダウンロードするとき、まず、ディストリビューションがサポートしている場合は、一元的な選択肢があります。 apt-get source php5 のようにこのコマンドを実行してダウンロードします。この方法の利点は、使用しているディストリビューション バージョンには、php ソース コードの変更が必要な問題が発生する可能性があることです。ここからダウンロードすると、次のような問題が発生する可能性があります。問題はパッチされており、ビルドの問題は少なくなります。欠点は、ほとんどのディストリビューションが公式 PHP リリースよりも数週間遅れることです。
別のオプションとして、www.php から php-x.y.z.tar.gz をダウンロードします。 net (x.y.z は現在のリリース バージョンです)。これらの PHP リリースは、世界中の無数の PHP ユーザーによってテストされており、最新です。
このサイトでは、スナップショット パッケージをダウンロードすることもできます。 PHP リポジトリ内のすべてのソース コードの最新バージョンは数日ごとに更新されます。PHP コア開発者による特定のコミットによって一時的に利用できなくなる場合がありますが、正式リリース前に最新の PHP 6.0 機能が必要な場合は、 、これが最も簡単に入手できる場所です
最後に、拡張機能と組み込みプログラムのみを開発している場合、CVS を使用すると、PHP カーネル開発チームが使用する開発バージョンを直接取得できます。ただし、拡張機能や他のアプリケーションを CVS ライブラリにリリースする予定がある場合は、チェックアウト プロセスを理解しておくと便利です。
翻訳注: 現在、PHP はコードの管理に Git を使用しています。 CVS チェックアウトについては詳しく説明しません。php にコードを提供したい場合は、https://github.com/php/php-src にアクセスしてください。
開発用の php の設定
拡張機能を開発するか、PHP の他のアプリケーションを開発するかについては、第 1 章で説明しました。開発者をビルドするときに使用する必要がある 2 つの特別な ./configure スイッチがあります。フレンドリーな PHP。これら 2 つのスイッチは、PHP を構築するときに使用する他のスイッチと組み合わせて使用する必要があります。
第 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 バイトのメモリがリークされます。スクリプトの実行終了後に解放されます。
有効 - デバッグがオンになっている場合、問題を特定するためのエラー メッセージが開発者に提供されます:
/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触发崩溃, 你现在可以看到下面的输出:
1
2
3
#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)!