Самі основи. Як працює PHP.


  • Відмінність веб-додатки від звичайної програми
  • Як працює РНР, де він виконується?
  • Як передати змінну з PHP в JavaScript і назад?
  • Способи спілкування браузера з сервером.
  • Перегляд обміну HTTP заголовками
  • ДУЖЕ ВАЖЛИВЕ ЗАУВАЖЕННЯ
  • Коментарі

    Відмінність веб-додатки від звичайної програми
    Починаючи писати програми для вебу, багато початківці програмісти стикаються з такою помилкою. Вони розглядають систему браузер-сервер, як звичайна програма. Інтерактивне. Натиснув кнопку - система зреагувала. Провів мишкою - зреагувала. Вся інформація, яка доступна клієнту - доступна і програмі, програма весь час знаходиться в пам'яті.
    Так ось, в веб-програмуванні це не так! .
    У момент, коли користувач бачить перед собою сторінку і починає здійснювати якісь дії з нею, PHP вже завершив роботу! І користувач взаємодіє ні з PHP скриптом, а зі своєю сторінкою HTML, яку він отримав в браузер. Результатом роботи скрипта на PHP в більшості випадків є звичайний текст. Текст HTML сторінки. Яка віддається браузеру і показується їм, як звичайний HTML. Ви самі можете в цьому переконатися, написавши в скрипті
    <? echo "Привет, <b>Вася!</b>" ; ?> ; А потім переглянувши в браузері вихідний текст отриманої сторінки. Ніяких тегів PHP там немає! тільки
    Привет, <b>Вася!</b>
    Тому, що PHP виповнюється на сервері!


    Сервер і браузер спілкуються, посилаючи один одному запити по особливому протоколу - HTTP. З'єднання може ініціювати тільки браузер. Він посилає серверу запит - показати такий-то файл. Сервер клієнтові файл посилає.
    Тільки так і відбувається. Клієнт запросив - сервер віддав. І забув одразу про клієнта. Звідси стає зрозумілим відповідь на питання, чи можна точно дізнатися, скільки користувачів сечас на сайті. Не можна. тому, що "на сайті" немає жодного. Вони з'єднуються, запитують сторінку, і від'єднуються. Не мають постійного З'єднання з сервером, як, наприклад, гравці в Кваку. Дізнатися можна тільки приблизно, записуючи час кожного з'єднання і вибираючи записи за певний проміжок часу.

    Так само, звідси стає ясно, що сервер може дізнатися про клієнта дуже мало. Тільки те, що клієнт надішле в HTTP-запиті. Дозволи екрану там немає ;-)
    Все, що сервер може знати про клієнта, можна подивитися командою
    phpinfo()
    Приклад спілкування браузера з сервером:
    Користувач натискає на посилання, браузер посилає запит серверу і чекає відповіді:
    Браузер -> PHP

    PHP виконує скрипт, віддає результат в браузер і завершує роботу:
    PHP -> браузер

    Браузер відображає сторінку, "переглядаючи" її на предмет посилань, які треба запитати у сервера (теги <img src>, <script src> і так далі) і посилає відповідні запити. Їх можна побачити, переглядаючи обмін заголовками, про що мова буде трохи нижче:
    Браузер -> сервер, браузер -> сервер, браузер -> сервер ...

    Користувач заповнює форму і натискає на кнопку:
    Браузер -> PHP

    PHP обробляє форму, записує дані в базу і посилає браузеру заголовок Location:
    PHP -> браузер

    Браузер, отримавши цей заголовок, запитує зазначену сторінку
    Браузер -> PHP

    PHP виконує її ... і так далі.

    Як працює РНР, де він виконується?
    РНР виконується на сервері. Браузер посилає серверу запит на сторінку з php кодом. Сервер віддає цю сторінку на виконання інтерпретатора PHP, інтерпретатор генерує HTML код, віддає серверу, а сервер посилає клієнтові. Ніякого РНР коду в браузер не потрапляє (це важливо! Це значить, що побачити вихідний код PHP скрипта неможливо!). Єдиний спосіб відправити щось скрипту - це клікнути по посиланню або натиснути на кнопку в формі. Так, щоб РНР обробляв якісь дії користувача в браузері - неможливо. РНР залишився на сервері, чекати нових запитів з даними для обробки. PHP, але не скрипт! Скрипт, який виконувався, віддаючи користувачеві сторінку, завершив роботу. Всі дані, які були в ньому - пропали. Саме тому, якщо якась змінна потрібна при наступних викликах скрипта, її треба цього скрипту передати знову.

    Як передати змінну з PHP в JavaScript і назад?
    Почнемо з того, що ніяку змінну передати, звичайно ж, неможливо. Оскільки змінна - це частина програми. І з однієї в іншу передати її нальзя. Передати можна тільки значення змінної. Тобто текст. Тобто, відмінності між "передачею змінної в яваскрипт" і формуванням html таблиці НЕМАЄ!
    Звідси висновок - "Передати змінну" в Javascript дуже легко. Особливо, повторюся, якщо врахувати, що ніякої "передачі" не відбувається. PHP просто напросто генерує яваскрипт точно так же, як і всю іншу сторінку, разом з усіма змінними.
    Точно так же, як ви виводите в браузер рядок "Hello World, це Вася Пупкін!", Виводиться і будь яваскрипт, з усіма своїми змінними.
    Єдина умова - ви повинні уявляти собі той яваскрипт, який хочете отримати.
    Наприклад в PHP є змінна $name = "Вася" $name = "Вася" , Значення якої треба передати в яваскрипт, щоб отримати
    <script>name="Вася";</script>
    Ми просто пишемо
    <?
    $name
    = "Вася" ;
    ?>
    <script>name=" <? echo $name ; ?> "</script>
    <?
    $name
    = "Вася" ;
    ?>
    <script>name=" <? echo $name ; ?> "</script>
    Тобто, фактично, ми просто сформували нашим PHP скриптом якийсь текст, який виглядає, як потрібний нам код на Яваскрипт. Або, з іншого боку, ми писали свій яваскрипт, в потрібних місцях вставляючи висновок змінних з PHP.
    Щоб не збожеволіти від різноманітних лапок, настійно рекомендується яваскрипт виводити не весь за допомогою echo, а саме так, як написано тут - закривши тег PHP і відкриваючи їх тільки там, де потрібно вивести змінну.

    Як передати змінну з Яваскрипт в PHP?
    Точно так же, як і будь-які інші дані - надіславши запит на сервер.
    Але треба чітко розуміти, що під час виконання php скрипта отримати що-небудь з Яваскрипт, зрозуміло, неможливо. Передати можна буде тільки при наступному запиті. І обробляти його буде вже інший PHP скрипт.
    Якщо треба але події onClick рбратіться до бази даних, то слід пам'ятати, що вона знаходиться на сервері. Тобто, треба запитувати сервер, який запустить PHP скрипт, який звернеться до бази, отримає від неї відповідь і передасть його в браузер.

    Все вищевикладене не суперечить, зрозуміло, модною технології асинхронного спілкування браузера з сервером. Всі методи залишилися ті ж, просто спілкування з сервером виконує не сам браузер, а програма на Яваскрипт.
    Детальніше можна почитати на ресурсах, присвячених Яваскрипт. З точки зору PHP запити за технологією AJAX нічим не відрізняються від звичайних.

    Способи спілкування браузера з сервером.
    Способів, що надаються протоколом HTTP, небагато. Це важлива інформація. Ніяких інших способів немає. На практиці використовуються два:
    GET - це коли дані передаються в адресному рядку, наприклад, коли користувач тисне посилання.
    POST - коли він натискає кнопку в формі.
    Сформували сторінку з посиланням або з формою методом GET - запит прийде GET-му. Сформували з формою, в якій вказано метод POST - прийде POST-му.
    Визначити, який спосіб слід застосовувати, дуже просто. Якщо форма служить для запиту якоїсь інформації, наприклад - при пошуку, то її слід відправляти методом GET. Щоб можна було оновлювати сторінку, можна було поставити закладку і чи послати посилання одному.
    Якщо ж в результаті відправки форми дані записуються або змінюються на сервері, то слід їх відправляти методом POST, причому обов'язково після обробки форми треба перенаправити браузер методом GET. Так само, POST може знадобитися, якщо на сервер треба передати великий обсяг даних (у GET він сильно обмежений), а так само, якщо не слід "світити" передані дані в адресному рядку (при введенні логіна і пароля, наприклад). Але в будь-якому випадку, після обробки POST треба завжди перенаправляти браузер на якусь сторінку, нехай ту ж саму, але вже без даних форми, щоб при оновленні сторінки вони не записувалися повторно. наприклад:
    header ( "Location: http://" . $_SERVER [ 'HTTP_HOST' ]. $_SERVER [ 'REQUEST_URI' ]);
    exit;

    Найголовніше, що треба пам'ятати: сервер за своєю ініціативою звернутися до клієнта не може. Ми можемо тільки по факту запиту видати щось браузеру - або сторінку, або команду запросити інший ресурс.

    Корисна інформація може міститися в різних НТТР заголовках.
    Cookie - якщо сервер поставив куку, і вона не застаріла, то браузер відсилає її разом з кожним запитом.
    HTTP authentication - якщо сервер запитував HTTP авторизацію, то браузер при кожному зверненні шле введені логін і пароль.

    РНР може посилати HTTP заголовки двома командами - header () і setcookie ().

    Перегляд обміну HTTP заголовками
    Я дуже рекомендую попрактикуватися з HTTP заголовками, подивитися, як ними обмінюються сервер і клієнт.
    Для цього є безліч різних способів. Якщо у вас стоїть популярний download manager FlashGet, то можна використовувати його. Так само заголовки показує популярна програма Proxomitron, можна скачати якісь спеціальні утиліти.
    Так само, існує багато інших утиліт, легко знаходять в мережі за запитом HTTP sniffer.
    Обов'язково скористайтеся будь-яким способом подивитися HTTP заголовки, якими обмінюється браузер з сервером. Це дуже хороша практика, а так само перевірка - що шле твій скрипт. Зручно при налагодженні установки кук або проблеми з сесіями.
    Приблизне уявлення про тих, хто прийшов заголовках можна також отримати, скориставшись функцією getallheaders (). Але слід враховувати, що працює вона тільки якщо PHP зібраний, як модуль.

    ДУЖЕ ВАЖЛИВЕ ЗАУВАЖЕННЯ
    З того факту, що 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.