必要なシナリオによっては、特定のニーズを満たすために独自のローカル PHP 関数 を開発する必要があり、新しい関数は PHP モジュールに存在する必要があります。以下では、最も単純な PHP モジュール開発を紹介します。独自の Say_hello($arg) 関数を構築して hello world: $arg を出力します。
このドキュメントで紹介する PHP モジュールの開発は、Hello World を作成する程度のものです。なぜこれが行われるかについては、しばらく説明しません。その後の構造を詳しく紹介します。
Hello World レベルのモジュールは、いくつかの簡単な手順で完了できます:
モジュールインフラストラクチャを生成する
モジュールコードを変更し、say_hello 関数を追加する
コンパイルを変更する 設定ファイル
モジュール共有ライブラリを生成する
モジュールを有効にするための構成モジュール
モジュールをテストします
PHP ソースコードディレクトリの下にある ext ディレクトリに入ります。
./ext_skel ––extname=sayhello を実行します (ここの「–」エンコーディングに問題があるため、直接コピーしないでください)
出力:
[root@myhost ext]# ./ext_skel ––extname=sayhello
sayhello ディレクトリの作成
基本ファイルの作成: config.m4 config.w32 .cvsignore Sayhello.c php_sayhello.h CREDITS EXPERIMENTAL testing/001.phpt Sayhello.php [done].
新しい拡張機能を使用するには、次のものが必要です。次の手順を実行します:
1. $ cd ..
2. $ vi ext/sayhello/config.m4
3. $ ./configure ––[with|enable] -sayhello
5. $ make
6. $ ./php -f ext/sayhello/sayhello.php
7. $ make
8. 手順 3-を繰り返します。 ext/sayhello/config.m4 に満足するまで 6 を実行し、ステップ 6 でモジュール
が PHP にコンパイルされていることを確認します。その後、 コードの作成を開始し、最後の 2 つのステップを必要に応じて繰り返します。を参照してください。モジュールが生成されたことを示す出力を表示します。 生成されたモジュールによってどのファイルが生成されるかを見てみましょう:
-RW-R – R – Root Root 2103 APR 9 05:05 Config.m4 // 構成ファイルをコンパイルします -RW- R – R —R – 1 root root 310 Apr 9 05:05 config.w32 //w32 コンパイル設定ファイル-rw-r–r– 1 root root 8 Apr 9 05:05 クレジット //著者情報- rw-r–r – 1 ルート root 0 Apr 9 05:05 EXPERIMENTAL //ベータ版情報識別 -rw-r–r– 1 ルート root 2755 Apr 9 05:05 php_sayhello.h //モジュール定義ヘッダー ファイル-rw-r –r– 1 root root 5294 Apr 9 05:05 Sayhello.c //モジュール実装ファイル-rw-r–r– 1 root root 508 Apr 9 05:05 Sayhello.php //php usedファイル drwxr-xr-x 2 root root 4096 4 月 9 日 05:05 テスト’ s ’ s ’ s ’ s ’ t t t t t t t t t t t t t t t t t t t t t t t t t t y 2.say_hello() 関数を実装しますモジュールの php_sayhello.h ファイルを開き、php Say_hello() 用に用意された c 関数定義を追加します。
PHP_FUNCTION(say_hello); //php ソース コードは、慣れれば非常に便利です。追加したら、say_hello.c に PHP_FUNCTION (say_hello) の特定の実装を追加します。
PHP_FUNCTION(say_hello){ char *arg = NULL; int arg_len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) ==FAILURE) { //获取php代码的输入参数,方式与scanf差不多 return; } zend_printf("hello world : %s",arg); RETURN_STRINGL(arg, arg_len, 1); }
実装コードが記述されたので、次のことも行う必要があります。この関数を PHP ローカル関数に登録するには、sayhello.c のsayhello_functions を変更する必要があります:
zend_function_entry sayhello_functions[] = { PHP_FE(confirm_sayhello_compiled, NULL) /* For testing, remove later. */ PHP_FE(say_hello, NULL) //好,现在say_hello函数也注册了 {NULL, NULL, NULL} /* Must be the last line in sayhello_functions[] */ };
config.m4 の前にある
コメント文字「dnl」を削除します。次の内容:
dnl PHP_SUBST(SAYHELLO_ SHARED_LIBADD)
4. モジュールをコンパイルし、共有ライブラリを生成しますここで使用します。さらに、動的ライブラリモジュールの生成方法は、PHP への静的コンパイルよりもはるかに高速であり、デバッグ
に便利です (動的ライブラリは PHP を使用してロードされません)後で説明するように、dl() 関数)。 sayhello モジュール フォルダーに入り (cd)、パス bin で phpinstall
phpize を実行します: [root@myhostsayhello]# /opt/php_server/php/bin/phpizePHP API バージョン: 20041225Zend 拡張 API 番号: 220060519此时为模块编译的configure文件已经生成。继续生成Makefile文件:
[root@myhost sayhello]# ./configure –with-php-config=/opt/php_server/php/bin/php-config
……没问题的话是没有错误的
现在可以编译了:
make
代码没有问题的话不会有错的。
编译完,进行模块安装:
[root@myhost sayhello]# make install
Installing shared extensions: /opt/php_server/php/lib/php/extensions/no-debug-non-zts-20060613/
显示模块已经安装至/php安装路径/extensions/no-debug-non-zts-20060613/ 路径下了。
打开你的php.ini文件开始修改吧:
扩展路径设置:
修改extension_dir = “/php安装路径/lib/php/extensions/no-debug-non-zts-20060613″ //看看上述的模块安装路径就知道了
增加模块设置:
[sayhello]
extension=sayhello.so
ok 大功告成,重新启动你的php模块把。
写以下php测试代码执行:
<?php $a = say_hello("frank"); echo "<br>"; echo $a; ?>;
打开这个网页后显示:
hello world : frank
frank
成功运行,模块测试通过。
以上がPHPモジュール開発とは何ですか?簡単なPHPモジュール開発の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。