Help us understand the problem. What is going on with this article?

PHP7.1を関連ライブラリと共にインストール(ソースからコンパイル)for Apache2.4+CentOS7.4

More than 1 year has passed since last update.

はじめに

PHPは、様々なライブラリがあり大変便利ですが、コンパイル時にはそのライブラリを含めてビルドする必要があります。
PHP7とよく使うであろうGD周りを含めたコンパイルの一式の作業メモです。
処理部分をまとめていますので、必要に応じてコピペすればほぼ無操作で、PHP7が稼働する環境が作れます。

あらかじめApacheのインストールが必要です

Apacheのインストールに関しては以下を参考にしてあらかじめインストールが必要です。
Apache2.4をインストールする(ソースからコンパイル) for CentOS7.2

以下のライブラリの事前インストールが必要です。

コンパイルオプションを適宜変更していただければ構いませんが、投稿で以下のライブラリが事前にインストールされている前提になっています。
インストール手順はリンクを参考にしてください。
OpenSSL1.0
libssh2
zlib

今回採用するライブラリ群

プログラム名 バージョン
JPEG v9c
FreeType 2.9
libPNG 1.6.34
zlib 1.2.11
m4 1.4.18
autoconf 2.69
libiconv 1.15
xml 2.9.7
libGD 2.2.5
libmcrypt 2.5.8
imap(c-client) 2007f
curl curl-7.58.0
libpng 1.6.34
libtiff 4.0.8

※必要に応じてMySQLやPostgreSQLも追加可能です

実践環境

環境 バージョン
PHP 7.1.13
OS CentOS 7.4(7.2/7.3も確認済み)

OS標準のバイナリをインストールする

xorg-x11-proto-devel-7.7-13.el7.noarch.rpm
libXpm-devel-3.5.11-3.el7.x86_64.rpm
libX11-devel-1.6.3-3.el7.x86_64.rpm
pam-devel-1.1.8-18.el8.x86_64.rpm

関係ライブラリをダウンロードする

#バイナリダウンロード
mkdir -p /usr/local/src/phpmodule
cd /usr/local/src/phpmodule
#JPEG
cd /usr/local/src/phpmodule
wget http://www.ijg.org/files/jpegsrc.v9c.tar.gz
tar xvzf jpegsrc.v9c.tar.gz

#FreeType
wget https://download.savannah.gnu.org/releases/freetype/freetype-2.9.tar.gz
tar xvzf freetype-2.9.tar.gz

#libPNG
wget --trust-server-names https://downloads.sourceforge.net/project/libpng/libpng16/1.6.34/libpng-1.6.34.tar.gz?r=http%3A%2F%2Fwww.libpng.org%2Fpub%2Fpng%2Flibpng.html&ts=1511065314&use_mirror=jaist
tar xvzf libpng-1.6.34.tar.gz


#zlib
wget http://zlib.net/zlib-1.2.11.tar.gz
tar xvzf zlib-1.2.11.tar.gz

#m4
wget http://ftp.gnu.org/gnu/m4/m4-1.4.18.tar.gz
tar xvzf m4-1.4.18.tar.gz

#autoconf
wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
tar xvzf autoconf-2.69.tar.gz

#libiconv
wget https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz
tar xvzf libiconv-1.15.tar.gz

#xml
wget ftp://xmlsoft.org/libxml2/libxml2-2.9.7.tar.gz
tar xvzf libxml2-2.9.7.tar.gz

#libGD
wget https://github.com/libgd/libgd/releases/download/gd-2.2.5/libgd-2.2.5.tar.gz
tar xvzf libgd-2.2.5.tar.gz

#libmcrypt
wget --trust-server-names http://downloads.sourceforge.net/project/mcrypt/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz?r=https%3A%2F%2Fsourceforge.net%2Fprojects%2Fmcrypt%2Ffiles%2FLibmcrypt%2F2.5.8%2F&ts=1474546665&use_mirror=jaist
tar xvzf libmcrypt-2.5.8.tar.gz

