fastcgi vs apache2+mod_php в бэкенде

February 12, 2012 Posted by
Comments closed

Очередное наблюдение в копилку холивара, что лучше – nginx + fastcgi или nginx + apache + mod_php . На реальном проекте, а не в синтетических тестах.

На картинке изображен munin-овский график загрузки сервера, на котором крутится сайт с 800k просмотрами страниц в сутки и примерно 300-400 пользователями онлайн. На сервере нет БД, она вынесена на другой сервер, на этом только файлохранилище, memcache и php. Обычно он крутился на связке nginx + spawn-fcgi (раньше был php-fpm, на графиках этого нет, но можете поверить на слово, нагрузка не изменилась). В пятницу 10го числа я по ряду внутренних причин решил попробовать поменять бэкенд на mod_php с апачем, настройки по воркерам постарался сделать максимально идентичными с fastcgi-шными. Поработав полдня, я вернул spawn-fcgi обратно.

Как видите, разница в загрузке весьма ощутима.

node.js для php-программистов

January 27, 2012 Posted by
Comments closed

А также различия между синхронным и асинхронным подходом к программированию:
http://dotheweb.posterous.com/nodejs-for-php-programmers-1-event-driven-pro

Контекстное меню на jQuery

December 23, 2011 Posted by
Comments closed

Контекстное меню в виде плагина для jQuery с довольно гибким API.

http://medialize.github.com/jQuery-contextMenu/index.html

via RMcreative

Валидация в Kohana

November 30, 2011 Posted by

macmax с форума forum.kohanaframework.org выложил пример использования валидации в Кохане 3.2 (в 3.1 оно работает так же)

/**
* Test controller
*
*/
class Controller_Test extends Controller_Template
{

/**
* @var View page template
*/
public $template = 'test_template';

/**
* @var boolean auto render template
**/
public $auto_render = TRUE;

public function before()
{
parent::before();

$this->template->content = '';
}

public function after()
{
parent::after();
}

/**
* Callback demonstration (Ko3.2.x)
*/
public function action_validation()
{

// данные, которые хотим проверить
$array = array(
'name1' => 'Тру-ля-ля',
'name2' => 'Тра-ля-ля',
'name3' => 'Алиса',
'name4' => 'Ворон',
);

// тут ошибки будут, которые мы покажем позже
$errors1 = $errors2 = NULL;

// класс для демонстрации использования его методов (сам класс ниже)
$testclass = new Testclass;

// класс проверки
$validation = Validation::factory($array)

// RULES

// -- подключение методов класса Valid (только для примера)
// подробнее см. документацию
->rule('name1', 'not_empty')
->rule('name1', 'max_length', array(':value', 250))

/*
важный момент!
внешние правила срабатывают до первой ошибки
если вызванная функция вернула FALSE, то дальнейшая проверка этого ключа массива прекращается.
оставшиеся для этого ключа правила не сработают
для демонстрации этого снова проверяем name1
*/
// -- подключение static методов

// вариант первый:
// имя ключа, для которого правило (первый аргумент)
// запускаем Testclass::static_rule_1() (второй аргумент)
// параметры опущены (третий аргумент). будет передано только значение проверяемого поля
->rule('name1', array('Testclass', 'static_rule_1'))

// вариант второй:
// имя ключа, для которого правило (первый аргумент)
// запускаем Testclass::static_rule_1() (второй аргумент)
// передаем имя поля и его значение (третий аргумент)
->rule('name2', array('Testclass', 'static_rule_1'), array(':field', ':value'))

// вариант третий:
// имя ключа, для которого правило (первый аргумент)
// запускаем Testclass::static_rule_2() (второй аргумент)
// передаем сам класс валидации, имя поля и его значение (третий аргумент)
// ':validation', ':field', ':value' всегда есть в параметрах подстановки, можно использовать также те, что переданы через Validation::bind. например, ORM в :model передает класс модели
// в качестве параметров можно прямо указывать какие-либо значения
->rule('name3', array('Testclass', 'static_rule_2'), array(':validation', ':field', ':value'))

// повторная проверка поля name1:
->rule('name1', array('Testclass', 'static_rule_2'), array(':validation', ':field', ':value'))

// -- подключение public методов экземпляра класса
// все тоже самое, только вместо имени передается экземпляр класса

->rule('name4', array($testclass, 'public_rule'))
;

// проверка
if (! $validation->check())
{
// покажем структуру массива ошибок без обработки
// будет что-то типа: array("name1" => array(0 => "static_rule_1", 1 => array(0 => "Тру-ля-ля"))
$errors1 = $validation->errors();

// покажем какие ключи будут искаться при обработке, на примере файла bla/blabla, которого не существует.
// но если в папке messages будет папка bla, а в ней blabla.php, значения ошибок будут подставлены.
// Validation::errors в случае, если не находит сообщение ставит вместо значения путь до ненайденного ключа
// будет что-то типа: array("name1" => "bla/blabla.name1.static_rule_1")
$errors2 = $validation->errors('bla/blabla');
}

echo "errors1: ".Debug::vars( $errors1 )."\n";
echo "errors2: ".Debug::vars( $errors2 )."\n";

} // End action_validation

} // End class Controller_Test

