Новости о CodeIgniter

  • Derek Allard сообщил в своем блоге, что у сообщества CodeIgniter новый лидер Jamie Rumbelow. И вроде как после этого разработка должна вестись более активнее.
  • Сам Derek в январе активно занялся разработкой CodeIgniter, это видно по последним комитам в svn:
  • Rick Ellis основатель Ellis Lab завел себе аккаунт в твиттере: @rickellis , иногда пишет интересные новости о CodeIgniter

Далее

Добавление водяных знаков (watermark) в Webasyst Shop-script

Для магазина Gadgets Mart понадобилось сделать защиту картинок. Shop-script очень большой продукт, достаточно мощный, но почему-то функционала добавления водяных знаков нет.  (по крайней мере он не вынесен в админку). Стал копать файлы, у них там полный бардак: куча дублирующих классов и библиотек, не внятная архитектура и полно хвостов от старой версии Shop-script. Не смотря на это Shop-script работает вполне неплохо. Самое забавное что через 5 минут ковыряния я нашел файл в котором есть метод создания водяного знака :) Осталось немного подправить код и все заработало…

Далее

Пара ссылок на тему CodeIgniter

Ух, у меня в последнии дни так мало времени, это все из-за моего повышения :) Придется кратенько рассказать о всем интересном вокруг CodeIgniter:

  1. На youtube.com появился скринкаст «Building a CodeIgniter backend in 10 min» (чел явно наш — юзает vim :)
  2. На горизонте замаячила новая CMS на CodeIgniter — InkType (по функционалу не дотягивает до BlazeCMS, но сделано неплохо и админка симпатичная — на wordpress похожая)
  3. Интересная штука для CI разработчиков — BackendPro (является основой для разработки CMS, включает в себя модуль авторизации и аутентификации, админку, управление пользователями и т.д.)
  4. Еще один OSS продукт на CI — Mass PageRank Checker tool (будет свободное время поковыряйте код)
  5. Максим запустил первый сайт на своем движке MaxsiteCMS (движок естественно на CodeIgniter)
  6. Я в очередной раз обновил страничку по CI

Это все, следите за мной в twitter'e: twitter.com/termit

Далее

Новый портал о CodeIgniter

Товарищь 2bj (спасибо ему) в твиттере подкинул ссылочку на портал о CodeIgniterCodeIgniter Directory. Сайт на английском, пока там информации не очень много и она вся на английском, но думаю он вскоре разовьется во что-то стоящее.

Кстати, раз тема зашла о CodeIgniter, помните я говорил о blaze cms, так вот, всем советую посмотреть на версию v.1

Далее

Русский сайт о ExpressionEngine?

Как веб-разработчику пользующемуся фреймворком CodeIgniter, меня всегда интересовал другой, коммерческий продукт от команды EllisLab — это CMS ExpressionEngine. Но единственной причиной, по которой я не стал билдить сайты на нем это слабое развитое русское комьюнити, т.е. его отсутствие как такового. А ведь продукт на самом деле очень хорош, но обо всем по порядку. На время я забыл о ExpressionEngine, сегодня ко мне постучал человек под ником mrtt, и предложил посетить сайт http://www.eeclub.ru/. Сначала я, конечно же, подумал, что это спам, но все равно пошел по ссылке. Ну а там оказался большой русский портал о ExpressionEngine! (как я его не заметил раньше?) именно об этом портале мы и поговорим с одним из его создателей (и просто хорошем парнем) mrtt (настоящее имя Стас).

Доброго времени, mrtt. Представься, пожалуйста, и представь остальных организаторов портала EE Club.
Привет, Геннадий. Меня зовут Станислав, вместе с Максимом (mxnr) и Романом (Taho) мы сделали проект, посвященный движку ExpressionEngine и поддержки русскоговорящих пользователей.

