Анатомия HTTP запроса

June 25th, 2007 3 Comments »

Занимаясь веб-разработкой профессионально, нельзя не знать как все работает до последней шестеренки. Поэтому я считаю будет уместно рассказать о том как происходит взаимодействие сервера и клиента и для этого препарировать HTTP протокол как основу такого взаимодействия.

Когда вы пробовали создавать первые HTML страницы, вы либо открывали их через двойное нажатие мышкой браузером прямо с диска (файловой системы), либо выкладывали на локальный или удаленный web-сервер и открывали браузером URL. В обоих случаях, результать один и тот-же – вы видете HTML страницу в браузере. Однако, когда вы открываете страницу расположенную на web-сервере через HTTP протокол, неявно передается достаточно много дополнительной информации, а именно заголовки HTTP. Протокол передачи – это договор между сервером и клиентом о допустимых вопросах и ответах. Протокол задокументирован в виде стандарта RFC2616.

Общение между сервером и клиентом может быть описано как разговор человека в магазине:

Клиент: Привет! Я Мозилла-Файрфокс, можно-ли мне файлик products.html с хоста shop.com ?
Сервер: Да, есть у меня такой файлик, он имеет тип text|/html и вот его содержимое.
(Клиент получает целиком файл, смотрит на него и натыкается на тег <img>)
Клиент: Привет! Я Мозилла-Файрфокс, можно ли мне файлик product.jpg с хоста shop.com ?
Сервер: Да, есть у меня такой файлик, он имеет тип image/jpg и вот его содержимое.
(Клиент получает файл и отображает на экране)

И так далее. Что кстати сразу замечу – сервер понятия не имеет что оба раза это был один и тот же клиент. HTTP-протокол называется “stateless” – он не хранит состояние соединения и передачи. Вопрос – ответ – “вiльна каса”.

Вернемся к заголовкам. Они бывают двух типов – заголовки запроса (request) и заголовки ответа (response). Например, вы набираете URL нашего сайта и он открывается. На языке современного протокола HTTP версии 1.1 это выглядит так:

Запрос:

GET / HTTP/1.1
Host: iwannabedeveloper.com
User-Agent: Mozilla/5.0

Ответ сервера:

HTTP/1.1 200 OK
Date: Mon, 25 Jun 2007 13:50:37 GMT
Server: Apache/2.0.46 (CentOS)
Accept-Ranges: bytes
X-Powered-By: PHP/4.3.2
X-Pingback: http://iwannabedeveloper.com/xmlrpc.php
Content-Encoding: gzip
Vary: Accept-Encoding
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

После заголовков следует содержимое страницы в виде HTML:


< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Выглядит довольно просто. В запросе клиент указывает какой файл он просит сервер вернуть и опознает себя (хоть и не обязан) как Mozilla. Запрос посылается методом GET, и есть еще метод POST, но о нем в следующий раз. В ответ клиент получает информацию о запрашиваемом файле и сам файл. Наиболее значимые заголовки ответа – это Content-Type и Status. Content-Type сообщает клиенту какого типа файл будет передаваться, а в случае HTML, какая кодировка будет использоваться. Список типов файлов (MIME-types) стандартизована и с ней можно ознакомится здесь. Status – (200 ОК) – это стандартизованный код выполнения запроса. Код 200 означает что запрошенный файл был найден и успешно передан клиенту. Например код 404 означает что файл не найден, код 301 – что файл перемещен в другое место, а код 500 – что во время выполнения запроса произошла непоправимая ошибка на сервере. Список кодов описан в упомянутом стандарте RFC2616.

Вот в кратце как работает HTTP протокол. Есть еще много вопросов которые мы разберем позже – например, как передаются формы и файлы других типов или как можно управлять передаваемыми заголовками с помощью PHP.

SVN

June 25th, 2007 6 Comments »

Давайте разберёмся, что такое SVN и зачем он нужен.

