Быстрая установка формы обратной связи.

Большинство CMS имеют встроенные модули, позволяющие реализовать формы обратной связи, однако нередко возникает ситуация, когда такой формы не предусмотрено, либо проще поставить внешнюю, чем разбираться с внутренностями малоизвестной или малопригодной для подобных изменений CMS.

Ниже даётся описание простого скрипта, который устанавливается отдельной папкой и обеспечивает функционал формы обратной связи с регулируемым числом полей во всплывающем окне
Continue reading


Установка Google-карты

Подобрать координаты (по GPS, например) и разместить вот этот код на странице

    <div id="map_canvas" style="width: 800px; height: 650px"></div>

    <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>    
    <script type="text/javascript">
    function initialize() {
        var myLatlng = new google.maps.LatLng(44.180,43.089); // Координаты центра карты
        var labelLatlng = new google.maps.LatLng(44.163,43.140); // Координаты метки
        var myOptions = {
            zoom: 13,
            center: myLatlng,
            mapTypeId: google.maps.MapTypeId.HYBRID // roadmap, satellite, hybrid, and terrain
        }
        var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);    
        var marker = new google.maps.Marker({
          position: labelLatlng,
          map: map,
          title:"Название метки"
        });
    }
    initialize();
    </script>

Индикаторы состояния web-сервера

Предлагается 2 простых индикатора, позволяющих определить наскользо загружен web-сервер, на котором располагается сайт. Все индикаторы основаны на выводе команды exec, которая вызывает системные приложения UNIX-подобной операционной системы.

Шкала загрузки сервера

Основана на выводе команды uptime. Считается, что значение этого параметра >1 должно вызывать серьёзную озабоченность.

$ uptime
09:45:01 up  1:52,  3 users,  load average: 0.26, 0.21, 0.09
<?php
/* ============= Замер загрузки сервера ================= */

$load_scale=2; // Масштаб шкалы
// Получение данных об аптайме и загрузке
$load=exec("uptime");
// Выделение текущей загрузки
$load=preg_replace("/^.*average.*?:\s([0-9]+?)\.([0-9]+?)\,\ .*$/","$1.$2",$load);
// Определение цветовой шкалы
$colors=array(
"#aaffaa","#aff7aa","#b7f0aa","#bfe7aa","#c7e0aa",
"#cfd7aa","#d7d0aa","#dfc7aa","#E7c0aa","#F0b7aa",
"#F7aaaa","#FFaa99","#FF9988","#FF8877","#FF7766",
"#ff6655","#ff5544","#ff4433","#ff3322","#ff2211",
"#ff1100","#ee1100","#dd0000","#cc0000","#bb0000",
"#aa0000","#990000");
?>

<!-- Шкала загрузки системы -->
<table border="0"style="
    border-top: 1px #8FFF8F solid;
    border-bottom: 1px #8FFF8F solid;
    border-left: 1px #8FFF8F solid;
    border-right: 1px #8FFF8F solid;
    ">
    <tr>
	<?php foreach($colors as $k=>$v){?>
	<td bgcolor="<?php if($load>=($k/$load_scale))echo $v;?>">
	    &#160;
	</td>
	<?php }?>
	<td>
	    <?php echo $load;?>
	</td>
    </tr>
</table>

Количество процессов web-сервера

Основана на выводе команды ps, выборке строк, содержащих http с помощью grep, и подсчете количества выбранных строк с помощью wc -l

$ ps -A|grep httpd
 4348 ?        00:00:00 httpd
 4356 ?        00:00:00 httpd
 4357 ?        00:00:00 httpd
 4358 ?        00:00:00 httpd
 4359 ?        00:00:00 httpd
 4360 ?        00:00:00 httpd
 4361 ?        00:00:00 httpd
 4362 ?        00:00:00 httpd
 4363 ?        00:00:00 httpd
$ ps -A|grep httpd|wc -l
9
<?php
    // Масштаб шкалы
    $httpd_scale=0.1;
    // Получение данных о колистве процессов web-сервера
    $httpd=exec("ps -A|grep httpd|wc -l");
    $httpd=trim($httpd);
?>

<!-- Шкала количества процессов -->
<table border="0"style="
    border-top: 1px #FF8F8F solid;
    border-bottom: 1px #FF8F8F solid;
    border-left: 1px #FF8F8F solid;
    border-right: 1px #FF8F8F solid;
    ">
    <tr>
	<?php foreach($colors as $k=>$v){?>
	<td bgcolor="<?php if($httpd>=($k/$httpd_scale))echo $v;?>">
	    &#160;
	</td>
	<?php }?>
	<td>
	    <?php echo $httpd;?>
	</td>
    </tr>
</table>

Catalyst. Perl web-фрэймворк. Руководство по эксплуатации. Основные принципы.

Gerda Shank, gerda.shank@gmail.com Kennedy Clark, hkclark@gmail.com

Основы Catalyst

Описание

В этой части руководства мы создадим очень простое web-приложение на основе Catalyst, демонстрирующее такие мощные инструменты как:

  • Вспомогательные скрипты, которые могут быть использованы для быстрого создания и настройки структуры приложения
  • MVC (Model/View/Controller), реализующий такую структуру, которая способствует качественному разделению функций между различными частями приложения. Существует множество документации, раскрывающей это определение в деталях, поэтому MVC не будем обсуждать его здесь подробно. В кратце:
    • Модель (Model) обычно отражает структуру данных. В большинстве приложений модель приравнивается к объектам, создаваемым и сохраняемым в вашей базе данных в виде SQL.
    • Вид (View) отображает объекты модели в удобной для пользователя форме. Обычно он создаёт html страницы для браузера на основе шаблонизаторов, но также может быть представлен в других формах, таких как PDF-документ или Excel-таблица
    • Контроллер (Controller), как видно из названия, контроллер позволяет пользователю получать и вызывать и обрабатывать необходимые представления и модели.
  • ORM — технология представления объектов-связей (Object-Relational Mapping) используется для доступа к БД. Фактически, ORM реализует стандартизированные и автоматизированные возможности по созданию и сохранению объектов в реляционной БД.