Как давно и почему ты перешел на данную CMS?
Я использую систему ExpressionEngine с того самого момента, как она была создана и даже немного раньше :) Дело в том, что ранее разработчик Rick Ellis выпускал блоговый движок pMachine. Я полюбил его сразу, в то время так и не нашел ничего лучше и понятнее. Что мне сразу тогда понравилось, это что движок можно было вмонтировать в абсолютно любой дизайн. Кстати, о создании тогдашней pMachine, Рик (создатель движка) рассказывает в интервью.

Расскажи нам, как появилась идея создания подобного ресурса.
Переход на что-то новое как правило сложен, приходится менять взгляды и понимание некоторых вещей. В 2004 году вышел ExpressionEngine, а осенью 2005 года я случайно обнаружил раздел «Pmachine & ExpressionEngine» на форуме  netadmin, где началось образовываться сообщество пользователей данного продукта. Советы пользователей, которые хорошо освоили данную систему, очень помогали. Там присутствовали также и специалисты по программированию. Вообще знание навыков программирования превращает пользователя EE в превосходного разработчика, чем я похвастаться не могу. Со временем вопросов становилось меньше и народ плавно переманил на свой сайт expressionengine.ru товарищ sigjork — разработчик из Латвии. На том ресурсе по-прежнему все набирались опыта, делились своими решениями, но неожиданно для всех sigjork объявил о закрытии ресурса. Благодаря сохранившимся контактам, удалось поддерживать связь с другими разработчиками на ЕЕ. Некоторое время не было ни одного русскоязычного сайта об ExpressionEngine, где можно было бы пообщаться и пообсуждать насущные вопросы. Активными участниками было решено создать целый сайт с форумом, каталогом и другими вкусностями. В самом преддверии 2008 года был создан www.eeclub.ru. Почти сразу к сайту примкнули грамотные разработчики сайтов и большим весомым вкладом послужил перевод документации на русский язык, сделанный одним из участников.

Что разработчики EE могут найти на вашем портале?
Разработчики могут найти как саму систему, так и дополнительные модули, плагины и расширения для ЕЕ, значительно расширяющие возможности движка. Также есть полная документация по созданию своих собственных модулей, плагинов и расширений (пока, к сожалению, доступна только на английском языке). То есть разработчик получает систему, из которой он может «скромсать» что угодно под свои нужды. На форуме всегда можно задать интересующий вопрос и получить ответ.

Наверное, стоит сказать пару слов о самом ExpresionEngine для читателей которые не знакомы с этой CMS. В чем её особенности? Чем EE лучше других CMS?
Этот движок занял свою нишу на рынке CMS. Я не встречал системы, из которой можно сделать как доску объявлений, галерею, блог, так и целый каталог программ, товаров и прочего. Можно даже сделать целое комьюнити со всеми присущими современными штучками, такими как тэги, одобрялки, друзья и прочее. Система платная, и даже в этом есть свои преимущества. На официальном форуме поддержки не придется ждать ответа на вопрос по 2 недели, что зачастую случается с бесплатными движками, особенно с теми, которые только начинают разрабатываться. Но для некоторых и платность не преграда, они умудряются достать варезную версию движка.

Многие разработчики ждут релиза второй версии продукта. Что ты знаешь о предстоящем релизе?
Версия ЕЕ 2.0 появится летом 2008 года и откроет новый этап в развитии движка. Это привлечет новые силы к системе, потому что она будет целиком построена на CodeIgniter — это open source система, которая уже прекрасно освоено многими разработчиками и программистами, в том числе и тобой Геннадий :) Кому интересно, можно посмотреть некоторую информацию о будущем релизе ЕЕ 2.0 здесь.

Какие есть идеи о дальнейшем развитии портала?
Привлекать как можно больше разработчиков и решать сложные проблемы разработки сайтов сообща. Система ExpressionEngine очень перспективная. Хочется также открыть отдельный раздел или блог о CodeIgniter (нужен ведущий, это намек :), но к сожалению разработчики на CodeIgniter также разбросаны на разных сайтах и нет единого места, где можно было бы пообсуждать насущные проблемы. Уверен, eeclub сможет объединить людей, работающих с ExpressionEngine и CodeIgniter.