#imap
#wget ftp://ftp.cac.washington.edu/imap/imap-2007f.tar.gz
#ミラーサイトを利用
wget http://ftp.ntua.gr/pub/net/mail/imap/imap-2007f.tar.gz
tar xvzf imap-2007f.tar.gz

#curl
wget https://curl.haxx.se/download/curl-7.58.0.tar.gz
tar xvzf curl-7.58.0.tar.gz

#libpng
wget ftp://ftp-osl.osuosl.org/pub/libpng/src/libpng16/libpng-1.6.34.tar.gz
tar xvzf libpng-1.6.34.tar.gz

#libtiff
wget http://download.osgeo.org/libtiff/tiff-4.0.9.tar.gz
tar xvzf tiff-4.0.9.tar.gz

各モジュールをコンパイルする

#JPEG
cd /usr/local/src/phpmodule
cd jpeg-9c
./configure --enable-shared
make
make install

#libtiff
cd /usr/local/src/phpmodule
cd tiff-4.0.9
./configure
make
make install

#FreeType
cd /usr/local/src/phpmodule
cd freetype-2.9
./configure --enable-static
make
make install

#phpから参照できるようにシンボリックリンクを作成する
ln -s /usr/local/include/freetype2 /usr/local/include/freetype


#libPNG
cd /usr/local/src/phpmodule
cd libpng-1.6.34
cp scripts/makefile.linux Makefile
./configure --prefix=/usr/local LDFLAGS="-L/usr/local/lib -lz"
make
make install


#zlib
cd /usr/local/src/phpmodule
cd zlib-1.2.11
./configure
make
make install


#m4
cd /usr/local/src/phpmodule
cd m4-1.4.18
./configure
make
make install


#autoconf
cd /usr/local/src/phpmodule
cd autoconf-2.69
./configure
make
make install


#libiconv
cd /usr/local/src/phpmodule
cd libiconv-1.15
./configure
make
make install

libiconvで以下のエラーが出る場合

In file included from progname.c:26:0:
./stdio.h:1010:1: error: 'gets' undeclared here (not in a function)
 _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");

その場合は、以下のファイルを編集する

vi srclib/stdio.h

「_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");」
の箇所を確認し、以下のように変更する

#if defined(__GLIBC__) && !defined(__UCLIBC__) && !__GLIBC_PREREQ(2, 16)
_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
#endif

続き

#libxml
cd /usr/local/src/phpmodule
cd libxml2-2.9.7
./configure --with-python=no
make
make install


#libGD
cd /usr/local/src/phpmodule
cd libgd-2.2.5
#cp scripts/makefile.linux Makefile
./configure \
--with-png=/usr/local \
--with-freetype=/usr/local \
--with-jpeg=/usr/local \
--with-xpm=/usr \
--with-libiconv-prefix=/usr/local \
--disable-werror
make
make install

##もし、libgdのmakeで「gdft.c:154:22: 致命的エラー: ft2build.h:」こける場合は、
##yum install fontconfig-devel
##を実行後、再度、configureからやり直す

#mcrypt
cd /usr/local/src/phpmodule
cd libmcrypt-2.5.8
./configure
make
make install
cd libltdl
./configure --enable-ltdl-install
make
make install

#libxml
./configure
make


#imap
## 「osdep.c:89:31: 致命的エラー: security/pam_appl.h: そのようなファイルやディレクトリはありません」が出る場合は、
## rpm -ivh pam-devel-1.1.8-18.el7.x86_64.rpm
cd /usr/local/src/phpmodule
cd imap-2007f
make lnp SSLTYPE=unix EXTRACFLAGS=-fPIC
y

