Yii: используем кэш в CActiveDataProvider

Репост моей заметки из wiki: http://www.yiiframework.com/wiki/233/using-cache-in-cactivedataprovider/. Первый параметр в конструкторе CActiveDataProvider может быть строковым значением с названием модели или экземпляр класса модели. Поэтому можно использовать CActiveRecord::cache() для кэширования, но нужно установить значение 3 у третьего параметра, потому что мы должны закэшировать 2 запроса: получение количества записей и само получение записей. Не забудьте использовать зависимости для принудительного протухания кэша. {% raw %} $dependecy = new CDbCacheDependency('SELECT MAX(update_time) FROM {{post}}') CActiveDataProvider(Post::model()->cache($duration, $dependecy, 2), array ( 'criteria' => array ( 'condition' => 'status = 1', 'order' => 'DESC create_time', ) 'pagination' => array ( 'pageSize' => 20, ) )); {% endraw %}

Read More

Yii: CGridView и запрос с group by и having by

Задача такая: вывести данные через компонент CGridView в YII, сгруппированные по определённому полю, а также применение условий по агрегированным данным. Возьмём простую таблицу: date | clicks Нам нужно получить сгруппированные данные по каждому часу. По сути нужно применить следующий запрос SELECT * FROM table GROUP BY LEFT(date, 13); Возникают следующие трудности в реализации через Yii: Yii не может посчитать общее количество, а соответственно будет неправильно создавать пагинатор. Yii просто обнуляет поля group by и having при подсчёте общего количества.

Read More

Настройка exim на почту для доменов от Яндекса (pdd.yandex.ru)

Настраиваем отправку почты с нашего сервера через почту для доменов от Яндекса. Для примера, используем домен zagirov.name. Запускаем конфигурирование exim’а: dpkg-reconfigure exim4-config Отвечаем на вопросы: mail sent by SMARTHOST; received via SMTP or fetchmail Type System Mail Name: пусто Type IP Adresses to listen on for incoming SMTP connections: 127.0.0.1 ; ::1 Other destinations for which mail: пусто Machines to relay mail for: пусто Type Machine handling outgoing mail for this host (smarthost): smtp.

Read More

Сохраняем письма, отправленные из php, в файлы

При разработке нужно как-то складировать письма, отправляемые из php через функцию mail. Был написан такой скрипт: #!/usr/bin/env php <?php define('SENDMAIL_DIR', '/tmp/mail/'); if ( ! file_exists(SENDMAIL_DIR)) { mkdir(SENDMAIL_DIR, 0777, true); } function generateFileName($i = 1) { $fileName = SENDMAIL_DIR . date('Y-m-d_H-i-s_') . $i . '.eml'; return file_exists($fileName) ? generateFileName(++$i) : $fileName; } $mail = fopen('php://stdin', 'r') or die(); $file = fopen(generateFileName(), 'w'); while ( ! feof($mail)) { fwrite($file, fgets($mail)); } fclose($mail); fclose($file); Даём ему право на исполнение для пользователя веб-сервера (обычно www-data).

Read More

Nginx конфиги

В интернете довольно много можно выложено конфигов nginx под различные веб-приложения. Но в большинстве из них используются if совместно с rewrite, что достойно всяческого порицания по словам автора nginx Игоря Сысоева. Выложу используемые мной конфиги для различных систем (redmine, chive) Redmine: upstream thin { server unix:/tmp/redmine.0.sock; } server { listen 80; server_name redmine.zagirov.name; root /usr/share/redmine/public/; access_log /var/log/nginx/redmine.access.log; error_log /var/log/nginx/redmine.error.log; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; include proxy.

Read More

Перенос svn-репозитария в git

Если у вас есть репозиторий svn, но вы познали все прелести git и не хотите терять историю правок, то эта статья для вас ;) Первым этапом будет получение всех авторов, которые коммитили в svn. Для гита нужен дополнительно email коммитера. #!/usr/bin/env bash authors=$(svn log -q | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sort | uniq) for author in ${authors}; do echo "${author} = ${author} <email>"; done Сохраняем вывод в какой-нибудь файл (/home/user/svn-authors.

Read More

Непрерывная интеграция: jenkins + yii + git

Услышав шумиху про некую систему интеграционного тестирования hudson, который переименовали в jenkins, я захотел узнать что это и как это можно использовать. Для чего собственно он нужен? В кратце: он вытягивает последнюю версию из git/svn-репозитория и выполняет определённые действия (тестирует, выкладывает на другой сервер, делает отчёты). Всё это происходит автоматически: можно задать время, когда будет выполнятся задания. Можно почитать про пример использования jenkins. Задача такая: Выполнение unit тестов для yii с отображением покрытия кода

Read More

Правильная отдача заголовков при технических работах на сайте

Есть ситуация: проводятся какие-то технические работы на сайте и нужно сайт правильно закрыть. Это нужно чтобы поисковики знали, что сайт не доступен, а не добавляли страницы в индекс или помечали страницы как удалённые. server { listen 80 default; server_name _; root /var/www/default/www; charset utf-8; error_page 404 403 =503 /503.html; location = /503.html { add_header Retry-After "Sun, 27 Feb 2011 23:59:59"; } } Строка error_page 404 403 =503 /503.html означает, что перенаправляем все запросы с ошибками 404 и 403 на файл 503.

Read More

Ubuntu 11.04 alpha 2. Asus EeePC 1000H. Не работает wifi RaLink 2790 (RT2860)

Нашёл как исправить баг с глючащим wifi в моём нетбуке Asus EeePC 1000H. Карточка RaLink 2790 (RT2860). Нетбук подключался к wifi, получал ip-адрес по DHCP, но ничего не работало. Потом разрывалось соединение и заново подключалось с тем же печальным эффектом. Решение подсмотрел тут. Комманда lspci -vv выдала 01:00.0 Network controller: RaLink RT2860 Subsystem: RaLink Device 2790 Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast &gt;TAbort- &lt;TAbort- &lt;MAbort- &gt;SERR- &lt;PERR- INTx- Latency: 0, Cache Line Size: 32 bytes Interrupt: pin A routed to IRQ 19 Region 0: Memory at fbef0000 (32-bit, non-prefetchable) [size=64K] Capabilities: &lt;access denied&gt; Kernel driver in use: rt2800pci Kernel modules: rt2860sta, rt2800pci Нужно отключить модуль rt2800pci и использовать модуль rt2860.

Read More