Спасибо за ответы, Стас, держи меня в курсе дел о eeclub.ru.
Спасибо тебе за интервью, Геннадий, обязательно буду сообщать обо всех вещах, творящихся вокруг Ellislab. Надеюсь видеть тебя и твоих читателей среди постоянных посетителей сайта EEClub.

Далее

Синхронные HTTP запросы в php, используя cURL

Перевод заметки Simultaneuos HTTP requests in PHP with cURL с блога phpied.com
Основная идея Веб 2.0 машапов получение данных от стороннего сервиса или сервисов и обработка их результатов представленная в интересном ключе. Это означает, что вам придется отправлять большое количество HTTP запросов к этому сервису или сервисам. Если вы воспользуетесь PHP функцией file_get_contents (), то запросы будут выполняться не синхронно, а поочерёдно, то есть пока не будут получены данные от первого запроса второй запрос не будет выполнятся. А если вам нужно выполнить три запроса и каждому из них необходима одна секунда на исполнение, то ваше приложение «задумается», по меньшей мере, на три секунды.

Решение
Конечно, можно и нужно использовать кэширование запросов, но первоначально запросы все же нужно делать.
Используя семейство curl_multi* cURL-функций можно достичь синхронного выполнения запросов. В этом случае ваше приложение «задумается» на промежуток равный затраченному времени на самый трудоемкий запрос, в противовес сумме времени всех запросов.
Реализация
Представляю вам свою функцию которая позволит вам выполнять запросы синхронно.

PHP:
  1. <?php
  2.  
  3. function multiRequest($data, $options = array()) {
  4.  
  5.   // массив curl дескрипторов
  6.   $curly = array();
  7.   // массив с возвращенными данными
  8.   $result = array();
  9.  
  10.   // инициализация многосложного curl дескриптора
  11.   $mh = curl_multi_init();
  12.  
  13.   // цикл по элементам массива $data:
  14.   // инициализация простых curl дескрипторов
  15.   // и добавление их к многосложному curl дескриптору
  16.   foreach ($data as $id => $d) {
  17.  
  18.     $curly[$id] = curl_init();
  19.  
  20.     $url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d;
  21.     curl_setopt($curly[$id], CURLOPT_URL,            $url);
  22.     curl_setopt($curly[$id], CURLOPT_HEADER,         0);
  23.     curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, 1);
  24.  
  25.     // определяем тип передачи параметров в запросе
  26.     // GET или POST
  27.     if (is_array($d)) {
  28.       if (!empty($d['post'])) {
  29.         curl_setopt($curly[$id], CURLOPT_POST,       1);
  30.         curl_setopt($curly[$id], CURLOPT_POSTFIELDS, $d['post']);
  31.       }
  32.     }
  33.  
  34.     // указываем дополнительные опции, если нужно
  35.     if (!empty($options)) {
  36.       curl_setopt_array($curly[$id], $options);
  37.     }
  38.  
  39.     curl_multi_add_handle($mh, $curly[$id]);
  40.   }
  41.  
  42.   // выполняем запрос
  43.   $running = null;
  44.   do {
  45.     curl_multi_exec($mh, $running);
  46.   } while($running> 0);
  47.  
  48.   // получаем данные и уничтожаем дискриптор
  49.   foreach($curly as $id => $c) {
  50.     $result[$id] = curl_multi_getcontent($c);
  51.     curl_multi_remove_handle($mh, $c);
  52.   }
  53.  
  54.   // закрываем многосложный дескриптор
  55.   curl_multi_close($mh);
  56.  
  57.   return $result;
  58. }
  59.  
  60. ?>