/**
* Test class
*
*/
class Testclass
{

public static function static_rule_1()
{
// демонстрация переданных аргументов
$args = func_get_args();
echo "static_rule_1: ".Debug::vars( $args )."\n";
/*
этот вариант валидации должен разобраться с переданными ему аргументами
и вернуть boolean результат
если результат будет FALSE, то класс Validation запишет ошибку для проверяемого поля
ключ ошибки будет равен имени функции
*/

// вернем FALSE, чтобы показать как запишеться ошибка
return FALSE;
}

public static function static_rule_2($validation, $field, $value)
{
// демонстрация переданных аргументов
$args = func_get_args();
echo "static_rule_2: ".Debug::vars( $args )."\n";
/*
этот вариант валидации должен разобраться с переданными ему аргументами
и сам рассказать про ошибки вызывая $validation->error
можно и другие возможности класса Validation вызывать
*/
// пишем информацию об ошибке через $validation->error
// в качестве параметров должно быть:
// поле, которое присутствует в проверяемом массиве (первый аргумент). как правило это переданное имя поля, которое и проверяли тут
// имя ключа ошибки (второй аргумент). Validation на это место ставит имя функции, но можно написать что-то более человечное
// дополнительные параметры, которые будут подставлены в ответ (третий аргумент). их необязательно указывать, по умолчанию NULL
// ':validation', ':field', ':value' всегда есть в параметрах подстановки, а также те, что переданы через Validation::bind. например, ORM в :model передает класс модели
$params = NULL;
$validation->error($field, 'имя_ключа_ошибки', $params);
/*
функция не должна возвращать ничего (если конструкция return не указана, то функция вернет значение NULL)
если вернуть FALSE, то класс Validation запишет ошибку для проверяемого поля и затрет при этом то, что сами написали выше
ключ ошибки будет равен имени функции
*/
}

public function public_rule()
{
// демонстрация переданных аргументов
$args = func_get_args();
echo "public_rule: ".Debug::vars( $args )."\n";
/*
этот вариант валидации должен разобраться с переданными ему аргументами
и вернуть boolean результат
если результат будет FALSE, то класс Validation запишет ошибку для проверяемого поля
ключ ошибки будет равен имени функции
*/

// вернем FALSE, чтобы показать как запишеться ошибка
return FALSE;
}

} // End class Testclass

Источник: http://forum.kohanaframework.org/discussion/10036/callback-v-validatore-ko3.2

Шаблоны кода и макросы в Netbeans

November 27, 2011 Posted by
Comments closed

Список команд, которые применяются в Netbeans для создания Code Templates и Macros.

В хэлпе, помнится, я не нашел нормального описания процесса создания сих полезнейших вещей, пришлось изучать их устройство по примерам и методом тыка.

Code Templates

${cursor} Куда поставить курсор после добавления кода.
${param_name} Определяет параметр. Параметры с одинаковыми именами дублируют друг друга. Перемещаться между параметрами можно по TAB. Завершить ввод — по ENTER.
${param_name default=”value”} Определяет значение по умолчанию для параметра.
${param_name editable=false} Запрещает редактировать параметр.
${selection} Вставляет в данное место выбранный в редакторе текст. После выделения текста нажимаем ALT+ENTER (Fix Code…). Как и в param_name можно использовать editable=false.
${clipboard-content} Вставляет в данное место содержимое буфера обмена. Также можно использовать editable=false.
$$ Если возникает необходимость написать $ — его надо дублировать.

Макросы