Инструкции о том, как можно получить исходный код с примерами из subversion репозитария catalyst можно найти в разделе «введение»

Создание проекта в Catalyst

В Catalyst есть несколько вспомогательных скриптов, которые позволяют быстро создать основную структуру вашего приложения. Все приложения в Catalyst создаются запуском вспомогательного скрипта catalyst.pl, для него, начиная с версии 5.7000, необходимо установить Catalyst::Runtime и Catalyst::Devel.

В этой части руководства скрипт catalyst.pl будет использован для иницилизации фрэймворка для приложения, называемого hello

  $ catalyst.pl Hello
  created "Hello"
  created "Hello/script"
  created "Hello/lib"
  created "Hello/root"
  ...
  created "Hello/script/hello_create.pl"
  $ cd Hello

Далее показана структура каталогов, которую создаст вспомогателоьный скрипт catalyst.pl.

Changes # Запись об изменениях в приложении

  lib                   # Каталог для Perl-модулей
      Hello             # Каталог для кода приложений
          Controller    # Каталог для модулей контроллеров
          Model         # Каталог для моделей
          View          # Каталог для видов
      Hello.pm          # Основной модуль приложения
  Makefile.PL           # Makefile для сборки приложения
  hello.conf            # Файл конфигурации приложения
  README                # README file
  root                  # Подобный htdocs, каталог для шаблонов css, и javascript
      favicon.ico
      static            # Каталог для статичных файлов
          images        # Каталог для изображений, используемых в окне приветствия
  script                # Каталог для Perl-скриптов
      hello_cgi.pl      # Запустить приложение как CGI (не рекомендуется)
      hello_create.pl   # Создать модели, виды, контроллеры
      hello_fastcgi.pl  # Запустить приложение как fastcgi
      hello_server.pl   # Обычный сервер разработки
      hello_test.pl     # Тестирование приложения из командной строки
  t                     # Каталог для тестов
      01app.t           # Заготовки тестов
      02pod.t           
      03podcoverage.t

Catalyst будет автоматически создавать модули в каталогах ControllerModel, и View. Скрипт hello_create.pl позволит сделать в них заготовки Perl-модулей, плюс тестовые файлы в каталоге

t. По умолчанию шаблоны располагаются в каталоге root. Скрипты в каталоге script и их имена всегда нычинаются с названия вашего приложения в нижнем регистре. Если оно называется MaiTai, то созданные скрипты будут иметь вид maitai_create.pl

И хотя радоваться ещё пока рано, но у нас уже есть функционирующее приложение. Мы можем использовать скрипт, который нам предоставляет Catalyst, для запуска сервера разработки и просмотреть с помощью браузера страницу по умолчанию. Все скрипты в каталоге script могут быть запущены из основного каталога вашего приложения Hello.

Наберите следующую команду для запуска встроенного веб-сервера

$ script/hello_server.pl
[debug] Debug messages enabled
[debug] Loaded plugins:
.----------------------------------------------------------------------------.
| Catalyst::Plugin::ConfigLoader  0.17                                       |
| Catalyst::Plugin::Static::Simple  0.20                                     |
'----------------------------------------------------------------------------'

[debug] Loaded dispatcher "Catalyst::Dispatcher"
[debug] Loaded engine "Catalyst::Engine::HTTP"
[debug] Found home "/home/me/Hello"
[debug] Loaded Config "/home/me/Hello/hello.conf"
[debug] Loaded components:
.-----------------------------------------------------------------+----------.
| Class                                                           | Type     |
+-----------------------------------------------------------------+----------+
| Hello::Controller::Root                                         | instance |
'-----------------------------------------------------------------+----------'

[debug] Loaded Private actions:
.----------------------+--------------------------------------+--------------.
| Private              | Class                                | Method       |
+----------------------+--------------------------------------+--------------+
| /default             | Hello::Controller::Root              | default      |
| /end                 | Hello::Controller::Root              | end          |
'----------------------+--------------------------------------+--------------'

[info] Hello powered by Catalyst 5.7011
You can connect to your server at http://localhost:3000

Проследуйте в браузере по адресу http://localhost:3000 (подставьте имя нужного хоста) и будете поприветствованы страницей-приглашением Catalyst. В отладочном выводе сервера разработки появится информация, подобная этой:

[info] *** Request 1 (1.000/s) [10301] [Sun May 18 10:11:36 2008] ***
[debug] "GET" request for "/" from "127.0.0.1"
[info] Request took 0.017964s (55.667/s)
.----------------------------------------------------------------+-----------.
| Action                                                         | Time      |
+----------------------------------------------------------------+-----------+
| /default                                                       | 0.000540s |
| /end                                                           | 0.001246s |
'----------------------------------------------------------------+-----------'

Нажмите Ctrl+C, чтобы остановить сервер разработки.

Hello, world

Простейший путь

