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:

$ zypper install libopenssl-devel libmcrypt-devel libxslt-devel libcurl-devel postgresql96-devel re2c imap-devel libjpeg8-devel libpng16-devel libbz2-devel freetype2-devel libicu-devel

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 mkdir /usr/c-client/
$ 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 /usr/lib/postgresql96/bin/pg_config /etc/alternatives/pg_config
$ 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:

$ apt-get install libssl-dev libmcrypt-dev libxslt1-dev zlib1g-dev re2c libbz2-dev libcurl4-openssl-dev curl pkg-config libpng-dev libjpeg-dev libxpm-dev libfreetype6-dev libc-client2007e-dev libkrb5-dev libpq-dev libreadline-dev libonig-dev libzip-dev libgmp-dev
$ 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
# sudo chmod +x /usr/bin/icu-config

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.

$ mkdir /opt/php-7.4.29
$ 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ů:

  1. Nainstalovat:
    sudo apt-get install libapache2-mod-fcgid php7-cgi apache2-suexec-custom
  2. Odebrat z /etc/apache/mods-enabled/ soubory php5.conf a php5.load
     sudo a2dismod php7.3
    Alternativně lze vypnout php hanlder touto konfigurací (např. jen pro konkrétní adresář, v mod_userdir.conf):
            <FilesMatch "\.ph(p[345]?|tml)$">
                    SetHandler None
            </FilesMatch>
            AddType application/fast-php .php
            Action application/fast-php /cgi-bin/php-fast
  3. 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
  4. 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
  5. Nastavit právo spuštění: chmod +x /srv/www/cgi-bin/php-fast
  6. 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
  7. 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ší.)

  8. Zapnout modul suexec:
    $ a2enmod suexec
  9. 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:

#!/bin/bash
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.

Komentář Hlášení chyby
Created: 4.7.2017
Last updated: 16.4.2022
Tato stánka používá ke svému běhu cookies, díky kterým je možné monitorovat, co tu provádíte (ne že bych to bez cookies nezvládl). Také vás tu bude špehovat google analytics. Jestli si myslíte, že je to problém, vypněte si cookies ve vašem prohlížeči, nebo odejděte a už se nevracejte :-). Prohlížením tohoto webu souhlasíte s používáním cookies. Dozvědět se více..