computerの日記

Cisco,SHELL,C,Qt,C++,Linux,ネットワーク,Windows Scriptなどの発言です

Fedora28 に Phalcon をインストールしてみた

Phalcon は、PHP フレームワークのうちのひとつで、爆速で知られています。

今回は、ソースからのコンパイルをやってみます(*注1)。

こちらのドキュメントを参考にしました。

docs.phalconphp.com php7 をインストールします。

# dnf install php
...(snip)...
インストール済み:
php.x86_64 7.2.7-1.fc28
php-fpm.x86_64 7.2.7-1.fc28
nginx-filesystem.noarch 1:1.12.1-8.fc28

 その他、必要なパッケージをインストールします。

# dnf install php-json php-devel pcre-devel gcc make

確認したところでは、必要なパッケージは、以下となります。
php, php-json, php-devel, pcre-devel, gcc, make

PHP 関係だけ確認します。

$ rpm -qa | grep php
php-cli-7.2.7-1.fc28.x86_64
php-devel-7.2.7-1.fc28.x86_64
php-json-7.2.7-1.fc28.x86_64
php-7.2.7-1.fc28.x86_64
php-mysqlnd-7.2.7-1.fc28.x86_64
php-fpm-7.2.7-1.fc28.x86_64
php-pdo-7.2.7-1.fc28.x86_64
php-common-7.2.7-1.fc28.x86_64

では、cphalcon を clone します。

$ git clone https://github.com/phalcon/cphalcon

build ディレクトリに移動して、make します。

$ cd cphalcon/build
# ./install
find . -name \*.gcno -o -name \*.gcda | xargs rm -f
find . -name \*.lo -o -name \*.o | xargs rm -f
find . -name \*.la -o -name \*.a | xargs rm -f
find . -name \*.so | xargs rm -f
find . -name .libs -a -type d|xargs rm -rf
rm -f libphp.la modules/* libs/*
Cleaning..
Configuring for:
PHP Api Version: 20170718
Zend Module Api No: 20170718
Zend Extension Api No: 320170718
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
libtool: compile: gcc -I. -I/home/fujiwara/PHALCON/cphalcon/build/php7/64bits -DPHP_ATOM_INC -I/home/fujiwara/PHALCON/cphalcon/build/php7/64bits/include -I/home/fujiwara/PHALCON/cphalcon/build/php7/64bits/main -I/home/fujiwara/PHALCON/cphalcon/build/php7/64bits -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib -DPHALCON_RELEASE -DHAVE_CONFIG_H -march=native -mtune=native -O2 -fomit-frame-pointer -c /home/fujiwara/PHALCON/cphalcon/build/php7/64bits/phalcon.zep.c -fPIC -DPIC -o .libs/phalcon.o
libtool: link: gcc -shared -fPIC -DPIC .libs/phalcon.o -march=native -mtune=native -O2 -Wl,-soname -Wl,phalcon.so -o .libs/phalcon.so
libtool: link: ( cd ".libs" && rm -f "phalcon.la" && ln -s "../phalcon.la" "phalcon.la" )
libtool: install: cp ./.libs/phalcon.so /home/fujiwara/PHALCON/cphalcon/build/php7/64bits/modules/phalcon.so
libtool: install: cp ./.libs/phalcon.lai /home/fujiwara/PHALCON/cphalcon/build/php7/64bits/modules/phalcon.la
libtool: finish: PATH="/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/home/fujiwara/.rvm/bin:/usr/local/sbin:/usr/sbin:/home/fujiwara/.rvm/bin:/home/fujiwara/.local/bin:/home/fujiwara/bin:/home/fujiwara/.rvm/bin:/sbin" ldconfig -n /home/fujiwara/PHALCON/cphalcon/build/php7/64bits/modules
----------------------------------------------------------------------
Libraries have been installed in:
/home/fujiwara/PHALCON/cphalcon/build/php7/64bits/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the 'LD_RUN_PATH' environment variable
during linking
- use the '-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to '/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------

Build complete.
Don't forget to run 'make test'.

Installing shared extensions: /usr/lib64/php/modules/
Installing header files: /usr/include/php/

Thanks for compiling Phalcon!
Build succeed: Please restart your web server to complete the installation

共有モジュールがインストールされました。確認します。

# ls /usr/lib64/php/modules/
bz2.so ctype.so exif.so ftp.so iconv.so mysqlnd.so pdo_mysql.so phalcon.so sockets.so tokenizer.so
calendar.so curl.so fileinfo.so gettext.so mysqli.so pdo.so pdo_sqlite.so phar.so sqlite3.so

ヘッダーファイルがインストールされました。確認します。

# ls /usr/include/php/ext
date dom filter gd hash iconv json libxml mbstring mysqli mysqlnd pcre pdo phalcon phar session simplexml sockets spl standard xml

以下のファイルを作成して、extension の記述をします。
php.ini に記述するよりも、この方がよいようです(*注2)。

# vim /etc/php.d/30-phalcon.ini
--------
; Enable phalcon extension module
extension=phalcon
--------

ini ファイルのディレクトリ配下は、以下のようになりました。

# ls /etc/php.d
20-bz2.ini 20-curl.ini 20-ftp.ini 20-json.ini 20-phar.ini 20-tokenizer.ini 30-pdo_sqlite.ini
20-calendar.ini 20-exif.ini 20-gettext.ini 20-mysqlnd.ini 20-sockets.ini 30-mysqli.ini 30-phalcon.ini
20-ctype.ini 20-fileinfo.ini 20-iconv.ini 20-pdo.ini 20-sqlite3.ini 30-pdo_mysql.ini

httpd.service をリスタートします。

# systemctl restart httpd.service

loaded extensions を確認します。
phpinfo を見たところ、Phalcon の項目がありました。

以下のコマンドでも確認できました。

# php -r 'print_r(get_loaded_extensions());'| grep phalcon
[33] => phalcon

さあ、なに食べようか。。

--------
(*注1)
リポジトリをインストールして、パッケージインストールをする場合はこちらです。

phalcon のリポジトリをインストールします。

# curl -s https://packagecloud.io/install/repositories/phalcon/stable/script.rpm.sh | bash

phalcon のリポジトリ設定ファイルがあることを確認します。

# ls -l /etc/yum.repos.d
...(snip)...
phalcon_stable.repo

(*注2)
php.ini に直接モジュールの読み込み設定を記述すると、たとえば、以下のようなエラーになります。

/usr/lib64/php/modules/phalcon.so (/usr/lib64/php/modules/phalcon.so: undefined symbol: php_json_decode_ex)) in Unknown on line 0