Итог
Функция принимает в качестве аргументов массив URL’ов и опционально дополнительный параметры cURL опций. Первый массив может иметь простую численную индексацию или это может быть массивом массивов, где второй ключ должен иметь имя «url». Если вы пользуетесь вторым способом, вы также можете добавить ключ «post», тогда данные будут передаваться методом POST.
Функция возвращает массив строк содержащих результат запроса (ответ сервиса) с той же индексацией, что и в массиве с параметрами запроса.

GET пример
Допустим вы решили воспользоваться сервисом поиска от Yahoo (документация на YDN) для создания машап сервиса энциклопедии музыкальных исполнителей. Выполнением следующего кода вы получите результаты поиска по аудио, видео и изображениям одновременно:

PHP:
  1. <?php
  2.  
  3. $data = array(
  4.   'http://search.yahooapis.com/VideoSearchService/V1/videoSearch?appid=YahooDemo&query=Pearl+Jam&output=json',
  5.   'http://search.yahooapis.com/ImageSearchService/V1/imageSearch?appid=YahooDemo&query=Pearl+Jam&output=json',
  6.   'http://search.yahooapis.com/AudioSearchService/V1/artistSearch?appid=YahooDemo&artist=Pearl+Jam&output=json'
  7. );
  8. $r = multiRequest($data);
  9.  
  10. echo '<pre>';
  11. print_r($r);
  12.  
  13. ?>

В результате вы получите, что-то похожее на это:

PHP:
  1. (
  2.     [0] => {«ResultSet»:{«totalResultsAvailable»:«633»,«totalResultsReturned»:...
  3.     [1] => {«ResultSet»:{«totalResultsAvailable»:«105342»,«totalResultsReturned»:...
  4.     [2] => {«ResultSet»:{«totalResultsAvailable»:10,«totalResultsReturned»:...
  5. )

POST пример
Yahoo предлагает api к очень интересному сервису: term extraction, который анализирует большие куски текста и выдает релевантные фразы. Вот пример выполнения одновременно двух запросов к этому сервису использую POST.

PHP:
  1. <?php
  2. $data = array(array(),array());
  3.  
  4. $data[0]['url']  = 'http://search.yahooapis.com/ContentAnalysisService/V1/termExtraction';
  5. $data[0]['post'] = array();
  6. $data[0]['post']['appid']   = 'YahooDemo';
  7. $data[0]['post']['output']  = 'php';
  8. $data[0]['post']['context'] = 'Now I lay me down to sleep,
  9.                                I pray the Lord my soul to keep;
  10.                                And if I die before I wake,
  11.                                I pray the Lord my soul to take.';
  12.  
  13. $data[1]['url']  = 'http://search.yahooapis.com/ContentAnalysisService/V1/termExtraction';
  14. $data[1]['post'] = array();
  15. $data[1]['post']['appid']   = 'YahooDemo';
  16. $data[1]['post']['output']  = 'php';
  17. $data[1]['post']['context'] = 'Now I lay me down to sleep,
  18.                                I pray the funk will make me freak;
  19.                                If I should die before I waked,
  20.                                Allow me Lord to rock out naked.';
  21.  
  22. $r = multiRequest($data);
  23.  
  24. print_r($r);
  25. ?>

И результат:

PHP:
  1. (
  2.     [0] => a:1:{s:9:«ResultSet»;a:1:{s:6:«Result»;s:5:«sleep»;}}
  3.     [1] => a:1:{s:9:«ResultSet»;a:1:{s:6:«Result»;a:3:{i:0;s:5:«freak»;i:1;s:5:«sleep»;i:2;s:4:«funk»;}}}
  4. )

От себя добавлю: я встречался с подобной проблемой, когда занимался разработкой системы для одного литературного агентства. Система занималась тем, что разбивала текст на короткие части и отправляла их поисковой машине. Эта была своеобразная система проверки авторов на плагиат. Решил я проблему, не так элегантно как автор данной заметки, а простым выносом той части кода, что отвечала за составление и обработку результатов запроса в отдельный скрипт, который запускал из основного приложения с помощью exec (), которой передавалась команда с амперсандом на конце.

Далее