Новый портал о CodeIgniter
Опубликовано TermiT Апр 19, 2008 в Links, PHP |
Товарищь 2bj (спасибо ему) в твиттере подкинул ссылочку на портал о CodeIgniter — CodeIgniter Directory. Сайт на английском, пока там информации не очень много и она вся на английском, но думаю он вскоре разовьется во что-то стоящее.
Кстати, раз тема зашла о CodeIgniter, помните я говорил о blaze cms, так вот, всем советую посмотреть на версию v.1…
ДалееСинхронные HTTP запросы в php, используя cURL
Опубликовано TermiT марта 14, 2008 в PHP |
Перевод заметки Simultaneuos HTTP requests in PHP with cURL с блога phpied.com
Основная идея Веб 2.0 машапов получение данных от стороннего сервиса или сервисов и обработка их результатов представленная в интересном ключе. Это означает, что вам придется отправлять большое количество HTTP запросов к этому сервису или сервисам. Если вы воспользуетесь PHP функцией file_get_contents (), то запросы будут выполняться не синхронно, а поочерёдно, то есть пока не будут получены данные от первого запроса второй запрос не будет выполнятся. А если вам нужно выполнить три запроса и каждому из них необходима одна секунда на исполнение, то ваше приложение «задумается», по меньшей мере, на три секунды.
Решение
Конечно, можно и нужно использовать кэширование запросов, но первоначально запросы все же нужно делать.
Используя семейство curl_multi* cURL-функций можно достичь синхронного выполнения запросов. В этом случае ваше приложение «задумается» на промежуток равный затраченному времени на самый трудоемкий запрос, в противовес сумме времени всех запросов.
Реализация
Представляю вам свою функцию которая позволит вам выполнять запросы синхронно.
-
<?php
-
-
-
// массив curl дескрипторов
-
// массив с возвращенными данными
-
-
// инициализация многосложного curl дескриптора
-
$mh = curl_multi_init();
-
-
// цикл по элементам массива $data:
-
// инициализация простых curl дескрипторов
-
// и добавление их к многосложному curl дескриптору
-
foreach ($data as $id => $d) {
-
-
$curly[$id] = curl_init();
-
-
curl_setopt($curly[$id], CURLOPT_URL, $url);
-
curl_setopt($curly[$id], CURLOPT_HEADER, 0);
-
curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, 1);
-
-
// определяем тип передачи параметров в запросе
-
// GET или POST
-
curl_setopt($curly[$id], CURLOPT_POST, 1);
-
curl_setopt($curly[$id], CURLOPT_POSTFIELDS, $d['post']);
-
}
-
}
-
-
// указываем дополнительные опции, если нужно
-
curl_setopt_array($curly[$id], $options);
-
}
-
-
curl_multi_add_handle($mh, $curly[$id]);
-
}
-
-
// выполняем запрос
-
$running = null;
-
do {
-
curl_multi_exec($mh, $running);
-
} while($running> 0);
-
-
// получаем данные и уничтожаем дискриптор
-
foreach($curly as $id => $c) {
-
$result[$id] = curl_multi_getcontent($c);
-
curl_multi_remove_handle($mh, $c);
-
}
-
-
// закрываем многосложный дескриптор
-
curl_multi_close($mh);
-
-
return $result;
-
}
-
-
?>
Итог
Функция принимает в качестве аргументов массив URL’ов и опционально дополнительный параметры cURL опций. Первый массив может иметь простую численную индексацию или это может быть массивом массивов, где второй ключ должен иметь имя «url». Если вы пользуетесь вторым способом, вы также можете добавить ключ «post», тогда данные будут передаваться методом POST.
Функция возвращает массив строк содержащих результат запроса (ответ сервиса) с той же индексацией, что и в массиве с параметрами запроса.
GET пример
Допустим вы решили воспользоваться сервисом поиска от Yahoo (документация на YDN) для создания машап сервиса энциклопедии музыкальных исполнителей. Выполнением следующего кода вы получите результаты поиска по аудио, видео и изображениям одновременно:
-
<?php
-
-
'http://search.yahooapis.com/VideoSearchService/V1/videoSearch?appid=YahooDemo&query=Pearl+Jam&output=json',
-
'http://search.yahooapis.com/ImageSearchService/V1/imageSearch?appid=YahooDemo&query=Pearl+Jam&output=json',
-
'http://search.yahooapis.com/AudioSearchService/V1/artistSearch?appid=YahooDemo&artist=Pearl+Jam&output=json'
-
);
-
$r = multiRequest($data);
-
-
echo '<pre>';
-
-
?>
В результате вы получите, что-то похожее на это:
-
(
-
[0] => {«ResultSet»:{«totalResultsAvailable»:«633»,«totalResultsReturned»:...
-
[1] => {«ResultSet»:{«totalResultsAvailable»:«105342»,«totalResultsReturned»:...
-
[2] => {«ResultSet»:{«totalResultsAvailable»:10,«totalResultsReturned»:...
-
)
POST пример
Yahoo предлагает api к очень интересному сервису: term extraction, который анализирует большие куски текста и выдает релевантные фразы. Вот пример выполнения одновременно двух запросов к этому сервису использую POST.
-
<?php
-
-
$data[0]['url'] = 'http://search.yahooapis.com/ContentAnalysisService/V1/termExtraction';
-
$data[0]['post']['appid'] = 'YahooDemo';
-
$data[0]['post']['output'] = 'php';
-
$data[0]['post']['context'] = 'Now I lay me down to sleep,
-
I pray the Lord my soul to keep;
-
And if I die before I wake,
-
I pray the Lord my soul to take.';
-
-
$data[1]['url'] = 'http://search.yahooapis.com/ContentAnalysisService/V1/termExtraction';
-
$data[1]['post']['appid'] = 'YahooDemo';
-
$data[1]['post']['output'] = 'php';
-
$data[1]['post']['context'] = 'Now I lay me down to sleep,
-
I pray the funk will make me freak;
-
If I should die before I waked,
-
Allow me Lord to rock out naked.';
-
-
$r = multiRequest($data);
-
-
?>
И результат:
-
(
-
[0] => a:1:{s:9:«ResultSet»;a:1:{s:6:«Result»;s:5:«sleep»;}}
-
[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»;}}}
-
)
От себя добавлю: я встречался с подобной проблемой, когда занимался разработкой системы для одного литературного агентства. Система занималась тем, что разбивала текст на короткие части и отправляла их поисковой машине. Эта была своеобразная система проверки авторов на плагиат. Решил я проблему, не так элегантно как автор данной заметки, а простым выносом той части кода, что отвечала за составление и обработку результатов запроса в отдельный скрипт, который запускал из основного приложения с помощью exec (), которой передавалась команда с амперсандом на конце.
ДалееBlaze — первая открытая CMS, основанная на CodeIgniter
Опубликовано TermiT Фев 22, 2008 в PHP |
Пару дней назад Elliot Haughin анонсировал свою новую CMS основанную на php фреймворке CodeIgniter — Blaze. Blaze распространяется под довольно либеральной лицензией: Creative Commons Attribution-No Derivative Works 2.0 UK: England & Wales License. Пока это только ранняя альфа версия, но уже готова к использованию в качестве каркаса для CI проекта. Готовы модули авторизации, создание страниц, записей блога, rss модуль. Эллиот обещает выпустить релиз через пару недель, буду ждать и возможно постою свой сдедующий проект на blaze.
CodeIgniter Framework
Опубликовано TermiT Янв 12, 2008 в PHP |
Последнее обновление 2.09.08
Просмотрел запросы по которым ко мне заходят на блог: часто фигурирую codeigniter про который я уже несколько раз упоминал. И решил собрать побольше информации об этом php фреймворке на одной странице, чтобы всем было удобнее. Если я что-то упустил — нестесняйтесь, добавляй комментарии.
Если кто не знает CodeIgniter — открытый фреймворк написанный на PHP для разработки полноценных веб-систем и приложений. Разработан компанией EllisLab, а также Риком Эллисом (Rick Ellis) и Полом Бурдиком (Paul Burdick).
Из его особенностей обычно выделяют:
- Поддержка версий PHP4 и PHP5.
- Модель MVC (Model-View-Controller).
- Поддержка баз данных MySQL, PostgreSQL, MSSQL, SQLite, Oracle.
- Хорошо спроектированная документация на англ. языке с примерами.
- Очень быстр в работе. В этом смысле — эталон скорости и пример для подражания.
Ресурсы, где вы можете почерпнуть основную информацию об этом продукте:
- Сайт фреймворка (англ.)
- Официальное wiki (англ.)
- Официальный форум (англ.), наверное, лучший источник информации, именно там зарождаются все дополнительные библиотеки и множественные форки
- Документация (англ.), это один из самых крупных плюсов CodeIgniter'a, такую хорошую документацию редко где встретишь.
- Видео уроки + еще 6 скринкастов от ElliotHaugin
- Шпаргалка (CheetSheet) (англ.), я распечатал и повесил на стену — удобно
- Книга СodeIgniter for Rapid PHP Application Development (англ.)
- Книга Professional CodeIgniter (англ.)
- Русское сообщество CodeIgniter, к сожалению это пока единственный русскоязычный ресурс где можно получить помощь при работе с фреймворком
- Перевод документации (переведено процентов 60)
- CodeIgniter — Викиучебник, также стоит обратить внимание на следующие два блога, где часто появляются заметки о «воспламеняющем» фреймворке (оба на русском):
- simplecoding.org
- mihailt.wordpress.com
CMS построенные на CodeIgniter:
Приложения на CodeIgniter c открытым кодом:
Руководства, статьи и заметки:
- Introduction to Code Igniter: Part 1
- Introduction to Code Igniter: Part 2
- Introduction to Code Igniter: Part 3
- Pagination with Code Igniter
- CodeIgniter vs. CakePHP
- Ajax Examples with xajax + Code Igniter
- Building a Complete CodeIgniter Application: Part 1
- Building a Complete CodeIgniter Application: Part 2
- Building a Complete CodeIgniter Application: Part 3
- CodeIgniter and External Resources
- Code Igniter Template Tutorial
- How I use CodeIgniter’s MVC
- Templating with CodeIgniter
- Using Zend Framework components in Code Igniter
- Using Oracle with PHP and CodeIgniter
- Forms in CodeIgniter Views
- Checking CodeIgniter out of the Subversion Repository
- SimplePie RSS class and CodeIgniter
- Template engine integration
- Content Manager
- Enhanced CodeIgniter Session library
- CakePHP & CodeIgniter Benchmark
- PEAR integration
- Using SWIFT MAILER with Code Igniter
- Unobtrusive AJAX with CodeIgniter and Mootools
- Live search with CodeIgniter and Mootools (JSON)
- Top 8 Code Igniter Wiki Resources
- Code Igniter and jQuery Autocomplete
- Extending CodeIgniter Helpers
- Handling Passwords In CodeIgniter
- Linking images in Code Igniter
- CodeIgniter — vBulletin user integration
- CodeIgniter model productivity methods
- CodeIgniter TextMate Bundle Additions
- Surviving without GET parameters
- CodeIgniter: Introduction to CodeIgniter Framework
- CodeIgniter: Installation
- CodeIgniter: Creating First Application at CodeIgniter
- CodeIgniter: Creating and Sending Parameters Between Controller and View
- CodeIgniter: Getting Parameters From GET
- CodeIgniter: Setting Database Configuration
- CodeIgniter: Preparing Database
- CodeIgniter: Showing Simple All Data
- CodeIgniter: Showing Simple One Data
- CodeIgniter: Choosing a Data From GET
- CodeIgniter — Form: Creating Skeleton
- CodeIgniter — Form: File Structure
- CodeIgniter — Form: Creating Layout Code
- CodeIgniter — Form: Creating Menu Library
- CodeIgniter — Form: Putting Text at Header and Footer
- CodeIgniter — Form: Centralizing $data
- CodeIgniter — Form: Adding CSS
- CodeIgniter — Form: Creating Form HTML
- CodeIgniter — Form: Creating Beautiful Form Code
- CodeIgniter — Form: CodeIgniter HTML Style
- CodeIgniter — Form: Preparing Table at Database
- CodeIgniter — Form: Creating Insert Data
- CodeIgniter — Form: Creating List Data Use Table Library
- CodeIgniter — Form: Creating Table List Without Table Library
- CodeIgniter — Form: Using URL Helper
- CodeIgniter — Form: Showing Single Data for Form Edit
- CodeIgniter — Form: Something Happen With Form Parameters
- CodeIgniter — Form: Updating Data
- CodeIgniter — Form: Deleting Data
- Deploying CodeIgniter Projects to Dreamhost Using Capistrano
- Just another nice tutorial
- Running CodeIgniter from Cron/CLI
- Tutorial:ExtJs CodeIgniter
- Allow $_GET in Codeigniter
- Working with models in CodeIgniter
- File Uploading in Code Igniter
- How To Display Database Value In View
- Helpful CodeIgniter Auth Library
- Using jQuery and CodeIgniter for a AJAX Login
- Authenticatication checking in CodeIgniter
- Extended Model for CodeIgniter
- Прикручивание Wysiwyg[fckeditor] к фреймворку
- Codeigniter Blog. Step1: Hello World
- Codeigniter Blog. Step2: Приступаем к блогу. Ввод/вывод записей и комментариев
- Codeigniter Blog. Step3: Добавление записей и комментариев в блог
- Codeigniter Blog. Step4: Авторизация
- Codeigniter Blog. Step5: Pagination
- Codeigniter Blog. Step6: WISIWIG: TinyMCE и FCKEditor
- Codeigniter Blog. Step7: Template+Benchmark+Cache
- Создание RSS потока в CodeIgniter
- Совместное использование Code Igniter и Smarty
- CodeIgniter vs. CakePHP
- Авторизация посетителей и ограничение доступа (CodeIgniter)
- Проверка данных из форм (CodeIgniter)
- Создание многоязычных сайтов с помощью CodeIgniter
- Авторизация пользователя Сodeigniter с использованием ExtJS
- Codeigniter и extJS — список пользователей
- Добавляем CAPTCHA к форме
- CodeExtinguisher — гламурная административная панель для сайта в два клика
- Управление внутренней адресацией в CodeIgniter
- Email класс в Codeigniter
- Отправка почты в CodeIgniter
- Web приложение для проверки URL
- Примеры использования Rapyd из CI (часть 1)
- CodeIgniter Textmate bundle (+E-Texteditor (Windows))
- Отложенное подключение к базе в CodeIgniter
- Почему нужно использовать php-framework’и, на примере codeigniter
- Ускоряем работу с CodeIgniter. Шаблоны для Eclipse.
- Публикация постов в WordPress с помощью XML-RPC и CodeIgniter
- Codeigniter with PEAR
- Inferno: подключаем сторонние библиотеки к CodeIgniter
- Codeigniter — облегчаем себе жизнь (расширяем базовый контроллер)
- Codeigniter — облегчаем себе жизнь (расширяем модель)
- Создание PDF в CodeIgniter c помощью R&OS pdf class
- Userlib — предельно простая авторизация пользователей в CodeIgniter
Библиотеки:
- Rapyd framework — мощный набор библиотек, где реализованы средства авторизации, многоязычности, ORM и т.д.
- Управление пользователями, авторизация, аутификация:
- Управление сессиями:
- Фильтры:
- XML, DOM, AJAX:
- Формы:
- Графики/Диаграммы:
- Paypal:
- Шаблонизация:
- Базы данных:
- Email:
- Pagination:
- Остальное:
Плагины:
- WYSWYG редакторы:
- PDF:
- Формы:
- Exel:
Хелперы:
- Формы:
- AJAX:
- Работа с файлами:
- Валидация:
- Остальное:
Последнее обновление 2.09.08
ДалееСоздание RSS потока в CodeIgniter
Опубликовано TermiT Дек 15, 2007 в Web 2.0 |
У нас (в Linux-Online) есть система управления репозиториями и системы сборки iso-образов с вебмордой на CodeIgniter'e. Естественно ведутся логи, сегодня подумал, что было бы удобно чтобы логи транслировались в RSS — ставим любой RSS ридер с поддержкой нотификаций в треи, красота. Естественно велик не стал изобретать — нашел вариант от Delek Allard'a. Изложу его на русском :)
Итак начнем с контроллера, который я назвал «feed»:
-
<?php
-
class Feed extends Controller
-
{
-
-
function Feed()
-
{
-
parent::Controller();
-
$this->load->model('posts_model', '', TRUE);
-
$this->load->helper('xml');
-
}
-
-
function index()
-
{
-
$data['encoding'] = 'utf-8';
-
$data['feed_name'] = 'DerekAllard.com';
-
$data['feed_url'] = 'http://www.derekallard.com';
-
$data['page_description'] = 'Code Igniter, PHP, and the World of Web Design';
-
$data['page_language'] = 'en-ca';
-
$data['creator_email'] = 'Derek Allard is at derek at derekallard dot com';
-
$data['posts'] = $this->posts_model->getRecentPosts();
-
$this->load->view('feed/rss', $data);
-
}
-
}
-
?>
Важно заметит, что без объявления заголовка (строка #18) браузер проинтерпретировал бы вывод как обычный текст или как xml файл и предложил бы его загрузить, естественно нам такого результата не хотелось. Также в строке #17 мы обращаемся к методу getRecentPosts из модели posts_model, который содержит следующий код:
-
function getRecentPosts ()
-
{
-
$this->db->orderby('post_date', 'desc');
-
$this->db->where('post_visible', 1);
-
$this->db->limit(10);
-
return $this->db->get('posts');
-
}
Выборка с условием, что колонка 'post_visible' должна содержать 1, необходима если вы не хотите отдавать пост на публику, например если это черновик. Теперь посмотрим шаблон (view) 'rss':
-
<?php
-
echo '<?xml version="1.0" encoding="utf-8"?>';
-
?>
-
<rss version=«2.0»
-
xmlns:dc=«http://purl.org/dc/elements/1.1/»
-
xmlns:sy=«http://purl.org/rss/1.0/modules/syndication/»
-
xmlns:admin=«http://webns.net/mvcb/»
-
xmlns:rdf=«http://www.w3.org/1999/02/22-rdf-syntax-ns#»
-
xmlns:content=«http://purl.org/rss/1.0/modules/content/»>
-
-
<channel>
-
-
<title><?php echo $feed_name; ?></title>
-
-
<link><?php echo $feed_url; ?></link>
-
<description><?php echo $page_description; ?></description>
-
<dc :language><?php echo $page_language; ?></dc>
-
<dc :creator><?php echo $creator_email; ?></dc>
-
-
<admin :generatorAgent rdf:resource=«http://www.codeigniter.com/» />
-
-
<?php foreach($posts->result() as $entry): ?>
-
-
<item>
-
-
-
<description><![CDATA[
-
]]></description>
-
</item>
-
-
<?php endforeach; ?>
-
-
</channel>
-
</rss>
В шаблоне я использовал PHP функцию echo для вывода строки «<?xml version="1.0"?>» , т.к. интерпритатор мог воспринять «<?» и «?>» за открывающиеся и закрывающиеся тэги PHP.
И наконец строка:
которая с помощью функции замены строк str_replace преобразует относительные пути к изображению в абсолютные.
Вот так всё оказалось просто. :)
Далее