ホームページ >バックエンド開発 >PHPチュートリアル >C/C++ を利用して PHP 言語を拡張し、パラメータなしの Usher_GetHostIP 関数を実装します。
C は PHP の母国語であるため、ビジネスの観点からでも専門的な観点からでも、PHP プログラマは C について少し知っておくことも必要です。また、現時点では、大量のビジネス ロジックを処理するためにネイティブ PHP を使用することはありません。
PHP は、言語の本質という点では確かに優れた言語です。柔軟に使用すれば、進歩を妨げるボトルネックにはならず、鋭い武器になるはずです。
適切に使用すれば、PHP は本当に良い選択です。
PHP を展開する
実装関数_gethostip ()
この関数の機能は、システム IP を取得することです。非パラメータ呼び出しを返します
トピックに直接移動します:
まず、PHP ソースコードの ext ディレクトリに入り、 ./ を実行します。 ext_skel -- extname=usher このステップにより、拡張アーキテクチャが生成されます。実行後は、次の図が表示されます。
usher 拡張ディレクトリを生成します。
cd usher ls と入力し、次のファイルを見つけてください。私は他の人よりも多くの設定を持っていますが、それは問題ではありません。 /usr/local/php/bin/phpize を実行します。パスに従って phpize を選択します。このステップでは autoconfig を使用します。これにより、上の図の構成が生成されます。 ! Usher_GetHostIP() の実装を開始しましょう
生成された usher ディレクトリに入り、usher.c と php_usher.h を編集します。ここで PHP を拡張する必要があります。
php_usher.hを開いて以下のコードを追加します
PHP_FUNCTION(Usher_GetHostIP); //注意这里 这是我们自己添加的 扩展函数結果は以下の通りです
RREE
usher を開きます。 c 次のコードを追加します
#ifndef PHP_USHER_H#define PHP_USHER_Hextern zend_module_entry usher_module_entry;#define phpext_usher_ptr &usher_module_entry#define PHP_USHER_VERSION "0.1.0" /* Replace with version number for your extension */#ifdef PHP_WIN32# define PHP_USHER_API __declspec(dllexport)#elif defined(__GNUC__) && __GNUC__ >= 4# define PHP_USHER_API __attribute__ ((visibility("default")))#else# define PHP_USHER_API#endif#ifdef ZTS#include "TSRM.h"#endifPHP_MINIT_FUNCTION(usher);PHP_MSHUTDOWN_FUNCTION(usher);PHP_RINIT_FUNCTION(usher);PHP_RSHUTDOWN_FUNCTION(usher);PHP_MINFO_FUNCTION(usher);PHP_FUNCTION(confirm_usher_compiled); /* For testing, remove later. */PHP_FUNCTION(Usher_GetHostIP); //注意这里 这是我们自己添加的 扩展函数/* Declare any global variables you may need between the BEGIN and END macros here: ZEND_BEGIN_MODULE_GLOBALS(usher) long global_value; char *global_string;ZEND_END_MODULE_GLOBALS(usher)*/#ifdef ZTS#define USHER_G(v) TSRMG(usher_globals_id, zend_usher_globals *, v)#else#define USHER_G(v) (usher_globals.v)#endif#endif /* PHP_USHER_H */
#include <netdb.h> //我们添加的扩展代码#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>
最終的な usher.c は次のとおりです
//Usher_GetHostIP实现PHP_FUNCTION(Usher_GetHostIP){ char *arg = NULL; int arg_len, len; char *strg; struct hostent *he; char hostname[20] = {0}; gethostname(hostname,sizeof(hostname)); he = gethostbyname(hostname); if (ZEND_NUM_ARGS() !=0) { RETURN_STRINGL("Prm error",strlen("Prm error") , 0); return; } len = spprintf(&strg, 0, "%s:%s", "usher", inet_ntoa(*(struct in_addr*)(he->h_addr))); RETURN_STRINGL(strg, len, 0);}
コードが変更され、コンパイルが開始されました
usher ディレクトリの config.m4 を変更して削除します。 図に示されている 2 行の前の dnl (PHP_ARG_WITH, [ これら 2 行の --with-usher dnl)
を直接削除します。 /make usher ディレクトリでは、以下の図に示す結果がコンパイルに成功したことを示しています。
make install インストール ここでデフォルトでインストールしました。
拡張 編集後、それを php にロードして、拡張機能がロードされているかどうかを確認するために phpinfo を入力してください
PHP が正常に拡張されました