Archive

Archive for the ‘php’ Category

Устанавливаем акселлератор APC на CentOS+Apache

August 3rd, 2011

Если у вас нагруженное веб-приложение и тесты показывают, что одно из узких мест это исполнение php-кода, то имеет смысл установить PHP-акселлератор. Один из лучших это APC от разработчиков самого PHP. Принцип его работы такой: он держит скомпилированный код php-файлов в памяти и при повторном обращении быстро его отдает.
Устанавливаем его из репозитория Remi:

yum --enablerepo=remi install php-pecl-apc

Теперь смотрим конфиг /etc/php.d/apc.ini, самые важные параметры:
# Включаем кэширование
apc.enabled=1
# количество блоков с кэшем в памяти
apc.shm_segments=1
# размер каждого блока
apc.shm_size=256M
# время устаревания кэшированных файлов
apc.ttl=3600
apc.max_file_size=1M
# если выключить, apc не будет проверять не изменился ли файл при обращении к нему.
apc.stat=1

Для каждого сервера надо подбирать свои параметры размера блока и срока устаревания кэша. Потому как иногда при заполнении памяти APC может падать с ошибкой “unable to allocate memory for pool” подробнее читать тут.
Для мониторинга состояния кэша APC удобно использовать прилагаемую к дистрибутиву утилиту apc.php. Просто скачиваете дистр и кладете файлик в любой виртуалхост.

php ,

Разные php.ini для Apache и консольных скриптов

February 2nd, 2011

Иногда бывает нужно сделать так, чтобы апач и скрипты запускаемые кроном имели разные php.ini. К примеру, для того чтобы ограничить скрипты апача разными disable_functions.
Просто создаем копию php.ini в любом месте, допустим, это будет версия для Apache. Добавляем в нее:

disable_functions=popen,exec,system,passthru,proc_open,shell_exec

Это серьезно усложнит жизнь злоумышленнику на пути повышения привилегий.
И прописываем путь к этому php.ini в httpd.conf:

PHPIniDir /etc/httpd/php.ini

Перезапускаем апач и простеньким скриптом проверяем что получилось:

<?php
system('ls -la');
?>

Apache, php ,

Установка PHP5.2 из портов на FreeBSD

May 31st, 2010

Сейчас в портах есть порт php52, но у меня он корректно собрался с модулем апача только с Apache 2.2. Поэтому в скрипте автоматической установки будет небольшое исправление:

make WITHOUT_SAMBA=yes -DBATCH -C /usr/ports/misc/mc install clean
make WITH_RC_NG=yes -DBATCH -C /usr/ports/ftp/vsftpd install clean
make WITHOUT_IPV6=yes -DBATCH -C /usr/ports/www/apache22 install clean
make WITH_CHARSET=utf8 WITH_COLLATION=utf8_unicode_ci -DBATCH -C /usr/ports/databases/mysql51-server install clean
make WITH_APACHE=yes WITHOUT_IPV6=yes -DBATCH -C /usr/ports/lang/php52 install clean
make WITH_BUNDLED_PCRE=yes -DBATCH -C /usr/ports/devel/php52-pcre install clean
make WITH_MBSTRING=yes WITH_CURL=yes WITH_FTP=yes WITH_GD=yes WITH_MCRYPT=yes WITH_MYSQL=yes WITH_MYSQLI=yes WITH_OPENSSL=yes WITH_SOCKETS=yes WITH_ZLIB=yes -DBATCH -C /usr/ports/lang/php52-extensions install clean
make -DBATCH -C /usr/ports/www/mod_geoip2 install clean
make WITH_HTTP_FLV_MODULE=yes -DBATCH -C /usr/ports/www/nginx install clean
make -DBATCH -C /usr/ports/www/mod_rpaf2 install clean
make -DBATCH -C /usr/ports/devel/ZendOptimizer install clean

FreeBSD, php

Ошибка в работе pcre (preg_match) во FreeBSD

April 22nd, 2010

В версиях php5-pcre 5.2 и ниже возможна ошибка проявляющаяся как:

Warning: preg_match() [function.preg-match]: Internal pcre_fullinfo() error

Причина этого проста – при сборке этого порта забыли поставить галочку для поддержки апача. Т.е. надо просто сделать make config этому порту и переустановить его.

FreeBSD, php

Установка eAccelerator на CentOS с DirectAdmin

February 16th, 2010

Перед установкой вам может понадобиться php-devel, autoconf. Тогда просто ставим их через yum

