Php


 * php установка модулей
 * php/check
 * Php/mysql

Установка как CGI
Для установки как CGI (или как интерпретатора) а не php52 make config-recursive install clean -C /usr/ports/lang/php5

make showconfig  ===> The following configuration options are available for php5-5.2.12: CLI=on "Build CLI version" CGI=on "Build CGI version" APACHE=on "Build Apache module" DEBUG=off "Enable debug" SUHOSIN=off "Enable Suhosin protection system (not for jails)" MULTIBYTE=on "Enable zend multibyte support" IPV6=off "Enable ipv6 support" MAILHEAD=on "Enable mail header patch" REDIRECT=off "Enable force-cgi-redirect support (CGI only)" DISCARD=off "Enable discard-path support (CGI only)" FASTCGI=on "Enable fastcgi support (CGI only)" PATHINFO=on "Enable path-info-check support (CGI only)" ===> Use 'make config' to modify these settings 
 * При установке в jail, надо отключить SUHOSIN - в новое версии уже нет этого замечания и ставил в jail
 * ipv6 если этот протокол не используется
 * Влияющие на использование в CGI переменные - могут быть переопределены через php.ini
 * Назначение неизвестно MULTIBYTE и MAILHEAD

Минусы у варианта установки как CGI - проблемы с безопасностью. Подробнее.

Сборка остановится и будет предложено выбрать опции для:
 * LIBSIGSERV (выключена по умолчанию - так и оставил)
 * для M4 (GNU M4 is an implementation of the traditional Unix macro processor) - по умолчанию
 * libiconv - оставил по умолчанию

Чтобы не появлялись запросы, BATCH использовать. Нужно.

Когда выбирается модуль для PHP, то ставится regex. Другие параметры configure можно увидеть в секции CONFIGURE_ARGS= в Makefile.

В итоге получаем установленный php /usr/local/bin/php и /usr/local/bin/php-cgi

По умолчанию для configure php используется строка вида (отображается в phpinfo):

'./configure' '--with-layout=GNU' '--with-config-file-scan-dir=/usr/local/etc/php' '--disable-all' '--enable-libxml' '--with-libxml-dir=/usr/local' '--program-prefix=' '--with-pcre-regex=/usr/local' '--with-regex=php' '--with-zend-vm=CALL' '--disable-ipv6' '--prefix=/usr/local' '--mandir=/usr/local/man' '--infodir=/usr/local/info/' '--build=i386-portbld-freebsd8.0'

Чтобы изменить условия configure можно воспользоваться CONFIGURE_ARGS make CONFIGURE_ARGS+="--with-layout=PHP" install clean

В конфигурационный файл Apache, чтобы индексным файлом по умолчанию был index с расширением php надо добавить строку. "DirectoryIndex index.php index.html"

Проверка
Для проверки создаем в cgi-bin файл и даем ему аттрибут на выполнение chmod +х. Должна выводится страница с результатами.   
 * 1) !/usr/local/bin/php-cgi

php -r 'phpinfo;' | grep mysql
 * Инлайны

Указание интерпретатора
Чтобы файлы передавались на выполнение php-интерпретатору, надо указать путь до него через sha-bang строку в начале файла, либо сделать файл-враппер, который размещается в cgi-bin.

Fast-cgi
Одна из причин, по которой Установка как интерпретатора требовалась - возможность использоваться fast-cgi. Установка mod_fcgid описана на странице Fastcgi.

Установка модулей
Php установка модулей

Проблемы
Если права не выставлены на php-файл в httpd-error лог будет добавлена следующая строка. Исправляется командой chmod +x mime [Tue Feb 2 23:34:42 2010] [error] [client 89.250.4.112] file permissions deny server execution: /usr/local/www/cgi-bin/mime

Установка PHP как модуля Apache
1. Нужно взвести при установке флажок APACHE "Build Apache module" (по умолчанию сброшен)

Файл модуля собирается /usr/local/libexec/apache22/libphp5.so

2. Индексный файл по умолчанию  DirectoryIndex index.php index.html 

? AllowOverride ALL

