Отличный программист

Прошел сегодня повторно PHP/MySQL/Linux тест от Badoo, назвали отличным программистом.

И даже поставили на 22 место в рейтинге. Когда прошлый раз проходил, пару лет назад, набрал 69 баллов. Профессионализм не пропьешь.

Первоначальная настройка CDbAuthManager через миграцию в Yii

Сабж делается крайне просто:

  • Копируем настройку компонента authManager в секцию components конфигурационного файла console.php из файла main.php.
  • Если используется модуль yii-auth, то добавляем этот модуль в секцию modules того же файла.
  • Работаем с компонентом напрямую из миграции
  • < ?php
    class m131225_061135_auth extends CDbMigration
    {
        public function safeUp()
        {
            /** @var CDbAuthManager $auth */
            $auth = Yii::app()->authManager;
    
            $auth->createRole('admin', 'Администратор');
            $auth->createRole('guest', 'Гость');
        }
    
        public function safeDown()
        {
            /** @var CDbAuthManager $auth */
            $auth = Yii::app()->authManager;
    
            $auth->removeAuthItem('admin');
            $auth->removeAuthItem('guest');
        }
    }
    

Локализация валюты в Yii

Локализация валюты в во фреймворке Yii делается очень просто:

// короткий способ
$c = Yii::app()->locale->numberFormatter->formatCurrency(100, 'RUR');
// длинный способ
$c = Yii::app()->getLocale()->getNumberFormatter()->formatCurrency(0, 'RUR');

Результат будет одинаковый:

100,00 р.

Критическая уязвимость в PHP 5.3.9

Очередной привет любителям Bleeding Edge и автообновлений по крону.

В PHP обнаружена одна из самых серьёзных уязвимостей за время существования данного языка. Уязвимость проявляется только в PHP 5.3.9 и позволяет удалённому злоумышленнику выполнить свой код на сервере, независимо от того какие PHP-скрипты используются. При успешном совершении атаки код будет выполнен с правами PHP-приложения, к которому отправлен специально оформленный запрос.

Реврайты nginx для dokuwiki

На этот раз дружим с nginx dokuwiki:

    location /wiki {
        index index.php;
        access_log logs/wiki.log;
        error_log logs/wiki-error.log;

        rewrite ^/wiki/_media/(.*) lib/exe/fetch.php?media=$1 last;
        rewrite ^/wiki/_detail/(.*) lib/exe/detail.php?media=$1 last;
        rewrite ^/wiki/_export/([^/]+)/(.*)     doku.php?do=export_$1&id=$2 last;

        if (!-e $request_filename) {
            rewrite ^/wiki/(.+)$ /wiki/doku.php?id=$1 last;
        }

        if ($request_uri ~ ^/wiki/(bin|conf|data|inc)) {
            return 403;
        }

        rewrite ^/wiki/index.php$ doku.php;
    }

Патч, добавляющий поддержку php-fpm в порт lang/php5

Набросал небольшой патч, добавляющий в порт php 5.3 поддержку php-fpm. Из недостатков — требует наличие svn клиента для загрузки патчей с репозитария svn.php.net. Зато в теории будет работать для любой стабильной версии порта в пределах ветки 5.3.x.

Установка очень простая:

cd /usr/ports/lang/php5
fetch http://sav.ecom24.ru/freebsd/fpm.patch
patch < fpm.patch
make config install clean

Сам патч:

--- Makefile    2010-06-17 07:59:24.414207380 +0000
+++ Makefile    2010-06-17 08:56:48.418613806 +0000
@@ -43,7 +43,8 @@ OPTIONS=      CLI "Build CLI version" on \
                SUHOSIN "Enable Suhosin protection system" on \
                MULTIBYTE "Enable zend multibyte support" off \
                IPV6 "Enable ipv6 support" on \
-               MAILHEAD "Enable mail header patch" off
+               MAILHEAD "Enable mail header patch" off \
+               FPM "Enable PHP-FPM patch" off

 CONFLICTS=     php4-4* php5-pcre-* php5-spl-*

@@ -51,6 +52,13 @@ MAN1=                php-config.1 phpize.1

 .include 