Контроллер Root.pm является местом, где описываются действия, выполняемые, как правило, из корневого URL. Откройте файл lib/Hello/Controller/Root.pm в любом текстовом редакторе. Вы увидите функцию default, которая отвечает за отображение страницы-приглашения, которую ранее видели в браузере. Позже, возможно будет желание сменить её на что-то более полезное, например сообщение о 404-й ошибке. Но пока оставьте её в таком виде.

sub default :Path :Args {
    my ( $self, $c ) = @_;

    $c->response->body( $c->welcome_message );
}

$c в данном контексте — ссылка для доступа к Catalyst-приложению. Дополнительно она предоставляет доступ к объектам response и request (см. Catalyst,Catalyst::Response, и Catalyst::Request).

$c→response→body определяет содержимое HTTP ответа, а

$c→welcome_message — специальный метод(обработчик), возвращающий сообщение-приглашение, которое вы уже видели в браузере.

:Path :Args после имени метода — это аттрибуты, определяющие какие URL будут обрабатываться этим методом(обработчиком)(в зависимости от вашей версии Catalyst может быть использован «Private», но лучше этого не делать).

Некоторые MVC фрейворки управляют обработкой URL из одного места. Политика Catalyst такова, что управление обработкой URL осуществляется обработчиками внутри контроллеров. Это даёт гибкость в определении соответствия URL и обработчика. Обработчик default будет вызываться для всех URL, потому что не определён путь (ничего не указано после Path), и будет принимать любое количество аргументов (ничего не указано после Args).

По умолчанию URL повторяют имена контроллеров, и поскольку Perl управляет пространством имен через имена пакетов, то достаточно просто создавать иерархические структуры. Это значит, что вы можете создавать контроллеры с произвольной глубиной вложенности в простом и логичном виде.

Например, URL /admin/articles/create обрабатывается Hello::Controller::Admin::Articles, и обработчиком create внутри него.

Добавьте следующий обработчик в libs/Hello/Controller/Root.pm:

sub hello : Global { my ( $self, $c ) = @_; $c→response→body(«Hello, World!»); }

В данном примере вы посылаете в браузер свою собственную строку.

Сохраните файл, перезапустите сервер разработки и проследуйте на http://localhost:3000/hello, чтобы увидеть «Hello, World!».

Hello, World! с использованием вида и шаблона

В понятиях Catalyst «ВИД» — это не не XHTML — страница или или шаблон для представления в браузере. Это модуль, определяющий тип вывода — HTML, pdf, XML.

Чтобы создать TT-вид, запустите

$ script/hello_create.pl view TT TT

Будет создан модуль lib/Hello/View/TT.pm, который является дочерним классом Catalyst::View::TT. Ключевое слово view говорит скрипту, что мы создаём вид. Первое TT, что что вид будет на основе ToolkitTemplate шаблонизатора, а второе TT, что имя у модуля вида будет TT.pm(он будет использован для всех видов TT, и вы можете назвать его как хотите, например HTML.pm). Если посмотрите внутрь него, то обнаружите только настройки в виде константы, определяющей, что расширение для TT — это .tt

Теперь, когда вид «TT.pm» существует, Catalyst автоматически обнаружит его и позволить использовать его для отображения шаблонов, используя метод

«process»

