Синхронные 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 (), которой передавалась команда с амперсандом на конце.
Далее
ExpressionEngine 2.0 готов к выпуску
Опубликовано TermiT марта 9, 2008 в PHP |
На конференции sxsw Ellislab представили свою новую разработку ExpressionEngine 2.0. Меня бы это не особо волновало, если бы не один факт меняющий все координально: ExpressionEngine 2.0 создан на CodeIgniter. Что это означает для CodeIgniter разработчиков?
- Наконецто появляется «правильная» CMS на CodeIgniter от разработчиков CodeIgniter
- CodeIgniter будет развиваться быстрее
- Объединение комьюнити
- Возможность использовать модули из ExpressionEngine 2.0 в CodeIgniter и соответсвено наоборот
- Уже в новой версии CodeIgniter получит библиотеку подобную DBForge которая была создана для развития ExpressionEngine 2.0
- Также появится хелпер для работы с jQuery
Материалы:
- Скриншоты ExpressionEngine 2.0
- Видео с презентации
- Интервью с Ellislab
- Мини интервью о совместимости ExpressionEngine 2.0 и ExpressionEngine 1.6
- Описание новых возможностей ExpressionEngine 2.0
- Фотографии команды Ellislab с конференции
Чтож будем ждать паблик релиза.
ДалееJust another Codeigniter CMS — Shanti CMS
Опубликовано TermiT марта 5, 2008 в PHP |

Открытые CMS на CodeIgniter растут как грибы, и это не может не радовать. Shanti представил свою cms с незатейливым названием Shanti CMS (Commons Attribution 4.0 License). Не ожидайте от нее чего большого, cms очень простоя, но посмотреть неприменно стоит.
Далее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
ДалееЛягушачий фреймворк
Опубликовано TermiT Ноя 16, 2007 в PHP |
Когда меня просят посоветовать php фреймворк я обычно без раздумья отвечаю Code Igniter. Вчера я познакомился с фреймворком имеющим незатейливое названием Framework.php, он являются ядром Frog CMS (php версия Radiant CMS) и весит всего 37кб. Не смотря на его размер лягушачий фреймворк достоит внимания, он имеет весь необходимый функционал для старта небольших нет-приложений, а его скорости позавидует сам Code Igniter. Теперь я буду советовать и его тоже.
Далее