Я сейчас читаю книжку “Building scalable web sites” (“Создание масштабируемых веб-сайтов“) на примере проекта Flickr.com, так вот в разделе разработки значится три вещи, которые обязательно должны быть в девелоперской команде:

  1. система контроля версий;
  2. одно-шаговая сборка проекта;
  3. баг-тракер (система учета ошибок и фич)

На первом месте стоит система контроля версий. Почему?

Во-первых, она позволяет разработчику быстро исправить свои ошибки. Система хранит все промежуточные “фотографии” проекта и позволяет по ним перемещаться, при необходимости возвращая систему на прежнее, стабильное состояние. Разработка есть творчество, это факт. Иногда такое “натворишь”, что хочется всё отменить и начать сначала. Вот система контроля версий и позволяет это сделать – она хранит все этапы создания ваших приложений.

Во-вторых, система контроля версий позволяет сразу нескольким людям работать не только над одним проектом, но и даже над одними и теми же файлами.

Реализаций таких систем много, есть платные и бесплатные. Самые популярные: CVS (Сontrol Version System) и SVN (Subversion). Мы будем пользоваться последней из них – SVN.

Пара ссылок для ознакомления: описание в Википедии и подробный мануал работы с системой (на доходивом русском).

Итак, есть где-то какой-то SVN, который делает кучу всего полезного. Как им пользоваться?

Система имеет две части: серверную и клиентскую (локальную для вас). Это позволяет всем работать откуда им удобно.

Серверную часть за вас уже проинсталлировали и дали УРЛ вида http://svn.server.com:7575/projects/super_project/ Это всё, что нам пока нужно.