Template Toolkit — прекрасно документированный (http://template-tookit.org), мощный шаблонизатор, но поскольку это не документация по TT, мы рассмотрим лишь некоторые его основные возможности.

Создайте файл шаблона root/hello.tt (Разместите в подкаталоге root каталога приложения Hello). Вот простой пример:

  [% META title = 'Hello, World!' %]
  <p>
      This is a TT view template, located in the 'root/' directory.
  </p>

[% and %] — маркеры частей TT — шаблона. Внутри них вы можете получить доступ к переменным и классам Perl, а так же использовать директивы TT. За пределами маркеров шаблон представляет из себя самый обычный HTML. Замените обработчик hello в lib/Hello/Controller/Root.pm следующим:

  sub hello : Global {
      my ( $self, $c ) = @_;

      $c->stash->{template} = 'hello.tt';
  }

В этот раз, вмето того, чтобы использовать $c→response-body(), устанавите значения ключа template хэша stash. В этот хэш помещаются данные, которые должны быть видны в других частях приложения. Ключ template определяет какой шаблон должен использоваться для отображения в конце обработчика.У контроллеров Catalist для всех обработчиков есть действие по умолчанию «end», которое выполняется при формировании страницы если нет оператора $c→response→body(). Таким образом ваш шаблон будет отображен при окончании работы вашего обработчика.

Сохраните lib/Hello/Controller/Root.pm и перезапустите сервер разработки, и снова взгляните на http://localhost:3000/hello. Вы должны увидеть результат применения шаблона.

Создание простого контроллера и действия

Создайте контроллер с именем «Site» выполнив

$ script/hello_create.pl controller Site

Будет создан файл lib/Hello/Controller/Site.pm (и тестовый файл). Добавьте туда обработчик

sub test : Local {
    my ( $self, $c ) = @_;

    $c->stash->{username} = "John";
    $c->stash->{template} = 'site/test.tt';
}

Обратите внимание на аттрибут Local у этого обработчика. Это позволяет ему отрабатывать URL вида «контроллер/обработчик», в нашем случае «site/test» вместо корневого URL, как при «Global». Имя шаблона указывать необязательно, поскольку TT по умолчанию будет пытаться использовать шаблон следующего вида «контроллер/обработчик.tt», но возможны ситуации, когда вам необходимо определить своё (например ещё неизвестно имя обработчика, или если не соблюдается трансляция имён по умолчанию). Так же в stash вставим ключ «username» для использования в шаблоне.

Создайте подкаталог site в каталоге root. Скопируйте

hello.tt как root/site/test.tt. Включите туда строку

<p>Hello, [% username %]!</p>

Перезапустите сервер разработки и проследуйте по адресу http://localhost:3000/site/test. Вы должны увидеть интерпретированный файл test.tt, включая установленное контроллером имя John.


Основные пункты usability-тестирования.

Групповые установка и снятие checkbox’ов

Если на странице есть группа однотипных по смыслу checkbox’ов, то необходимо реализовать групповую установку иснятие «галочек» дополнительным checkbox’ом выделить все

Групповые операции.

Необходимо реализовать одну «групповую» кнопку для всех строк таблицы и использование для каждой записи чекбокса, если предполагается производить однотипное действие со всеми элементами. (негативный пример — 100 строк где у каждой стоит кнопка удалить или перенести).

Подсказка к ссылкам и графическим кнопкам.

К сылкам и особенно к графическим кнопкам обязательно должны идти всплывающие подсказки, кратко (не более 5 слов) объясняющие её назначение. Для этого следует использовать стендартный аттрибут тегов title

Значение по умолчанию «не выбрано» у select’ов.

За исключением случаев, когда один из элементов выпадающего списка <select> выбран сознательно, или особо оговорённых случаев, первым элементом списка (при этом выбранным по умолчанию) должен быть —не выбрано—, означающий, что пользователь не совершал сознательного выбора в этом поле. При отправке формы должна производиться проверка этого поля на отсутствие значения —не выбрано—.

Расположение кнопок «Ok» и «Отмена».

Если форма содержит кнопки ОК/Отмена (Выполнить/Отмена), их расположение должно быть стандартным: в самом низу формы, обе кнопки на одном уровне, выравнивание по правому краю и слева «ОК», а справа «Отмена»

Отправка формы по Ctrl+Enter

Любая форма должна отправляться по Ctrl+Enter, то есть обязательна должна содержать поле типа submit. Совершенно недопустима отправка формы с помощью javascript. С помощью javascript должна проводиться только её проверка.

Нумерация строк таблицы и списков.

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

Отступы от краёв ячеек в таблицах.

Данные в таблице, особенно если четко очерчены границы ячеек, не должды прилипать вплотную к левому и правому краю ячейки. Необхоимо использовать отступы, задаваемые стилями CSS. Рекомендуется отступ по 5px слева и справа. Выравнивание текста в ячейках таблицы, за исключением особых случаем, должно быть по левому краю.

Черезцветица строк.

Для таблицы ширина которой составляет более половины окна, цвет фона соседних строк должен чередоваться (чет/нечет). В то же время не стоит выбирать слишком яркие цвета, рекомендуется сочетание #EFEFEF и #F8F8F8.

Заголовки столбцов.

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

<table>
    <tr>
        <th>
            № П/П
        </th>
        <th>
            Ф.И.О.
        </th>
    </tr>
    <tr>
        <td>
            1
        </td>
        <td>
            Иванов Иван Иваныч
        </td>
    </tr>
</table>

Повторение заголовков у длинных таблиц.

Если количество строк таблицы превышает 30, то каждые 30 строк заголовок таблицы следует повторять, или организовать постраничный просмотр таблицы.

Предупреждение перед удалением.

Перед операциями удаления необходимо выводить предупреждающее сообщение, в котором пользователь должен подтвердить своё намерение (защита от случайных удалений). Рекомендуется реализовывать это с помощью стандартной функции javascript confirm, помещённой в качестве обработчика для элемента управления

<input type="submit" name="delete" onclick="return confirm('Вы уверены');">

Проверка данных формы с помощью Javascript.

Кроме проверки данных на стороне сервера необходимо организовать (по возможности полную) проверку на стороне браузера с помощью javascript. Вот пример проверки заполнения формы регистрации

  /* ***********************************
  *   Функция проверки данных формы
  *************************************/
  function check_form_master_reg(){

      // Проверка корректности имени пользователя
      var reg1=/[\d\w\_\-]+/i;
      if(!reg1.test(document.getElementById('form_username').value)){
          alert("Неверно задано имя пользователя. "+
          "Допускаются только символы латиницы, цифры тире и подчеркивание");
          return false;
      }

      // Проверка корректности e-mail
      var reg2=/[\d\w\-\.]+\@[\d\w\-\.]+/i;
      if(!reg2.test(document.getElementById('form_email').value)){
          alert("Неверно задан email");
          return false;
      }

      // Проверка непустоты пароля
      if(!document.getElementById('form_password').value){
          alert('Не введён пароль');
          return false;
      }
      // Проверка непустоты подтверждения пароля
      if(!document.getElementById('form_repassword').value){
          alert('Не введёно подтверждение пароля');
          return false;
      }

      // Проверка на совпадение пароля и подтверждения
      if(document.getElementById('form_password').value!=
          document.getElementById('form_repassword').value){
          alert('Пароль и подтверждение не совпадают');
          return false;
      }
      return true;
  }

Сохранение данных формы при распозновании сервером ошибочных входных данных.

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

Сообщения об успехе/неудаче проделанной операции.

Любое действие инициированное пользователем(клик, отправление формы) должно сопровождаться сообщением о статусе операции (выполняется/успешно/неуспешно — причина).

Не допускать повторную отработку формы при перезагрузке страницы

Совершенно недопустима многократная успешная отправка формы простым нажатием F5 или Ctrl+R (негативный пример — добавление записи в гостевую книгу простым нажатием F5)

Этого можно избежать, если после завершения обработки данных формы делать 301-й редирект на страницу с сообщением об успехе/неудаче операции.


Базовый курс подготовки web-программиста на PHP.

 

Введение

Время чтения курса без практических занятий — 815 минут. Практические занятия включают в себя разбор котрольных заданий в объёме 540 минут (по часу на каждую главу курса).

Цели и задачи курса

Начальные навыки.

Для успешного прохождения курса слушатель должен иметь следующие навыки

  • Базовые навыки html-верстки;
  • Навыки программирования на любом ЯП.
  • Навык установки web-сервера с интерпретатором php

Основные принципы работы web-сервера

URL и его структура

Рассмотрим типичный пример адресной строки браузера.

Адресная строка браузера

Адресная строка браузера

Протокол

Протокол — набор правил обмена сообщений. http — один из протоколов для передачи данных по сети. Так же можно вспомнить: ftp, https, smb, и даже такие экзотические, как obex и svn. http — специализируется на передаче гипертекстовых документов (web-страниц).

Хост(HTTP_HOST, HOST, Имя домена)

Хост определяет к какому сайту направлен наш http — запрос. Хост выполняет двойную роль(направляется запрос к DNS-серверу):

  1. Является указателем на конкретный компьютер в сети, на котором устанавлен web-сервер
  2. Является указателем на виртуальный хост на web-сервере, из которого берутся данные.
Понятие виртуального хоста.

Виртуалхост — запись в настройках web-сервера, определяющая из какого корневого каталога для какого хоста, прописанного вURL, отдавать данные.

Корневой каталог(DOCUMENT_ROOT) — каталог, начиная с которого клиенту отдаётся содержимое документов, находящихся в нём. То есть доступ к подкаталогам DOCUMENT_ROOT возможен, к надкаталогам — нет.

Рассмотрим последовательность совершения браузером запроса к web — серверу.

Схема работы виртуальных хостов веб-сервера

Схема работы виртуальных хостов веб-сервера

  1. Получение IP-адреса web-сервера. Согласно настройкам операционной системы идёт обращение к DNS: передаётся имя домена, и получается IP адрес
  2. Получение содержимого web-страницы. Браузер подключается к web-серверу, используя полученный от DNS IP-адрес, передаёт имя домена(HOST) и запрос документа(REQUEST_URI) и получает его содержимое.

Часто встречающиеся ситуации, когда IP-адрес web-сервера получить не удаётся:

  • DNS работает неверно;
  • DNS недоступен;
  • доменное имя незарегистрировано;
  • настройки файрвола не позволяют получить IP;

В данном случае ОС просто не знает под каким IP-адресом web-сервер подключен к сети, и браузер никуда не может послать имя домена и запрос документа(REQUEST_URI). В этом случае можно прямо указать какой к какому серверу необходимо подключиться (все браузеры имеют настройку «использовать прокси-сервер»), указав IP и порт(как правило это порт 80).

Как проверить доступность DNS и web-сервера.

Для проверки доступности, и просмотра вывода, DNS — сервера используется команда nslookup.

Пуск->Выполнить->nslookup [имя домена]

Ответ DNS-сервера, если он доступен, выглядит так:

nslookup perpetum-mobile.ru
Server:         62.213.0.12
Address:        62.213.0.12#53

Non-authoritative answer:
Name:   perpetum-mobile.ru
Address: 81.177.46.165

Разберём вывод nsloockup:

  • Server: 62.213.0.12 — IP- адрес DNS, который нам ответил
  • Address: 62.213.0.12#53 — полный адрес DNS (вместе с портом) который нам ответил
  • Name: perpetum-mobile.ru — имя домена, запрос на выдачу IP которого был отправлен
  • Address: 81.177.46.165 — IP адрес web-сервера, на котором располагается сайт perpetum-mobile.ru
Проверка web-сервера

Для проверки физической доступности web-сервера можно использовать команду telnet.

Пуск->Выполнить->nslookup [IP адрес или имя домена] [порт]

Как правило, web-сервер работает на порту 80.

Разберём вывод команды telnet

telnet perpetum-mobile.ru 80
Trying 81.177.46.165...
Connected to perpetum-mobile.ru (81.177.46.165).
Escape character is '^]'.
  • Trying 81.177.46.165 — «пытаюсь соединиться» если в качестве аргумента команды telnet вы ввели имя домена, а не IP адрес, но при этом этой строчки не появилось — это причина задуматься о том, что DNS по какой-то причине недоступен. Вывод DNS обычно кэшируется ОС.
  • Connected to perpetum-mobile.ru (81.177.46.165) соединено с web-сервером, если этой строчки так и не появилось, но появилась предыдущая — очень вероятно, что запрашиваемый север недоступен.
  • Escape character is ’]’. — приглашение на ввод.