yum install php-devel
yum install autoconf
cd /usr/local/src
mkdir eAccelerator
cd eAccelerator
wget http://bart.eaccelerator.net/source/0.9.6/eaccelerator-0.9.6.tar.bz2
tar -xvjf eaccelerator-0.9.6.tar.bz2
cd eaccelerator-0.9.6
export PHP_PREFIX="/usr/local"
$PHP_PREFIX/bin/phpize
./configure --enable-eaccelerator=shared --with-php-config=$PHP_PREFIX/bin/php-config
make
make install
cd /tmp
mkdir eaccelerator
chmod 0777 eaccelerator

Теперь правим php.ini. Например, при установленных ZendOptimizer, ionCube и eAccelerator он должен быть примерно таким (порядок подключения модулей важен!):

extension_dir = "/usr/local/lib/php/extensions/no-debug-non-zts-20060613"

[eAccelerator]
extension="eaccelerator.so"
eaccelerator.shm_size="64"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="100"
eaccelerator.shm_prune_period="1800"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

[Zend]
zend_extension = /usr/lib64/ioncube/ioncube_loader_lin_5.2.so
zend_extension_manager.optimizer=/usr/local/Zend/lib/Optimizer-3.3.3
zend_extension_manager.optimizer_ts=/usr/local/Zend/lib/Optimizer_TS-3.3.3
zend_optimizer.version=3.3.3
zend_extension=/usr/local/Zend/lib/ZendExtensionManager.so
zend_extension_ts=/usr/local/Zend/lib/ZendExtensionManager_TS.so

Теперь проверяем и релоадим апач:

php -i |grep eacc
/etc/init.d/httpd reload

linux, php ,

Проблема с php5-ffmpeg на FreeBSD

January 28th, 2010

На сегодняшний день имеется проблема выражающаяся в том, что одна из основных функций toGDImage() не работает выдавая ошибку “ffmpeg.so: Undefined symbol img_convert”
Этот патч проблему не решил.
Помогло следующее: порт multimedia/ffmpeg должен быть собран без swscaler. Для этого нужно поправить Makefile. Т.е. сделать –disable-swsсale. После пересборки самого ffmpeg, пересобрать и php-ffmpeg.

FreeBSD, php

Отображение ошибок в PHP

January 11th, 2010

Включить отображение ошибок в PHP-скриптах можно несколькими способами:
Внести изменения в php.ini и релоаднуть апач. Эти изменения затронут все сайты.

error_reporting = E_ALL
display_errors = On
display_startup_errors = On
log_errors = On
log_errors_max_len = 1024
error_log = /var/log/php-error.log

Внести в .htaccess расположенный в папке скрипта. Это рекомендуемый способ:

php_value display_errors 1
php_value display_startup_errors 1

Внести изменения в сам скрипт:

ini_set("display_errors","1");
ini_set("display_startup_errors","1");
ini_set('error_reporting', E_ALL);

С этим методом такой нюанс: ошибки типа не закрытых скобок и не проставленных ; все равно будут приводить к белому экрану. Это происходит потому, что парсинг файла на синтаксическую корретность происходит до его выполнения и, соответственно, установки директив.
Это можно обойти подобным образом:

<?php
 error_reporting(E_ALL);
 ini_set("display_errors", 1);
 include("file_with_errors.php");
?>

Документация по соответствующим директивам PHP

php ,

PHP 5.3 и PHP 5.2.10

September 1st, 2009

После выхода PHP 5.3 в популярном репозитории REMI для RHEL/CentOS PHP-пакеты были заменены на версию 5.3. В некоторых случаях это создает неудобства, так как далеко не все веб-приложения и скрипты работоспособны под этой версией. Поэтому при сетапе или обновлении сервера надо либо отключать этот репозиторий или ставить 5.2.10 пакеты вручную для i386 и для x86_64

php

suPHP для PHP под Apache

August 4th, 2009

Если по простому,то suPHP это штука, которая позволяет выполнять PHP-скрипты под Apache с правами их владельца, а не с правами веб-сервера. Это бывает необходимо если на сервере несколько пользователей (например, фтп), они активно меняют контент сайтов, но веб-серверу тоже нужен доступ к этим файлам. Тут то и происходит конфликт владельцев.
suPHP есть и в портах для FreeBSD:

cd /usr/ports/www/suphp && make install clean

и в пакетах для CentOS:

yum install mod_suphp

Запускается как обычный модуль для апача:

