PHP
Informace ze popisované se hodí jen pro programátory v PHP.
Instalace PHP ze zdrojových souborů
Zde je stručně popsáno, jak si v Linuxu instalovat několik "libovolných" verzí PHP a jednoduše mezi nimi přepínat. Nová verze PHP (ta, která není součástí balíčkovacího systému) se instaluje ze zdrojových kódů. Překlad a instalace je popisována pro OpenSuSE, ale pro ostatní linuxové distribuce to bude obdobné.
1) Stažení zdrojových kódu PHP
Php ke stažení viz http://php.net/downloads.php.
2) Instalace knihoven potřebných pro překlad
Kromě tradičních nástrojů potřebných pro překlad (gcc, make atp.) jsem potřeboval doinstalovat následující balíčky:
V OpenSuSE:
Pokud chcete použít imap (volby --with-imap a --with-imap-ssl), musíte po instalaci imap-devel balíčku spustit následující příkazy:
$ sudo ln -s /usr/lib64/libc-client.a /usr/c-client/
Pokud použijete volbu -with-pdo-pgsql, možná budete muset zadat tyto příkazy:
$ sudo ln -s /etc/alternatives/pg_config /usr/bin/pg_config
Jinak vám ./configure
(viz dále) skončí s chybovou hláškou configure: error: Cannot find imap library (libc-client.a). Please check your c-client installation..
V Debianu:
$ cd /usr/local/include
$ ln -s /usr/include/x86_64-linux-gnu/curl .
2.0) Pro PHP 5.6 na nových systémech
PHP 5.6 vyžaduje icu-config, který byl v nových distribucích linuxu odebrán. Vrátit ho můžete vytvořením suboru /usr/bin/icu-config:#!/bin/sh opts=$1 case $opts in '--cppflags') echo '' ;; '--ldflags') echo '-licuuc -licudata -ldl' ;; *) echo '/usr/lib/x86_64-linux-gnu/icu/pkgdata.inc' ;; esac
Na novější verzi OpenSuSE (15.1) musíte pro podporu OpenSSL 1.1 (volba --with-openssl) v PHP 5.6 použít tento patch.
(Například příkazem git apply 4ca...7e.patch
v adresáři se zdrojovými kódy PHP).
3) Překlad a instalace PHP
Po staru:
Hodnota pro volbu --with-mysql-sock=???
se zjistí příkazem netstat -ln | grep mysql
.
Po novu:
Hodnota pro volbu --with-mysql-sock=???
se zjistí příkazem ss -ln | grep mysql
.
$ cd /opt/php-7.4.29
$ mv .../php-7.4.29.tar.gz .
$ gunzip php-7.4.29.tar.gz
$ tar xvf php-7.4.29.tar
$ mv php-7.4.29 php-7.4.29-src
$ cd /opt/php-7.4.29/php-7.4.29-src
#php 5.6.40: ./configure --prefix=/opt/php-5.6.40 --with-pdo-pgsql --with-readline --with-zlib-dir --enable-mbstring --with-libxml-dir --enable-soap --enable-calendar --with-zlib --with-gd --with-jpeg-dir --with-png-dir --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --with-mhash --enable-zip --with-pcre-regex --with-pdo-mysql --with-mysqli --enable-ftp --with-gettext -with-pdo-pgsql --with-mysql-sock=/var/run/mysql/mysql.sock --enable-exif --enable-bcmath --with-xmlrpc --with-xsl --with-config-file-path=/opt/php-5.6.40/lib64/ini/ --with-config-file-scan-dir=/opt/php-5.6.40/lib64/ini/modules/ --with-imap --with-imap-ssl --enable-fpm --with-curl=/usr/local/
# php 7.2.33: ./configure --prefix=/opt/php-7.2.33 --with-pdo-pgsql --with-readline --with-zlib-dir --enable-intl --enable-mbstring --with-libxml-dir --enable-soap --enable-calendar --with-zlib --with-gd --with-jpeg-dir --with-png-dir --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --with-mhash --enable-zip --with-pcre-regex --with-pdo-mysql --with-mysqli --enable-ftp --with-gettext -with-pdo-pgsql --with-mysql-sock=/var/run/mysql/mysql.sock --enable-exif --enable-bcmath --with-xmlrpc --with-xsl --with-openssl --with-config-file-path=/opt/php-7.2.33/lib64/ini/ --with-config-file-scan-dir=/opt/php-7.2.33/lib64/ini/modules/ --with-curl --with-imap --with-imap-ssl --enable-fpm --with-gmp
$ ./configure --prefix=/opt/php-7.4.29 --with-pdo-pgsql --with-readline --with-zlib-dir --enable-intl --enable-mbstring --enable-soap --enable-calendar --with-zlib --enable-gd --with-jpeg --with-xpm --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --with-mhash --with-zip --with-pcre-jit --with-pdo-mysql --with-mysqli --enable-ftp --with-gettext -with-pdo-pgsql --with-mysql-sock=/var/run/mysql/mysql.sock --enable-exif --enable-bcmath --with-xmlrpc --with-xsl --with-openssl --with-config-file-path=/opt/php-7.4.29/lib64/ini/ --with-config-file-scan-dir=/opt/php-7.4.29/lib64/ini/modules/ --with-curl --with-imap --with-imap-ssl --enable-fpm --with-gmp
$ make -j $(nproc)
$ make install
Ujistěte se, že máte správně nastavené hodnoty u --prefix=, --with-mysql-sock=, --with-config-file-path= a --with-config-file-scan-dir
Volby vhodné pro vývoj extension: --enable-maintainer-zts --enable-debug --enable-phpdbg
S PHP 5.6 také můžete chtít zapnout volbu --with-mysql.
V debianu/ubuntu budete možná ještě k ./configure přidat tyto volby: ... --with-curl=/usr/local --with-openssl-dir=/usr/local --with-kerberos
4) Nastavení php.ini
Nastavení viz soubor /opt/php-7.4.29/lib64/php.ini
.
V php.ini je třeba nastavit pdo_mysql.default_socket="/var/run/mysql/mysql.sock"
a přidat extension=/usr/lib64/php7/extensions/mysqli.so atp.
5) Nastavení Apache pro spouštění PHP jako FastCGI
Viz Nastavení FastCGI dále.
Nastavení FastCGI
PHP se obvykle používá jako modul v Apache. Ale můžete jej zprovoznit také jako FastCGI aplikaci. Máto své výhody i nevýhody. Výhodou je třeba to, že php může běžet pod uživatelskými právy vlastníka PHP souborů namísto uživatele, pod kterým je spuštěn Apache (pomocí modulu suexec). PHP interpret je pak také zcela nezávislý na Apache, takže nemůže ohrozit jeho stabilitu / výkon. Rychlost PHP jako FastCGI a modulu je srovnatelná, takže v tom výhodu nehledejte.
Instalace v Debianu se dá stručně shrnout do těchto bodů:
- Nainstalovat:
sudo apt-get install libapache2-mod-fcgid php7-cgi apache2-suexec-custom
-
Odebrat z /etc/apache/mods-enabled/ soubory php5.conf a php5.load
Alternativně lze vypnout php hanlder touto konfigurací (např. jen pro konkrétní adresář, v mod_userdir.conf):sudo a2dismod php7.3<FilesMatch "\.ph(p[345]?|tml)$">
SetHandler None
</FilesMatch>
AddType application/fast-php .php
Action application/fast-php /cgi-bin/php-fast -
Přidat do /etc/apache/mods-available/ soubory actions.conf a actions.load
Do actions.conf přidat řádky:
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ Action application/fast-php /cgi-bin/php-fast
Alternativně může být Action např. v mod_userdir.conf (viz výše).
Pozor na to, že ScriptAlias už můžete mít definovaný v nějakém konfiguračním souboru a nasměrovaný do jiného adresáře. V takovém případě doporučuji soubor php-fast (viz níže) umístit do adresáře definovaném původním ScriptAlias (což může být třeba /srv/www/cgi-bin/).
Povolit actions a cgid:
$ a2enmod actions
$ a2enmod cgid -
Do /usr/lib/cgi-bin/php-fast (nebo /srv/www/cgi-bin/php-fast) přidat:
#!/bin/sh
#version 7.4.29 (alias=7)
PHP_FCGI_CHILDREN=4
export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_MAX_REQUESTS
ulimit -s 16777216
exec /opt/php-7.4.29/bin/php-cgi - Nastavit právo spuštění: chmod +x /srv/www/cgi-bin/php-fast
-
V /etc/apache/sites-enabled/000default přidat na konec <VirtualHost *:80>:
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
AddType application/fast-php .php -
Do /etc/apache2/httpd.conf (nebo nějakého podobného configuračního souboru apache) můžete přidat
TimeOut 600
. Tím se nastaví TimeOut na 600 sekund. (To je, mimo jiné, čas, po který apache čeká na nějaký výstup z fastCGI skriptu. TimeOut by měl být větší než max_execution_time v php.ini, jinak se může stát, že apache PHP ukončí dřív než max_execution_time vyprší.) -
Zapnout modul suexec:
$ a2enmod suexec
- Restartovat Apache:
$ /etc/init.d/apache2 restart # debian
$ sudo systemctl restart apache2 # OpenSuse
Pokud se vše podaří, pak by phpinfo()
mělo zobrazit v tabulce
vedle Server API hodnotu CGI/FastCGI
.
Pokud máte nainstalován suexec, cgi a fcgi programy nesmějí mít nastaveno právo zápisu osatními a skupinou, jinak suexec odmítne jejich spuštění (viz chyby v /var/log/apache2/suexec.log).
Fungování suexec lze ověřit pomocí tohoto skriptu:
echo "Content-Type: text/plain"
echo ""
echo "User: `id -un` (`id -u`)"
echo "Group: `id -gn` (`id -g`)"
echo "Groups: `id -Gn` (`id -G`)"
echo ""
echo "Environment:"
env
TODO: jak rozchodit suexec s PHP a FastCGI.