REQUEST_URI

REQUEST_URI — запрос документа у web-сервера. Если HTTP_HOST определяет из какого корневого каталога будет получен документ, то REQUEST_URI определяет:

  • путь этого документа относительно корня (SCRIPT_NAME);
  • дополнительные параметры вызова (QUERY_STRING).

REQUEST_URI может содержать только следующие символы:

  • символы латинского алфавита;
  • следующие знаки препинания:
    • -(тире),
    • .(точка), _(нижнее подчеркивание),
    • %(процент), ?(знак вопроса)
    • , =(равно), &(амперсант);
    • любые другие символы ASCII двухбайтные символы Unicode, где каждый байт кодируется через %[HEX-код];

SCRIPT_NAME. Mime-types

Mime-type — тип документа, определяемый по расширению. К типу может быть привязано какое-то действие, но по умолчанию web-сервер просто передаёт содержимое документа web-клиенту(браузеру), но может быть и какая-то обработка. Примеры mime-types:

  • text/plain — простой текст;
  • text/html — html документ;
  • image/png — изображение в формате PNG

QUERY_STRING

QUERY_STRING — дополнительные параметры документа. Имеет вид пар «ключ=значение». Пары отделяются друг от друга амперсантами &. Ключ от значения отделяется знаком «равно». Отделяется от SCRIPT_NAME знаком вопроса.

