PHP extensionの作り方 5分でできるHello world!
スポンサーリンク
このドキュメントの内容は、以下の通りです。
はじめに
PHPエクステンションを爆速で作るサンプルです。
CodeGen_PECLのインストール
sudo pear install --alldeps CodeGen_PECL
FreeBSD で ports から入れたのですが、pecl-gen コマンドが入ってこなかったので pear コマンドでインストールしました。
XMLの準備
pecl-gen コマンドでソースコード類を生成します。pecl-genコマンドには、specファイルが必要です。
ファイル helloworld.xml
<?xml version="1.0" encoding="UTF-8"?>
<extension name="helloworld" version="1.0.0">
<summary>Hello, World!</summary>
<description><?data
This is PHP extension module.
?></description>
<maintainers>
<maintainer>
<user>kaoru</user>
<name>kaoru</name>
<email>kaoru@foo.com</email>
<role>lead</role>
</maintainer>
</maintainers>
<license>PHP</license>
<channel>__uri</channel>
<release>
<version>1.0.0</version>
<date>2013-02-16</date>
<state>stable</state>
<notes><?data
- Initial release.
?></notes>
</release>
<function name="helloworld" role="public">
<proto>void helloworld()</proto>
<summary>Hello, World!</summary>
<description><?data
Print "Hello, World!".
?></description>
<code><?data
php_printf("Hello, World!%s", PHP_EOL);
?></code>
<test>
<code><?data
helloworld();
?></code>
<result mode="plain"><?data
Hello, World!
?></result>
</test>
</function>
</extension>
スケルトンの生成
pecl-gen helloworld.xml
ビルド
cd helloworld phpize ./configure gmake
ソースの修正
function_entry がないとエラーが出ました。
error: expected '=', ',', ';', 'asm' or '__attribute__' before 'xxx'
function_entry は、 zend_function_entry と直します。
修正したら、gmake を実行します。
根本的解決
pecl-gen を何度も叩くことになるので、CodeGen_PECL のコードを修正してしまったほうがよいです。
対象ファイルは /usr/local/share/pear/CodeGen/PECL/Extension.php です。
suvo vim /usr/local/share/pear/CodeGen/PECL/Extension.php
対象となるコードは、この部分です。
function generateFunctionRegistrations()
{
$code = "/* {{{ {$this->name}_functions[] */\n";
$code .= "function_entry {$this->name}_functions[] = {\n";
foreach ($this->functions as $function) {
zend_function_entry に修正します。
$code .= "zend_function_entry {$this->name}_functions[] = {\n";
テスト
ビルドができたらテストをします。
% make test Build complete. Don't forget to run 'make test'. ===================================================================== PHP : /usr/local/bin/php PHP_SAPI : cli PHP_VERSION : 5.4.11 ZEND_VERSION: 2.4.0 PHP_OS : FreeBSD - FreeBSD vm2.local 9.0-RELEASE FreeBSD 9.0-RELEASE #0: Tue Jan 3 07:15:25 UTC 2012 root@obrian.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386 INI actual : /home/foo/php/helloworld/tmp-php.ini More .INIs : CWD : /home/foo/php/helloworld Extra dirs : VALGRIND : Not used ===================================================================== TIME START 2013-02-16 18:28:44 ===================================================================== PASS helloworld() function [tests/helloworld.phpt] ===================================================================== TIME END 2013-02-16 18:28:44 ===================================================================== TEST RESULT SUMMARY --------------------------------------------------------------------- Exts skipped : 0 Exts tested : 10 --------------------------------------------------------------------- Number of tests : 1 1 Tests skipped : 0 ( 0.0%) -------- Tests warned : 0 ( 0.0%) ( 0.0%) Tests failed : 0 ( 0.0%) ( 0.0%) Expected fail : 0 ( 0.0%) ( 0.0%) Tests passed : 1 (100.0%) (100.0%) --------------------------------------------------------------------- Time taken : 0 seconds ===================================================================== This report can be automatically sent to the PHP QA team at http://qa.php.net/reports and http://news.php.net/php.qa.reports This gives us a better understanding of PHP's behavior. If you don't want to send the report immediately you can choose option "s" to save it. You can then email it to qa-reports@lists.php.net later. Do you want to send this report now? [Yns]: n
実行
このようなコマンドラインで実行します。
php -d extension=modules/helloworld.so -r 'helloworld();'
Hello, World! と表示されたでしょうか?
インストール
sudo make install
以上で、Hello World ができました。
参照しているページ (サイト内): [2013-02-27-1] [2013-02-19-1] [2013-02-18-1]
スポンサーリンク
スポンサーリンク
いつもシェア、ありがとうございます!
もっと情報を探しませんか?
関連記事
最近の記事
- パナソニック ジェットウォッシャードルツ EW-DJ61-Wのホースの修理
- LinuxセキュリティモジュールIntegrity Policy Enforcement
- アマゾンのEcho Show 5を買ったのでレビューします
- アマゾンのサイバーマンデーはAlexa Echo Show 5が安い
- Android スマートフォン OnePlus 7T と OnePlus 7の違い
- Android スマートフォン OnePlus 7 をAndroid10にアップデートしてみた
- クレジットカードのバーチャルカードの比較のまとめ
- 活動量計 Xiaomi Mi Band 4を買ってみたのでレビュー
- Android スマートフォン OnePlus 7 のレビュー
- AliExpressでスマートフォンを買い物してみた
- パソコンのホコリ対策 レンジフードフィルターと養生テープ
- 80PLUS GOLDのPC電源ユニットAntec NeoEco 750 Goldのレビュー
- イギリスの付加価値税 VAT は払い戻しを受けられる
- イギリスのロンドンでスーツケースなど荷物を預けられる場所は
- イギリスのロンドンで地下鉄やバスに乗るならオイスターカードを使おう
- イギリスのヒースロー空港からロンドン市内への行き方
- 航空便でほかの航空会社に乗り継ぎがある場合のオンラインチェックイン
- SFC会員がANA便ではなくベトナム航空のコードシェアを試して解ったこと
- ベトナムの入国審査でeチケットの掲示が必要だった話
- シアトルの交通ICカードはオルカカード(Orca)です
人気のページ
- Windows7 IME 辞書ツールで単語の登録に失敗しました
- C言語 popen()でコマンドを実行して出力を読み込む
- Windows7で休止状態にする方法
- CentOS MySQLの起動、停止、再起動
- loggerコマンドでsyslogにエラーを出力する方法
- パソコンパーツの買取をしてくれる店のまとめ
- Java Mapの使い方 get(),put(),remove(),size(),clear()
- 楽天のRポイントカードを作ってみた
- iPhone 5 から iPhone 6 に乗り換えたのでレビュー
- netstatコマンドのステータスの意味
スポンサーリンク
過去ログ
2020 : 01 02 03 04 05 06 07 08 09 10 11 122019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12