PHP の成功の主な理由の 1 つは、利用可能な拡張機能が多数あることです。 Web 開発者がどのようなニーズを持っているかに関係なく、それらは PHP 配布パッケージに含まれている可能性が最も高くなります。 PHP 配布パッケージには、さまざまなデータベース、グラフィックス ファイル形式、圧縮、および XML テクノロジ拡張機能をサポートする多くの拡張機能が含まれています。
拡張機能 API の導入により、PHP3 は大幅に進歩しました。拡張機能 API メカニズムにより、PHP 開発コミュニティは多数の拡張機能を簡単に開発できるようになりました。 2 つのバージョンを経た現在でも、API は PHP3 と非常によく似ています。拡張機能の主なアイデアは、PHP の内部メカニズムとスクリプト エンジン自体を拡張機能作成者から可能な限り隠し、開発者が API に精通していることのみを要求することです。
独自の PHP 拡張機能を作成する理由は 2 つあります。 1 つ目の理由は、PHP がまだサポートしていないテクノロジーをサポートする必要があるということです。これには通常、既製の C ライブラリをラップして PHP インターフェイスを提供することが含まれます。たとえば、FooBase というデータベースが市場に投入される場合、PHP から FooBase の C 関数ライブラリを呼び出すのに役立つ PHP 拡張機能を作成する必要があります。この作業は 1 人だけで行っても、(そうするなら) PHP コミュニティ全体で共有することもできます。 2 番目の、あまり一般的ではない理由は、パフォーマンスまたは機能上の理由から、ビジネス ロジックを作成する必要があることです。
for($i = 0; $i
$result .= $string;
}
$result を返す;
}
util_str_repeat("One", 3);// "OneOneOne" を返します。
util_str_repeat("One", 1);// "One" を返します。
何らかの奇妙な理由で、この関数を時々呼び出す必要があり、また、長い文字列と大きな値 n を関数に渡す必要があるとします。これは、スクリプト内でかなりの量の文字列の連結とメモリの再割り当てが行われ、スクリプトの実行が大幅に遅くなる可能性があることを意味します。結果の文字列を格納するために大きくて十分なメモリをより速く割り当てて、$string を n 回繰り返すことができる関数があれば、ループの繰り返しごとにメモリを割り当てる必要はなくなります。
拡張機能の関数を作成する最初のステップは、拡張機能によって提供される関数プロトタイプを定義する関数定義ファイルを作成することです。この例では、関数を定義する関数プロトタイプ util_str_repeat() が 1 行だけあります。
string util_str_repeat(string str, int n)
関数定義ファイルの一般的な形式は、1 行に 1 つの関数です。オプションのパラメーターを定義し、bool、float、int、array などの多数の PHP 型を使用できます。
PHP のオリジナル コード ディレクトリ ツリーに util.def ファイルとして保存します (つまり、ext_skel ファイルと同じディレクトリに置きます。私のディレクトリは /usr/share/php5/ です)。
次に、スケルトン コンストラクターを拡張して関数定義ファイルを実行します。コンストラクター スクリプトは ext_skel です。関数定義を util.def というファイルに保存し、拡張機能に util という名前を付けたいとします。次のコマンドを実行して拡張機能スケルトンを作成します。
sudo ./ext_skel --extname=util --proto=util.def
実行後、次のエラーを報告しました:
./ext_skel: 1: cd: /usr/lib/php5/skeleton に cd できません
ディレクトリユーティリティの作成
awk: /create_stubs を開けません (そのようなファイルまたはディレクトリはありません)
基本ファイルの作成: config.m4 config.w32 .svnignore util.c./ext_skel: 216: ./ext_skel: /skeleton.c を開けません: そのようなファイルはありません
php_util.h./ext_skel: 234: ./ext_skel: /php_skeleton.h を開けません: そのようなファイルはありません
CREDITS./ext_skel: 238: ./ext_skel: 開けません /CREDITS: そのようなファイルはありません
EXPERIMENTAL./ext_skel: 242: ./ext_skel: 開けません /EXPERIMENTAL: そのようなファイルはありません
testing/001.phpt./ext_skel: 247: ./ext_skel: /tests/001.phpt を開けません: そのようなファイルはありません
util.php./ext_skel: 251: ./ext_skel: /skeleton.php を開けません: そのようなファイルはありません
rm: 「function_entries」を削除できません: そのようなファイルまたはディレクトリはありません
rm: 「function_declarations」を削除できません: そのようなファイルまたはディレクトリはありません
rm: 「function_stubs」を削除できません: そのようなファイルまたはディレクトリはありません
[完了]。
新しい拡張機能を使用するには、次の手順を実行する必要があります:
1.$cd..
2. $ vi ext/util/config.m4
3. $ ./buildconf
4. $ ./configure --[with|enable]-util
5. $メイク
6. $ ./php -f ext/util/util.php
7. $ vi ext/util/util.c
8. $メイク
ext/util/config.m4 と
に満足するまで手順 3 ~ 6 を繰り返します。
ステップ 6 では、モジュールが PHP にコンパイルされていることを確認してから、書き込みを開始します
。
コーディングして、最後の 2 つの手順を必要なだけ繰り返します。
明らかに、これは /usr/lib/php5/skeleton パスのエラーです。 ext_skel ファイルを編集し、/usr/lib/php5/skeleton を /usr/share/php5/skeleton に変更して、生成された util フォルダーを削除します。前のコマンドを再度実行すると、成功すると次のようなプロンプトが表示されます。
ディレクトリユーティリティの作成
基本ファイルの作成: config.m4 config.w32 .svnignore util.c php_util.h CREDITS EXPERIMENTAL testing/001.phpt util.php [完了].
新しい拡張機能を使用するには、次の手順を実行する必要があります:
1.$cd..
2. $ vi ext/util/config.m4
3. $ ./buildconf
4. $ ./configure --[with|enable]-util
5. $メイク
6. $ ./php -f ext/util/util.php
7. $ vi ext/util/util.c
8. $メイク
ext/util/config.m4 と
に満足するまで手順 3 ~ 6 を繰り返します。
ステップ 6 では、モジュールが PHP にコンパイルされていることを確認してから、書き込みを開始します
。
コーディングして、最後の 2 つの手順を必要なだけ繰り返します。
次に、静的コンパイルを使用して拡張機能をコンパイルします。拡張機能をコンパイルするには、拡張機能ディレクトリ util/ 内の config.m4 ファイルを変更する必要があります。この拡張機能は外部 C ライブラリをラップしません。 --enable-util 構成スイッチのサポートを PHP ビルド システムに追加する必要があります (--with-extension スイッチは、ユーザーがパスを指定する必要がある拡張機能に使用されます)関連する C ライブラリ)。以下を見つけてください:
dnl PHP_ARG_ENABLE(util、util サポートを有効にするかどうか、
dnl コメントが整列していることを確認してください:
dnl [ --enable-util util サポートを有効にする])
以前のDNLを削除し、次の結果に変更します:
PHP_ARG_ENABLE(util、util サポートを有効にするかどうか、
コメントが揃っていることを確認してください:
[ --enable-util util サポートを有効にする])
次に、util.c ファイルを変更し、次のコードを見つけます:
PHP_FUNCTION(util_str_repeat)
{
char *str = NULL;
int argc = ZEND_NUM_ARGS();
int str_len;
長いです;
if (zend_parse_parameters(argc TSRMLS_CC, "sl", &str, &str_len, &n) == 失敗)
戻る;
php_error(E_WARNING, "util_str_repeat: まだ実装されていません");
}
次のコードに変更します:
PHP_FUNCTION(util_str_repeat)
{
char *str = NULL;
int argc = ZEND_NUM_ARGS();
int str_len;
長いです;
char *result; /* 結果の文字列へのポインタ */
char *ptr; /* 次にコピーする場所のポイント */
int result_length; /* 結果の文字列の長さ */
if (zend_parse_parameters(argc TSRMLS_CC, "sl", &str, &str_len, &n) == 失敗)
戻る;
/* 結果の長さを計算します */
result_length = (str_len * n);
/* 結果にメモリを割り当てる */
結果 = (char *) emalloc(result_length + 1);
/* 結果の先頭のポイント */
ptr = 結果;
しながら (n--) {
/* str を結果にコピー */
memcpy(ptr, str, str_len);
/* 次に書き込む位置を指すように ptr をインクリメントします */
ptr += str_len;
}
/* 結果は null で終了します。文字列は常に null で終了します。
バイナリ文字列であっても */
*ptr = '
/* 結果を複製せずにスクリプト エンジンに返します*/
RETURN_STRINGL(結果, result_length, 0);
}
具体的な内容については、ここでは触れませんので、後ほど書きます。
次にコンパイルとインストールです。 util ディレクトリ内のコマンドは次のとおりです (コマンドごとに sudo が必要な場合があります):
phpize
./configure
作る
テストを行う
メイクインストール
次に、生成された拡張ファイルを php5.5 バージョンで設定し、/etc/php5/mods-available ディレクトリに移動し、util.ini ファイルを作成し、次の内容を記述します。
拡張子=util.so
次に、util 拡張機能を有効にします
sudo php5enmod ユーティリティ
最後にphp-fpmを再起動します
sudoサービスphp5-fpm再起動
phpファイルを作成してテストします。テストファイルは次のとおりです。
for ($i = 1; $i
print util_str_repeat("CraryPrimitiveMan ", $i);
「n」を印刷します;
}
?>
実行結果は以下の通りです:
クレイリープリミティブマン
クレイリープリミティブマンクレイリープリミティブマン
クレイリープリミティブマンクレイプリミティブマンクレイプリミティブマン
このようにして、単純な PHP 関数を含む拡張機能を作成することができました。
http://www.bkjia.com/PHPjc/984112.html
www.bkjia.comtruehttp://www.bkjia.com/PHPjc/984112.html技術記事 PHP コアの学習 - PHP 拡張機能の作成 PHP の成功の主な理由の 1 つは、利用可能な拡張機能が多数あることです。 Web 開発者がどのようなニーズを抱えていても、このニーズは PHP で開発される可能性が最も高いです...