При сборке порта автоматически добавляется LoadModule php5_module       libexec/apache22/libphp5.so

Надо добавить только тип и все AddType application/x-httpd-php .php
 * 1) AddHandler cgi-script .cgi

Строку для загрузки модуля добавляет в конфигурационный файл самостоятельно, остается лишь поправить httpd.conf в части (тут вместо mod_php4.c изменяем на mod_php5.c - актутально для Apache 1.3):    .. и строку добавить: AddType application/x-httpd-php .php Видимо можно почти куда угодно, я в внутрь  после #AddHandler cgi-script .cgi
 * Старый Apache 1.3

Переустановка
make deinstall make reinstall просто повторно устанавливает, поэтому сначала сделал make rmconfig

Установка из портов отсутствующую там версию ПО
О том что 5.3 в портах отсутствует становится известно после посещения freshports.org. Желательно поискать готовые варианты, например, пачт от пользователей, который позволит установить из портов. Если он найден (например, по запросу FreeBSd ports php 5.3 patch), применить его /usr/ports/lang/php5/ make -C /usr/ports/lang/php5/ deinstall clean make -C /usr/ports/lang/php5-extensions/ deinstall clean pkg_delete -v "php5-*" pkg_delete -v "pecl*" cd ~ fetch http://www.alexdupre.com/php53.diff cd /usr/ patch -p0 -E < ~/php53.diff

fileinfo при этом не был доступен, если ставить как модуль, то видится в phpinfo (без версии), но не работает, но передать configure параметры, указывающие собрать с ним.

Чтобы избавиться от --disable-all<BR> make CONFIGURE_ARGS+="--with-layout=GNU --with-config-file-scan-dir=/usr/local/etc/php --enable-libxml --with-libxml-dir=/usr/local --program-prefix= --with-pcre-regex=/usr/local --with-regex=php --with-zend-vm=CALL --disable-ipv6 --prefix=/usr/local --mandir=/usr/local/man --infodir=/usr/local/info/ --build=i386-portbld-freebsd8.0" install clean

Достаточно много модулей откуда-то взялось, если их ставить еще раз из портов, то в логах апача будет при каждом вызове php-скрипта сообщения, что такой-то модуль уже загружены. УДалил их pkg_delete все дублирующие.

При второй установке не пропатчилось MAkefile на предмет portverion и постоянно выводилось сообщение при попытке сборки, что уже конфигурация такая есть, надо было поискать по версии рекурсивно, а не по имени файл.

Не поставился qmake и auttoconf - видимо, сломалось в портах, поставил из пакетов первый, а второй захотел старый Perl. Оказалось, что авктоконф н ставится, потому что m4 потерял свой бинарик, переставил из портов.

Установка из исходных кодов
Если требуется установить версии более новую чем ту что есть в портах, нужно перейти на официальный сайт. Скачиваем архив с исходными кодами с официального сайта и распаковываем его.

fetch -v http://ru2.php.net/get/php-5.3.1.tar.bz2/from/this/mirror tar -xvf mirror Чтобы просмотреть список возможных ключей ./configure --help Если есть готовая строка, то выполнить с ней ./configure --prefix=/usr/local/php/5.3.2 --with-apxs=/usr/local/sbin/apxs --with-config-file-scan-dir=/usr/local/php/5.3.2/etc/ --disable-debug --enable-safe-mode --enable-inline-optimization --with-gnu-ld --enable-mbstring --with-regex=php --with-mysql --with-bz2 --enable-exif --with-iconv --with-gd --with-mcrypt --with-zlib

dimarik ./configure --prefix=/usr/local/php/5.3.2 --with-config-file-path=/usr/local/php/5.3.2/conf --disable-debug --enable-safe-mode --enable-inline-optimization --with-gnu-ld --enable-mbstring --with-regex=php --with-mysql --with-bz2 --enable-exif --with-iconv --with-gd --with-jpeg-dir=/usr/ports/graphics/jpeg/work/jpeg-7b --with-mcrypt --with-zlib

