🙌

phpの拡張モジュール開発環境

2022/08/28に公開

PHP7の準備

既存のPHP関連パッケージを削除し、PHP7のインストールを行う

必要なパッケージのインストール

yum install -y wget bzip2 gcc

既存のPHP削除

yum remove php-*

PHP7インストール

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

yum install --enablerepo=remi,remi-php73 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt php-pgsql

拡張モジュールの設定

拡張モジュールのスケルトンはPHP本体に同梱されている
PHP7の標準モジュールも同じく同梱されているため、実装が分からない場合は他のモジュールのソースを参考にする

PHP7のソースコード取得7.3.10

mkdir /home/[ユーザ名]/php-dev

cd /home/[ユーザ名]/php-dev

wget -O php-7.3.10.tar.bz2 http://jp2.php.net/get/php-7.3.10.tar.bz2/from/this/mirror

tar xjf php-7.3.10.tar.bz2

cd /php-7.3.10/ext

テンプレート作成

php ext_skel.php --ext [任意のモジュール名]

cd /[任意のモジュール名]

vi config.m4
        dnl(コメントアウト)を外す
        dnl PHP_ARG_ENABLE(my_ext, whether to enable my_ext support,
        dnl Make sure that the comment is aligned:
        dnl [  --enable-my_ext           Enable my_ext support])

phpize

./configure --enable-[任意のモジュール名]

開発

修正対象

[任意のモジュール名].c
php_[任意のモジュール名].h

注意事項

いくつか独自の関数を使った方がいいものがある。らしい。
普通のC 拡張モジュールの場合
calloc ecalloc
free efree

基本的なメモリ管理
https://www.php.net/manual/ja/internals2.memory.management.php

iniファイルを追加

vi [任意のモジュール名].ini

; Enable source_guard extension module
extension=source_guard

デバッグ

make

make test

php -d extension=modules/[任意のモジュール名].so [任意のモジュール名].php

本番

make

make install

systemctl restart httpd

php -m

systemctl restart httpd

Discussion