ホームページ >バックエンド開発 >PHPチュートリアル >C/C++ を利用して PHP 言語を拡張し、パラメータなしの Usher_GetHostIP 関数を実装します。

C/C++ を利用して PHP 言語を拡張し、パラメータなしの Usher_GetHostIP 関数を実装します。

WBOY
WBOYオリジナル
2016-06-23 13:40:221005ブラウズ

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 が正常に拡張されました


















声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。