#ソースをコピー
cp -p c-client/*.h /usr/include
cp c-client/c-client.a  /usr/lib/libc-client.a


#curl
cd /usr/local/src/phpmodule
cd curl-7.58.0

#OpenSSLの場所を明示
CPPFLAGS="-I/usr/local/ssl/include" LDFLAGS="-L/usr/local/ssl/lib"

./configure \
--enable-http \
--enable-ftp \
--enable-file \
--enable-proxy \
--enable-cookies \
--with-zlib=/usr/local \
--with-ssl=/usr/local/ssl \
--with-libssh2=/usr/local

make
make install

PHPをインストールする

cd /usr/local/src
wget --trust-server-names http://jp2.php.net/get/php-7.1.13.tar.gz/from/this/mirror
tar xvzf php-7.1.13.tar.gz
cd php-7.1.13


./configure \
--enable-mbstring \
--enable-mbregex \
--with-apxs2=/usr/local/apache2/bin/apxs \
--with-gd=/usr/local \
--with-freetype-dir=/usr/local/src/phpmodule/freetype-2.7 \
--with-jpeg-dir=/usr/local/lib \
--with-png-dir=/usr/local \
--with-tiff-dir=/usr/local \
--with-zlib-dir=/usr \
--with-iconv-dir=/usr/local \
--with-libxml-dir=/usr/local \
--enable-gd-native-ttf \
--enable-gd-jis-conv \
--enable-zip \
--with-curl=/usr/local \
--with-mcrypt=/usr/local \
--enable-bcmath \
--enable-sockets \
--enable-ftp \
--enable-opcache=no \
--with-openssl=/usr/local/ssl \
--with-xpm-dir=/usr \
--with-gettext \
--with-imap=/usr/local/src/phpmodule/imap-2007f \
--with-imap-ssl=/usr/local/ssl
#
#PGSQLを入れる場合
#--with-pgsql=/usr/local/pgsql \
#--with-pdo-pgsql=/usr/local/pgsql
#
#MySQL(MariaDB)を入れる場合
#--with-mysqli=/usr/local/mysql/bin/mysql_config \
#--with-pdo-mysql=/usr/local/mysql \
##CentOS6以前=--with-mysql-sock=/tmp/mysql.sock
#--with-mysql-sock=/run/mysql/mysql.sock

make
make install

以下のようなエラーが出る場合

In file included from /usr/local/src/php-7.1.0/ext/gd/gd_compat.c:13:0:
/usr/local/include/jpeglib.h:974:30: error: unknown type name 'FILE'
 EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile));
                              ^
/usr/local/include/jpeglib.h:975:29: error: unknown type name 'FILE'
 EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile));

この場合、jpeglib.hを編集し、「#include "jmorecfg.h" 」の下に、「#include <stdio.h>」を追加する

vi /usr/local/include/jpeglib.h

以下のを追加

#include "jmorecfg.h"           /* seldom changed options */
#include <stdio.h>
//↑これを追加する

DBに対応する場合

PostgreSQLに対応する場合

--with-pgsql=/usr/local/pgsql \
--with-pdo-pgsql=/usr/local/pgsql

MySQL対応する場合

--with-mysqli=/usr/local/mysql/bin/mysql_config \
--with-pdo-mysql=/usr/local/mysql \
--with-mysql-sock=/tmp/mysql.sock

設定を行う

cp php.ini-production /usr/local/lib/php.ini

httpd.confにphpファイルを実行されるように設定します

vi /usr/local/apache2/conf/httpd.conf

LoadModule php7_module modules/libphp7.so
の下に「AddType application/x-httpd-php .php」を記入する

httpd.copf
LoadModule php7_module        modules/libphp7.so
#↓追加する
AddType application/x-httpd-php .php

を追記して保存終了します。

phpinfoを出す

vi /usr/local/apache2/htdocs/phpinfo.php

以下の内容を張り付けて保存終了

phpinfo
<?php
  date_default_timezone_set("Asia/Tokyo");
  phpinfo();
?>

Apacheを再起動後、phpinfo.phpを開き以下のような画面が出ればOK
image

参考文献

http://www.itkb.ro/kb/linux/patch-libiconv-pentru-glibc-216
https://travis-ci.org/libgd/libgd/jobs/151123674/config
https://github.com/libgd/libgd/issues/292

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away