Как работает php на сервере
Язык программирования PHP: как устроен и работает PHP?
Язык программирования PHP это скриптовый язык программирования для создания веб-сайтов. Язык программирования PHP является одним из лидеров среди языков для создания web-сайтов, потому что он изначально был «заточен» под их написание. Большинство популярных CMS таких как Joomla, WordPress, Drupal написаны на этом языке.
PHP является объектно-ориентированным языком наподобие C++, Java, C#. Он имеет большое количество различных встроенных библиотек что существенно облегчает и ускоряет написание web-приложений: библиотека для работы с текстовыми файлами, работы с изображениями популярных форматов (кроп, масштабирование изображения, вставка одного изображения в другое и др.), библиотеки для работы с xml и html (Работа с DOM), работы с http (удаленный запрос к серверу, получение ответа с содержимым от сервера) CURL, библиотеки для работы с базами данных (mysql, PDO), криптографические библиотеки, библиотеки для работы с файловой системой, обработка аудио форматов.
Это далеко неполный перечень всех имеющихся на сегодняшний момент PHP библиотек. Возможности этого языка поистине колоссальны!
Как устроен и работает PHP?
Как работает PHP? За работу PHP интерпретатора отвечает web-сервер (например Apache), который обычно устанавливается вместе с PHP интерпретатором и какой нибудь СУБД в связке (например в пакетах LAMP или MAMP). При получении запроса c URL страницей сайта от браузера (клиента) web-сервер находит нужный скрипт у себя на жестком диске и отдает команду php-интерпретатору выполнить этот скрипт.
Разберем этот процесс более подробно. Например, вы хотите зайти на сайт yandex.ru:
1. Сначала вы набираете в адресной строке вашего браузера адрес сайта
2. После того как вы набрали адрес сайта и нажали Enter, клиент (в нашем случае это браузер) посылает запрос серверу (то есть компьютеру, на котором размещен сайт) через протокол http. Грубо говоря, браузер говорит серверу: я мозилла фаерфокс (например), дай мне информацию по такому то URL адресу (в нашем случае URL адрес это http://yandex.ru).
3. Сервер обрабатывает запрос клиента, и находит нужный ресурс (скрипт, картинку либо еще какой нибудь файл) у себя на жестком диске ориентируясь на полученный URL адрес. Если файл либо директория по заданному URL адресу на сервере не будут найдены, то сервер отправит клиенту (браузеру) ответ с определенным кодом 404 — «не найдено». При этом в браузере отобразится соответствующее сообщение: «Страница не найдена». Если же сервер найдет нужный скрипт по заданному URL адресу, то он поручит интерпретатору PHP выполнить этот скрипт, а результат выполнения (если он есть) сервер «отдаст» браузеру по протоколу http в виде html кода. Так же помимо самой информации web-сервер передает браузеру различные http заголовки. Но об этом уже в других статьях
Применение PHP: Методы на стороне сервера, которые помогут вам в разработке интерфейсов
Я обнаружил, что включение элементов PHP в мой процесс разработки интерфейсов делает код более продуктивным и ускоряет процесс развития проектов.
Это не отнимет много времени или сил. Вы легко сможете разобраться с азами PHP и ввести новые элементы в свой инструментарий. Давайте начнем с рассмотрения того, насколько введение в разработку интерфейса некоторых скриптов на стороне сервера может быть одновременно и простым, и полезным.
Приступая к работе с основами PHP
Эхо-функция выводит все, что следует в разметке непосредственно за ней. В нашем случае « echo » будет выводить строку со словами « Привет Мир «. В PHP окончание оператора запятой является обязательным; пропущенная запятая являются еще одним распространенным источником ошибки в скриптах.
С помощью переменных мы могли бы написать приведенный выше код следующим образом:
Цикл for используется, чтобы повторять выполнение набора кодов, пока не будет выполнено некоторое условие:
Создание простых шаблонов PHP
В определенный момент времени вы можете обнаружить, что постоянно создаете разметку, которая повторяется для каждой страницы вашего проекта. Наиболее часто повторяющиеся части веб-проекта — это заголовок ( шапка ) сайта и подвал ( футер ).
Обычно если бы у нас что-то изменилось в заголовке сайта, мы должны были бы вручную отредактировать заголовок в каждом файле нашего проекта. Вот где PHP может существенно облегчить нам жизнь.
Естественно, мы можем сделать то же самое с элементом подвала и любым другим фрагментом, который вы, возможно, захотите использовать на нескольких страницах:
В этом примере header.php и footer.php хранятся в папке « includes «, и на каждый из них ссылается основной файл. Представьте себе, сколько времени это может сэкономить разработчику.
Обслуживание различных файлов в зависимости от страницы
Недостаток в обслуживании заголовка и подвала на каждой странице, заключается в том, что это ограничивает наши возможности гибкой настройки каждой страницы.
Например, если у нас есть файл JavaScript со слайдером изображений, который мы хотим размещать только на главной или скрипт проверки формы на странице контактов. К счастью, существует еще один простой прием, который может помочь нам в этом.
Для выполнения этого приема мне сперва нужно получить имя текущего файла и отбросить его расширение:
В первой строке мы получаем с сервера имя файла, а во второй отделяем расширение файла ( вторая строка имеет скорее косметическое значение, чтобы сделать код немного чище, но я все равно рекомендую это ).
Я, как правило, размещаю эту строку кода в самом начале своих файлов еще до открытия тега ; это позволяет мне использовать эти данные для различных элементов, например, для имен генерируемых классов.
Вторая часть этого приема заключается в том, чтобы включить в подвал страницы перед закрывающимся тегом body определение того, какие скрипты какие страницы должны обслуживать.
С RESS мы можем пойти еще дальше
RESS или Responsive Design with Server Side Components ( Адаптивный дизайн с использованием компонентов на стороне сервера ) означает, что вы добавляете немного логики на стороне сервера в ваш набор инструментов адаптивного дизайна, с целью создания таких удивительных вещей, как уменьшение объема некоторых страниц.
ПРИМЕЧАНИЕ: Поскольку Mobile Detect рассматривает планшеты как мобильные устройства, я также проверяю, является ли устройство планшетом:
Шаблоны автоматической разметки
Так же у вас могут быть определенные шаблоны разметки, которые не выводят одинаковый контент, однако выглядят очень похожими друг на друга. Стандартная ситуация — отображение группы изображений, которые принадлежат к тому же объекту галереи.
К счастью, Лара Шенк недавно показала замечательное решение для подобных случаев:
Первая функция printGalleryItem() принимает путь к изображению и текст для тега alt и выводит тег изображения с контейнером
Функция foreach оказывается очень полезной, когда вам нужно перебрать массив переменных и сверить что-то со значением каждой из них.
Существует намного больше продвинутых концепций, которые касаются примеров, приведенных мною сегодня. Однако для понимания того, что эти функции делают и как они могут помочь в процессе разработки, этого должно быть достаточно.
Это только верхушка айсберга
Добавление логики на стороне сервера перед отправкой страницы в браузер может сэкономить вам время в процессе разработки, повысит надежность веб-приложений и даже улучшит сами веб-страницы.
Методы, описанные в этой статье, должны послужить для вас отличной отправной точкой, независимо от того являетесь ли вы новичком в PHP в принципе или просто новичком в использовании PHP именно в этом направлении.
Как работает PHP
Приветствую! В этом уроке мы разберём, что же из себя представляет PHP, как он работает и для чего он предназначен.
Начнём с того, что программа, написанная на языке PHP, во время своей работы представляет из себя не то стандартное окошко, которое мы привыкли видеть. В абсолютном большинстве случаев эта программа работает на сервере «невидимо». То есть мы не можем управлять ею во время выполнения, но на самом деле нам это и не нужно 🙂
Дело в том, что эта программа должна принимать запрос от пользователя, сделать какие-то действия, отдать пользователю результат и после этого завершиться. И чем быстрее она отработает, тем лучше. В этом главное отличие программ на PHP от «стандартных» программ, которые постоянно висят в памяти, ждут действий пользователя и реагируют на них в режиме реального времени.
Этот процесс можно значительно ускорить, подключив расширение-акселератор. Оно занимается тем, что кэширует получившийся байт-код, и пока файл остаётся неизменным сразу начинается его выполнение. Начиная с версии PHP 5.6 акселератор OPcache включён в дистрибутив по умолчанию.
Здесь стоит упомянуть, почему PHP так хорош для веб-разработки — он по умолчанию содержит в себе огромное число инструментов для работы с запросами, средства для работы с огромным количеством баз данных, работу с файлами. Всё это активно используется современными сайтами.
Наверное, Вы уже успели подумать о том, что для того чтобы запустить программу на PHP, Вам придётся повозиться с настройкой, ведь нужно связать его с веб-сервером. К счастью, есть готовые решения, позволяющие запустить веб-сервер с PHP за несколько минут. А современные хостинги позволяют выкладывать и запускать проекты на PHP, вообще не задумываясь, как там всё устроено. И это хорошо, ведь Вы — программист, а не системный администратор. Прошу Вас это принять, это позволит расти как программисту гораздо быстрее. Разумеется, со временем Вам придётся вникнуть в эту область, но прошу Вас не делать этого сейчас — посвятите себя программированию.
Готовое решение в качестве сервера, которое я всем советую использовать, называется OpenServer. О том, как его установить и запустить, мы поговорим в следующем уроке.
Определение и особенности языка PHP
Что такое PHP
Начнём с определения того, чем именно является PHP. Сложно в одном предложении дать полное представление об этом языке, поэтому опишем его следующими тремя характеристиками:
PHP — это препроцессор гипертекста (HTML).
PHP — это серверный язык программирования.
PHP — это скриптовый, интерпретируемый язык программирования.
Зачем нужен PHP
Поясним каждое из определений и узнаем, в каких задачах будет полезен PHP.
Основная задача PHP — это «оживление» HTML страниц.
Обычные HTML-страницы статичны. Статичность (или неизменность) означает, что после того, как страницу создали и загрузили на сайт, при каждом обращении к этой странице браузер покажет её любому пользователю в неизменном виде.
Но этого не всегда достаточно.
Почти всегда пользователи приходят на сайт за информацией, которая всё время меняется, и нужно отображать её актуальное состояние. Например:
Если использовать только HTML, то решить такие задачи не получится. Здесь-то нам и понадобится PHP. Он принимает входящий запрос от веб-сервера, выполняет сценарий и возвращает веб-серверу результат в виде готового HTML-код. Сервер отправляет этот результат в браузер пользователю, который, в свою очередь, отображает её пользователю. После этого видно свежий курс валют, погоду, и что угодно ещё.
РНР позволяет изменять веб-страницу на сервере непосредственно перед тем, как она будет отправлена браузеру. Давайте разберёмся, как это работает. PHP умеет исполнять код — так называемые сценарии. В ходе исполнения PHP может изменить или динамически создать любой HTML-код, который и является результатом исполнения сценария. Затем сервер отправляет этот код браузеру. При этом браузеру не известно, как была сформирована данная страница — статично сверстана верстальщиком, или динамически создана при участии PHP. Это не важно, т.к. браузер всегда работает только с тем, что получил от сервера.
Давайте запомним, что сценарий — это программа, которая находится на стороне сервера и запускается в ответ на запрос от браузера.
Выполнение сценария также называют его интерпретацией, а сам PHP — интерпретатором.
Вы можете попрактиковаться в создании динамических страниц с помощью PHP в этом тренажёре.
Где используется PHP
Основная сфера применения языка PHP — это веб, то есть сайты, которые мы каждый день посещаем через браузер компьютера или смартфона. Важно понимать, что веб — это не весь интернет, а только самая большая и популярная его часть. Кроме веба через интернет работает электронная почта, мессенджеры, файлообменные сервисы, сетевые игры и многое другое.
Практически каждый сайт, который есть в интернете, работает на PHP. Этот язык отлично подходит для любых динамических веб-сайтов, среди которых:
Установка и использование
На нашем курсе мы будем работать с версией PHP 7.1
Где скачать PHP?
Мы рекомендуем использовать программную сборку OpenServer. После загрузки и установки на вашем компьютере появятся свежая версия PHP, веб-сервер, база данных, и много других программ и инструментов для удобной работы. Подробнее об установке и использовании мы рассказываем на первой лекции.
Как выглядит PHP-сценарий
Типичный PHP-сценарий — это набор выражений. Каждое выражение начинается с новой строчки и заканчивается точкой с запятой.
Выражение — это инструкция, которая приказывает PHP-интерпретатору выполнить одно действие, например, сложить два числа или вывести на экран информацию. Давайте посмотрим на самый простой сценарий. Он будет выводить на экран одну строку: «Привет, Мир!»:
В нашем примере сценарий состоит из всего одной инструкции: print(«Привет, мир»);
Здесь мы просим функцию print вывести на экран наш текст — «Привет, Мир!». Это можно рассматривать как подлежащее и сказуемое в русском языке, где функция print — это сказуемое, а «Привет, Мир!» — подлежащее.
Как мы уже знаем, PHP можно встроить в статичные HTML-файлы и модифицировать их с помощью инструкций. Вот как будет выглядеть тот же пример с выводом текста, но расположенный внутри HTML:
Потренироваться вставлять код на PHP в разметку можно в этом задании.
PHP для начинающих. Сессия
Начну с сессий — это один из самых важных компонентов, с которыми вам придется работать. Не понимая принципов его работы — наворотите делов. Так что во избежание проблем я постараюсь рассказать о всех возможных нюансах.
Но для начала, чтобы понять зачем нам сессия, обратимся к истокам — к HTTP протоколу.
HTTP Protocol
Изначально подразумевали, что по этому протоколу будет только HTML передаваться, отсель и название, а сейчас чего только не отправляют и =^.^= и(•_ㅅ_•)
Чтобы не ходить вокруг да около, давайте я вам приведу пример общения по HTTP протоколу.
Вот пример запроса, каким его отправляет ваш браузер, когда вы запрашиваете страницу http://example.com :
А вот пример ответа:
Это очень упрощенные примеры, но и тут можно увидеть из чего состоят HTTP запрос и ответ:
Т.е. если украсть cookie из вашего браузера, то можно будет зайти на вашу страничку в facebook от вашего имени? Не пугайтесь, так сделать нельзя, по крайней мере с facebook, и дальше я вам покажу один из возможных способов защиты от данного вида атаки на ваших пользователей.
Давайте теперь посмотрим как изменятся наши запрос-ответ, будь там авторизация:
Метод у нас изменился на POST, и в теле запроса у нас передаются логин и пароль. Если использовать метод GET, то строка запроса будет содержать логин и пароль, что не очень правильно с идеологической точки зрения, и имеет ряд побочных явлений в виде логирования (например, в том же access.log ) и кеширования паролей в открытом виде.
Как можно заметить, заголовки отправляемые браузером (Request Headers) и сервером (Response Headers) отличаются, хотя есть и общие и для запросов и для ответов (General Headers)
Сервер узнал нашего пользователя по присланным cookie, и дальше предоставит ему доступ к личной информации. Так, ну вроде с сессиями и HTTP разобрались, теперь можно вернутся к PHP и его особенностям.
PHP и сессия
Я надеюсь, у вас уже установлен PHP на компьютере, т.к. дальше я буду приводить примеры, и их надо будет запускать
Вот вам статейка на тему PHP is meant to die, или вот она же на русском языке, но лучше отложите её в закладки «на потом».
Перво-наперво необходимо «стартовать» сессию — для этого воспользуемся функцией session_start(), создайте файл session.start.php со следующим содержимым:
Запустите встроенный в PHP web-server в папке с вашим скриптом:
Запустите браузер, и откройте в нём Developer Tools (или что там у вас), далее перейдите на страницу http://127.0.0.1:8080/session.start.php — вы должны увидеть лишь пустую страницу, но не спешите закрывать — посмотрите на заголовки которые нам прислал сервер:
Там будет много чего, интересует нас только вот эта строчка в ответе сервера (почистите куки, если нет такой строчки, и обновите страницу):
Увидев сие, браузер сохранит у себя куку с именем `PHPSESSID`:
PHPSESSID — имя сессии по умолчанию, регулируется из конфига php.ini директивой session.name, при необходимости имя можно изменить в самом конфигурационном файле или с помощью функции session_name()
И теперь — обновляем страничку, и видим, что браузер отправляет эту куку на сервер, можете попробовать пару раз обновить страницу, результат будет идентичным:
Итого, что мы имеем — теория совпала с практикой, и это просто отлично.
Обновляем страничку и видим время сервера, обновляем ещё раз — и время обновилось. Давайте теперь сделаем так, чтобы установленное время не изменялось при каждом обновлении страницы:
Обновляем — время не меняется, то что нужно. Но при этом мы помним, PHP умирает, значит данную сессию он где-то хранит, и мы найдём это место…
Всё тайное становится явным
В вашей конфигурации путь к файлам может быть не указан, тогда файлы сессии будут хранится во временных файлах вашей системы — вызовите функцию sys_get_temp_dir() и узнайте где это потаённое место.
Так, идём по данному пути и находим ваш файл сессии (у меня это файл sess_dap83arr6r3b56e0q7t5i0qf91 ), откроем его в текстовом редакторе:
Как видим — вот оно наше время, вот в каком хитром формате хранится наша сессия, но мы можем внести правки, поменять время, или можем просто вписать любую строку, почему бы и нет:
Так, что мы ещё не пробовали? Правильно — украсть «печеньки», давайте запустим другой браузер и добавим в него теже самые cookie. Я вам для этого простенький javascript написал, скопируйте его в консоль браузера и запустите, только не забудьте идентификатор сессии поменять на свой:
Вот теперь у вас оба браузера смотрят на одну и туже сессию. Я выше упоминал, что расскажу о способах защиты, рассмотрим самый простой способ — привяжем сессию к браузеру, точнее к тому, как браузер представляется серверу — будем запоминать User-Agent и проверять его каждый раз:
Ключевое слово в предыдущем абзаце похоже, в реальных проектах cookies уже давно «бегают» по HTTPS протоколу, таким образом никто их не сможет украсть без физического доступа к вашему компьютеру или смартфону
Стоит упомянуть директиву session.cookie-httponly, благодаря ей сессионная кука будет недоступна из JavaScript’a. Кроме этого — если заглянуть в мануал функции setcookie(), то можно заметить, что последний параметр так же отвечает за HttpOnly. Помните об этом — эта настройка позволяет достаточно эффективно бороться с XSS атаками в практически всех браузерах.
По шагам
А теперь поясню по шагам алгоритм, как работает сессия в PHP, на примере следующего кода (настройки по умолчанию):
А есть ли жизнь без «печенек»?
PHP может работать с сессией даже если cookie в браузере отключены, но тогда все URL на сайте будут содержать параметр с идентификатором вашей сессии, и да — это ещё настроить надо, но оно вам надо? Мне не приходилось это использовать, но если очень хочется — я просто скажу где копать:
А если надо сессию в базе данных хранить?
Отдельно замечу, что не надо писать собственные обработчики сессий для redis и memcache — когда вы устанавливаете данные расширения, то вместе с ними идут и соответствующие обработчики, так что RTFM наше всё. Ну и да, обработчик нужно указывать до вызова session_start() 😉
Когда умирает сессия?
За время жизни сессии отвечает директива session.gc_maxlifetime. По умолчанию, данная директива равна 1440 секундам (24 минуты), понимать её следует так, что если к сессии не было обращении в течении заданного времени, то сессия будет считаться «протухшей» и будет ждать своей очереди на удаление.
Интересен другой вопрос, можете задать его матёрым разработчикам — когда PHP удаляет файлы просроченных сессий? Ответ есть в официальном руководстве, но не в явном виде — так что запоминайте:
Самая тривиальная ошибка
Ошибка у которой более полумиллиона результатов в выдаче Google:
Cannot send session cookie — headers already sent by
Cannot send session cache limiter — headers already sent
Для получения таковой, создайте файл session.error.php со следующим содержимым:
Во второй строке странная «магия» — это фокус с буфером вывода, я ещё расскажу о нём в одной из следующих статей, пока считайте это лишь строкой длинной в 4096 символов, в данном случае — это всё пробелы
Для проверки полученных знаний, я хочу, чтобы вы реализовали свой собственный механизм сессий и заставили приведенный код работать:
Блокировка
Ещё одна распространённая ошибка у новичков — это попытка прочитать файл сессии пока он заблокирован другим скриптом. Собственно, это не совсем ошибка, это недопонимание принципа блокировки 🙂
Но давайте ещё раз по шагам:
«Воткнутся» в данную ошибку очень легко, создайте два файла:
Есть пару вариантов, как избежать подобного явления — «топорный» и «продуманный».
«Топорный»
Использовать самописный обработчик сессий, в котором «забыть» реализовать блокировку 🙂
Чуть лучше вариант, это взять готовый и отключить блокировку (например у memcached есть такая опция — memcached.sess_locking) O_o
Потратить часы на дебаг кода в поисках редко всплывающей ошибки…
«Продуманный»
Куда как лучше — самому следить за блокировкой сессии, и снимать её, когда она не требуется:
— Если вы уверенны, что вам не потребуется вносить изменения в сессионные данные используйте опцию read_and_close при старте сессии:
Таким образом, блокировка будет снята сразу по прочтению данных сессии.
— Если вам таки нужно вносить изменения в сессию, то после внесения оных закрывайте сессию от записи:
В заключение
В этой статье вам дано семь заданий, при этом они касаются не только работы с сессиями, но так же познакомят вас с MySQL и с функциями работы со строками. Для усвоения этого материала — отдельной статьи не нужно, хватит и мануала по приведенным ссылкам — никто за вас его читать не будет. Дерзайте!