スポンサーリンク

このドキュメントの内容は、以下の通りです。

はじめに


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]

スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

スポンサーリンク
 

過去ログ

2020 : 01 02 03 04 05 06 07 08 09 10 11 12
2019 : 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

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー