Главная » Полезные статьи » Язык PHP » Как работает PHP
Распечатать статью

Как работает PHP

Отличие веб-приложения от обычной программы
Начиная писать программы для веба, многие начинающие программисты сталкиваются с такой ошибкой. Они рассматривают систему браузер-сервер, как обычное приложение. Интерактивное. Нажал кнопку — система среагировала. Провел мышкой — среагировала. Вся информация, которая доступна клиенту — доступна и программе, программа все время находится в памяти.
Так вот, в веб-программировании это не так!.
В момент, когда пользователь видит перед собой страницу и начинает совершать какие-то действия с ней, PHP уже завершил работу! И пользователь взаимодействует не с PHP скриптом, а со своей страницей HTML, которую он получил в браузер. Результатом работы скрипта на PHP в большинстве случаев является обычный текст. Текст HTML страницы. Которая отдается браузеру и показывается им, как обычный HTML. Вы сами можете в этом убедиться, написав в скрипте
echo «Привет, Вася!»;
А потом просмотрев в браузере исходный текст полученной страницы. Никаких тегов PHP там нет! Только
Привет, Вася!

Потому, что PHP исполняется на сервере!

Сервер и браузер общаются, посылая друг другу запросы по особому протоколу — HTTP. Соединение может инициировать только браузер. Он посылает серверу запрос — показать такой-то файл. Сервер клиенту файл посылает.
Только так и происходит. Клиент запросил — сервер отдал. И забыл сразу о клиенте. Отсюда становится понятным ответ на вопрос, можно ли точно узнать, сколько юзеров сечас на сайте. Нельзя. потому, что «на сайте» нету ни одного. Они соединяются, запрашивают страницу, и отсоединяются. Не имеют постоянного cоединения с сервером, как, например, игроки в Кваку. Узнать можно только примерно, записывая время каждого соединения и выбирая записи за определенный промежуток времени.

Так же, отсюда становится ясно, что сервер может узнать о клиенте очень мало. Только то, что клиент пришлет в HTTP-запросе. Разрешения экрана там нет 😉
Все, что сервер может знать о клиенте, можно посмотреть командой phpinfo()

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

Браузер -> PHP

PHP выполняет скрипт, отдает результат в браузер и завершает работу:

PHP -> браузер

Браузер отображает страницу, «просматривая» её на предмет ссылок, которые надо запросить у сервера (теги img src, script src и так далее) и посылает соответствующие запросы. Их можно увидеть, просматривая обмен заголовками, о чем речь будет чуть ниже:

Браузер -> сервер, Браузер -> сервер, Браузер -> сервер…

Пользователь заполняет форму и нажимает на кнопку:

Браузер -> PHP

PHP обрабатывает форму, записывает данные в базу и посылает браузеру заголовок
Location:

PHP -> браузер

Браузер, получив этот заголовок, запрашивает указанную страницу

Браузер -> PHP

PHP выполняет ее… и так далее.

Как работает РНР, где он выполняется?
РНР выполняется на сервере. Браузер посылает серверу запрос на страницу с php кодом. Сервер отдает эту страницу на исполнение интерпретатору PHP, интерпретатор генерирует HTML код, отдает серверу, а сервер посылает клиенту. Никакого РНР кода в браузер не попадает (это важно! Это значит, что увидеть исходный код PHP скрипта невозможно!). Единственный способ отправить что-то скрипту — это кликнуть по ссылке или нажать на кнопку в форме. Так, чтобы РНР обрабатывал какие-то действия пользователя в браузере — невозможно. РНР остался на сервере, ждать новых запросов с данными для обработки. PHP, но не скрипт! Скрипт, который выполнялся, отдавая пользователю страницу, завершил работу. Все данные, которые были в нем — пропали. Именно поэтому, если какая-то переменная нужна при последующих вызовах скрипта, ее надо этому скрипту передать снова.

Очень хорошая статья об основах веб-программирования находится на сайте PHP5.RU. Обязательно прочитайте её.

Как передать переменную из PHP в JavaScript и обратно?
Начнем с того, что никакую переменную передать, конечно же, невозможно. Поскольку переменная — это часть программы. И из одной в другую передать её нальзя. Передать можно только значение переменной. Т.е. текст. То есть, различия между «передачей переменной в яваскрипт» и формированием html таблицы НЕТ НИКАКОГО!
Отсюда вывод — «Передать переменную» в Javascript очень легко. Особенно, повторюсь, если учесть, что никакой «передачи» не происходит. PHP просто напросто генерирует яваскрипт точно так же, как и всю остальную страницу, вместе со всеми переменными.
Точно так же, как вы выводите в браузер строку «Hello World, это Вася Пупкин!», выводится и любой яваскрипт, со всеми своими переменными.
Единственное условие — вы должны представлять себе тот яваскрипт, который хотите получить.
К примеру в PHP есть переменная $name=»Вася», значение которой надо передать в яваскрипт, чтобы получить
< script>name=»Вася»;
Мы просто пишем
$name=»Вася»;

То есть, фактически, мы просто сформировали нашим PHP скриптом некий текст, который выглядит, как нужный нам код на яваскрипте. Или, с другой стороны, мы писали свой яваскрипт, в нужных местах вставляя вывод переменных из PHP.
Чтобы не сойти с ума от разнообразных кавычек, настоятельно рекомендуется яваскрипт выводить не весь с помощью echo, а именно так, как написано здесь — закрыв тег PHP и открывая их только там, где нужно вывести переменную.

Как передать переменную из яваскрипта в PHP?
Точно так же, как и любые другие данные — послав запрос на сервер. Как посылать запросы — написано ниже.
Но надо четко понимать, что смысла в использовании яваскрипт переменных в PHP очень немного. Потому, что в том же самом php скриптнте получить значение из яваскрипта НЕЛЬЗЯ! Только при следующем запросе! Потому, что РНР на сервере, а яваскрипт — в браузере у клиента. И пхп остался на сервере.
Поэтому единственное осмылсенное действие, которое можно сделать на пхп с переменными яваскрипта — это передать их запросом картинки для статистики, как это делает, например, счетчик спайлог.
И база данных тоже осталась на сервере. Поэтому, если надо к ней обратиться по событию onClick, то по этому событию надо запрашивать сервер, который запустит PHP скрипт, который обратится к базе, сформирует новую HTML страницу и отдаст ее браузеру.
Или заранее загружать в массив яваскрипта все данные, которые могут понадобиться.

Способы общения браузера с сервером.
Способов, предоставляемых протоколом HTTP, немного. Это важная информация. Никаких других способов нет.
Способ общения мы рассматриваем с точки зрения нашего скрипта, формирующего страницу, отправляемую клиенту. Сам браузер, теоретически, может посылать, любые заголвки и любое их содержимое.
Но скриптом мы можем заставить браузер отправлять информацю серверу следующими способами:
Во-первых, это два стандартных метода запроса:
GET — это когда данные передаются в адресной строке, например, когда пользователь жмет ссылку.
POST — когда он нажимает кнопку в форме.
Сформировали страницу со ссылкой или с формой методом GET — запрос придет GET-ом. Сформировали с формой, в которой указан метод POST — придет POST-ом.
Определить, какой способ следует применять, очень просто. Если форма служит для запроса некой информации, напримр — при поиске, то ее следует отправлять методом GET. Чтобы можно было обновлять страницу, можно было поставить закладку и или послать ссылку другу.
Если же в результате отправки формы данные записываются или изменяются на сервере, то следует их отправлять методом POST, причем обязательно после обработки формы надо перенаправить браузер методом GET
На какую-нибудь страницу, пусть ту же самую, но уже без данных формы, чтобы при обновлении страницы они на записывались повторно. Например:
header(«Location: «.$_SERVER[‘PHP_SELF’]);
exit;

Во-вторых, мы можем управлять с сервера некоторыми HTTP заголовками. Это:
Cookie — если сервер поставил куку, и она не устарела, то браузер отсылает ее вместе с каждым запросом.
HTTP authentication — если сервер запрашивал HTTP авторизацию, то браузер при каждом обращении шлет введенные логин и пароль.
Все остальное — лишь использование этих методов. Например, когда запрос посылает яваскрипт, или когда по ссылке запрашивается PHP скрипт.

РНР может посылать HTTP заголовки двумя командами — header и setcookie.

Просмотр обмена HTTP заголовками
Я очень рекомендую попрактиковаться с HTTP заголовками, посмотреть, как ими обмениваются сервер и клиент.
Для этого есть множество разных способов. Если у вас стоит популярный download manager FlashGet, то можно использовать его. Так же заголовки показывает популярная программа Proxomitron, можно скачать какие-нибудь специальные утилиты.
Для IE можно предложить плагин http://www.blunck.info/iehttpheaders.html
Для браузера Mozilla есть удобный плагинhttp://livehttpheaders.mozdev.org/
Так же, существует много других утилит, легко находимых в сети по запросу HTTP sniffer.
Обязательно воспользуйтесь любым способом посмотреть HTTP заголовки, которыми обменивается браузер с сервером. Это очень хорошая практика, а так же проверка — что шлет твой скрипт. Удобно при отладке установки кук или проблемах с сессиями.

ОЧЕНЬ ВАЖНОЕ ЗАМЕЧАНИЕ
Из того факта, что PHP исполняется на сервере, и посылает результат своей работы браузеру, следует один простой, но очень важный вывод. Что PHP в принципе НЕ МОЖЕТ отобразить в браузере ничего такого, что невозможно было бы сделать средствами html.
ПРЕЖДЕ, чем что-то писать на PHP — попробуйте это сделать чистым HTML.
«Нажатие на Энтер» не переводит строку? А в html вы не пробовали таким образом строки переводить? Не получилось? Какая досада. Прочитайте, как в html сделать перевод строки и приходите снова.

PHP в результате своей работы формирует не картинку с текстами, как вы ее видите на экране монитора! PHP формирует HTML код! И этот код ЗНАЧИТЕЛЬНО отличается от того изображения, которое вы видите на экране. Если у вас что-то не получается, то надо всегда смотреть именно ИСХОДНЫЙ код страницы, а не то, как вам ее рисует браузер. В браузере Internet Explorer исходный код можно посмотреть, выбрав в меню Вид — Просмотр HTML-кода.
Если у вас не работает яваскрипт, сформированный PHP скриптом, или html показывает не то, что вы хотите, то исправить эту проблему очень просто.
1. Сначала пишете нужный яваскрипт или html руками. Если у вас с этим проблемы — обратитесь в соотвествующий форум — по яваскрипту или html. PHP тут не при чём.
2. Сравниваете с тем, что получено из PHP
3. Вносите исправления в PHP скрипт, чтобы текст, отдаваемый им, не отличался от написанного руками.

Браузер не умеет показывать файлы, в которые напихан одновременно и html картинки. Браузер умеет показывать только известные ему типы данных. В частности, это ИЛИ html ИЛИ картинка. Но не вместе. Если картинка — то ОДНА. Несколько картинок подряд браузер показывать не умеет. Браузер умеет показывать HTML, в котором прописаны ССЫЛКИ на несколько картинок.
Пожалуйста, прежде, чем изучать PHP — изучите хотя бы основы HTML! Прежде, чем что-то требовать от PHP — попробуйте сделать это на html.

Источник:   codingrus.ru

Вы можете оставить комментарий, или обратную ссылку на Ваш сайт.

Оставить комментарий

Похожие статьи