Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Данный пример выведет:
PHPSESSID |
Безусловно, такие названия сессии воспринимаются намного лучше, чем страшные ID.
session_destroy
Завершает работу сессии функция session_destroy(). Она уничтожает файл, связанный с текущей сессией, что является очень удобным. Но здесь возникает проблема: часто мы не знаем, где именно необходимо уничтожить сессиию. Например, если данные сессии используется страницами всего сайта, то мы не можем уничтожить сессию на определенной странице, так как не знаем, какая именно страница будет последней просмотренной страницей посетителем на сайте. Поэтому использование данной функци возможно лишь в том случае, если мы заранее знаем, на какой именно странице действие сессии должно прекратиться.
На этом с сессиями все. До встречи.
PHP и HTTP: headers
Заголовки удваивают размер событий.
Джон Голсуорси
PHP, будучи языком вебпрограммирования, поддерживает реализацию механизма отправки заголовков HTTP.
Сначала скажем несколько слов о самих HTTP заголовках.
В соответствии со спецификацией HTTP, этот протокол поддерживает передачу служебной информации от сервера к броузеру, оформленной в виде специальных заголовков.
Таким образом, HTTP headers - это средство общения сервера с удаленным клиентом. Каждый заголовок обычно состоит из одиночной линии ASCII текста с именем и значением. Сами заголовки никак не отображаются в окне броузера, но зачастую могут сильно изменить отображение сопутствующего документа.
Механизм отправки HTTP заголовков в PHP.
Механизм отправки заголовков в PHP представлен функцией header(). Особенность протокола HTTP заключается в том, что заголовок должен быть отправлен до посылки других данных, поэтому функция должна быть вызвана в самом начале документа и должна выглядеть следующим образом:
header("HTTP заголовок", необязательный параметр replace); |
Опциональный параметр replace может принимать значения типа bool (true или false) и указывает на то, должен ли быть замещен предыдущий заголовок подобного типа, либо добавить данный заголовок к уже существующему.
В отношении функции header() часто применяется функция headers_sent(), которая в качестве результата возвращает true в случае успешной отправки заголовка и false в обратном случае.
Рассмотрим наиболее используемые HTTP заголовки.
Cache-control.
"Cache-control: " значение
Заголовок управления кешированием страниц. Вообще, данная функция является одной из самых распространенных в использовании заголовков.
Данный заголовок может быть использован со следующими значениями:
- no-cashe - Запрет кеширования. Используется в часто обновляемых страницах и страницах с динамическим содержанием. Его дейсвтие подобно META тегу "Pragma: no-cache". public - Разрешение кеширования страницы как локальным клиентом, так и прокси-сервером. private - Разрешение кеширования только локальным клиентом. max-age - Разрешение использования кешированного документа в течение заданного времени в секундах.
header("Cache-control: private, max-age = 3600") /* Кеширование локальными клиентами и использование в течение 1 часа */ |
Expires.
"Expires: " HTTP-date
Устанавливает дату и время, после которого документ считается устаревшим. Дата должна указываться в следующем формате (на английском языке):
День недели (сокр.) число (2 цифры) Месяц (сокр.) год часы:минуты:секунды GMT
Например, Fri, 09 Jan 2002 12:00:00 GMT
Текущее время в этом формате возвращает функция gmdate() в следующем виде:
echo gmdate("D, d M Y H:i:s")."GMT"; |
Возможно использование данного HTTP заголовка для запрета кеширования. Для этого необходимо указать прошедшую дату.
Last-Modified.
"Last-Modified: " HTTP-date
Указывает дату последнего изменения документа. Дата должна задаваться в том же формате, что и в случае с заголовком Expires. Данный заголовок можно не использовать для динамических страниц, так как многие серверы (например, Apache) для таких страниц сами выставляют дату модификации.
Возможно сделать страницу всегда обновленной:
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); |
Location.
"Location :" абсолютный URL
Полезный заголовок, который перенаправляет броузер на указанный адрес. Его действие сравнимо с META тегом Refresh:
<META HTTP-EQUIV="Refresh" CONTENT="0; URL=someURL">
Например, этот заголовок может быть использован так:
if ($login!= $admin_login) header("Location: http://www. /login. php"); |
Мы разобрали конечно же не все HTTP заголовки (на это нам несколько уроков не хватит), но рассмотрели наиболее полезные и самые используемые. Полный список HTTP заголовков вы можете посмотреть здесь.
PHP и HTTP: cookie.
На предыдущем уроке мы разобрали взаимосвязь протокола HTTP и языка PHP на уровне HTTP заголовков. На этом уроке мы познакомимся еще с одним специфическим HTTP заголовком - cookie.
Что такое cookies?
Дело в том, что в процессе развития www-технологий и внедрения языков программирования в Интернет, перед разработчиками программ возникла очень серьезная проблема - как сохранять результаты выполнения алгоритма для каждого конкретно взятого пользователя на долгое время? Сам по себе протокол HTTP не имеет возможности фиксирования результатов программных процессов. Использование сессий также не является решением проблемы, так как их действие прекращается сразу после разрыва соединения с сервером.
Проблема разрешилась с внедрением механизма cookies (то есть, в переводе с английского, - "печенье"). Cookies обладают замечательным свойством - они сохраняются на винчестере пользователя и могут храниться там практически неограниченное время.
По своей сути cookies - это обычные текстовые файлы, хранящиеся в специальной директории, используемой броузером (обычно эта папка называется Temporary Internet Files), и вы можете увидеть их, зайдя в эту директорию (быстрый доступ к ней для броузера IE осуществляется через пункты меню Сервис -> Свойства обозревателя -> Временные файлы Интернета -> Настройка -> Просмотр файлов).
Реализация механизма cookies в PHP.
Реализация механизма cookies представлена единственной функцией setcookie(). Как и в случае с HTTP заголовками, эта функция должна быть вызвана до отправки каких-либо данных удаленному клиенту, не допускаются даже "пустые" символы, то есть пробел, символы перевода строки и так далее.
Функция имеет следующий синтаксис:
setcookie(имя куки, значение, срок годности, информация о пути, домен, защищенность) |
Все параметры, кроме имени cookie, являются необязательными. Если cookie посылается только с этим параметром, то она сразу же уничтожается удаленным клиентом, поэтому сам по себе этот параметр не несет информационной нагрузки. Полнофункциональной cookie делают два следующих параметра: значение, заложенное в куке, и время, до которого эта cookie может быть использована.
Значением, которое несет cookie, может быть любая строка ASCII символов. Например, можно установить cookie с именем и фамилией посетителя, которые он до этого ввел в поле формы.
$data = $name."||".$surname; |
Заметьте, что отсылаемые данные должны быть оформлены в виде строки, попытка прочитать отосланный ранее массив значений ни к чему не приведет.
Cookie, установленная в вышеуказанном примере, будет уничтожена сразу после закрытия броузера пользователем, так как по умолчанию срок жизни cookie устанавливается в ноль. Чтобы изменить этот порядок, необходимо указать третий параметр expire. Определение этого параметра можно произвести двуми способами:
- Задать отностительный срок действия с помощью функции time(), к которой прибавляется время в секундах для хранения cookie. Например, чтобы определить cookie на два часа необходимо написать:
setcookie("test 1", "это тестовая куки", time() + 3600 * 2); // 3600 - количество секунд в часе |
- Второй способ - задание абсолютного срока истечения годности cookie. Он устанавливается с помощью функции mktime(), которая возвращает конкретную дату удаления куки. Если необходимо задать срок жизни cookie до полуночи 1 сентября 2003 года, то следует определить cookie так:
setcooikie("test 2", "куки с абсолютной датой удаления", mktime(0, 0, 0, 9, 1, 2003); |
Необязательный параметр пути ограничивает область действия cookie в пределах определенных директорий. Причем в эту область входят все пути, начинающиеся со значения в этом параметре. Например:
setcookie("test 3, "", 0, "/mus"); |
Мы установили куку, пропустив параметры значения и времени и определив область действия всеми путями, начинающимися со строки "/mus", то есть сюда входят и директория "/music/", и "/museums/". Чтобы однозначно определить путь, необходимо завершить путь слешем. То есть для ограничения действия куки каталогом "/mus", необходимо было написать в параметре "/mus/".
Следующим опциональным параметром является параметр определения действия cookie в пределах указанного домена. Причем значению этого параметра "" соответствует только сайт с адресом http://, а значению "" соответствуют уже и http://, и http://mail. , и http://, то есть все домены, кончающиеся данной строкой.
Последний параметр функции setcookie() указывает на то, что данная cookie должна быть послана через защищенное соединение (HTTPS). Этот параметр необходим при установке cookie с конфеденциальными данными.
setcookie("my_cookie", $value, time() + 3600 * 24 * 5, "/", ".myphp. *****", 1); |
Чтение cookie.
Обращение к установленной cookie идет через ее имя. Например, продолжая пример выше, прочесть cookie можно следующим образом:
echo "У вас сохранены следующие данные:<br>"; |
Обращение к данным, сохраненным в cookie, также может происходить через массив $HTTP_COOKIE_VARS. Он схож с другими подобными массивами, такими как $HTTP_POST_VARS и другими, и содержит все значения, прочтенные из cookie.
Удаление cookie.
Удаление cookie производится отправкой новой cookie с именем удаляемой без каких-либо дополнительных параметров.
Например:
$data = $my_cookie; |
На этом закончим сегодняшний урок. До встречи.
Работа с удаленными документами.
Служебные секретные документы
существуют не для того,
чтобы защищать секреты, а для
того, чтобы защищать служащих.
Джонатан Линн и Энтони Джей
Интересная особенность PHP заключается в том, что он может выступать не только в роли обработчика и исполнителя сценария, но и в качестве клиента сети. Если до этого урока мы манипулировали только локальными объектами, такими как файлы и директории, то на этом мы познакомимся со способами взаимодействия с удаленными объектами.
Обращение к веб-документам.
Обращение к документам, расположенным на удаленном сервере, производится уже знакомой нам функцией fopen(). Как вы понимаете, в этом случае она может быть вызвана только в режиме чтения.
Далее с полученным дескриптором файла можно делать все то же, что и с дескриптором локального файла. Например, можно вывести все содержимое на экран пользователя:
if (!($fp = fopen("http:///", "r") ) exit("Не могу соединиться"); |
Функцией fpassthru() мы просто вывели все содержимое веб-документа, то есть на своей странице мы получим точную копию желаемой страницы.
Извлечение информации из документа.
Чаще всего работа с удаленными файлами проводится для получения необходимой информации из целого документа. Примером может служить установленный на сайте прогноз погоды, получаемый, например, с Метеобюро, либо курс доллара с http://www. *****/, либо афоризм дня или лучший анекдот. Все это и многое другое можно создать с помощью сетевых возможностей PHP.
Извлечение части информации производится с помощью регулярных выражений. Использование регулярных выражений основано на расположении желаемых данных в HTML-коде документа.
Скрипт по показу анекдотов.
В качестве иллюстрации к вышесказанному предлагаю написать скрипт, который будет выводить анекдоты с сайта Анекдоты на Кроватке в соответствии с указанным пользователем рейтингом.
Сперва напишем функцию, которая выводила бы форму для задания диапазона рейтингов анекдотов для вывода.
<? function show_form() { ?> <form method="post" action=""> <table width="200" border="0" cellspacing="0" cellpadding="2"> <tr> <td>Минимальный рейтинг</td> <td> <select name="min"> <? for ($i = 0; $i < 11; $i++) { echo "<option"; if ($i == 5) echo " selected"; echo ">".$i."</option>\n"; } ?> </select> </td> </tr>
Мы вставили элемент Select, с помощью которого пользователь будет определять нижний предел для рейтинга. Теперь добавим второй Select - для верхней границы рейтинга.
<tr> <td>Максимальный рейтинг</td> <td> <select name="max"> <? for ($i = 6; $i < 17; $i++) { echo "<option"; if ($i == 16) { echo " value='no' selected>"; echo "Неограниченный</option>\n"; continue; } echo ">".$i."</option>\n"; } ?> </select></td> </tr> <tr> <td> <input type="submit" value="Показать"></td> <td> </td> </tr> </table> </form> <? } // конец функции show_form()
Теперь напишем главную функцию, которая будет читать удаленный документ, обрабатывать его и выводить в соответствии с указанными пожеланиями пользователя.
function show_anecdots($min, $max) { if ( !($fp = fopen("http://www. *****/", "r")) ) exit("Не могу соединиться"); $file = fread($fp, 1500000); $file = trim(chop($file)); $file = convert_cyr_string($file, "k", "w"); preg_match_all("!<center><hr width=80%></center>([^<]+)<br><br>!si", $file, $anecdots); preg_match_all("!Рейтинг: <b>([^<]+)</b>!si", $file, $rating);
Данная функция начинается с получения дескриптора удаленного файла. Если происходит ошибка, выходим из скрипта, выводя соответствующее предупреждение. Далее мы считываем файл, указывая немыслимо большой размер документа, чтобы гарантированно считать весь файл. Напомню, что мы не можем использовать функцию filesize(), так как она работает только с локальными объектами.
Следующей строкой мы обрезаем пустые символы по краям текста, а также удаляем повторяющиеся пробелы. Обратите внимание на следующую строку: меняем кодировку текста с koi-8 на windows-1251, так как файл читается с удаленного сервера именно в этой нежелательной для нас кодировке.
После идет ключевой момент всей функции: с помощью регулярных выражений мы сначала помещаем в массив $anecdots найденные анекдоты, а в массив $rating - их рейтинг. Рассмотрим, как это делается.
Заглянув в HTML-код страницы с анекдотами, мы увидим, каким образом они располагаются:
...
<br>
<center><hr width=80%></center> Сам анекдот.
<br><br>
Рассказал(а) <a href="mailto:*****@***ru"><b>Имя рассказавшего</b></a>
Рейтинг: <b>Число</b>
Оценить: ...
Отсюда мы можем сделать вывод, что интересующие нас данные находятся между выделенными последовательностями символов. Причем мы можем с достаточной долей уверенностью утверждать, что они однозначно определяют необходимую информацию: для тела анекдота таким уникальным указателем является тег <hr...>, а для рейтинга - слово "Рейтинг". Больше таких последовательностей символов в документе не встречается.
Исходя из полученных умозаключений, мы составили регулярные выражения, причем с использованием подшаблонов, заключенных в скобках. Напомню, что функция preg_match_all() помещает строки, соответствующие подшаблонам, в массив с индексом 1, то есть сами анекдоты (без посторонних HTML тегов) будут храниться в массиве $anecdots[1], а числа-рейтинги - в массиве $rating[1].
Ну, а теперь осталось самое легкое - вывести подходящие условию анекдоты на экран пользователя:
if ($max == 'no') $max = 999; for ($i = 0; $i < sizeof($rating[1]); $i++) { if ((int)$rating[1][$i] >= $min && (int)$rating[1][$i] <= $max) { echo $anecdots[1][$i] . "<br><br>"; echo $rating[0][$i] . "<hr>"; } } }
Если максимум указан как неограниченный, то верхний предел мы устанавливаем невероятно большим. Далее мы просматриваем весь массив с рейтингами, и если его элемент находится в заданном диапазоне, то мы выводим анекдот, соответствующий этому рейтингу, и внизу пишем сам рейтинг, причем используем массив $rating[0], то есть выводим строку, соответствующую всему шаблону поиска рейтинга. Таким образом, у нас выведется не просто цифра, а "Рейтинг: <b>цифра</b>".
И, наконец, нам осталось только грамотно вызвать написанные функции:
if ( isset($min) && isset($max) ) show_anecdots($min, $max); |
Я хотел дать возможность читателям испытать скрипт в действии, но, к сожалению, хостинг этого сайта не дает возможности обращения к файлам других серверов. Так что пробуйте сами.
До встречи на следующем уроке!
Урок 13. Принципы ООП и классы.
Масса явлений, оставшихся без сознания,
становятся объектами представлений.
Эмиль Дюркгейм
Сегодня мы с вами познакомимся с принципами объектно-ориентированного программирования и их реализацией в PHP.
Многие недолюбливают эту тему и изучают ее поверхностно. Но все же без понимания ООП будет трудно создать что-то существенное, тем более практически все современные языки программирования являются обектно-ориентированными. Тем самым, поняв эту тему однажды, не придется к ней возвращаться, если вы захотите изучить другой язык.
Принципы ООП.
Давайте вдумаемся в эти слова "объектно-ориентированный". Они подразумевают, что какая-то деятельность направлена на определенный объект. Объектами в нашей повседневной жизни выступают все окружающие нас предметы: автомобили, книги, стол, CD, домашние тапочки в конце концов.
Рассмотрим такой объект, как телевизор. Внутри этого объекта находятся множество других объектов: микросхемы, провода, электронно-лучевая трубка и так далее. Но при взаимодействии с телевизором мы об этом даже и не задумываемся. В этом заключается первый принцип ООП - инкапсуляция.
Мы также знаем, что, нажав на определенную кнопку, мы включим телевизор, а удерживая другую - увеличим или уменьшим громкость. При этом от объекта мы получаем только результат его работы, не задумываясь о его внутренних процессах. Это составляет второй принцип - абстракцию.
Наконец, третий принцип, составляющий парадигму ООП, называется наследованием. Он заключается в том, что, например, цветной телевизор произошел от черно-белого, а телевизор с плазменным экраном - от обыкновенного. При этом каждый потомок наследовал свойства и функции предшественника, дополняя их своими, качественно новыми. Наследование позволяет расширить возможности объекта, не создавая при этом новый объект с нуля.
Классы в PHP.
Класс служит шаблоном для объекта. Он создается следующим образом:
class Myclass { |
Класс может содержать внутри себя собственные определяющие этот класс переменные, называемые свойствами класса. Кроме того, класс, как правило, содержит функции, которые называются методами класса. Для разграничения методов и свойств следует запомнить, что методы ассоциируются с глаголами в нашем обыденном языке, а свойства - с прилагательными или существительными. Тем самым метод всегда подразумевает действие, а свойство - признак объекта.
К примеру, возьмем такой объект, как шариковая ручка. Его свойствами могут являться слова "пластмассовая", "синяя", "новая" и так далее. А методом будет лишь то, что она пишет (конечно, если вы не найдете другой способ ее применения).
Доступ к свойствам и методам класса достигается с помощью указания пути к нему, где первым его элементом является название класса, а вторым - название самого свойства или метода. Элементы пути разделяются знаком ->. Давайте рассмотрим, как это делается:
class Array_class { return array_sum(array_unique($this->array)); } function getSortedMerge() { /* Возвращает отсортированный массив из ключей и элементов массива */ $result = array_merge(array_keys($this->array), array_values($this->array)); sort($result); return $result; } |
Вот мы написали небольшой класс работы с массивами. Он имеет одно свойство - $array. Обратите внимание, как мы прописываем к нему путь: как уже говорилось, первым элементом пути должно быть название класса, но ввиду того, что это свойство и так находится в самом классе, то название меняется на слово this.
Далее мы определяем два метода класса, представляющие собой функции getUniqSum() и getSortedMerge(). Обратите внимание, что свойства классов всегда являются глобальным в пределах этого класса, то есть нам не требовалось в каждой функции писать global $this->array. Также заметьте, где ставится знак $: его место в самом начале описания пути. Причем он ставится даже перед указанием пути к методу класса (то есть фактически к функции).
Теперь создадим новый класс, который будет наследовать все возможности родительского класса.
class Advanced_array extends Array_class { function advanced_array($size) { /* заполняет массив подряд идущими числами, чередуя их знаки */ $z = 1; for ($i = 0; $i < $size; $i++) { $this->array[$i] = $i *$z; $z = - $z; } } function getSizeofMerge() { /* возвращает число неповторяющихся элементов массива, полученного getSortedMerge() */ $merge = $this->getSortedMerge(); return sizeof(array_unique($merge)); } } |
Обратите внимание на функцию с названием самого класса. Это так называемый конструктор класса, который автоматически вызовется при создании экземпляра класса.
Теперь рассмотрим ход работы с полученными классами.
$my = new Array_class; |
Сначала мы создаем новый экземпляр класса Array_class и определяем его свойство array, затем выводим сумму элементов без учета повторяющихся (в нашем примере выведется 9). Далее мы создаем экземпляр класса Advanced_array, который наследует все свойства и методы Array_class.
Обратите внимание, что при создании класса не требуется указывать никаких параметров, но так как у Advanced_array есть конструктор, требующий параметры, то в скобках мы указываем эти данные.
Таким образом не пришлось определять свойство класса Advanced_array, так как за нас это сделал конструктор. Затем мы применяем метод getSizeofMerge(), который сам по себе использует метод родителя getSortedMerge(), и выводим полученные данные.
Использование классов.
По правде говоря, PHP не является в полной мере объектно-ориентированным языком, поэтому очень часто можно обойтись и без использования классов, но иногда они сильно облегчают жизнь.
Но не стоит и злоупотреблять ими, так как неоправданно большое количество используемых классов не только затрудняет понимание кода программы, но нередко приводит к снижению ее производительности.
А на сегодня все. До встречи.
Урок 14. Регулярные заявки.
Этот урок немного не вписывается в логическую цепь наших занятий, а был создан "под давлением общественности", то есть по просьбам читателей, и будет посвящен регулярным выражениям и функциям работы с ними. Наверное, мои расчеты, что статьи Александра Грималовского "Регулярные выражения" будет достаточно для понимания этой темы, оказались неверны.
Итак, надеясь, что вы уже прочитали вышеуказанную статью, начинаем сегодняшний урок.
Сами регулярные выражения не являются новинкой, превнесенной PHP. В том или ином виде они используются уже достаточно большой срок и являются очень мощным механизмом работы со строковыми данными.
Регулярное выражение представляет из себя некий шаблон, который используется для различных действий в зависимости от функции, использующей это регулярное выражение. Для задания шаблона используются специальные символы.
Ниже представлена краткая таблица специальных символов и их значений.
|
Функции работы с регулярными выражениями.
Необходимо сказать, что PHP располагает как собственным механизмом работы с регулярными выражениями (POSIX), так и заимствованным у другого серверного языка программирования Perl. Внешне их легко различить по названиям функций: функции первого типа начинаются с символов "ereg", а второго - "preg".
Но названия функций не единственное их отличие. Прежде всего они содержат некоторые различия в синтаксисе регулярных выражений. Так, Perl-подобные функии требуют разделители:
$str = "регулярное выражение"; // просто строка
НЕ нашли? Не то? Что вы ищете?
❮
❯
|