LoadModule php5_module libexec/apache2/libphp5.so
LoadModule suphp_module libexec/apache2/mod_suphp.so

Конфиги в файле suphp.conf

Внимательнее к параметрам:

; Security options
allow_file_group_writeable=false
allow_file_others_writeable=false
allow_directory_group_writeable=false
allow_directory_others_writeable=false

Из-за них может посыпаться много ошибок.

Для активации надо прописать либо в глобальной секции httpd.conf, либо в конкретном виртуал-хосте:

suPHP_Engine on
suPHP_AddHandler application/x-httpd-php

Не путать с модулем для апача suexec!

Замечен такой косяк: если надо запускать что-то через exec и по относительному пути исполняемый файл не находится, то надо убедится, что в suphp.conf прописано с кавычками!

env_path="/bin:/usr/bin"

Apache, php , ,

Закачка больших файлов через PHP

July 7th, 2009

Вот что нужно поправить:
Во-первых, в nginx.conf надо

client_max_body_size 20m;

Иначе если запрос не будет пролазить в этот лимит nginx покажет 413 Request Entity Too Large для некоторых браузеров или просто сбросит соединение.

В apache убедиться что не определено LimitRequestBody или имеет подходящий лимит. Если установлен mod_security то проверить еще SecRequestBodyLimit.

И наконец, в php.ini:

post_max_size = 20M
upload_max_filesize = 20M

Apache, nginx, php , ,

Установка eAccelerator, ionCube, ZendOptimizer на CentOS

June 8th, 2009

Основной принцип этой связки – ZendOptimizer должен загружаться последним, а eAccelerator первым.
Т.е. после того как мы поставили Zend из бинарника, скачали и поставили ionCube, поставили eAccelerator:

yum --enablerepo=remi install php-eaccelerator.x86_64

Надо задизаблить строчку:

zend_extension="/usr/lib64/php/modules/eaccelerator.so"

в /etc/php.d/eaccelerator.ini

и сделать так:

[Zend]
Zend_extension="/usr/lib64/php/modules/eaccelerator.so"

zend_extension_manager.optimizer=/usr/local/Zend/lib/Optimizer-3.3.3
zend_extension_manager.optimizer_ts=/usr/local/Zend/lib/Optimizer_TS-3.3.3
zend_optimizer.version=3.3.3
zend_extension=/usr/local/Zend/lib/ZendExtensionManager.so
zend_extension_ts=/usr/local/Zend/lib/ZendExtensionManager_TS.so

php ,

Установка Pear PHP GeoIP расширения на Linux

May 15th, 2009

К сожалению, данного расширения нет в RPM-ках поэтому будем ставить его из сорцов:

yum --enablerepo=remi install GeoIP-devel php-devel
cd /usr/local/src
wget http://pecl.php.net/get/geoip
tar zxvf ./geoip-1.0.7.tgz
cd geoip-1.0.7
phpize
./configure
make
make install

Создаем /etc/php.d/geoip.ini:

extension=geoip.so

Рестартим апач:

service httpd reload

php ,

Сокрытие версии PHP и Apache

April 7th, 2009

В php.ini:

expose_php = off

В httpd.conf:

ServerTokens Prod
ServerSignature Off

Apache, php, безопасность ,

Установка модулей в php собранном из сорцов

March 18th, 2009

Например, может понадобиться добавить модуль для PHP, который поставлен DirectAdmin-ом (т.е. из исходников). Сделаем это на примере модуля для memcached (предварительно надо убедиться что в системе установлен autoconf):

cd /usr/local/directadmin/custombuild/php-5.2.8/ext
wget http://pecl.php.net/get/memcache-2.2.5.tgz
tar xvf ./memcache-2.2.5.tgz
cd ./memcache-2.2.5
phpize
./configure
make && make install

Осталось прописать extension=memcache.so в php.ini. Проверяем присутствие модуля:

php -i |grep memcache
memcache
memcache support => enabled
memcache.allow_failover => 1 => 1
memcache.chunk_size => 8192 => 8192
memcache.default_port => 11211 => 11211
memcache.default_timeout_ms => 1000 => 1000
memcache.hash_function => crc32 => crc32
memcache.hash_strategy => consistent => consistent
memcache.max_failover_attempts => 20 => 20
Registered save handlers => files user sqlite memcache

php , ,

Обновление php на Linux через yum

January 16th, 2009

добавляем репозиторий и обновляемся:

rpm -ihv http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
yum --enablerepo=remi update php

linux, php ,