Команда Результат
Курсор
caret-down, caret-up, caret-forward, caret-backward ↓, ↑, →, ←
caret-begin-line, caret-end-line В начало/конец строки
page-up, page-down Страницу вверх/вниз
caret-begin, caret-end В начало/конец документа
caret-begin-word, caret-end-word К началу/концу слова
adjust-caret-bottom, adjust-caret-top, adjust-caret-center Вниз/вверх/в центр экрана
first-non-white, last-non-white К первому/последнему пробелу или разделителю
caret-next-word, caret-previous-word К следующему/предыдущему слову
caret-begin-line, caret-line-first-column В начало строки
Выделение
selection-begin-line, selection-end-line Выделить до начала/конца строки
selection-up, selection-down, selection-forward, selection-backward Выделить символ ↑, ↓, ←, →
select-line Выдеить строку
select-word Выделить слово
select-all Выделить всё
selection-match-brace Выделить всё по парную скобку
select-identifier Выделить идентификатор (переменная, метод)
selection-begin, selection-end Выделить от курсора до начала/конца документа
selection-begin-word, selection-end-word Выделить от курсора до начала/конца текущего слова
selection-previous-word, selection-next-word Выделить предыдущее/следующее слово
selection-page-up, selection-page-down Выделить страницу вверх/вниз
selection-last-non-white, selection-first-non-white Выделить по первый/последний не пробел и не разделитель
selection-line-first-column Выделить до начала строки
Буфер обмена
cut-to-clipboard Вырезать
copy-to-clipboard Копировать
paste-from-clipboard Вставить
paste-formated Вставить с форматированием. Форматирование частичное
cut-to-line-begin, cut-to-line-end Вырезать до начала/конца строки
Текст
“text” Ввести заданную строку
insert-break Вставить перенос строки
insert-tab Вставить TAB
delete-next, delete-previous DEL/BACKSPACE
comment, uncomment Закомментировать/раскомментировать строку
format, reindent-line Форматировать / выставить TAB-ы
insert-date-time Вставить дату и время
remove-selection Удалить выделенное
switch-case Сменить регистр
to-lower-case, to-upper-case К нижнему/верхнему регистру
split-line Разделить строку на две в текущей позиции курсора
remove-trailing-spaces Убить все пробелы после значимого конца строки во всём документе
remove-line Удалить строку
start-new-line Начать с новой строки
remove-word-previous, remove-word-next Удалить предыдущее/следующее слово
shift-line-left, shift-line-right Аналог SHIFT+TAB/TAB
toggle-typing-mode Переключить режим вставки/перезаписи текста
toggle-case-identifier-begin Первая буква выделения большая/маленькая
remove-tab Удалить табуляцию слева
remove-line-begin Удалить все символы строки слева от курсора
move-selection-else-line-up, move-selection-else-line-down Передвинуть строку вверх/вниз поменяв с той, на которую двигаем
copy-selection-else-line-up, copy-selection-else-line-down Продублировать текущую строку и сдвинуться вверх/вниз
Всякое
find-selection Найти выделенное
find-next, find-previous Следующее/предыдущее совпадение при поиске
adjust-window-bottom, adjust-window-top, adjust-window-center Прокрутить окно, чтобы курсор был снизу/сверху/по середине
match-brace Перейти от одной парной скобки к другой
set-read-only, set-writable Поставить/снять документу флаг «толко чтение»
undo Отмена
redo Отмена отмены :)

Шаблоны и макросы очень сильно повышают скорость и удовольствие от работы, настоятельно рекомендую их юзать. Продумать, какие конструкции вы используете чаще всего и забить их в code templates.

Инфа взята из playground Саши Макарова: http://rmcreative.ru/playground/netbeans_templates/ и http://rmcreative.ru/playground/netbeans_macro/

 

Интеграция Kohana 3.2 и WordPress 3

November 8, 2011 Posted by
Comments closed

Увидел на блоге свежезафренженного aktuba интересную ссылку с описанием и решением проблемы интеграции Коханы и Вордпресса.

http://aktuba.ru/wordpress-kohana.html

Rails-like миграции для Kohana

November 7, 2011 Posted by
Comments closed

Интересный модуль пришло недавно по RSS от kohana-modules.com – бд-миграции в стиле Ruby on Rails.
Еще не копал, но миграции – это больное место многих php-девелоперов. Для деплоя кода есть git и mercurial, а изменения в бд приходится накатывать патчиками из текстовых файликов, как при царе горохе.

http://github.com/OpenBuildings/timestamped-migrations

Все о Kohana 3.2 для начинающих на одной странице

October 28, 2011 Posted by

Неплохое summary по въезжанию во фреймворк Kohana для начинающих, имеющих некоторую подготовку:

http://www.workinprogress.ca/kohana32

Показаны первые шаги при инициализации и настройки приложения, работа с сессиями, встроенной ORM и Database, i18n, валидацией, аутентификацией, подключение сторонних библиотек, перечислены типсы, которые 100% понадобятся всем новичкам (например, как получить параметр, переданный в урле или получить адрес сайта, чтобы от него рисовать пути во вьюверах), показан даже пример работы с аяксом.
Все это с примерами кода, в общем, плотность полезных вещей на странице просто зашкаливает.

И чтобы два раза не вставать – поиск по API Коханы:

http://kohana.nerdblog.pl/api

Facebook-кнопки на css3

April 18, 2011 Posted by

Кнопки как на фейсбуке, на чистом css3, без бэкграундных картинок:

facebook buttons css3

На IE8 они тоже показываются, только без градиента и теней.

http://github.com/necolas/css3-facebook-buttons

Active Record на php

February 14, 2011 Posted by

ORM для работы с БД по паттерну ActiveRecord (это стандарт в ruby on rails):

http://www.phpactiverecord.org/

Позволяет писать разные магические вещи типа Order::find_all_by_person_id($id) – задавать параметры в названии самой функции, а не в её параметрах, что улучшает читаемость кода.
Естественно, для этой магии нужен PHP 5.3+ . Также требуется PDO – коннект к базе идет через неё.

Модуль для коханы: http://github.com/devi/kohana-activerecord