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

Epic PHP #3

Roma
March 03, 2014

Epic PHP #3

Слайды к третьему занятию курса Epic PHP (http://epixx.ru/epic-php/).
Темы: web features, формы, cookie, сессии, CLI, Git

Roma

March 03, 2014
Tweet

More Decks by Roma

Other Decks in Programming

Transcript

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

    View Slide

  2. Web Features

    View Slide

  3. Predefined Variables
    Каждый выполняемый скрипт PHP снабжает целой
    пачкой предопределенных переменных с разной
    информацией. Их набор и значения зависят от
    запроса, настроек и конфигурации сервера и
    других факторов. Часть из этих переменных
    недоступна при выполнении в CLI.

    View Slide

  4. Superglobals
    Встроенные переменные PHP, которые всегда
    видны в любой области видимости.

    View Slide

  5. Superglobals
    • $GLOBALS

    • $_SERVER

    • $_GET

    • $_POST

    • $_FILES

    View Slide

  6. Superglobals
    • $_REQUEST — не используйте его!

    • $_SESSION

    • $_ENV

    • $_COOKIE

    View Slide

  7. Задание
    В последнем написанном вами скрипте сделайте
    var_dump() суперглобальных переменных и
    посмотрите, что в них находится.

    View Slide

  8. Сказка про
    register_globals

    View Slide

  9. Сказка про
    register_globals

    View Slide

  10. Сказка про
    register_globals
    В темные времена $_GET['foo'] могло быть
    доступно в скрипте как $foo. И $_POST[‘foo’]
    тоже.

    !
    Надо объяснять, почему это плохо?

    !
    Если PHP < 5.4.0 убедитесь, что в php.ini:

    register_globals = off

    View Slide

  11. Семантика HTTP
    HTTP — протокол описывающий взаимодействие
    между двумя компьютерами (клиентом и
    сервером), построенное на базе сообщений,
    называемых запрос (Request) и ответ (Response).
    Каждое сообщение состоит из трех частей:
    стартовая строка, заголовки и тело. При этом
    обязательной является только стартовая строка.

    View Slide

  12. Семантика HTTP
    Стартовая строка:

    !
    METHOD URI HTTP/VERSION,

    !
    где METHOD — это как раз метод HTTP-запроса,
    URI — идентификатор ресурса, VERSION —
    версия протокола (на данный момент актуальна
    версия 1.1).

    View Slide

  13. Семантика HTTP
    • GET — дай

    • POST — создай

    • PUT — обнови

    • DELETE — удали

    View Slide

  14. Формы
    Обработка форм — одна из наиболее сильных
    сторон PHP. При этом, конечно, не лишенная
    нюансов.

    !
    Каждый элемент формы будет автоматически
    доступен в вашем PHP скрипте.

    View Slide

  15. Формы


    Name:


    Email:





    View Slide

  16. Формы

    !
    echo $_POST['username'];

    echo $_POST['email'];

    View Slide

  17. Формы
    • action — пункт назначения

    • method — get или post

    • get — фильтрация, получение данных,
    значения в $_GET

    • post — изменение, отправка, значения
    в $_POST

    View Slide

  18. Формы
    Точки и пробелы в названиях переменных будут
    сконвертированы в символ подчеркивания.

    !
    Например, попадет в $_GET["a_b"].

    View Slide

  19. Формы и массивы


    Name:


    Email:


    Beer:




    Warthog

    Guinness

    Stuttgarter Schwabenbräu







    View Slide

  20. Формы и массивы

    if ($_POST) {

    echo '';

    echo htmlspecialchars(print_r($_POST, true));

    echo '';

    }

    View Slide

  21. Задание
    Создадим праобраз простого блога.

    !
    Поля поста: название, дата, тело сообщения, slug.

    Храним посты в массиве (заведите для примера
    2-3).

    !
    Массив выводим на страницу.

    View Slide

  22. Задание
    Форма создания поста: название и тело сообщения.
    Отправляется через post на тот же скрипт. Пост
    дописывается в массив и выводится с остальными.
    Да, он пока что не сохранится :)

    !
    Форма поиска постов: строковое поле.
    Отправляется через get. Ищет посты по вхождению
    строки в название или тело сообщения.

    View Slide

  23. Формы. Файлы


    !


    !
    MAX_FILE_SIZE — после достижения этого значения PHP
    перестанет получать данные файла. Ошибка будет присутсвовать
    только в массиве $_FILES. Доверять этой настройке нельзя.

    View Slide

  24. Формы. Файлы
    • enctype=”multipart/form-data” — для
    отправки файлов

    • ini директивы

    • post_max_size

    • max_input_time

    • upload_max_filesize

    View Slide

  25. Формы. Файлы
    • $_FILES[]

    • $_FILES['name']

    • $_FILES['type']

    • $_FILES['size']

    • $_FILES['tmp_name']

    • $_FILES['error']

    View Slide

  26. Формы. Файлы

    $uploaddir = __DIR__;

    $uploadfile = $uploaddir

    . DIRECTORY_SEPARATOR

    . basename($_FILES['userfile']['name']);

    !
    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {

    echo "File is valid, and was successfully uploaded.\n";

    } else {

    echo "Possible file upload attack!\n";

    }

    View Slide

  27. Задание
    Добавить к нашему праобразу блога загрузку
    картинки к посту.

    View Slide

  28. Формы
    Значения по умолчанию
    !


    !
    Подстановка значений
    !

    $username = htmlspecialchars($_GET[‘username’]);

    ?>

    ” />

    View Slide

  29. Cookies

    View Slide

  30. Cookies
    Небольшой фрагмент данных, отправленный веб-
    сервером и хранимый на компьютере пользователя.

    !
    Используется для отслеживания пользователей и
    передачи информации между запросами к серверу.

    View Slide

  31. setcookie()
    bool setcookie ( string $name [, string $value [, int
    $expire = 0 [, string $path [, string $domain [, bool
    $secure = false [, bool $httponly = false ]]]]]] )

    !
    Печеньки передаются как часть заголовков запроса.
    Поэтому они должны задаваться до любого вывода
    в браузер.

    View Slide

  32. setcookie()

    if (isset($_COOKIE['count'])) {

    $count = $_COOKIE['count'] + 1;

    } else {

    $count = 1;

    }

    setcookie('count', $count, time() + 3600);

    echo $count;

    View Slide

  33. setcookie()
    Можно передавать и массивы

    !

    setcookie('card[one]', $item, time() + 3600);

    setcookie('card[two]', $item2, time() + 3600);

    View Slide

  34. $_COOKIE
    Суперглобальный массив всех печенек.

    !
    Заданные через setcookie значения попадают в
    $_COOKIE только на следующий запрос.

    View Slide

  35. Cookies
    • Хранится на клиентской стороне
    (браузер)

    • Значения должны быть скалярными

    • Можно задавать через header() как
    любой другой заголовок

    • Значения с одинаковыми именами
    перезаписываются

    View Slide

  36. Задание
    В нашем праобразе блога с помощью cookie
    добавьте ограничение: пользователю нельзя
    отправлять сообщение чаще чем раз в 2 минуты.
    Если он пытается это сделать, надо выводить ему
    ошибку.

    View Slide

  37. Sessions
    Еще один способ осуществить связь между
    запросами к серверу.

    !
    В отличии от Cookie данные хранятся на сервере, а
    их принадлежность пользователю определяется по
    уникальному id, который либо передается через
    Cookie, либо через параметра url.

    View Slide

  38. $_SESSION
    Суперглобальный массив, содержащий данные
    сессии текущего пользователя.

    View Slide

  39. Sessions

    session_start();

    if (!isset($_SESSION['count'])) {

    $_SESSION['count'] = 0;

    } else {

    $_SESSION['count']++;

    }

    echo $_SESSION[‘count’];

    View Slide

  40. Sessions
    • Сессии надо стартовать

    • session_start()

    • session.auto_start = 1

    • Сессии хранятся на сервере

    • session.save_handler — как

    • session.save_path — где

    View Slide

  41. Sessions
    • session_id()

    • session_name()

    • session_regenerate_id()

    View Slide

  42. Задание
    Добавьте к праобразу блога счетчик, сколько раз
    данный пользователь заходил на страницу, и
    выведите его на страницу.

    !
    Добавьте ссылку «сбросить счетчик» и
    соответствующий код в скрипт.

    View Slide

  43. Заголовки
    В PHP есть возможность управлять не только телом ответа, т.е. содержимым
    страниц или файлов, но и заголовками.

    !
    void header ( string $string [, bool $replace = true [, int $http_response_code ]] )

    View Slide

  44. Заголовки
    Редирект

    !
    header(“Location: http://epixx.ru“);

    View Slide

  45. Заголовки
    Тип данных

    !

    // Будем передавать PDF

    header('Content-type: application/pdf');

    !
    // Который будет называться downloaded.pdf

    header('Content-Disposition: attachment; filename="downloaded.pdf"');

    !
    // Исходный PDF файл original.pdf

    readfile('original.pdf');

    View Slide

  46. CLI

    View Slide

  47. Что нужно знать, чтобы
    выжить на сервере, или как
    впечатлить друзей и
    знакомых

    View Slide

  48. Жизненное
    • Умение не отрывать руки от клавиаутры
    и не пользоваться мышью повышает
    шансы на успех на 146%

    • Изучайте hotkeys

    • Когда-то файлы на сервер заливали через
    FTP

    • Но чем дальше в лес, тем больше git и
    ssh. Deal with it!

    View Slide

  49. CLI? WTF?
    • Command Line Interface

    • Это вам не окошки перетаскивать и
    мышкой щелкать

    • Linux – есть везде

    • Mac – Terminal, iTerm

    • Windows – CygWin

    View Slide

  50. View Slide

  51. Ориентация в
    пространстве

    View Slide

  52. Ориентация в
    пространстве
    • pwd — Где я, черт подери?

    View Slide

  53. Ориентация в
    пространстве
    • pwd — Где я, черт подери?
    • ls — Кто эти люди вокруг?

    View Slide

  54. Ориентация в
    пространстве
    • pwd — Где я, черт подери?
    • ls — Кто эти люди вокруг?
    • ls -al — Кто эти люди и кто там еще
    прячется?

    View Slide

  55. Ориентация в
    пространстве
    • pwd — Где я, черт подери?
    • ls — Кто эти люди вокруг?
    • ls -al — Кто эти люди и кто там еще
    прячется?
    • cd — Валим!

    View Slide

  56. Ориентация в
    пространстве
    • pwd — Где я, черт подери?
    • ls — Кто эти люди вокруг?
    • ls -al — Кто эти люди и кто там еще
    прячется?
    • cd — Валим!
    • Найдите папку xampp и файл php
    (php.exe)

    View Slide

  57. Ориентация в
    пространстве 2
    • locate — Где моя тачка, чувак?

    • which — А ты с какого района?

    • tree — Зри в корень!

    View Slide

  58. PHP?
    • php -h — Бэн, это Данила. Ай нид хелп!

    • php -v — А ты кто по жизни?

    • php -i — А, если в карманах посмотрю?

    • php --ini — Скажи мне, кто твои друзья?

    View Slide

  59. PHP?
    • php -S localhost:8000 -t web

    • php -r 'echo "hello\n";'

    • php test.php

    View Slide

  60. Ну, что еще?
    • mkdir — создание каталога

    • touch — создание пустого файла

    • ssh [email protected] — попасть на
    сервер

    View Slide

  61. Ну, что еще?
    • wget

    • curl

    • cat

    • less

    • more

    • nano

    View Slide

  62. Хотите всех напугать?

    View Slide

  63. Хотите всех напугать?
    И задавить понтами?

    View Slide

  64. Хотите всех напугать?
    И задавить понтами?
    Пользуйтесь vim!

    View Slide

  65. View Slide

  66. Виртуальные хосты
    • размещения более чем одного веб-сайта
    на одной машине

    • epixx.ru и epicss.ru

    • /etc/hosts

    • %SystemRoot%\system32\drivers\etc\hosts

    • 127.0.0.1 yoursite.dev

    View Slide

  67. httpd-vhosts.conf
    NameVirtualHost *:80

    !
    !


    ....


    View Slide


  68. DocumentRoot "/var/www/epicphp"

    ServerName epicphp.dev

    !


    ....


    View Slide


  69. Options Indexes FollowSymLinks Includes execCGI

    AllowOverride All

    Order allow,deny

    Allow from all

    View Slide

  70. GIT

    View Slide

  71. Система управления
    версиями
    ПО для облегчения работы с изменяющейся
    информацией. Позволяет хранить несколько версий
    одного и того же файла, возвращаться к более
    ранним версиям, определять, кто и когда сделал то
    или иное изменение, и многое другое.

    !
    (от англ. Version Control System, VCS)

    View Slide

  72. Как оно бывает

    View Slide

  73. Как оно бывает
    • Лена и Ян работают над одним проектом

    View Slide

  74. Как оно бывает
    • Лена и Ян работают над одним проектом
    • Работают каждый у себя дома

    View Slide

  75. Как оно бывает
    • Лена и Ян работают над одним проектом
    • Работают каждый у себя дома
    • Файлами обмениваются по почте/через
    мессенджер/фтп

    View Slide

  76. Как оно бывает
    • Лена и Ян работают над одним проектом
    • Работают каждый у себя дома
    • Файлами обмениваются по почте/через
    мессенджер/фтп
    • В один прекрасный момент им надо что-
    то изменить в одном и том же файле

    View Slide

  77. Как оно бывает
    • Лена и Ян работают над одним проектом
    • Работают каждый у себя дома
    • Файлами обмениваются по почте/через
    мессенджер/фтп
    • В один прекрасный момент им надо что-
    то изменить в одном и том же файле
    • Одновременно

    View Slide

  78. Как оно бывает

    View Slide

  79. Как оно бывает
    • Александр работает над небольшим
    проектом несколько дней

    View Slide

  80. Как оно бывает
    • Александр работает над небольшим
    проектом несколько дней
    • И вдруг понимает, что вчера случайно
    удалил файл, который сегодня очень
    нужен

    View Slide

  81. Как оно бывает
    • Александр работает над небольшим
    проектом несколько дней
    • И вдруг понимает, что вчера случайно
    удалил файл, который сегодня очень
    нужен
    • А в другом участке кода выясняется, что
    версия, сделанная позавчера была
    правильная

    View Slide

  82. Как оно бывает
    • Александр работает над небольшим
    проектом несколько дней
    • И вдруг понимает, что вчера случайно
    удалил файл, который сегодня очень
    нужен
    • А в другом участке кода выясняется, что
    версия, сделанная позавчера была
    правильная
    • Но ее уже нет

    View Slide

  83. Как оно бывает

    View Slide

  84. Как оно бывает
    • index.php

    View Slide

  85. Как оно бывает
    • index.php
    • index_old.php

    View Slide

  86. Как оно бывает
    • index.php
    • index_old.php
    • index_new.php

    View Slide

  87. Как оно бывает
    • index.php
    • index_old.php
    • index_new.php
    • index_new_new.php

    View Slide

  88. Как оно бывает
    • index.php
    • index_old.php
    • index_new.php
    • index_new_new.php
    • index_really_fucking_new_assure_you.php

    View Slide

  89. Как оно бывает
    • index.php
    • index_old.php
    • index_new.php
    • index_new_new.php
    • index_really_fucking_new_assure_you.php
    • damn.php

    View Slide

  90. View Slide

  91. View Slide

  92. View Slide

  93. Git
    Распределённая система управления версиями
    файлов. Проект был создан Линусом Торвальдсом
    для управления разработкой ядра Linux, первая
    версия выпущена 7 апреля 2005 года. На
    сегодняшний день поддерживается Джунио
    Хамано.

    View Slide

  94. Git
    • http://git-scm.com/

    • http://try.github.com/

    • http://rogerdudler.github.io/git-guide/

    View Slide