На клиенте нужно поставить специальную программу – Tortoise SVN, которая будет за вас общаться с сервером, автоматизируя кучу ручной работы. Качаем, инсталлируем, ничего сложного. Теперь заходим в ваш document root (ту папку, документы которой показывает ваш броузер, когда вы заходите на http://localhost), создаем папку для нашего проекта, заходим, ПКМ (правый клик мыши), “SVN Checkout” – чтобы стянуть файлы с сервера в эту папку (надо же нам над чем-то работать). Появится диалог, как на рисунке.

1.png

Нажимаем ОК, у вас спросят логин/пароль. Вводим.

2.png

После этого папка начнет наполнятся файлами. Отлично!

31.png

Теперь собственно работа над проектом: вы спокойно правите файлы, и потом решаете опубликовать ваши наработки. Для этого в папке с проектом ПКМ и “SVN Commit“. Сервер получит ваши наработки и сам хитро соединит ваши правки с работой других людей.

После этого вы наверняка захотите получить себе результат этого объединения (это и есть командная работа). Для этого ПКМ и “SVN Update“.

Начало летней практики

June 18th, 2007 3 Comments »

Вот собственно начались 6 мучительных недель практики. У меня сложилось впечатление что господа студенты уже поняли куда влипли, и уже не рады этому 🙂 Прошу не паниковать и оставаться на своих местах, мы не дадим вам засохнуть.

Ссылки на необходимый для работы софт и доки: Tortoise SVN, Fusebox, Smarty.

Первая неделя практики будет посвящена установке необходимого ПО, изучению технологий и анализу поставленных перед командами задачами. Через неделю проведем встречу, разъясним непонятные вопросы по требованиям и технологиям.

Ожидайте описание Fusebox и процесса разработки в следующих выпусках нашего журнала.

UPDATE: чтобы не казалось что тут звери сидят, могу заверить – с нашей стороны мы дадим все что нужно – расскажем о Fusebox, бизнес-логику и т.д. Выучить за вас php и mysql конечно никто не сможет, но ведь целью практики и есть научиться…

Установка PHP как модуль Apache

June 10th, 2007 1 Comment »

“А что, можно не как модуль ?” спросит пытливый читатель, и будет прав. PHP можно запускать вполне самостоятельно из командной строки, “скармливая” ему php скрипт как параметр:

php.exe test.php

Неудивительно, что результатом работы будет HTML который отобразится в консоли. Само название – PHP – “PHP Hypertext Preprocessor” – говорит о том, что цель существования PHP – обрабатывать скрипты, внедренные в HTML, динамически получая необходимый результат. Как быть при этом запущенным, никто не оговаривает. Поэтому, на заре человечества, PHP запускался, как и все порядочные веб-прибамбасы того времени, через интерфейс CGI. По сути, при такой организации, при каждом вызове веб-страницы веб-сервер запускал как отдельный процесс соответствующий препроцессор, отдавал ему на обработку файл, получал результат и передавал его клиенту. Все как бы неплохо, но в нынешний потребительский век, к веб-сайту люди обращаются не степенно и на Вы, спокойно ожидая своей очереди, а толпами по тысяче человек в день, причем 20-30 особо желающих будут ломится одновременно. Во время неких событий, например чемпионата мира по футболу, нагрузки на некоторые сервера может достигать миллионов обращений в день. С одной стороны – у сервера мозги луженные, работай себе и не жужжи, но нет. Запуск отдельного процесса – удовольствие не из дешевых, даже в современной ситуации копеечных цен на мегагерц и мегабайт. Добавим к расходу процессорного времени утечки памяти (это ситуация, когда память остается занятой даже после окончания работы процесса) оставленные нерадивыми программистами (вероятно они дома тоже не закрывают воду в ванной и не выключают свет в туалете) – и мы получим перерасход ресурсов сервера и необходимость перезагрузить его чтобы продолжить работу. Остановка сервера даже на 5 минут в день – катастрофа. Для серверов с коммерческой нагрузкой – это потерянные клиенты. Кому интересен сайт который недоступен ?

Таким образом, человечество вплотную подошло к важному открытю – PHP должен стать единым целым с Apache, благо последний предоставляет все средства для расширения через создание модулей. При таком варианте взаимодействия, серверу Apache не приходится порождать дополнительных процессов, кроме себя самого, что экономит ресурсы сервера, а взаимодействие между Apache и PHP происходит в одной области памяти, что ускоряет работу. Также, подключение PHP как модуль делает невозможным ряд атак на сервер.

Рассматривать установку как CGI приложения я здесь не буду, дабы не засорять ваш мозг. Перейдем к собственно установке. Есть два пути установки PHP – с помощью инсталлятора и ручной. С одной стороны, первый путь проще – так как примерно с 90% вероятности инсталлятор выполнит все процедуры за вас. С другой стороны, нам интересно разобраться как “оно работает” и установка вручную этому очень способствует. Поэтому:

  1. Скачайте последнюю версию PHP с сайта php.net. Сегодня (июнь 2007) это версия 5.2.3. Это должен быть zip архив. Не поддавайтесь искушению, и не скачивайте .msi файл – процесс установки с помощью инсталлятора слишком прост, а это ведет на Темную Сторону Силы.
  2. Разверните архив в папку С:\PHP на вашей машине. Это может быть и другая папка, но для простоты я буду считать что вы прислушались к совету. Кроме того, избегайте папок с пробелами при установке PHP – это создает ненужные сложности.
  3. Откройте на редактирование файл httpd.conf чтобы прописать PHP как модуль Apache (я считаю что вы установили сервер Apache2.2.x)
    LoadModule php5_module c:/php/php5apache2_2.dll
    AddType application/x-httpd-php .php
    PHPIniDir C:/php

    Если у вас установлен Apache 2.0.x – подключать следует библиотеку php5apache2.dll, которая располаается там-же. Если у вас версия Apache 1.3.x – используйте php5apache.dll
    Директива PHPIniDir определена внутри модуля PHP, и поэтому эта строка должна располагаться ниже чем LoadModule – иначе Apache не будет знать что от него хотят и не запустится. Эта директива описывает нахождение файла настроек PHP – php.ini. По умолчанию он расположен в корне PHP – я предполагаю у вас это C:/PHP. Заметьте также, что Apache привык видеть в путях файлов “линуховые” слеши – / (по-английски называемые forward slash), а не “виндовые” слеши – \ (back slash) которые используются для записи путей файлов в Windows. Поэтому везде в httpd.conf нужно указывать пути через forward slash: “С:/php” – хотя это не очевидно для пользователя Windows.

  4. PHP плагины любой версии используют core-библиотеку php5ts.dll и поэтому должны иметь к ней доступ. Сама библиотека лежит в папке C:\PHP, но сходу PHP ее там не найдет (очевидно, правда ? 🙂 ) Чтобы PHP таки нашел свою основную библиотеку нужно либо скопировать ее в папку Apache (например, C:\Program Files\Apache Group\Apache2\bin) – там PHP будет искать ее в первую очередь, либо скопировать ее папку Windows, либо прописать папку C:\PHP в переменную окружения PATH. Последний вариант предпочтительней, поскольку оставляет поле для маневра если вы смените версию PHP или Apache. Чтобы изменить переменную окружения, нажмите правой клавишей на значке Мой Компьютер, выберите пункт выпадающего меню Свойства и в открывшемся окне выберите закладку Дополнительно, а на открывшейся закладе – нажмите кнопку Переменные Среды. Там найдите строку с переменной Path и нажмите кнопку Изменить.

    В открывшемся диалоговом окне добавьте через точку запятой путь C:\PHP – вот так: “;C:\PHP”. Заметьте, что тут слеш уже “обратный”, “виндовый” – поскольку эта настройка к Apache не имеет отношения, а в терминах Windows пути должны записываться именно так.
  5. Сейчас надо перезапустить службу Apache чтобы был заново прочитан httpd.conf и новые настройки возымели силу. Для этого пройдите знакомый путь Панель Управления -> Администрирование -> Службы и в открывшемся окне найдите и выберите Apache и нажмите кнопку Перезапустить.

Чтобы проверить что все прошло гладко – создайте файл phpinfo.php в папке для документов вашего Apache (например C:\Program Files\Apache Group\Apache2\htdocs), внутри этого файла пропишите всего лишь одну строку на языке PHP:

<?php
   phpinfo();
?>

и сохраните файл. После этого, в браузере обратитесь к этому файлу – http://localhost/phpinfo.php – и вы должны увидеть всю информацию о PHP, установленном на вашей машине.

Как сдавать экзамены

June 6th, 2007 7 Comments »

Тема немного не девелоперская, так что потом удалю 🙂

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

1. Халява во всех её проявлениях

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

Самое простое – помощь преподавателю: подготовить материал надо, а времену у него нет. Сюда относится перевод и набор материалов, а также написание программ – мы с сотоварищами писали программу тестирования знаний, и хотя, я думаю, эти программулины пылятся на кафедре под столом, а) мы получили автоматы, б) набили руку в деле.