http-протокол

HTTP — протокол — описания порядка обмена служебной информацией (заголовками) данными. Наблюдать какая служебная информация в виде заголовков передаётся от браузера web-серверу и обратно можно, например, с помощью плагина к FireFox, который называется LiveHTTPHeader

http-заголовки в плагине LiveHTTPHeader для FireFox

http-заголовки в плагине LiveHTTPHeader для FireFox

Скачать его можно тут: http://livehttpheaders.mozdev.org/

Независимо от типа запроса сохраняется следующая последовательность:

  1. передача заголовков запроса
  2. передача заголовков ответа и блока данных(если они есть)

Заголовки запроса. Методы GET и POST.

Метод GET

При осуществлении запроса методом GET все параметры запроса к сайту (за исключением cookie) передаются через REQUEST_URI.

http-заголовки запроса GET

GET /project_checkout.php HTTP/1.1
Host: xepace.localhost
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US) Gecko/20070914 Firefox/2.0.0.9
Referer: http://xepace.localhost/

Основные элементы html-страницы, позволяющие делать GET-запросы

Гиперссылки

<a href="http://yandex.ru" title="Яндекс" target="_blank">
    Гиперссылка
</a>
Гиперссылка

Гиперссылка

Изображения

<img src="/images/crazytux.png" title="Бешенный пингвин1" border="2"
alt="Пингвин1"/>
<img src="/images/crazytux_.png" title="Бешенный пингвин2" border="2"
alt="Пингвин2"/>
Изображение в браузере

Изображение в браузере

Внешние таблицы стилей

<link href="css/style.css" rel="stylesheet" type="text/css" />

Внешние файлы с JavaScript

<script type="text/javascript" src="/scripts.js"></script>

Фреймы

<iframe src="/frame.php"></iframe>
Фрейм

Фрейм

Формы

<form action="" method="GET" target="_blank">
    <input type="text" name="textfield" value="textvalue"/><br/>
    <label>
        <input type="checkbox" name="checkbox" checked/>Checked
    </label><br/>
    <label>
        <input type="radio" name="radio" value="radio1" />radio-one
    </label><br/>
    <label>
        <input type="radio" name="radio" value="radio2" selected/>radio-two
    </label><br/>
    <input type="submit" name="get" value="Отправить форму"/>
</form>

Данный html-код генерит страцичку следующего вида:

Форма

Форма

При отправке этой формы открывается новое окно, в которое загружается url:

http://xepace.localhost/images/index.html?textfield=textvalue&checkbox=o......
&radio=radio2&...
get=%D0%9E%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D1%82%D1%8C+%D1%84%D0%BE%D1%80%D0%BC%D1%83
Метод POST

При осуществлении запроса методом POST кроме параметров, которые можно наблюдать в строке браузера, передаётся скрытая строка параметров

http-заголовки запроса POST

POST /images/index.html HTTP/1.1
Host: xepace.localhost
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US) Gecko/20070914 Firefox/2.0.0.9
Referer: http://xepace.localhost/
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
pass=&hid=hidden_value&textarea1=textarea_value&post=POST_FORM

Основные элементы html-страницы, позволяющие делать POST-запросы

Формы

<form action="" method="POST" target="_blank">
    <input type="password" name="pass" value=""/><br/>
    <input type="hidden" name="hid" value="hidden_value"/>
    <textarea name="textarea1">textarea_value</textarea><br/>
    <input type="submit" name="get" value="Отправить POST форму"/>
</form>

В новую страницу будет загружен url

http://xepace.localhost/images/index.html

а в заголовках отправлены значения полей в виде

Прочие заголовки запроса

Заголовки ответа.

TTP/1.x 200 OK
Date: Tue, 24 Jun 2008 17:34:13 GMT
Server: Apache/2.2.6 (Mandriva Linux/PREFORK-8mdv2008.0)
X-Powered-By: PHP/5.2.6
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 5547
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8

Коды ответа.

200
HTTP/1.x 200 OK
Content-Type: text/html; charset=utf-8
500
HTTP/1.x 500 Internal Server Error
Content-Type: text/html; charset=iso-8859-1
403
HTTP/1.x 403 Forbidden
Content-Type: text/html; charset=iso-8859-1
404
HTTP/1.x 404 Not Found
Content-Type: text/html; charset=iso-8859-1
304
GET /main.css HTTP/1.1
Host: xepace.localhost
Referer: http://xepace.localhost/project_checkout.php
If-Modified-Since: Wed, 04 Jun 2008 09:25:46 GMT
HTTP/1.x 304 Not Modified
302
HTTP/1.x 302 Found
Location: 1.php
Content-Length: 0
Content-Type: text/html

Куки

Куки — информация, отсылаемая в заголовке ответа. Сохраняется в браузере, и передается в виде заголовка запроса, если

  1. время хранения не истекло;
  2. имя хоста к которому осуществляется запрос, совпадает с шаблоном в сохранённых куках;
  3. REQUEST_URI запроса к web-серверу содержит PATH, в куках;

