ホームページ  >  記事  >  バックエンド開発  >  PHP拡張機能でのHello Worldの詳細な紹介

PHP拡張機能でのHello Worldの詳細な紹介

黄舟
黄舟オリジナル
2017-08-14 09:26:031966ブラウズ


前書き

これは私が長い間書きたいと思っていたメモです。PHP 拡張機能の作成に関する記事は何百もありますが、その多くは非常に古いものです。一部の例は機能しません。ちょっと恥ずかしいですね。
この記事は自分のメモをメモとして記録するために使用します。

本文

1. php インストール パッケージをダウンロードします

ダウンロード アドレス: php ダウンロード クイック リンク
この記事では php-5.6.7 インストール パッケージを選択します。
その後、phpをインストールします。

2. 拡張スケルトンを作成します

//跑到ext目录cd php-5.6.7/ext///执行一键生成骨架的操作./ext_skel --extname=helloworld

作成結果を説明する次のプロンプトが表示されたら、次のファイルが見つかります:

cd helloworld
ls
PHP拡張機能でのHello Worldの詳細な紹介3. 拡張設定ファイル config.m4 を変更します

次のコードDNLを削除します。 (dnl は php の // に相当します)

config.m4  config.w32  CREDITS  EXPERIMENTAL  helloworld.c  helloworld.php  php_helloworld.h  tests

通常、2 つのうちの 1 つを選択できます (個人の好みによって異なります。このチュートリアルでは、enable コメントを削除する必要があります)。

4. コンパイルテストを実行します

##动态编译选项,通过.so的方式链接,去掉dnl注释PHP_ARG_WITH(helloworld, for helloworld support,
Make sure that the comment is aligned:
[  --with-helloworld             Include helloworld support])##静态编译选项,通过enable来启用,去掉dnl注释PHP_ARG_ENABLE(helloworld, whether to enable helloworld support,
Make sure that the comment is aligned:
[  --enable-helloworld           Enable helloworld support])

その後、php.iniに拡張機能を追加します

phpize
./configure --enable-helloworldmakemake install

拡張機能が記述されたフォルダーに戻り、テストコマンドを実行します

vim /usr/local/php/etc/php.ini// 添加扩展extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/"extension = "helloworld.so"// 重启php-fpm/etc/init.d/php-fpm restart

次の文字が表示されている場合は、勝利まで遠くないことを意味します:

php -d enable_dl=On myfile.php

confirm_helloworld_compiled ext_skelが自動生成するテスト関数です。

追記: 2 つの php バージョンがローカルにインストールされており、拡張機能が php7 で記述されている場合、次の問題が発生する可能性があります:

confirm_helloworld_compiled

Congratulations! You have successfully modified ext/helloworld/config.m4. Module helloworld is now compiled into PHP.

原因: コンパイル環境が php7 ではありません。

解決策: php5 には zend_string 型がありません。char に置き換えるか、php バージョン環境を php7

5 に変更します。 helloworld 関数を作成


helloworld.c を編集し、実装する関数を追加します

/mydata/src/php-7.0.0/ext/helloworld/helloworld.c: 在函数‘zif_confirm_helloworld_compiled’中:
/mydata/src/php-7.0.0/ext/helloworld/helloworld.c:58: 错误:‘zend_string’未声明(在此函数内第一次使用)
/mydata/src/php-7.0.0/ext/helloworld/helloworld.c:58: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
/mydata/src/php-7.0.0/ext/helloworld/helloworld.c:58: 错误:所在的函数内也只报告一次。)
/mydata/src/php-7.0.0/ext/helloworld/helloworld.c:58: 错误:‘strg’未声明(在此函数内第一次使用)

「PHP_FUNCTION」を見つけます(confirm_helloworld_compiled)" として、別の関数を開始し、関数エンティティを記述します:

##zend_function_entry helloworld_functions 补充要实现的函数const zend_function_entry helloworld_functions[] = { 
    PHP_FE(confirm_helloworld_compiled, NULL)       /* For testing, remove later. */
    PHP_FE(helloworld,  NULL)       /* 这是补充的一行,尾巴没有逗号 */
    PHP_FE_END  /* Must be the last line in helloworld_functions[] */};

コンパイルを再度実行します:

PHP_FUNCTION(helloworld) {    php_printf("Hello World!\n");
    RETURN_TRUE;
}

それが本当に成功したかどうかをテストします:

./configure --enable-helloworld && make && make install

Success!

以上がPHP拡張機能でのHello Worldの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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