Build PHP from source
Packages without -dev
typically do not contain necessary header files.
If you are using Debian or Ubuntu you can use apt-get build-dep php5
to install a large number of optional build-dependencies in one go. If
you are only aiming for a default build, many of them will not be
necessary though.
The latest PHP is PHP 5.6.6 at the time of writing, and we have latest Debian 7.8 Wheezy. Let’s get the dependencies we need to build PHP from source:
Needed dependecies, for sure:
apt-get -y install \
libdb-dev libxpm-dev libbz2-dev libc-client-dev \
libcurl4-openssl-dev libevent-dev libfreetype6-dev libgmp3-dev \
libicu-dev libjpeg-dev libpng-dev libpspell-dev libsasl2-dev \
libsnmp-dev libxml2-dev libxslt-dev unixodbc-dev
Download and unzip sources:
cd /usr/local/src
wget http://php.net/get/php-5.6.6.tar.bz2/from/this/mirror -O php.tar.bz2
tar -xvf php.tar.bz2
cd php-5.6.6/
Configure and compile PHP
In order to enable FPM in your PHP build you must add --enable-fpm
to
your configure line.
I have chosen to install it in /usr/local/php566-fpm
. We must use the
prefix switch in order for your new PHP to be installed inside a single
directory.
The exact ./configure
is so huge that I decided to put it in separate
file.
./configure ... lot of stuff ...
Now, we make and install it, this could take a while:
# build
make --jobs=4
We can always clean up everything that make did with make clean
.
For a faster build, -j N
replace N with the number of CPU cores you
have available - grep "cpu cores" /proc/cpuinfo
.
By default PHP will build binaries for the CLI and CGI SAPIs, which will
be located at sapi/cli/php
and sapi/cgi/php-cgi
respectively. To
check that everything went well, try running sapi/cli/php -v.
# install php
# apt-get install checkinstall
checkinstall -D --pkgname="php-5.6.6-custom" make install
Note the neat trick about using a checkinstall tool. Option -D
commands to build a Debian package.
When asked, use a name php-5.6.6-custom
, so later I can remove it with
apt-get remove php-5.6.6-custom
Plesk: Install PHP 5.4 on Debian Squeeze CheckInstall
Adding a folder conf.d
which PHP will search for additional ini-files.
mkdir -p /etc/php5/php566/fpm/conf.d
When this is complete, the PHP is installed in place, and we need to
copy the default php.ini
file to the install directory:
cp php.ini-production /etc/php5/php566/fpm/php.ini
I have added the following to an ini-file in php.d, to enable OPCache and adjust some configuration files:
tmp=$(cat /etc/timezone)
sed -i "s#;date.timezone =#date.timezone = $tmp#" /etc/php5/php566/fpm/php.ini
cat <<'EOF' > /etc/php5/php566/fpm/conf.d/10-opcache.ini
; configuration for Zend opCache
post_max_size = 32M
upload_max_filesize = 32M
zend_extension=/usr/local/php566/lib/php/20131226/opcache.so
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=2001
opcache.revalidate_freq=5
opcache.fast_shutdown=1
opcache.enable_cli=0
opcache.enable=1
EOF
Adding the PHP to Plesk
This can be done for every SAPI type, EXCEPT for php-fpm.
plesk bin php_handler --add \
-displayname "5.6.6" \
-path /usr/local/php566/bin/php-cgi \
-phpini /usr/local/php-5.6.6/etc/php.ini \
-type fastcgi \
-id "fastcgi-5.6.6"
But for php-fpm, I will just switch executable in service script
/etc/init.d/php5-fpm
. Only the line DAEMON=/usr/sbin/$NAME
will be
changed.
sed -i -re 's/^(DAEMON=\/usr\/sbin\/\$NAME)/# \1\'$'\nDAEMON=\/usr\/local\/php566\/sbin\/php-fpm/g' /etc/init.d/php5-fpm
service php5-fpm restart
Sources & Articles
-
How to enable multiple PHP versions in Parallels Plesk for Linux
-
Debian: how to install PHP (5.5.15) from source and use it with Plesk 12
-
CentOS: Script for installing multiple PHP versions in Plesk 11.5
Configure command
By default most extensions will be compiled statically, i.e. they will be part of the resulting binary.
Only the opcache
extension is shared by default, i.e. it will generate an opcache.so
shared object in the modules/
directory. You can
compile other extensions into shared objects as well by writing --enable-NAME=shared
or --with-NAME=shared
, but not all extensions
support this.
php-fpm and php-cgi are mutually exclusive, as the php-cgi binary is not
created if PHP is compiled with --enable-fpm
. If you want to use PHP
as FastCGI module and with the FPM daemon you must compile PHP several
times until you get all the binaries you need.
Problems when compiling PHP with fpm and cgi
In this multi-line command, I used this trick about comments.
Configure command:
./configure \
--with-pic `# compiler libtool directive `\
\
--prefix=/usr/local/php566 \
--with-config-file-path=/etc/php5/php566/fpm `# will use php.ini located we already use `\
--with-config-file-scan-dir=/etc/php5/php566/fpm/conf.d `# use the same search path for .ini files `\
\
--enable-fpm `# build the fpm SAPI and not php-cgi `\
--with-fpm-group=www-data `# UID of web server, based on /var/run/php5-fpm.sock ownership `\
--with-fpm-user=www-data `# GID `\
\
--enable-opcache `# enable zend opcache support `\
\
--enable-bcmath `# enable bc style precision math functions `\
--with-bz2 `# include bzip2 support `\
--enable-calendar `# enable support for calendar conversion `\
--with-curl `# cURL support / --with-curl=shared,/usr `\
\
--enable-dba=shared `# My PHP supported: db4 cdb cdb_make inifile flatfile qdbm ~ http://php.net/manual/en/dba.installation.php `\
`# --with-db4 # or: --with-db4=/usr `\
`# --with-qdbm # DBA: this one is not bundled or enabled by default `\
\
--enable-exif `# Enable EXIF (metadata from images) support `\
--enable-ftp `# Enable FTP support `\
\
--with-gd `# http://php.net/manual/en/image.installation.php `\
--with-png-dir=shared,/usr `# or: --with-png-dir=/usr/local/php566 `\
--with-jpeg-dir=shared,/usr `# or: --with-jpeg-dir=/usr/local/php566 `\
--with-xpm-dir=shared `# /usr/local/php566 or: --with-xpm-dir=shared,/usr/X11R6 `\
--with-freetype-dir=shared,/usr `# or: --with-freetype-dir=/usr/local/php566 `\
--enable-gd-native-ttf `# Enable TrueType string function `\
\
--with-gettext `# Include GNU gettext support `\
--with-mhash `# Include mhash support `\
\
--with-imap `# or: --with-imap=shared,/usr ~ http://php.net/manual/en/imap.installation.php`\
--with-imap-ssl `# `\
--with-kerberos `# IMAP: Include Kerberos support ~ or: --with-kerberos=/usr `\
\
--enable-mbstring `# Multibyte string support ~ http://php.net/manual/en/mbstring.installation.php `\
\
--with-mysql `# mysqlnd is default ~ http://php.net/manual/en/mysql.installation.php `\
--with-mysqli `# for every mysql extension ~ http://php.net/manual/en/mysqli.installation.php `\
\
--with-openssl `# OpenSSL support ~ http://php.net/manual/en/openssl.installation.php or: with-openssl=/usr `\
\
--with-pdo-mysql `# --with-pdo-mysql=mysqlnd is not needed, as native driver is default now `\
--with-pdo-sqlite `# SQLite PDO support `\
\
--enable-shmop `# shmop support ~ http://php.net/manual/en/shmop.installation.php `\
--enable-soap `# SOAP support ~ http://php.net/manual/en/soap.installation.php `\
--enable-sockets `# sockets support ~ http://php.net/manual/en/sockets.installation.php `\
\
--enable-sysvmsg `# sysvmsg support ~ http://php.net/manual/en/sem.installation.php `\
--enable-sysvsem `# `\
--enable-sysvshm `# `\
\
--enable-wddx `# WDDX support ~ http://php.net/manual/en/wddx.installation.php `\
--with-xsl `# --with-xsl=shared,/usr ~ http://php.net/manual/en/xsl.installation.php `\
--enable-zip `# include zip read/write support ~ http://php.net/manual/en/zip.installation.php `\
--with-zlib `# include ZLIB support ~ http://php.net/manual/en/zlib.installation.php `\
--with-xmlrpc `# XML-RPC support ~ http://php.net/manual/en/xmlrpc.installation.php `\
\
--with-mcrypt `# Must be enabled for Laravel PHP framework. Include mcrypt support `\
\
`# --build=x86_64-linux-gnu # don't touch as system types are guessed `\
`# --host=x86_64-linux-gnu # no need to force anything `\
\
`# --enable-mbregex # enabled by default ~ http://php.net/manual/en/mbstring.installation.php `\
`# --enable-ctype # enabled by default ~ http://php.net/manual/en/ctype.installation.php `\
`# --with-iconv # enabled by default ~ http://php.net/manual/en/iconv.installation.php `\
`# --with-libxml-dir=/usr # enabled by default ~ http://php.net/manual/en/libxml.installation.php `\
`# --with-pcre-regex # enabled by default, --with-pcre-regex=/usr ~ http://php.net/manual/en/pcre.installation.php `\
`# --enable-pdo # enabled by default ~ http://php.net/manual/en/pdo.drivers.php `\
`# --enable-simplexml # enabled by default ~ http://php.net/manual/en/simplexml.installation.php `\
`# --with-sqlite3 # enabled by default ~ http://php.net/manual/en/sqlite3.installation.php `\
`# --enable-xmlreader # enabled by default ~ http://php.net/manual/en/xmlreader.installation.php `\
`# --enable-xmlwriter # enabled by default ~ http://php.net/manual/en/xmlwriter.installation.php `\
`# --disable-dom # enabled by default `\
`# --with-flatfile # enabled by default ~ DBA: FlatFile support is bundled `\
`# --with-cdb # enabled by default ~ DBA: CDB support is bundled `\
`# --with-inifile # enabled by default ~ DBA: INI support is bundled `\
`# --with-pdo-pgsql # postgre sql was disabled in my php `\
`# --with-mysql-sock=/var/run/mysqld/mysqld.sock # optional ~ http://php.net/manual/en/ref.pdo-mysql.php `\
`# --with-zlib-dir=/usr # optional to specify `\
`# --without-gdbm # disabled by default ~ part of "--enable-dba" `\
`# --without-mssql # disabled by default ~ microsoft ~ http://php.net/manual/en/mssql.installation.php `\
`# --without-sybase-ct # disabled by default ~ http://php.net/manual/en/sybase.installation.php `\
\
`# --with-onig=/usr # Can't find enywhere what "onig" is? `\
\
`# The Phar extension is now built into PHP ~ http://php.net/manual/en/phar.installation.php `\
`# POSIX functions are enabled by default ~ http://php.net/manual/en/posix.installation.php `\
`# Reflection functions are part of the PHP core ~ http://php.net/manual/en/reflection.installation.php `\
`# SPL available and compiled by default ~ http://php.net/manual/en/spl.installation.php `\
`# Tokenizer funtions are enabled by default ~ http://php.net/manual/en/tokenizer.installation.php `\
`# XML Parser is enabled by default ~ http://php.net/manual/en/xml.installation.php `\
\
`# WARNING: unrecognized options: `\
`# --with-fpm-systemd # my system doesn't support systemd integration to report health `\
`# --with-libevent-dir=/usr # no more libevent requirement ~ http://php.net/manual/en/install.fpm.install.php#101754 `\
`# --with-system-tzdata # unrecognized! system-supplied time zone database is used `\
\
--localstatedir=/var `# read variable machine data from here, as default is different `\
--mandir=/usr/share/man `# `\
--sysconfdir=/etc `# read system configuration from here, as default is different `\
\
--with-layout=GNU `# Minor diff in loc of ext dir ~ http://serverfault.com/a/293523/69638 `\
\
--with-pear=/usr/share/php `# Install PEAR in DIR `\
--with-regex `# php is already a default TYPE (=php) ~ http://php.net/manual/en/regex.installation.php `\
\
--disable-rpath `# disable passing additional runtime library search paths `\
--disable-static `# don't build static libraries `\
--without-mm `# disable mm support for session storage `\
Configure usage from help
./configure
usage:
By default, make install
will install all the files in /usr/local/bin
, /usr/local/lib
etc. You can specify
an installation prefix other than /usr/local
using --prefix
, for instance --prefix=$HOME
.
Enable-disable, with-without, yes-no. Explanation:
--disable-option-checking ignore unrecognized --enable/--with options
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
--with-libdir=NAME Look for libraries in .../NAME rather than .../lib
--disable-rpath Disable passing additional runtime library search paths
--enable-re2c-cgoto Enable -g flag to re2c to use computed goto gcc extension
| Installation directories: | |
| –prefix=PREFIX | install architecture-independent files in PREFIX [/usr/local] |
| –exec-prefix=EPREFIX | install architecture-dependent files in EPREFIX [PREFIX] |
| | |
| Fine tuning of the install dirs: | |
| –bindir=DIR | user executables [EPREFIX/bin] |
| –sbindir=DIR | system admin executables [EPREFIX/sbin] |
| –libexecdir=DIR | program executables [EPREFIX/libexec] |
| –sysconfdir=DIR | read-only single-machine data [PREFIX/etc] |
| –sharedstatedir=DIR | modifiable architecture-independent data [PREFIX/com] |
| –localstatedir=DIR | modifiable single-machine data [PREFIX/var] |
| –libdir=DIR | object code libraries [EPREFIX/lib] |
| –includedir=DIR | C header files [PREFIX/include] |
| –oldincludedir=DIR | C header files for non-gcc [/usr/include] |
| –datarootdir=DIR | read-only arch.-independent data root [PREFIX/share] |
| –datadir=DIR | read-only architecture-independent data [DATAROOTDIR] |
| –infodir=DIR | info documentation [DATAROOTDIR/info] |
| –localedir=DIR | locale-dependent data [DATAROOTDIR/locale] |
| –mandir=DIR | man documentation [DATAROOTDIR/man] |
| –docdir=DIR | documentation root [DATAROOTDIR/doc/PACKAGE] |
| –htmldir=DIR | html documentation [DOCDIR] |
| –dvidir=DIR | dvi documentation [DOCDIR] |
| –pdfdir=DIR | pdf documentation [DOCDIR] |
| –psdir=DIR | ps documentation [DOCDIR] |
| | |
| System types: | |
| –build=BUILD | configure for building on BUILD [guessed] |
| –host=HOST | cross-compile to build programs to run on HOST [BUILD] |
| –target=TARGET | configure for building compilers for TARGET [HOST] |
| | |
| SAPI modules: | |
| –with-apxs=FILE | Build shared Apache 1.x module. |
| –with-apxs2=FILE | Build shared Apache 2.0 Handler module. FILE is the optional pathname to Apache apxs tool apxs |
| –disable-cli | Disable building CLI version of PHP (this forces –without-pear) |
| –enable-fpm | Enable building of the fpm SAPI executable |
| –with-fpm-user=USER | Set the user for php-fpm to run as. (default: nobody) |
| –with-fpm-group=GRP | Group for php-fpm. For a system user, usually be set to match the fpm username (default: nobody) |
| –with-fpm-systemd | Activate systemd integration |
| –with-fpm-acl | Use POSIX Access Control Lists |
| –enable-phpdbg | Build phpdbg - PHP Debugger |
| –enable-phpdbg-debug | Build phpdbg in debug mode |
| –disable-cgi | Disable building CGI version of PHP |
| | |
| General settings: | |
| –enable-debug | Compile with debugging symbols |
| –with-layout=TYPE | Set how installed files will be laid out. Type can be either PHP or GNU [PHP] |
| | |
| –with-config-file-path=PATH | Set the path in which to look for php.ini [PREFIX/lib] |
| –with-config-file-scan-dir=PATH | Set the path where to scan for configuration files |
| –disable-short-tags | Disable the short-form <?
start tag by default |
| –disable-ipv6 | Disable IPv6 support |
| –enable-dtrace | Enable DTrace support |
| –enable-fd-setsize | Set size of descriptor sets |
| | |
| Extensions: | |
| –with-EXTENSION=shared[,PATH] | NOTE: Not all extensions can be build as ‘shared’. |
| | |
| –disable-all | Disable all extensions which are enabled by default |
| –with-regex=TYPE | Regex library type: system, php. TYPE=php |
| –disable-libxml | Disable LIBXML support |
| –with-libxml-dir=DIR | LIBXML: libxml2 install prefix |
| –with-openssl=DIR | Include OpenSSL support (requires OpenSSL >= 0.9.6) |
| –with-kerberos=DIR | OPENSSL: Include Kerberos support |
| –with-system-ciphers | OPENSSL: Use system default cipher list instead of hardcoded value |
| –with-pcre-regex=DIR | Include Perl Compatible Regular Expressions support. DIR is the PCRE install prefix BUNDLED |
| –without-sqlite3=DIR | Do not include SQLite3 support. DIR is the prefix to SQLite3 installation directory. |
| –with-zlib=DIR | Include ZLIB support (requires zlib >= 1.0.9) |
| –with-zlib-dir=
0 - Options used for original PHP build script (php-config)
./configure
--prefix=/usr
--enable-ctype
--enable-intl=shared
--mandir=/usr/share/man
# --with-apxs2=/usr/bin/apxs2 # Build shared Apache 2.0 module
--with-bz2
--with-enchant=shared,/usr
--with-gmp=shared,/usr
--with-layout=GNU
--with-ldap-sasl=/usr
--with-ldap=shared,/usr
--with-mcrypt=shared,/usr
--with-onig=/usr
--with-pear=/usr/share/php
--with-pgsql=shared,/usr
--with-pspell=shared,/usr
--with-recode=shared,/usr
--with-snmp=shared,/usr
--with-tidy=shared,/usr
--with-unixODBC=shared,/usr
--with-xmlrpc=shared
--without-t1lib
1-1 - Configure PHP ceromedia
./configure \
--prefix=/usr/local/php5514
--enable-intl
--enable-pcntl
--with-bz2
--with-gmp
--with-libdir=lib64
--with-mcrypt
--with-snmp
--with-xmlrpc
1 - Configure PHP build script - Stayallive
./configure \
--prefix=/php/php-5.6.4 \
--cache-file=./config.cache \
--enable-intl \
--enable-pcntl \
--with-bz2 \
--with-gmp \
--with-ldap \
--with-ldap-sasl \
--with-libdir=lib64 \
--with-mcrypt \
--with-pear=/php/php-5.6.4/pear \
--with-pspell \
--with-snmp \
--with-unixODBC=/usr \
2 - Configure PHP build script - http://aarvik.dk/, Debian
./configure \
--prefix=/usr/local/php5515
--enable-intl
--enable-pcntl
--with-bz2
--with-gmp
--with-libdir=lib64
--with-mcrypt
--with-snmp
--with-vpx-dir=/usr/local/php5515
--with-xmlrpc
3 - Configure PHP build script
./configure \
--prefix=/usr/local/php55
--with-bz2
--with-pear
--with-xmlrpc
4 - From Plesk - http://kb.sp.parallels.com/en/118378
./configure
--prefix=/usr/local/php563-cgi
--cache-file=../config.cache
# --enable-fastcgi # If this is enabled, the CGI module will be built with support for FastCGI also. No longer exists and is enabled by --enable-cgi instead.
--enable-intl
--enable-pcntl
--with-bz2
--with-config-file-path=/usr/local/php563-cgi/etc
--with-config-file-scan-dir=/usr/local/php563-cgi/php.d
--with-gmp
--with-ldap
--with-ldap-sasl
--with-libdir=lib64
--with-pear=/usr/local/php563-cgi/pear
--with-pspell
--with-snmp
--with-unixODBC=/usr
--with-xmlrpc
--with-xsl
Location of built extensions
Make install will put shared extensions in different directories
depending on ZTS options. Directory will be called
$PREFIX/lib/php/extensions/no-debug-non-zts-API_NO
for release builds
without ZTS, or debug-non-zts-API_NO
, no-debug-zts-API_NO
,
debug-zts-API_NO
where API_NO
placeholder above refers to the
ZEND_MODULE_API_NO
and is just a date like 20100525
, which is used
for internal API versioning.
As I don’t want this zts
naming, I found out ZEND_MODULE_API_NO
on
my PHP by typing grep ZEND_MODULE_API_NO Zend/zend_modules.h
from PHP
src-dir.
--extension-dir # shared modules will be built into /usr/lib/php5/20131226 (was 20100525)
Original config
Usage: /usr/bin/php-config5 [OPTION]
Options:
--prefix [/usr]
--includes [-I/usr/include/php5 -I/usr/include/php5/main -I/usr/include/php5/TSRM -I/usr/include/php5/Zend -I/usr/include/php5/ext -I/usr/include/php5/ext/date/lib ]
--ldflags [-L/usr/lib/php5 -L/usr/lib/x86_64-linux-gnu]
--libs [-lcrypt -lz -lcrypt -lonig -lstdc++ -lcrypto -lssl -ldb -lqdbm -lbz2 -lz -lpcre -lcrypto -lssl -lrt -lm -ldl -lnsl -lxml2 -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lxml2 -lxml2 -lxml2 -lcrypt -lxml2 -lxml2 -lxml2 -lxml2 -lcrypt ]
--extension-dir [/usr/lib/php5/20100525]
--include-dir [/usr/include/php5]
--man-dir [/usr/share/man]
--php-binary [/usr/bin/php]
--php-sapis [apache2handler apache2filter cgi cli fpm ]
--phpapi [20100525]
--configure-options [--prefix=/usr --with-apxs2=/usr/bin/apxs2 --with-config-file-path=/etc/php5/apache2 --with-config-file-scan-dir=/etc/php5/apache2/conf.d --build=x86_64-linux-gnu --host=x86_64-linux-gnu --sysconfdir=/etc --localstatedir=/var --mandir=/usr/share/man --disable-debug --with-regex=php --disable-rpath --disable-static --with-pic --with-layout=GNU --with-pear=/usr/share/php --enable-calendar --enable-sysvsem --enable-sysvshm --enable-sysvmsg --enable-bcmath --with-bz2 --enable-ctype --with-db4 --with-qdbm=/usr --without-gdbm --with-iconv --enable-exif --enable-ftp --with-gettext --enable-mbstring --with-onig=/usr --with-pcre-regex=/usr --enable-shmop --enable-sockets --enable-wddx --with-libxml-dir=/usr --with-zlib --with-kerberos=/usr --with-openssl=/usr --enable-soap --enable-zip --with-mhash=yes --with-system-tzdata --with-mysql-sock=/var/run/mysqld/mysqld.sock --without-mm --with-curl=shared,/usr --with-enchant=shared,/usr --with-zlib-dir=/usr --with-gd=shared,/usr --enable-gd-native-ttf --with-gmp=shared,/usr --with-jpeg-dir=shared,/usr --with-xpm-dir=shared,/usr/X11R6 --with-png-dir=shared,/usr --with-freetype-dir=shared,/usr --with-imap=shared,/usr --with-imap-ssl --enable-intl=shared --without-t1lib --with-ldap=shared,/usr --with-ldap-sasl=/usr --with-mcrypt=shared,/usr --with-mysql=shared,/usr --with-mysqli=shared,/usr/bin/mysql_config --with-pspell=shared,/usr --with-unixODBC=shared,/usr --with-recode=shared,/usr --with-xsl=shared,/usr --with-snmp=shared,/usr --with-sqlite3=shared,/usr --with-mssql=shared,/usr --with-tidy=shared,/usr --with-xmlrpc=shared --with-pgsql=shared,/usr]
--version [5.4.36-0+deb7u3]
--vernum [50436]
Fixing the problems
Installing with make install…
========================= Installation results =========================== Installing shared extensions: /usr/local/php566/lib/php/20131226/ Installing PHP CLI binary: /usr/local/php566/bin/ Installing PHP CLI man page: /usr/share/man/man1/ Installing PHP FPM binary: /usr/local/php566/sbin/ Installing PHP FPM config: /etc/ Installing PHP FPM man page: /usr/share/man/man8/ Installing PHP FPM status page: /usr/local/php566/share/php/fpm/ Installing PHP CGI binary: /usr/local/php566/bin/ Installing PHP CGI man page: /usr/share/man/man1/ Installing build environment: /usr/local/php566/lib/php/build/ Installing header files: /usr/local/php566/include/php/ Installing helper programs: /usr/local/php566/bin/ program: phpize program: php-config Installing man pages: /usr/share/man/man1/ page: phpize.1 page: php-config.1 Installing PEAR environment: /usr/share/php/ [PEAR] Archive_Tar - installed: 1.3.12 [PEAR] Console_Getopt - installed: 1.3.1 [PEAR] Structures_Graph- installed: 1.0.4 [PEAR] XML_Util - installed: 1.2.3 [PEAR] PEAR - installed: 1.9.5 Wrote PEAR system config file at: /etc/pear.conf You may want to add: /usr/share/php to your php.ini include_path /usr/local/src/php-5.6.6/build/shtool install -c ext/phar/phar.phar /usr/local/php566/bin ln -s -f /usr/local/php566/bin/phar.phar /usr/local/php566/bin/phar Installing PDO headers: /usr/local/php566/include/php/ext/pdo/
======================== Installation successful ==========================
Done. The new package has been installed and saved to
/usr/local/src/php-5.6.6/php_5.6.6-1_amd64.deb
You can remove it from your system anytime using:
dpkg -r php
On testing /usr/local/php566/bin/php --ini
we get:
Failed loading /usr/lib/php5/20100525/ioncube_loader_lin_5.4.so:
/usr/lib/php5/20100525/ioncube_loader_lin_5.4.so: undefined symbol:
execute
PHP Warning: PHP Startup: Unable to load dynamic library
'/usr/local/php566/lib/php/20131226/pdo.so' -
/usr/local/php566/lib/php/20131226/pdo.so: cannot open shared object
file: No such file or directory in Unknown on line 0
If I change extension_dir = "/usr/lib/php5/20100525"
in /etc/php5/fpm/php.ini
, I get
for every extension:
Failed loading /usr/lib/php5/20100525/ioncube_loader_lin_5.4.so: /usr/lib/php5/20100525/ioncube_loader_lin_5.4.so: undefined symbol: execute
PHP Warning: PHP Startup: PDO: Unable to initialize module
Module compiled with module API=20100525
PHP compiled with module API=20131226
These options need to match
So, that’s not an option.
ionCube Loader
ionCUbe Loader is Zend extension module for loading protected/crypted PHP files.
I checked it out and I found out that ionCube Loader is not required for
my installation and I can switch and install my version because Plesk
uses totally different and separate module
(/usr/lib/x86_64-linux-gnu/php/modules/sw-engine/ioncube_loader_lin_5.5.so
).
So, it’s safe to disable or upgrade ionCube. Standard location is in
/usr/lib/php5/20100525/
.
Fix missing extension modules
pdo.so curl.so gd.so imap.so mysql.so mysqli.so pdo_mysql.so pdo_sqlite.so sqlite3.so xsl.so
scripts/php-switch at master · tobiasgies/scripts
Adding an extension as module
You can install Mcrypt from the PHP source tree as a module. You first need to ensure you have libmcrypt, libmcrypt-devel, and mcrypt installed, then do:
/usr/local/php566/bin/phpize
make
checkinstall -D --pkgname="php-memcached-custom" make install
remove it anytime with `dpkg -r php-memcached-custom`
The problem was non-working:
/usr/local/php566/bin/pecl install memcached
cd /usr/local/src/php-5.6.6/ext/mcrypt/
/usr/local/php566/bin/phpize
./configure --with-php-config=/usr/local/php566/bin/php-config
make && make install
Compiled module is now in /usr/local/src/php-5.6.6/ext/mcrypt/modules
.
Enable the module by adding: extension=mcrypt.so
to PHP.ini
cp /usr/local/src/php-5.6.6/ext/mcrypt/modules/mcrypt.so /usr/local/php566/lib/php/20131226/
And enable extension:
echo '
; Extension needed for Laravel PHP framework
;
extension=mcrypt.so
' > /etc/php5/php566/fpm/conf.d/10-mcrypt.ini
Very handy if you need to install a single module but don’t wish to recompile your whole PHP install.
C
Error: configure: error: mcrypt.h not found. Please reinstall libmcrypt.
I have to install libmcrypt
with:
apt-get -y install mcrypt libmcrypt-dev
Optimize PHP-FPM
Monitor server reached max_children setting (), consider raising it
messages.
tail -f /var/log/php5-fpm.log
How to calculate values
Find out free RAM without PHP-FPM (free -h
). Look at the line
-/+ buffers/cache
as this is real free amount.
Divide the RAM you want dedicate to php (12G?) with average memory usage
by a single process, and you have your max_children
value.
Average memory usage by single PHP-FPM process:
ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("Number of PHP-FPM processes: %d\nAverage mem usage per process %dM\n", NR, sum/NR/1024) }'
Maximum memory usage by single PHP-FPM process:
ps --no-headers -o "rss,cmd" -C php-fpm | tail -n1 | awk '{ printf ("Max memory usage per process: %dM\n", $1/1024) }'
Do the same, but for some specific domain:
ps --no-headers -o "rss,cmd" -C php-fpm | grep "save-up.ch" | awk '{ sum+=$1 } END { printf ("Number of PHP-FPM processes: %d\nAverage mem usage per process %dM\n", NR, sum/NR/1024) }'
ps --no-headers -o "rss,cmd" -C php-fpm | grep "save-up.ch" | tail -n1 | awk '{ printf ("Max memory usage per process: %dM\n", $1/1024) }'
So, in my case I could set more than 700 but I believe that value of 200 will be more then enough.
Sources & Articles
In Plesk
If you want custom PHP-FPM pool values in Plesk, just add this as custom PHP directive. Plesk will automaticly put it where it should be.
Location of main PHP-FPM configuration file is
/etc/php5/fpm/php-fpm.conf
, and included ones - per domain are located
at /etc/php5/fpm/pool.d/*.conf
** THIS IS NOT WORKING **
In file itself, it states:
If you need to customize this file, use either custom PHP settings tab in Panel or override settings in /var/www/vhosts/system/save-up.ch/conf/php.ini. To override pool configuration options, specify them in
[php-fpm-pool-settings]
section of /var/www/vhosts/system/save-up.ch/conf/php.ini file.
Default value was correct (ondemand spawning), and I just want to increase couple of values.
cat <<'EOF' > /var/www/vhosts/system/save-up.ch/etc/php.ini
[php-fpm-pool-settings]
pm.max_children = 100
EOF
Sources & Articles
- PROBLEM
Extra Optimizations:
Add extra indexes to MySQL
WordPress wp_options table autoload micro-optimization
Increase realpath_cache_size
NOTE: No need, as of PHP7 the default is 4M
Increase realpath_cache_size
to 128K to 256K for Wordpress
realpath_cache_size
is used by PHP to keep from having to look up file names. Every time you perform any of the various file functions or
include/require a file and use a relative path, PHP has to look up where that file really exists. PHP caches those values so it doesn’t have to
search the current working directory and include_path for the file you’re working on.
Tweaking realpath_cache_size for SugarCRM PHP open_basedir and Magento Performance Optimize PHP performance, check and set PHP realpath_cache_size Solving drupal performance problem
echo "realpath_cache_size = 128k" /usr/local/etc/php/conf.d/speed-tweaks.ini
My usage on local server was around 45K.
echo "<pre>"; die(var_export(realpath_cache_size()) . "</pre>");
See below for Plesk.
Problem with open_basedir
Normally, PHP can cache various path locations it learns after processing include_once and require_once calls via the realpath_cache. There’s a bug in PHP that effectively disables the realpath_cache entirely when combined with open_basedir.
Confirmed: When PHP’s open_basedir restriction is set, PHP disables the realpath cache for security reasons.
Whissi/realpath_turbo Speed up PHP on NFS with turbo_realpath on CentOS
Solution can be to use realpath_turbo PHP extension or to disable
open_basedir
completely for the site:
nano /etc/php5/fpm/pool.d/save-up.ch.conf
service php5-fpm restart
; Put this in
; php.ini custom configuration directives
php_value[short_open_tag] = on
; php_value[open_basedir] = "/var/www/vhosts/save-up.ch/:/tmp/"
php_value[open_basedir] = ""
php_value[realpath_cache_size] = "128k"
; Following directives override default pool configuration
pm.max_children = 100