Заголовок ответа, сохраняющий куки в браузере, выглядит так:

Set-Cookie: cookie1=qwerty; expires=Wed, 25-Jun-2008 22:49:28 GMT; path=/libs; domain=xepace.localhost

А это заголовок запроса, если хранящеся куки удовлетворяют необходимым условиям:

Cookie: cookie1=qwerty;

Сессии

У куков есть определенные проблемы с безопасностью, связанные с тем, что все значения передаются в http-заголовках напрямую. Для данных, которые нежелательны для раскрытия (к примеру можно было запоминать логин и пароль входа) лучше применять механизм сессии.

Сессия — набор данных, хранящихся в файле во временном каталоге или в оперативной памяти, содержащих информацию, характерную для определенного посетителя. Принадлежность данных к конкретному файлу определяется на основе куков — ID сессии. Значение этих куков, как правило, совпадают с именем файла сессии. Значение ID сессии так же можно передавать не через cookie, а в качестве одного из параметров QUERY_STRING. Если web-приложение, работающее с сессией написано на php, то это можно сделать через файл .htaccess.

Настройка параметров подкаталогов через .htaccess

Для отдельного каталога в виртуальном хосте и всех его подкаталогов можно определить собственные настройки web-сервера. Это делается с помощью файла .htaccess

Управление способом передачи ID сессии

Немного забегая вперёд, отметим, что для настройки PHP, работающего в окружении web-сервера, используются ключи конфигурационного файла php.ini. Некоторые из них можно задавать через .htaccess, в том числе и эти 3 ключа, управляющие способом передачи ID сессии.

  • session.use_cookies — использовать cookie для передачи ID сессии
  • session.use_only_cookies — использовать только cookie для передачи ID сессии
  • session.use_trans_sid — использовать QUERY_STRING для передачи ID сессии

Для того, чтобы ID сессии передавался только через cookie в .htaccess достаточно прописать следующее

php_flag session.use_cookies On
php_flag session.use_only_cookies On
php_value session.use_trans_sid 0

Кодировка по умолчанию

AddDefaultCharset utf-8
AddDefaultCharset windows-1251

Индекс каталога. Документ по умолчанию

Если REQUEST_URI не содержит не содержит имени конечного файла, а только имя каталога, то имя файла в каталоге, которое берётся по умолчанию прописывается в .htaccess директивой

DirectoryIndex index.html

Если необходимо не использовать файл по умолчанию, а вывести содержимое запрашиваемого каталога — используйте:

Options +Indexes
Страница индекса каталога

Страница индекса каталога

Разрешение и запрещение доступа

Запретить доступ для всех

Deny from all

Запретить доступ для 192.168.0.1 и 192.168.0.1

Deny from 192.168.0.1 192.168.0.1

Запретить доступ для всех кроме 192.168.0.1 и 192.168.0.1

Deny from all
Allow from 192.168.0.1 192.168.0.1

http-авторизация

Окно http-авторизации

Окно http-авторизации

Авторизация и аутентификация будут производиться при помощи двух файлов: .htaccess и .htpasswd . При помощи первого файла будет выдаваться форма запроса логина и пароля. Для этого в файл .htaccess следует добавить следующие строки:

AuthUserFile /home/user/public_html/.htpasswd
AuthName "example of http-auth"
AuthType Basic
Require valid-user admin

AuthUserFile — указывает на файл, в котором хранятся имена пользователей и пароли. Требуется указать полный путь. Стоит заметить, что файл с паролями следует размещать так, чтобы он не был доступен для просмотра из интернета. О том, что из себя представляет этот файл, будет сказано ниже.

AuthName — текст, заключенный в кавычках после этой директивы, будет выведен в окне запроса логина и пароля.

AuthType — тип авторизации. В данном случае используется тип Basic. Есть еще один — Digest. Разница заключается в том, что тип Basic хранит пароли зашифрованные алгоритмом DES, а Digest для этих целей использует MD5.

Require — определяет кому давать доступ. valid-user означает что доступ будет предоставлен тем кто введет правильно логин и пароль. Эту директиву можно настроить так чтобы она впускала только пользователей определенной группы или просто пользователей перечисленных после нее через пробел.

Для создания парольного файла нужно выполнить:

htpasswd -c .htpasswd admin

Где:

  • .htpasswd — имя парольного файла (можно не менять);
  • admin — логин доступа.
  • После этого в консоли вводится пароль и подтверждение пароля.

Парольный файлик — готов. Можно просто создать файл .htpasswd и ручками впечатать туда: yourname:yourpass (где: yourname — логин, yourpass — пароль), но это крайность, т.к. если твой сайт находится на общем хостинге, есть вероятность что другие пользователи хостинга будут мониторить логин:пароль.

Переопределение стандартных страниц ошибок

Переопределить стандартые страницы ошибок можно с помощью директивы

ErrorDocument

Например, чтобы для отображения 404-й ошибки использовалась страница с REQUEST_URI /errors/404.html достаточно прописать:

ErrorDocument 404 /errors/404.html

mod_rewrite

mod_rewrite — плагин к web-серверу apache, позволяющий налету подменять одни REQUEST_URI другими, с последющим редиректом или без.

Options +FollowSymLinks
RewriteEngine on

Это отдельная большая тема и тут рассматриваться не будет.

Синтаксис PHP, работающего в окружении web-сервера. Часть 1.

Структура скрипта. Формирование заголовков ответа.

Скрипт PHP — по сути является приложением, принимающим заголовки от браузера и формирующим заголовки ответа и содержимое. Создадим в DOCUMENT_ROOT web-сервера файл 0.php следующего содержания.