+.if defined(WITH_FPM)
+USE_RC_SUBR=   php-fpm.sh
+LIB_DEPENDS+=  event:${PORTSDIR}/devel/libevent
+BUILD_DEPENDS+=        svn:$(PORTSDIR)/devel/subversion
+CONFIGURE_ARGS+=--enable-fpm --with-fpm-log=/var/log/php-fpm.log --with-fpm-pid=/var/run/php-fpm.pid
+.endif
+
 PATCH_DIST_STRIP=      -p1

 .if !defined(WITHOUT_SUHOSIN)
@@ -136,9 +144,16 @@ CONFIGURE_ARGS+=--disable-ipv6
 post-patch:
        @${TOUCH} ${WRKSRC}/ext/php_config.h
        @${REINPLACE_CMD} "s|^\(extension_dir\)|; \1|" ${WRKSRC}/php.ini-*
+       @(svn export http://svn.php.net/repository/php/php-src/branches/PHP_5_3/sapi/fpm ${WRKSRC}/sapi/fpm)

 pre-configure:
        @${CAT} ${WRKSRC}/acinclude.m4 ${WRKSRC}/build/libtool.m4 > ${WRKSRC}/aclocal.m4
+       @(cd ${WRKSRC} && ./buildconf --force)
+
+post-configure:
+.if defined(WITH_FPM)
+       @${REINPLACE_CMD} "s|/usr/local/var|/var|" ${WRKSRC}/sapi/fpm/php-fpm.conf
+.endif

 post-build:
        @${ECHO_CMD} "PHP_VER=5" > ${WRKDIR}/php.conf
--- files/php-fpm.sh.in 1970-01-01 00:00:00.000000000 +0000
+++ files/php-fpm.sh.in 2010-06-17 09:05:07.600963518 +0000
@@ -0,0 +1,43 @@
+#!/bin/sh
+
+# PROVIDE: php-fpm
+# REQUIRE: NETWORKING SERVERS
+# KEYWORD: shutdown
+
+# Add the following lines to /etc/rc.conf to enable php-fpm:
+# php_fpm_enable (bool):      Set to "NO" by default.
+#                             Set it to "YES" to enable php-fpm
+# php_fpm_config (str):       Set to "" by default.
+#                             Define your php-fpm configuration file here.
+
+. /etc/rc.subr
+
+name="php_fpm"
+rcvar=`set_rcvar`
+
+load_rc_config $name
+
+: ${php_fpm_enable="NO"}
+: ${php_fpm_pidfile="/var/run/php-fpm.pid"}
+: ${php_fpm_config="%%PREFIX%%/etc/php-fpm.conf"}
+
+command="%%PREFIX%%/sbin/php-fpm"
+pidfile=${php_fpm_pidfile}
+reload_precmd="php_fpm_prereload"
+quit_cmd="php_fpm_quit"
+
+[ -n "$php_fpm_config" ] && php_fpm_flags="--fpm-config $php_fpm_config"
+
+php_fpm_prereload()
+{
+       sig_reload=USR2
+}
+
+php_fpm_quit()
+{
+       sig_stop=QUIT
+       run_rc_command stop
+}
+
+extra_commands="reload quit"
+run_rc_command "$1"

Реврайты nginx для kohana

Осваиваю новый фреймворк. Поскольку поддержки .htaccess в nginx нет, нужно добавить следующие строчки в конфиг, дабы фреймворк заработал правильно:

if ($request_filename ~ ^(application|modules|system)) {
    return 403;
    }

if (!-e $request_filename) {
    rewrite ^/(.+)$ /index.php?kohana_uri=$1 last;
    }

Хранение сессий PHP в memcached

Данные всех пользовательских сессий php по умолчанию складывает в особые файлы во временной директории. Количество этих файлов пропорционально количеству пользователей, работающих с проектом.

При определенном уровне нагрузки это приведет к тому, что даже простое открытие файла сессии будет длиться секунду и дольше. Что неизбежно привезет к зависанию клиентских запросов в пуле PHP-FastCGI и появлению ошибок 502 Bad Gateway при попытке открыть любой пхп скрипт — только лишь потому, что большинство воркеров будут заняты открытием файлов сессий.
Читать далее Хранение сессий PHP в memcached