Ключ при configure --with-config-file-scan-dir=/usr/local/etc/php Значения из php_info Configuration File (php.ini) Path => /usr/local/etc Loaded Configuration File => /usr/local/etc/php.ini

Чтобы модуль для Apache был собран --with-apxs=/usr/local/sbin/apxs

Configure не проходит, потому что не находит следующего: Узнать, чего именно не хватает можно просмотрев содержимое Makefile ./configure --help | grep libjpeg
 * libxml
 * gd
 * crypt
 * mysql

make install clean -C /usr/ports/textproc/libxml2 make install clean -C /usr/ports/graphics/gd make install clean -C /usr/ports/security/mcrypt

make останавиливается с ошибкой /usr/bin/ld: cannot find -lltdl - название после ключа -l ищем в портах. psearch ltdl devel/libltdl22          System independent dlopen wrapper проверяем, не установлено ли оно еще и ставим pkg_info | grep dlopen

make install  Installing PHP SAPI module:      cgi Installing PHP CGI binary: /usr/local/php/5.3.2/bin/ Installing PHP CLI binary:       /usr/local/php/5.3.2/bin/ Installing PHP CLI man page:     /usr/local/php/5.3.2/man/man1/ Installing build environment:    /usr/local/php/5.3.2/lib/php/build/ Installing header files:         /usr/local/php/5.3.2/include/php/ Installing helper programs:      /usr/local/php/5.3.2/bin/ program: phpize program: php-config Installing man pages:            /usr/local/php/5.3.2/man/man1/ page: phpize.1 page: php-config.1 Installing PEAR environment:     /usr/local/php/5.3.2/lib/php/ [PEAR] Archive_Tar   - installed: 1.3.3 [PEAR] Console_Getopt - installed: 1.2.3 [PEAR] Structures_Graph- installed: 1.0.2 [PEAR] XML_Util      - installed: 1.2.1 [PEAR] PEAR          - installed: 1.9.0 Wrote PEAR system config file at: /usr/local/etc/pear.conf You may want to add: /usr/local/php/5.3.2/lib/php to your php.ini include_path /tmp/php/php-5.3.2/build/shtool install -c ext/phar/phar.phar /usr/local/php/5.3.2/bin ln -s -f /usr/local/php/5.3.2/bin/phar.phar /usr/local/php/5.3.2/bin/phar Installing PDO headers:         /usr/local/php/5.3.2/include/php/ext/pdo/ </PRE>

Чтобы заблокировать отдельный модуль --disable-libxml

чтобы отключить все ненужные модули при сборке php, --disable-all --without-all --disable-reflection и указать необходимые --enable и --with

./configure --prefix=/usr/local --disable-all --without-all make make install  Installing PHP SAPI module:      cgi Installing PHP CGI binary: /usr/local/bin/ Installing PHP CLI binary:       /usr/local/bin/ Installing PHP CLI man page:     /usr/local/man/man1/ Installing build environment:    /usr/local/lib/php/build/ Installing header files:         /usr/local/include/php/ Installing helper programs:      /usr/local/bin/ program: phpize program: php-config Installing man pages:            /usr/local/man/man1/ page: phpize.1 page: php-config.1 </PRE> cd ext/iconv phpize  Configuring for: PHP Api Version:        20090626 Zend Module Api No:     20090626 Zend Extension Api No:  220090626 Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment variable. Then, rerun this script. </PRE> Не хватает autoconf - последний устанавливается из портов. make -C /usr/ports/devel/autoconf262 install clean Результатов явилось появление модуля /usr/local/lib/php/extensions/no-debug-non-zts-20090626/bz2.so

Сборка и установка make && make install

Для установки расширений надо зайти в дереве кодов в нужное и выполнить там phpize ./configure make && make install

Поскольку поддержку Zend прекратили разработчики (мало продаж), то в 5.3 его уже не будет.