<html>
<head>
</head>
<body>
<h1>Test</h1>
<h2>
<?php
    $a = 1;
    $b = 2;
    $c = $a + $b;
    echo $c;
?>
</h2>
</body>
</html>

Заголовки, которые будут сформированиы этим скриптом будут выглядеть так:

HTTP/1.x 200 OK
Date: Sun, 06 Jul 2008 07:07:39 GMT
Server: Apache/2.2.6 (Mandriva Linux/PREFORK-8mdv2008.0)
X-Powered-By: PHP/5.2.6
Content-Length: 74
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

В браузер будет передано следующее содержимое:

<html>
<head>
</head>
<body>
<h1>Test</h1>
<h2>
3
</h2>
</body>
</html>

Которое в окне браузера отобразится как заголовок первого уровня «Test» и заголовок 2-гоуровня «3».

Из приведённых примеров можно сделать следующие выводы:

  1. Содержимое файла с расширением .php не передаётся браузеру в неизменном виде, а обрабатывается интерпретатором PHP.
  2. Интерпретатор PHP по умолчанию формирует http-заголовки, показывающие, что содержимое страницы сгенерировано динамически и его следует отображать как html-страничку
  3. Всё содержимое файла с расширением .php передаётся браузеру без изменений, за исклученим блоков <?php … ?>, которые выполняются как программа, с возможностью вывода в виде html-кода

Есть возможность прописать собственные заголовки, для того, чтобы, например, содержимое генерируемой страницы отображалось не как html-страница, а как простой текст (без интерпретации тегов) (файл 1.php)

<?php header("Content-Type: text/plain");?>
<html>
<head>
</head>
<body>
<h1>Test</h1>
<h2>
<?php
    $a = 1;
    $b = 2;
    $c = $a + $b;
    echo $c;
?>
</h2>
</body>
</html>

Сгенерированная страничка выведется в виде простого текста.

<html>
<head>
</head>
<body>
<h1>Test</h1>
<h2>
3</h2>
</body>
</html>

Ещё пара выводов:

  1. В тексте .php — файла может быть произвольное число блоков <?php ?>, каждый из которы будет исполняться как программа.
  2. Поскольку заголовки всегда отправляются перед тем как содержимое, вызовы функции header должны осуществляться перед тем, как будет вывод ЛЮБОГО текста. Таже если будет пробел перед первым <?php — заголовок не будет отправлен, и вместо него будет передан заголовок по умолчанию (в данном случае «Content-type: text/html»)

Получение информации об установленном интерпретаторе PHP.

В PHP есть стандартная функция, которая выводит в виде красивого форматированного html-кода параметры установленного интерпретатора PHP. Разместим в файле 2.php следующий код.

<?php phpinfo();?>

Сгенерированный этой функцией код формирует страницу следующего вида:

Страница информации о текущей версии PHP

Страница информации о текущей версии PHP

Переменные. Фукции для работы с переменными. Присваивание.

Массивы. Фукции для работы с массивами. Присваивание. List

Служебные массивы как средство передачи параметров скрипту.

Синтаксис PHP, работающего в окружении web-сервера. Часть 2.

Условия.

Операторы сравнения. Арифметические операторы.

Циклы foreach, for, while. Операторы continue и break

Функции. Встроенные функции.

Операторы include и include_once.

Принцип разделения данных и формы.

Операции ввода-вывода в PHP.

Работа с файловой системой

Функции работы с каталогами. Чтение содержимого каталога

Функции работы с файлами. Получение информации о файлах. Права.

Чтения из файла и запись в файл.

Работа с удалёнными документами с помощью http-протокола.

Работа по http-протоколу c использованием библиотеки curl.

Работа c удалённым документом как с файлом.

Загрузка файлов на сервер.

Работа с датой и временем.

Работа со строками в PHP.

2 вида кавычек. Операция конкатенации(слияния).

Длина строки

Разбиение строки на части по разделителю. Слияние строки по разделителю.

Выделение подстрок и поиск по подстроке.

Регулярные выражения

Когда возникает необходимость в регулярных выражениях.

Классы символов.

Псевдонимы классов символов.

Повторители.

Группировка.

Модификаторы

Ограничения регулярных выражений. Многострочное сопоставление.

MySQL. Часть 1

Табличное представление данных. Типы данных в столбцах.

Понятие первичного ключа

Понятие справочной таблицы.

Понятие внешнего ключа

Понятия сервера БД. Привелегии. Подключение. Простейшие запросы.

Запрос на создание таблицы.

Запрос на вставку строки в таблицу.

Запрос на выборку из таблицы

Условие в запросе.

Запрос на изменение записи в таблице.

Запрос на удаление строки

Запрос на удаление таблицы.

Основные популярные инструменты для работы с MySQL

phpMyAdmin

Sypex Dumper

MySQL. Часть 2.

Индексы

Сортировка выборки.

Лимитированная выборка.

Группировка выборки. Групповые операции.

Сложные запросы

Запрос со связыванием основной таблицы со справочной.

Использование подзапросов

7.6 Работа с MySQL из PHP.

Подключение к БД и установление кодировки соединения.

Осуществление запросов.

Получение количества выбранных строк.

Получение количества изменённых строк.

Получение значения первичного ключа вставленной строки.

Получение результата запроса на выборку.

Примеры реализации простых web-приложений.

Авторизация

Форма обратной связи. Отправка почты.

Счетчик посетителей

Гостевая книга. C уведомлением по почте.

Вопрос-ответ

Новости

Статья и комментарии