Здесь собраны материалы по PHP и сURL
Планируется серия статей по работе и использованию cURL – библиотека функций Client URL из файла libcurl, написанного Дениэлом Стейнбергом (Daniel Steinberg). Набор функций cURL определён в PHP начиная с версии 4.0.2.
При помощи cURL можно реализовать практически любое сетевое соединение, перечислять, думаю, не стоит – поэтому знать механизмы работы будет весьма полезно. Начну с нескольких простых функций использования cURL в PHP.
Итак, то что необходимо для организации сессии cURL – это всего-навсего три следующие функции:
- curl_init() - инициализация сессии cURL (возвращает дескриптор сеанса cURL);
- сurl_exec() - выполняет реальное соединение с требуемым сервером после того, как все параметры установлены. Но параметры указывать необязательно для выполнения соединения – необходима функция – curl_init().
- curl_close() – закрывает сеанс.
Вот и всё. Вроде всё просто. Попробую написать простейшую программу - получить на экран любую страницу в интернете, например страницу этого блога. Если будете использовать этот пример в Друпале в соответствии со стандартами кода не забывайте брать Вашу программу в теги <?php и ?>.
<?php
$ch=curl_init("http://ezh-leon.ru"); /* В переменную $ch я записываю дескриптор сеанса */
$result = curl_exec($ch); /* В переменную $result записываю страницу, которую я получаю по http://ezh-leon.ru для того, чтобы ниже отобразить её с помощью фунции echo – и таким образом смогу наблюдать результат работы моей программы */
curl_close($ch);
echo $result;
?>
Таким образом я получаю по HTTP соответствующую страницу, адрес которой я указываю в параметре функции curl_init(). Первая программа готова.
Но для практического применения cURL мне просто необходима функция curl_setopt(). Именно в ней указываются все параметры пересылки. Количество настраиваемых аргументов у этой функции очень велико – буду использовать каждый из параметров, и для каждого приводить конкретный пример использования в программе.
Функция curl_setopt() получает три аргумента. Первый аргумент – мой дескриптор сеанса (в данном случае $ch), второй аргумент – имя соответствующего параметра, и третий – то самое значение, которое передаётся этому параметру. Не имеет значения в какой последовательности перечислять параметры – но главное, чтобы все вызовы curl_setopt() располагались между curl_init() и curl_exec(). Итак, перепишу свою программу – результат её работы будет таким же, но на этот раз использую функцию curl_setopt().
<?php
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, "http://ezh-leon.ru");
$result = curl_exec($ch);
curl_close($ch);
echo $result;
?>
Я использовал параметр CURLOPT_URL – в него передаётся URL требуемого сайта, и для этого я использовал не curl_init(), а curl_setopt().
Ну что ж, это было вступление – продолжу в следующих статьях.
С уважением, Ёж.
Итак, продолжу изучение параметров функции curl_setopt(), которое я начал в первой cтатье Использование cURL. Напишу программу для авторизации на каком-либо сайте и попутно подробно остановлюсь на каждом из параметров функции curl_setopt().
Первое, что Вам нужно сделать для того, чтобы написать программу автоматической авторизации – это установить сниффер, с помощью которого можно отследить данные, которые передаются методом POST, и затем эмулировать передачу этих данных в своей программе на cURL. Лично я пользуюсь программой IEWatch для Internet Explorer и рекомендую её Вам. При авторизации методом POST например передаются имя пользователя и пароль, возможно какие-нибудь ещё параметры – на каждом сайте по-разному – одним словом, без сниффера никуда.
Пару слов о том, как пользоваться программой IEWatch. Запускаете программу и проходите авторизацию на веб-сайте так, как обычно вы это делаете. Программа IEWatch отслеживает все передаваемые Вами данные, и на вкладке Post Data для данных передаваемых методом POST – вы можете увидеть все параметры, которые передаются веб-серверу, на котором Вам необходимо пройти авторизацию.
Теперь буду писать программу для авторизации. Параметры функции curl_setopt(), которые мне необходимо задать для правильной работы моей программы:
CURLOPT_POST – этот параметр нужен для того, чтобы эмулировать передачу данных методом POST. Обязательно установите параметр в ненулевое значение, для того чтобы передать пароль и остальные необходимые поля.
CURLOPT_POSTFIELDS – параметр передаёт поля, содержащие полные данные, которые передаются методом POST. Можно для удобство записать эти данные в переменную. Именно здесь Вы передаёте поля, полученные Вами от сниффера – имя пользователя, пароль и так далее.
CURLOPT_COOKIEJAR – параметр нужен для того, чтобы записывать куки (cookies), получаемые от сервера, с тем, чтобы потом передать эти куки серверу при авторизации. Куки записываются в текстовый файл, причём данный файл совсем не обязательно создавать самостоятельно. Я использовал при работе с этим параметром встроенную переменную PHP $DOCUMENT_ROOT – эта переменная указывает на основание дерева документов веб-сервера. В целях повышения безопасности Вашего сайта рекомендую вам использовать эту переменную – с её помощью можно указывать на каталог, который находится вне дерева документов Вашего веб-сервера – то есть Вы можете задавать относительный путь для любого файла.
CURLOPT_COOKIEFILE – когда Вы будете заходить на веб-страницу как авторизованный пользователь, с помощью этого параметра нужно передать куки, которые до этого были записаны с помощью параметра COOKIEJAR. Без этого процедуру автоматической авторизации пройти не удастся.
CURLOPT_RETURNTRANSFER – необязательный параметр в данной программе, но я использую его для удобства. Вы должны передать в этом параметре ненулевое значение, если хотите, чтобы cURL непосредственно возвращала трансфер, вместо его печати напрямую. Как это работает? Например Вы используете вот такой фрагмент кода
$result = curl_exec($ch);
Так вот, если Вы установите параметр CURLOPT_RETURNTRANSFER=1, то вся получаемая Вами страница будет сохраняться в переменной $result, и затем в дальнейшем Вы сможете манипулировать этой переменной в программе так, как Вам это заблагорассудится. Это очень удобно. Но, повторюсь – в данной программе этот параметр не обязателен.
Ну что ж, а теперь я пишу мою программу:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/personal/login.phtml"); /* Переходим на страницу, на которой нужно пройти процедуру авторизации */
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "login=mylog&psw=mypassword"); /* Внимание! Здесь необходимо передать параметры, полученные Вами от сниффера – параметры разделяются знаком & */
curl_setopt($ch, CURLOPT_COOKIEJAR,$_SERVER['DOCUMENT_ROOT'].'/cookiefile.txt');
$result = curl_exec($ch);
curl_setopt($ch, CURLOPT_URL, "http://example.com"); /* Теперь заходите на сайт как авторизованный пользователь – в данном случае нужно вместо example.com указать URL страницы, на которую может попасть только авторизованный пользователь */
curl_setopt($ch, CURLOPT_POST, 0); /* Также необязательное действие, но я указал этот параметр – устанавливаю CURLOPT_POST в нуль, ведь теперь мне не нужно передавать данные методом POST */
curl_setopt($ch, CURLOPT_COOKIEFILE, $_SERVER['DOCUMENT_ROOT'].'/cookiefile.txt'); /* Внимание! Здесь третий параметр (адрес текстового файла с куками) должен быть точно таким же, как и при использовании CURLOPT_COOKIEJAR, иначе процедура авторизации работать не будет, так как требуемые серверу Куки не передадутся */
$result = curl_exec($ch);
curl_close($ch);
echo $result;
?>
Вот – программа работает. Иначе и быть не могло :).
Спасибо за внимание.
Ёж.
Seagull PHP Framework - это фреймворк для разработки веб-приложений, использующий возможности ООП (объектно-ориентированного программирования). Данный фреймворк распространяется в исходных кодах по системе распространения ПО BSD. Проект позволяет PHP разработчикам в сжатые сроки построить требуемые комплексные приложения. Но всегда надо с чего-то начинать. В данной статье я опишу процесс установки Seagull.
Итак, скачиваете фреймворк с сайта проекта http://seagullproject.org. На данный момент последняя версия - 0.6.6. После этого архив нужно распаковать в корневой каталог Вашего сайта. Заменяете название папки на seagull. Изначально папка называлась seagull-0.6.6, ну - это зависит от устанавливаемой версии. Всё - теперь можно запускать процесс установки. В адресной строке Вашего браузера набираете mysite.com/seagull/www (где mysite.com - URL Вашего сайта).
Шаг 1. Соглашаетесь с условиями лицензии, кликаете NEXT. Далее нужно будет загрузить файл AUTH.txt с персональным кодом и перенести этот файл в корень веб-сайта. Этот простой шаг сделан для того, чтобы проверить, что сайт устанавливает именно его владелец, человек, который имеет доступ ко всем каталогам и директориям. Загоняете файл на сервер, кликаете NEXT.
Шаг 2. Далее - необходимо разрешить запись в папки var и www. Необходимо дать этим папкам права 777.
Шаг 3. На следующем шаге устанавливаете тип БД, версию протокола (для localhost - лучше выбрать тип протокола unix). Задаёте имя пользователя БД и, соответственно, пароль доступа к базе. После чего нужно будет создать базу данных. Если пользователь, которого Вы указали, имеет права на создание БД, то тогда Seagull может создать базу за Вас. Можно также создать пустую базу данных а затем инициализировать её при установке, в этом случае надо поставить птичку напротив пункта 'use existing db', то есть 'выбрать существующую базу данных'.
Шаг 4. Далее прописываете администраторский логин и пароль. Можно также изменить генеральные настройки, например ключевые слова, описание сайта, установки часового пояса на сервере. Также здесь нужно задать Ваш install password, то есть пароль, используемый при установке системы. Этот пароль будет применятся в том случае, если Вы будете переустанавливать Seagull. Предпочтительно, чтобы данный пароль отличался от пароля администратора, хотя это уже на Ваше усмотрение.
Шаг 5. Всё. Seagull прописывает свои таблицы - это займёт максимум полторы минуты. Теперь при клике на ссылку LAUNCH SEAGULL Вы попадаете на Ваш сайт.
На этом пока всё. Продолжение следует...
Ёж
Проект Seagull представляет собой набор классов, с помощью которых предлагается подход к разработке программ - позволяющий писать Вам программы легче и быстрее, чем обычно. Главное, что при разработке программ лучше, чтобы программист основное внимание и время уделял именно решению ключевых проблем, в то время как проект Seagull может помочь решить сопуствующие стандартные задачи без Вашего вмешательства - такие как разработка приятного и простого интерфейса с пользователем, применение определённой программной логики в некоторых местах алгоритма, удобная организация кода, интеграция сопутствующих рабочих процессов (workflows) и так далее.
Но всегда интереснее поскорее перейти к чему нибудь конкретному - поэтому поскорее перехожу к непосредственной работе с системой.
Но перед тем, как начать разработку вместе с Seagull - необходимо разобраться с тремя главными логическими составляющими - Модули (Modules), Менеджеры (Managers) и Контроллеры (Controllers). До меня на русский документацию по Seagull похоже никто особо много не переводил, проект к сожалению мало раскручен (по крайней мере - в рунете про него большинство даже не слышали) - так что называть всё пока буду преимущественно по своему вкусу, но постараюсь максимально близко к тексту и смыслу.
Наилуший путь для разработчика при написании приложения на Seagull - это конечно же разработка и имплементация своих собственных модулей. Модуль - это логическая организация для реализации некоторого нужного функционала. Например, в User Module Вы можете найти код, который управляет:
- пользователями,
- разрешениями,
- преимуществами пользователей (preferences),
- ролями.
Ну и, короче говоря, управляет всеми аспектами управления пользователями.
Модуль же в свою очередь состоит из одного или нескольких менеджеров. Менеджер - это просто объект контроллера (page controller object), который группирует некоторое количество связанных действий, которые могут быть выполнены в применении к некоторой единице в бизнес-модели объектов, например - Пользователь (User), Транзакция (Transaction), Shopping Cart (Корзина) и так далее. Типичные действия, которые осуществляет менеджер:
- добавить,
- вставить,
- редактировать,
- обновить и так далее.
Среди Контроллеров (Controllers) выделяют два важных типа - Application Controller и Front Controller. Seagull как известно использует архитектуру MVC (Model-View-Controller).
Application Controller реализует концепцию контроллера SGL_Manager. Если не вдаваться в глубокие детали - смысл в том, что Вы всегда сможете создать ещё один контроллер приложения (application controller) и каждый из этих контроллеров может использоваться контроллерами, управляющими страницей (page controllers).
Front Controller может упростить для Вас работу с запросами пользователей. Данный объект отвечает за сбор всех запросов и передачу их в так называемый Фильтр Звена (Filter Chain), который содержит простой перечень фильтров ввода-вывода и вышеупомянутый App Controller. Разные фильтры в цепи обрабатывают запросы и вызывают соответствующего менеджера для дальнейшей правильной работы приложения.
Продолжение в следующих выпусках...
Спасибо за внимание.
Ёж
В этой статье я начну рассказ о том, как создать на Seagull простейший модуль - с чего всё всегда и начинается, то есть модуль, который выводит на экран надпись Hello World!
Вся функциональность Seagull реализуется с помощью модулей, а в модуле уже содержится всё необходимое для реализации того или иного действия.
Итак, необходимо создать в папке modules папку helloword, и в ней папки classes, data и templates:
|-- [modules]
| |-- [helloworld]
| | |-- [classes]
| | |-- [data]
| | `-- [templates]Первый файл, который нужно создать - это класс, который будет отвечать запросам на появление надписи Hello World! Назову его HelloWorldMgr.php. Этот файл нужно создать в папке classes. В Seagull вся функциональность, которая реализует все действия для отображения/модифицирования данных некоторого типа, помещается в классах, которые называют Менеджерами (Managers). Например, если вы хотите создать функциональность для добавления,редактирования и удаления FAQов, то создадите класс FaqMgr.php, Mgr - это стандартная стенографическая запись для Менеджера.
Итак, создаёте файл HelloWorldMgr.php, он наследует данные и операции из класса SGL_Manager. В нём напишите следующий код:
<?php
class HelloWorldMgr extends SGL_Manager
{
// ...
}
?>Между фигурных скобок потом будет код.
Если используется база данных MySQL, то нужно создать файл data.default.my.sql в папке data, и написать в этом файле следующий код:
INSERT INTO module VALUES ({SGL_NEXT_ID}, 1, 'helloworld', 'Hello World', 'A ''Hello World'' test module.', '', '', 'Alouicious Bird', NULL, 'BSD', 'alpha');Ну, и ещё, необходимо создать непосредственно в самой папке helloworld файл conf.ini. Теперь получится вот такая структура:
|-- [modules]
| |-- [helloworld]
| | |-- [classes]
| | | `-- HelloWorldMgr.php
| | |-- [data]
| | | `-- data.default.my.sql
| | |-- [templates]
| | `-- conf.iniВ файл conf.ini пишем
[HelloWorldMgr]О том, как зарегистрировать модуль и вызвать менеджер - поговорим в следующих статьях.
Продолжение следует ...
Ёж
В данной статье я продолжаю изготовление нашего первого модуля:
Регистрация модуля
В целях безопасности Seagull устроен так, что каждый модуль, который добавляется в папку modules, нужно сначала зарегистрировать. Делается это очень просто - сперва заходите на сайт как главный администратор, затем в администраторском меню заходите на вкладку General -> Manage Мodules и ставите птичку напротив show uninstalled modules (показать неустановленные модули). В появившемся списке выбираете helloworld, нажимаете на плюсик напротив - и всё, Seagull должен выдать вам надпись The helloworld module was successfully installed (Модуль helloworld был успешно установлен).
Запрашиваете Ваш новый менеджер
А сейчас проверим, работает ли обращение к данному менеджеру. Для это в адресной строке браузера набираете следующий URL:
http://your-site.com/seagull/index.php/moduleName/managerName/
где moduleName - это имя модуля, а managerName - это, соответственно, имя менеджера.
В нашем случае адрес URL будет выглядеть так:
http://your-site.com/seagull/index.php/helloworld/HelloWorldMgr/
После чего на экране должно появится окно Seagull, но так как менеджер ничего пока не делает, в середине будет просто белое пустое пространство. Но если стандартное окно Seagull всё-таки появляется, значит всё работает правильно.
Но обращение к менеджеру будет работать и даже вот так:
http://your-site.com/seagull/index.php/helloworld/HelloWorld/
и так:
http://your-site.com/seagull/index.php/helloworld/helloworld/
То есть, как видите, регистр не учитывается, и приписку Mgr можно тоже опустить. В данном случае будет работать даже вот такой адрес:
http://your-site.com/seagull/index.php/helloworld/
так как данный менеджер является менеджером модуля helloworld по умолчанию.
Добавление данных
Итак, каркас готов, теперь добавляем непосредственно сам вывод фразы Hello World!
Проще всего просто добавить метод в класс HelloWorldMgr.php:
function display(&$output)
{
print 'Hello World!';
}После чего обновляете страницу, и Вы увидите надпись Hello World! в самом верху, над хедэром (header) страницы.
Но для того, чтобы встроить данную надпись туда, куда нам нужно - то есть внутри окна, надо сделать вывод немного по-другому.
Создание шаблона
В директории templates создаёте файл helloWorld.html:
|-- [modules]
| |-- [helloworld]
| | |-- [classes]
| | | `-- HelloWorldMgr.php
| | |-- [data]
| | | `-- data.default.my.sql
| | |-- [templates]
| | | `-- helloWorld.html
| | `-- conf.iniВ этом файле пишите название переменной, в которую будет осуществляться вывод - название переменной должно быть в фигурных скобках, например:
{testVariable}Соединяете всё это вместе
Ну и, соответственно, в конце необходимо прописать в функции вывода шаблон, и надпись, которая будет выводиться в данную переменную. Переписываем метод display():
class HelloWorldMgr extends SGL_Manager
{
function display(&$output)
{
$output->template = 'helloWorld.html';
$output->testVariable = 'Hello World!';
}
}Всё, теперь надпись Hello World! появляется как раз в том самом белом окне!
Оригинал статьи на английском .
Ёж
В этой статье продолжу развивать наш первый модуль, дополнив его новыми фичами.
Прежде всего стоит отметить, что стандартным движком для генерирования HTML-страниц в Seagull является движок Flexy. Именно на этом движке строится модуль в данных статьях. Важные особенности этого движка:
1. все переменные и имена функций должны быть взяты в фигурные скобки
2. никогда не используйте пробелы между переменными, в случае использования их как аргументов, Flexy такое не приветствует
Итак, сперва сгенерирую какую-нибудь ссылку. Для этого в Seagull можно использовать функцию makeUrl().
{makeUrl()}При использовании функции без параметров ссылка будет вести просто на ту страницу, на которой мы и находились до этого. Например, добавьте в файл helloWorld.html следующее:
<a href="{makeUrl()}">say good bye</a>Но вообще, функция эта имеет три параметра:
{makeUrl(action,manager,module)}action - имя некоего действия, manager - имя модуля, ну и, соответственно, module - третий параметр, имя модуля. Давайте вызовем эту функцию, используя один только первый параметр. Ещё одна важная особенность движка Flexy - если в параметрах используется не имя переменной, а литерал, то его нужно брать в знак хэша (#).
<a href="{makeUrl(#sayGoodBye#)}">say good bye</a>Если Вы посмотрите исходный код страницы в браузере, то Вы увидите ссылку вот такого вида:
<a href="http://localhost/seagull/www/index.php/helloworld/action/sayGoodBye/">say good bye</a>Вот - а теперь добавим немного кода в наш класс HelloWorldMgr, чтобы соответствующее действие выполнилось. Добавляем в наш класс вот такой конструктор:
function HelloWorldMgr()
{
parent::SGL_Manager();
$this->_aActionsMapping = array(
'sayGoodBye' => array('sayGoodBye'),
);
}Это нужно для того, чтобы сказать Segull, какие конкретно методы будут призваны для того, чтобы выполнить действие, зависящее от значения параметра action. Пока у нас параметр только один - sayGoodBye, вот его мы и перечисляем.
Для валидации этой переменной добавляем в класс ещё одну функцию validate:
function validate($req, &$input)
{
$this->validated = true;
$input->action = $req->get('action');
}Объяснение вышерасположенного кода можно посмотреть тут.
Осталось немного. Добавляю функцию, которая выводит некоторый текст (в нашем случае это слово Goodbye) в новую переменную word:
function _cmd_sayGoodBye(&$input, &$output)
{
$output->word = 'Goodbye';
}Теперь осталось только немного подправить файл шаблона, во-первых, вывести ту самую переменную word в фигурных скобках, ну и сделать ссылку, при нажатии на которую будет появляться надпись Goodbye. Также я поменял вывод - теперь выводится не Hello World!, а просто World!
Итак, финальный вид того, как будет выглядеть теперь файл helloWorld.html:
{word} {testVariable}
<p><a href="{makeUrl(#sayGoodBye#)}">say good bye</a></p>Всё. Сохраняйте изменения, перезапускайте модуль. Появится надпись World!, а под ней ссылка say good bye, при нажатии на которую действительно перед World! добавляется Goodbye.
Goodbye World!
Продолжение следует...
С уважением, Ёж.
Seagull поощряет разработчиков добросовестно управлять получением запрашиваемых переменных.
Все данные, введённые пользователем - будут ассоциированы с объектом $input.
Безусловно - введённые данные необходимо подвергнуть валидации. Функция валидации validate() имеет два аргумента - the request object and the input object (т.е. объект запроса и объект ввода), которые передаются в функцию. И таким образом можно сразу же проверить наличие запрашиваемых переменных и ассоциировать их с объектом ввода ($input object), и после этого введённые значения будут доступны на протяжении всего того времени, пока это будет нужно фреймворку.
- Request object - это инкапсуляция данных ассоциативного массива $_REQUEST. Напомню, $_REQUEST содержит данные HTTP-запроса - то есть данные переменных $_GET, $_POST и $_COOKIE
- Input object служит для регистрации данных и ресурсов, которые работают в режиме запрос/ответ (request/response cycle).
- Вы поставляете объект ввода в свои action methods (методы, осуществляющие действия), которые, после обработки и осуществления действий, выполняемых соответствующим методом, ассоциируются с объектом вывода (output object).
Вобщем - всё работает очень просто. Данные собираются из запроса, и после проверки валидации отправляются в action methods, инициализируясь через параметр action в запросе. Если валидация не проходит - другими словами, если свойство $validated устанавливается в FALSE, тогда App Controller отправляет данные запроса прямо в функцию display, игнорируя всё остальное.
Это и побудило нас написать функцию валидации данным образом:
function validate($req, &$input)
{
$this->validated = true;
$input->action = $req->get('action');
}Ёж