Самое важное здесь – ответственность. Как-то мне дали один чертёж нарисовать на компьютере, и я протянул несколько месяцев – ясное дело, ни о каком “зачёте” речи быть не могло.

Второе – олимпиады. Даже если вы не попадете на всеукраинские туры, то участие (участие, не победа!) на олимпиаде уровня нашего универа скорее даст вам +1 на экзамене (многие преподы это озвучивают заранее). Идти страшно, но боятся глупо. На олимпиадах обычно весело, т.к. никто ничего не знает, кроме двух умок на первой парте. Так что идите и зачтется вам. Как-то был курьёз: я получил у Чернеги на экзамене 2, но он учёл +1 балл за участие в олимпиде, +1 за хороший перевод технических текстов с английского, в итоге 4! Приятно иметь дело с программистами 🙂 Я всегда думал, что 2 – это примерно ноль, а оказывается это целых два балла.

2. Если экзамен всё же надо сдавать, и вы честный человек

Это я был таким курса до второго 🙂

Я общался с психологом, и он посоветовал интересную вещь, которая мне в своё время помогла сдать вышку – надо приготовить специальный листок, на который четко выписать все основные формулы и определения. Их должно быть не больше одной страницы. Так вот именно этот листок надо держать перед глазами, когда вы стоите под дверью аудитории экзамена, а не чужой конспект 🙂 Истинно говорю вам, так вы запомните больше ценной инфы. Особенно это хорошо работает, когда преподы задают дополнительные вопросы – чаще всего они попадают в данные с вашего листика.

