一般的に言えば、phpはすでに高速ですが、一部のより高度な開発者にとって、より高速な速度を追求したい場合、これはありません自分で C コードを作成し、それをダイナミック リンク ライブラリ (多くの場合 .so ファイル) にコンパイルできるかどうかは疑問です。その後、PHP は新しい拡張子 (拡張子) を作成し、同時に拡張子の .so ファイルを呼び出します。 PHP 関数のインターフェイスは外部に公開されます。
実際の使用では、関数インターフェイスが呼び出されている限り、基盤となる高速な C 関数サービスを使用できます。
1.ダイナミックリンクライブラリ(共有)
ダイナミックリンクライブラリのファイル名の拡張子は通常「.so」です。 Windows システムでは、ファイル名の拡張子は「.dll」です。
プログラムがダイナミック リンク ライブラリにリンクされている場合、プログラムの実行時に対応するダイナミック リンク ライブラリ ファイルを見つける必要があります。
ダイナミック リンク ライブラリを使用してコンパイルされたプログラムでは、実行時に対応するダイナミック リンク ライブラリ ファイルがユーザーのマシンにインストールされている必要があり、プログラムがこれらのライブラリをロードできるように、これらのライブラリ ファイルを特定のディレクトリに配置する必要があります。
静的リンクライブラリを使用したプログラムほど使い勝手は良くないようですが、プログラムのサイズは小さくなります。多くのプログラムで使用されるライブラリの場合、動的リンクを使用する利点はさらに明らかです。
ダイナミックリンクライブラリの制作:
オプション -fPIC は AMD64 では必要ですが、他のプラットフォームでは必要ありません。
スタティックリンクライブラリをダイナミックリンクライブラリにインクルードします
ダイナミック リンク ライブラリをコンパイルするときに、スタティック ライブラリをリンクし、リンク ライブラリのコンテンツをコンパイルするダイナミック ライブラリに含める必要がある場合は、オプション -Wl、--whole-archive を使用できます。
例:
リーリー上記の -Wl はリンカーに渡されることを意味します。
2. ダイナミック C/C++ リンク ライブラリを呼び出す
以下、この記事の開発環境背景は CentOS リリース 6.5 です。 C ライブラリを呼び出せるようにするために、php 5.6.9 と apache 2.4 はソース コードからダウンロードされてコンパイルされます。yum! を介して直接インストールすることはできません。ご注意ください。 php と apache のソース コードのコンパイルについては、この記事では触れません。configure で適切なスイッチをオンにすることに注意してください。
具体的な手順は次のとおりです:
共有 library.so をシステム設定に追加します (共有ライブラリの名前が「libhello.so」であると仮定します)
php/extディレクトリに拡張ヘッダーファイルを作成し、myfunctions.defという名前を付けます
このファイルに c 関数宣言を記入するだけです。関数ごとに 1 行。
ext_skel を使用して拡張スケルトンを構築する
config.m4の有効化スイッチをオンにします
拡張機能のスケルトンは上で確立され、php は下で再構成されます (以下は私の個人的な構成ファイルです。読者は独自の状況に基づいて変更する必要があります)
覚えておいてください!最後に —enable-myfunctions を必ず追加してください。この方法でのみ php にコンパイルされます。
拡張機能がコンパイルされたら、拡張機能内の myfunctions.c ファイルの変更を開始できます。その中に php->c 転送関数を追加し、転送関数で .so 内の関数を呼び出すことができます。
たとえば、hello_add php 関数を追加したい場合は、c 関数 add(int a, int b) を呼び出すことができます
a. 関数宣言を追加します
b.php関数を追加します
この関数では、.so ファイル内のインターフェイス関数を呼び出す場合、作成時に使用する .so 共有ライブラリを指定する必要があることに注意してください。共有ライブラリは、手順 1. の操作でシステム構成に追加する必要があります。
.so ファイルが呼び出された場合は、それを php/Makefile に追加します
上記の c ファイルを変更するたびに、再度作成する必要があります
Apacheサーバーを再起動します
新しい拡張機能は phpinfo で確認でき、新しい拡張機能の関数を php で直接呼び出すことができます。