Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Epic PHP #7

101b5adab18a468a3dfe63f77980ccb9?s=47 Roma
March 20, 2014

Epic PHP #7

Слайды к седьмому занятию курса Epic PHP (http://epixx.ru/epic-php/).
Темы: xml, json, curl, API

101b5adab18a468a3dfe63f77980ccb9?s=128

Roma

March 20, 2014
Tweet

Transcript

  1. Epic PHP #7 Рома Лапин, Evercode Lab

  2. XML

  3. XML XML (англ. eXtensible Markup Language — расширяемый язык разметки;

    произносится [экс-эм- э́л]) — рекомендованный Консорциумом Всемирной паутины (W3C) язык разметки.
  4. XML

  5. XML • RSS • XML-RPC • Ajax

  6. XML

  7. XML • простой формальный синтаксис • в теории удобен для

    чтения и компьютеру и человеку • расширяемый • http://ru.wikipedia.org/wiki/XML
  8. XML <recipe name="хлеб" preptime="5" cooktime="180"> <title>Простой хлеб</title> <composition> <ingredient amount="3"

    unit="стакан">Мука</ingredient> <ingredient amount="0.25" unit="грамм">Дрожжи</ingredient> <ingredient amount="1.5" unit="стакан">Тёплая вода</ingredient> <ingredient amount="1" unit="чайная ложка">Соль</ingredient> </composition> <instructions> <step>Смешать все ингредиенты и тщательно замесить.</step> <step>Закрыть тканью и оставить на один час в тёплом помещении.</step> <!-- <step>Почитать вчерашнюю газету.</step> - это сомнительный шаг... --> <step>Замесить ещё раз, положить на противень и поставить в духовку.</step> </instructions> </recipe>
  9. XML • многословный • а значит тяжелый и объёмный •

    плохая поддержка типов данных
  10. Well Formed XML • Один корневой тэг • Все тэги

    открыты и закрыты правильно • Каждый узел тоже well formed
  11. Валидный XML • Well formed • Содержит указание на DTD

    • Следует этому DTD • DTD = Document Type Definition
  12. PHP + XML • SimpleXML • DOM • XMLReader, XMLWriter,

    XSLT processor
  13. DOM

  14. DOM DOM (от англ. Document Object Model — «объектная модель

    документа») — это не зависящий от платформы и языка программный интерфейс, позволяющий программам и скриптам получить доступ к содержимому HTML, XHTML и XML-документов, а также изменять содержимое, структуру и оформление таких документов.
  15. None
  16. DOM в PHP • Расширение для работы с XML через

    DOM API • Загружает весь документ в память и создает внутреннее представление в виде дерева
  17. DOM $dom = new DomDocument('1.0'); ! $books = $dom->appendChild($dom->createElement('books')); !

    $book = $books->appendChild($dom->createElement('book')); ! $title = $book->appendChild($dom->createElement('title')); ! $title->appendChild($dom->createTextNode('Great American Novel')); ! $dom->formatOutput = true; ! $test1 = $dom->saveXML(); // put string in test1 $dom->save('test1.xml'); // save as file
  18. DOM <?xml version="1.0"?> <books> <book> <title>Great American Novel</title> </book> </books>

  19. DomDocument • createElement() • createTextNode()

  20. DomNode • appendChild() • insertBefore() • cloneNode() • removeAttribute() •

    removeChild()
  21. SimpleXML

  22. SimpleXML • Легче в использовании, чем DOM • Что понятно

    из названия • Конструирует объект из xml
  23. SimpleXML

  24. SimpleXML $xml = new SimpleXMLElement($xmlstr); ! echo $xml->instructions->step[0]; ! foreach

    ($xml->composition->ingridient as $ingridient) { echo $ingridient[‘unit’] . '<br />'; }
  25. Добавляем узлы • SimpleXMLElement::addChild() • SimpleXMLElement::addAttribute()

  26. Добавляем узлы • asXML() • $library->book[0] = null; // удаление

    • children() • attributes()
  27. DOM + SimpleXML

  28. DOM + SimpleXML $sxe = simplexml_load_string($someXmlString); if ($sxe === false)

    { exit; } if (!$dom_sxe = dom_import_simplexml($sxe)) { exit; } $dom = new DOMDocument('1.0'); $dom_sxe = $dom->importNode($dom_sxe, true); $dom_sxe = $dom->appendChild($dom_sxe); echo $dom->save('test2.xml');
  29. SimpleXML $dom = new domDocument; $dom->loadXML($xmlString); if (!$dom) { echo

    'Error while parsing the document'; exit; } $s = simplexml_import_dom($dom); echo $s->book[0]->title;
  30. Задание Напишем простой парсер новостей для RSS сервиса Яндекс.Новости. Выберите

    любой раздел, например, Туризм. Ссылка на RSS на него будет http://news.yandex.ru/travels.rss. ! Скрипт должен брать RSS по URL и каждый <item> записывать в базу с соответствующими полями: title, link, description, pubDate. При повторном запуске одни и те же новости в базу записываться не должны. ! Что лучше использовать: file_get_contents(), SimpleXML, PDO.
  31. XPath $doc = new DOMDocument; ! $doc->preserveWhiteSpace = false; !

    $doc->Load('book.xml'); ! $xpath = new DOMXPath($doc); ! $query = '//book/chapter/tgroup/tbody/row/entry[. = "en"]'; ! $entries = $xpath->query($query); ! foreach ($entries as $entry) { echo "Found {$entry->previousSibling->previousSibling->nodeValue}," . " by {$entry->previousSibling->nodeValue}\n"; }
  32. XPath • Что-то среднее между регулярками и SQL • Стандарт,

    поддерживаемый множеством языков • $xpath = new DomXPath($dom) • Вызов DomXpath::query() возвращает объект DomNodeList
  33. SOAP

  34. Избегайте SOAP как только можно

  35. Но если все-таки интересно, то удачи вам!

  36. Еще про парсинг • symfony/dom-crawler • symfony/css-selector • fabpot/goutte •

    не изобретайте велосипед, короче
  37. JSON

  38. JSON (JavaScript Object Notation)

  39. None
  40. JSON { "one": "A Number", "hello": "world", "myarray": ["orange", "apple",

    "banana"], "myobject": {"library": "books", "bar": "alcohol"} }
  41. JSON functions • json_decode • json_encode • json_last_error_msg • json_last_error

  42. JSON $arr = array('a' => 1, 'b' => 2, 'c'

    => 3, 'd' => 4, 'e' => 5); ! $json = json_encode($arr); echo $json; ! var_dump(json_decode($json)); var_dump(json_decode($json, true));
  43. Bad JSON $bad_json = "{ 'bar': 'baz' }"; json_decode($bad_json); //

    null ! $bad_json = '{ bar: "baz" }'; json_decode($bad_json); // null ! $bad_json = '{ bar: "baz", }'; json_decode($bad_json); // null
  44. Задание Сделаем небольшой и простой поисковик по сообщениям твиттера. Большинство

    методов Twitter API требуют регистрации приложения и специальных ключей. Но поиском можно пользоваться без этого. ! index: форма с поисковым полем обработчик: запрос к Twitter API, парсинг json, вывод твитов в виде списка. ! Формат запроса: https://search.twitter.com/search.json?q=epicskills Красиво оформить json для чтения полей: http://jsonlint.com/ Дока для поиска: https://dev.twitter.com/docs/using-search
  45. CURL

  46. CURL cURL — свободная (распространяемая по лицензии MIT), кроссплатформенная служебная

    программа командной строки для копирования файлов по различным протоколам с синтаксисом URL.
  47. CURL

  48. CURL • читает сайты • отправляет формы • загружает файлы

    • и многое другое • БЕСПЛАТНО И БЕЗ СМС!!111
  49. CURL <?php $ch = curl_init ("http://www.yandex.ru"); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);

    $yahoo = curl_exec ($ch); var_dump($yahoo);
  50. CURL • “Ну и че, это делается с помощью file_get_contents

    гораздо проще”, скажете вы. • И будете правы. • Но
  51. CURL • Что, если вам надо указать какой-нибудь заголовок? Например,

    HTTP_REFERER. • Или использовать Cookie и сохранить логин пользователя между страницами? • А форму отправить через POST?
  52. Закачиваем файл /* http://localhost/upload.php: print_r($_POST); print_r($_FILES); */ ! $ch =

    curl_init(); ! $data = array('name' => 'Foo', 'file' => '@/home/user/test.png'); ! curl_setopt($ch, CURLOPT_URL, 'http://localhost/upload.php'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); ! curl_exec($ch);
  53. Задание Переделайте скрипты предыдущих заданий на работу через CURL.

  54. API

  55. API • У кого-то уже есть данные, которые вам нужны

    • И по API их взять проще, чем парсить сайт • И автоматизировать можно • Да и оптимизировать
  56. REST

  57. REST • Representational State Transfer • Запросы выглядят, как отправленные

    формы • Ответ обычно XML или JSON • RESTafarians — это почти растаманы, только более упороты