make install  Installing PHP SAPI module: apache [activating module `php5' in /usr/local/etc/apache/httpd.conf] cp libs/libphp5.so /usr/local/libexec/apache/libphp5.so chmod 755 /usr/local/libexec/apache/libphp5.so cp /usr/local/etc/apache/httpd.conf.new /usr/local/etc/apache/httpd.conf rm /usr/local/etc/apache/httpd.conf.new Installing PHP CLI binary: /usr/local/php/5.3.2/bin/ Installing PHP CLI man page: /usr/local/php/5.3.2/man/man1/ Installing build environment: /usr/local/php/5.3.2/lib/php/build/ Installing header files: /usr/local/php/5.3.2/include/php/ Installing helper programs: /usr/local/php/5.3.2/bin/ program: phpize program: php-config Installing man pages: /usr/local/php/5.3.2/man/man1/ page: phpize.1 page: php-config.1 Installing PEAR environment: /usr/local/php/5.3.2/lib/php/ [PEAR] Archive_Tar - installed: 1.3.3 [PEAR] Console_Getopt - installed: 1.2.3 [PEAR] Structures_Graph- installed: 1.0.2 [PEAR] XML_Util - installed: 1.2.1 [PEAR] PEAR - installed: 1.9.0 Wrote PEAR system config file at: /usr/local/php/5.3.2/etc/pear.conf You may want to add: /usr/local/php/5.3.2/lib/php to your php.ini include_path /tmp/php/php-5.3.2/build/shtool install -c ext/phar/phar.phar /usr/local/php/5.3.2/bin ln -s -f /usr/local/php/5.3.2/bin/phar.phar /usr/local/php/5.3.2/bin/phar Installing PDO headers: /usr/local/php/5.3.2/include/php/ext/pdo/ </PRE>

Если не указан JPEG при сборке, то в выводе gd нету упоминания о JPEG pkg_info | grep jpeg jpeg-8_1           IJG's jpeg compression utilities /tmp/php/php-5.3.2/configure --help | grep jpeg --with-jpeg-dir[=DIR]    GD: Set the path to libjpeg install prefix

Взять строку из php-info и дополнить --with-jpeg-dir=/usr/local/lib/

Повторить сборку и установку. После configure - make inbstall. Без перезапуска Apache после посторной установки не заработало.

Проблемы

 * Если не хватает какого-то модуля, например, mysql, это не пишется в логи апача - надо смотреть в сообщения PHP.

При попытке вызвать напрямую скрипт по URL возникает ошибка 500, а в /var/log/httpd-errors следующая запись

 Security Alert! The PHP CGI cannot be accessed directly.

This PHP CGI binary was compiled with force-cgi-redirect enabled. This means that a page will only be served up if the REDIRECT_STATUS CGI variable is set, e.g. via an Apache Action directive. For more information as to why this behaviour exists, see the <a href="http://php.net/security.cgi-bin">manual page for CGI security</a>. For more information about changing this behaviour or re-enabling this webserver, consult the installation file that came with this distribution, or visit <a href="http://php.net/install.windows">the manual page</a>. [Mon Feb 8 17:36:41 2010] [error] [client 89.108.68.6] Premature end of script headers: /usr/local/www/cgi-bin/php.php </PRE>

Найти конфиг locate php.ini /usr/local/etc/php.ini-dist /usr/local/etc/php.ini-recommended /usr/ports/lang/php4/files/patch-php.ini-dist /usr/ports/lang/php4/files/patch-php.ini-recommended /usr/ports/lang/php5/files/patch-php.ini-dist /usr/ports/lang/php5/files/patch-php.ini-recommended Добавить строку в конфигурационный файл echo "cgi.force_redirect=false" >> /usr/local/etc/php.ini

http://ru.php.net/manual/en/security.cgi-bin.force-redirect.php cgi.force_redirect boolean cgi.force_redirect is necessary to provide security running PHP as a CGI under most web servers. Left undefined, PHP turns this on by default. You can turn it off at your own risk.

Повторная загрузка модуля
В логах следующая запись "PHP Warning: Module 'ctype' already loaded in Unknown on line 0" Отыскать в выводе pkg_info такой модуль у удалить его pkg_delete -vf php5-ctype-5.3.2_1


 * To separate distinct open_basedir use : instead of on
 * http://www.php.net/manual/de/configure.about.php