От себя добавлю – лучшая стратегия подготовки к экзамену по Скакунову:

  1. Заучманим 1-3 дня до экзамена. Больше – вредно.
  2. Стараемся больше понимать и меньше запоминать. Понимание нескольких принципов заменяет знание множества фактов.
  3. Вечером перед экзаменом хорошенько гульбеним. Это дает отдых натруженной голове и поднимает боевой дух. Бухать надо не от безысходности, а для снятия морального утомления! 🙂
  4. По идее утром в вашей голове будет очень тихо и умиротворенно, а знания словно лежат на полочках – нужный эффект достигнут.

По этому принципу я поступил в универ и сдал самые трудные экзамены 🙂

Очень помогает общение со старшим курсом. Они могут рассказать про любимые вопросы преподов. Помогло мне на курсе по регулярным выражениям – просто выучил наизусть любимое определение преподавателя, и он конечно спросил, и я конечно ответил.

3. Если экзамен всё же надо сдавать, и вы бесчестный чел

Это начинает приходить после Экватора…

В основном это мутки с билетами.

Мой метод всегда был такой: “самурай, идущий на смерть, побеждает“, что означает, что надо идти в первой пятёрке; препод заходит вместе с вами, кладёт билеты и идёт вешать куртку и точить свои гильотины; вы в этом время вольны выбирать любой билет какой вам понравится.

Если препод уже сидел за столом, я брал сразу два билета, молниеносно сканировал их взгядом, рассчитывал какой билет лучше и со словами “ой!” клал на место наименее релевантный. Преподавателю остается только улыбнуться вашей наглости.

Как сделать, чтобы хоть один билет вам понравился? Всем перед экзаменом дают список вопросов. Делим примерно пополам – получаем готовые билеты (в билете два вопроса), т.е. если у вас 30 вопросов, то в первом билете скорее всего будут вопросы №1 и №16. “Скорее всего” – список может быть устаревшим, так что соответствие будет нечётким. Учитывая всё это, я ярко учил первые четыре билета (“ярко” – глубокое понимание, свои примеры, доп. литература, готовность к дополнительным вопросам) и уже на экзамене быстренько искал нужный. Даже если вы провалитесь (не попадёте с билетом), на пересдачу у вас будет отличный задел.

Если вы благородный человек, вы даже сможете помочь товарищам по несчастью. Для этого опять же есть несколько вариантов.

Можно пометить билет, это работает даже для друзей из параллельных групп, которые этот же экзамен сдают в другой день. Только метить надо грамотно. Ставить жирный отпечаток большого пальца – глупо: найти взглядом этот уголок в ворохе из 30 билетов за 5 секунд почти нереально, да и препод может убрать “испачканный” билет. У меня всегда срабатывало ставить небольшие, но заметные точки в каждом углу на обороте билета – каким бы концом он ни торчал наружу, его легко заметить; если билеты лежат слишком плотно, никто не запрещает вам на удачу их поворошить. Короче, пиво вы всегда таким образом заработаете.

Второй метод более рискованный, но прекрасно работает с преподавателями, которые или плохо видят, или постоянно смотрят в свой журнал, или уже очень устали. Берём два билета, сдаём какой понравится, а второй выносим для товарища – у него даже будет время подготовиться. Ему надо только вытянуть новый билет, демонстративно положить его себе на стопку листиков (конечно, держа их выше глаз препода) и громко вслух прочитать заранее принесённый “Билет №9. Принцип работы синхрофазотрона.” Так можно устраивать конвейер, системно. Последний лишний листик кладём на пол и говорим “У вас упало” 🙂

Надеюсь, в следующем посте Родион поведает вам, какие предметы стоило учить и какие экзамены стоило сдавать.

На последок добавлю слова В.Н.Бондарева, которые до сих пор помогают мне сдавать экзамены (не думайте, что после универа всё кончится, так что начинайте любить это дело!): “Экзамен – очень важная часть учебного процесса. Он приводит знания в систему.