Створити сторінку на php. Вступний урок. Що потрібно для початку роботи з PHP. А якщо треба сесію в базі даних зберігати

Create a file named hello.php and put it in your web server "s root directory (DOCUMENT_ROOT) with the following content:

Example # 1 Our first PHP script: hello.php



PHP Test


Hello World

" ; ?>

Use your browser to access the file with your web server "s URL, ending with the /hello.php file reference. When developing locally this URL will be something like http: //localhost/hello.php or http://127.0.0.1/hello.php but this depends on the web server "s configuration. If everything is configured correctly, this file will be parsed by PHP and the following output will be sent to your browser:

PHP Test

Hello World

This program is extremely simple and you really did not need to use PHP to create a page like this. All it does is display: Hello World using the PHP echo statement. Note that the file does not need to be executable or special in any way. The server finds out that this file needs to be interpreted by PHP because you used the ".php" extension, which the server is configured to pass on to PHP. Think of this as a normal HTML file which happens to have a set of special tags available to you that do a lot of interesting things.

If you tried this example and it did not output anything, it prompted for download, or you see the whole file as text, chances are that the server you are on does not have PHP enabled, or is not configured properly. Ask your administrator to enable it for you using the Installation chapter of the manual. If you are developing locally, also read the installation chapter to make sure everything is configured properly. Make sure that you access the file via http with the server providing you the output. If you just call up the file from your file system, then it will not be parsed by PHP. If the problems persist anyway, do not hesitate to use one of the many options.

The point of the example is to show the special PHP tag format. In this example we used to indicate the start of a PHP tag. Then we put the PHP statement and left PHP mode by adding the closing tag, ?> . You may jump in and out of PHP mode in an HTML file like this anywhere you want. For more details, read the manual section on the basic PHP syntax.

Note: A Note on Line Feeds

Line feeds have little meaning in HTML, however it is still a good idea to make your HTML look nice and clean by putting line feeds in. A linefeed that follows immediately after a closing ?> will be removed by PHP. This can be extremely useful when you are putting in many blocks of PHP or include files containing PHP that aren "t supposed to output anything. At the same time it can be a bit confusing. You can put a space after the closing ?> to force a space and a line feed to be output, or you can put an explicit line feed in the last echo / print from within your PHP block.

Note: A Note on Text Editors

There are many text editors and Integrated Development Environments (IDEs) that you can use to create, edit and manage PHP files. A partial list of these tools is maintained at »PHP Editors List. If you wish to recommend an editor, please visit the above page and ask the page maintainer to add the editor to the list. Having an editor with syntax highlighting can be helpful.

Note: A Note on Word Processors

Word processors such as StarOffice Writer, Microsoft Word and Abiword are not optimal for editing PHP files. If you wish to use one for this test script, you must ensure that you save the file as plain text or PHP will not be able to read and execute the script.

Note: A Note on Windows Notepad

If you are writing your PHP scripts using Windows Notepad, you will need to ensure that your files are saved with the .php extension. (Notepad adds a .txt extension to files automatically unless you take one of the following steps to prevent it.) When you save the file and are prompted to provide a name for the file, place the filename in quotes (ie "hello.php "). Alternatively, you can click on the "Text Documents" drop-down menu in the "Save" dialog box and change the setting to "All Files". You can then enter your filename without quotes.

Now that you have successfully created a working PHP script, it is time to create the most famous PHP script! Make a call to the phpinfo () function and you will see a lot of useful information about your system and setup such as available predefined variables, loaded PHP modules, and configuration settings. Take some time and review this important information.

Example # 2 Get system information from PHP

У цьому вступному уроці я познайомлю вас з потрібними програмами і розповім, що потрібні для роботи з PHP.

Що потрібно знати

    Також потрібно знати як записується PHP. У файлі, PHP скрипт починається зі слова - і закінчується на ?> . Все, що між і ?> це PHP код, запам'ятайте це.

    Файли, в якому записаний PHP код потрібно зберігати під розширенням .php

    Для того щоб навчиться PHP (як і будь-якого іншого мови програмування) важливо багато практикуватися.
    Коли ви будете читати уроки, то не копіюйте код, а саме пишіть самі, так буде краще для Вас, так Ви швидше запам'ятаєте сама мова, і вам буде легше далі.

Програмне забезпечення

    Перша програма, яка вам потрібна, це браузер (те, в чому Ви зараз перебуваєте: D)

    Веб-сервер. Для локального тестування вам потрібно встановити веб-сервер. Я рекомендую поставити Open Server (Mini версії буде достатньо). Як встановити Open Server. Open Server є портативним, тобто вам потрібно тільки розпакувати скачаний архів і запустити сервер через Open Server.exe. Після старту програми ви побачите червоний прапорець в треї Windows (область біля системного годинника). Щоб включити безпосередньо сам веб-сервер натисніть на прапорець, далі виберіть пункт меню Запустити.

Багато читачів в будь-якій книзі про комп'ютери прокрутити все, що не представляє безпосереднього інтересу, і переходять до того, що вони дійсно хочуть знати. Особисто я роблю саме так. Втім, в цьому немає нічого страшного - рідко зустрічаються технічні книги, які необхідно читати від корки до корки. А може, ви саме так і вчинили - пропустили вісім початкових глав і взялися за цю главу, тому що у неї було найцікавіше назва? Та й кому захочеться витрачати час на подробиці, коли на роботі «горить» черговий проект?

На щастя, подібна квапливість не завадить вам нормально засвоїти матеріал другій частині книги, присвяченій використанню PHP для побудови сайтів і взаємодії з Web. У цьому розділі ви навчитеся легко модифікувати вміст web-сторінок і здійснювати навігацію в Web за допомогою посилань і різних стандартних функцій. Наступна глава доповнить викладений матеріал - в ній докладно розглядаються засоби взаємодії з користувачем в формах HTML У розділі 11 описана організація інтерфейсу з базами даних. В інших розділах другій частині розглядаються нетривіальні аспекти web-програмування на PHP.

Однак слід пам'ятати про те, що матеріал частини 1 абсолютно необхідний для нормального володіння PHP. Передбачається, що ви все ж прочитали першу частину, тому в прикладах будуть використовуватися багато з описаних раніше концепцій. Отже, якщо ви перегорнули частина книги, вам доведеться час від часу повертатися до попередніх главам і надолужувати згаяне.

прості посилання

<а href = "date.php">

$ Link \u003d "date.php";

print "<а href = \"$link\">View today "s date
\\ N "

Ймовірно, у вас виникло питання - чому в коді посилання перед лапками ( ") ставиться зворотна коса риска (\\)? Справа в тому, що лапки в PHP є спеціальними символами і використовуються в якості обмежувачів рядків. Отже, лапки-літерали в рядках повинні екрануватися.

Якщо необхідність екранувати лапки вас дратує, просто включите режим magic_quotes_gpc в файлі php.ini. В результаті все апострофи, лапки, зворотні косі риси і нуль-символи. в тексті автоматично екрануються!

Розвинемо наведений приклад. Для швидкого виведення списку посилань в браузері можна скористатися масивом:

// Створити масив розділів

$ Contents - array ( "tutorials", "articles", "scripts", "contact");

// Перебрати і послідовно вивести кожен елемент масиву

for ($ i \u003d 0; $ i< sizeof($contents; $i++)

print " ". $ Contents [$ i]."
\\ N ";

// - спеціальне позначення точки-маркера endfor;

Файлові компоненти (шаблони)

Ми підійшли до однієї з моїх улюблених можливостей PHP. Шаблоном (стосовно web-програмування) називається частина web-документа, яку ви збираєтеся використовувати в декількох сторінках. Шаблони, як і функції PHP, позбавляють вас від зайвого копіювання / вставки фрагментів змісту сторінки і програмного коду. Зі збільшенням масштабів сайту значення шаблонів зростає, оскільки вони дозволяють легко і швидко проводити модифікації на рівні цілого сайту. У цьому розділі будуть описані деякі можливості, які відкриваються при використанні найпростіших шаблонів.

Як правило, загальні фрагменти змісту / коду (тобто шаблони) зберігаються в окремих файлах. При побудові web-документа ви просто «включаєте» ці файли у відповідні місця сторінки. У PHP для цього існують дві функції: include () і require ().

include () і require ()

Одним з найвидатніших аспектів PHP є можливість побудови шаблонів і програмних бібліотек і їх подальшої вставки в нові сценарії. Застосування бібліотек економить час і зусилля по використанню загальних функціональних можливостей на різних web-сайтах. Читачі, що володіють

досвідом програмування на інших мовах (наприклад, С, C ++ або Java), добре знайомі з концепцією бібліотек функцій і їх використанням в програмах для розширення функціональних можливостей.

Включення одного або декількох файлів в сценарій здійснюється стандартними функціями PHP require () і include (). Як буде показано в наступному розділі, кожна з цих функцій застосовується в певній ситуації.

функції

У PHP існують чотири функції для включення файлів в сценарії PHP:

  • include ();
  • include_once ();
  • require ();
  • require_once ().

Незважаючи на схожість імен, ці функції вирішують різні завдання.

Функція include () включає вміст файлу в сценарій. Синтаксис функції include ():

include (file файл]

У функції include () є одна цікава особливість - її можна виконувати умовно. Наприклад, якщо виклик функції включений в блок команди if. то файл включається в програму лише в тому випадку, якщо умова i f істинно. Якщо функція includeO використовується в умовній команді, то вона повинна бути укладена в фігурні дужки або в альтернативні обмежувачі. Порівняйте відмінності в синтаксисі лістингів 9.1 і 9.2.

Лістинг 9.1. Неправильне використання include ()

if (some_conditional)

include ( "text91a.txt"); else

include ( "text91b.txt");

Лістинг 9.2. Правильне використання include ()

if (some_conditional):

include ( "text91a.txt");

include ( "text91b.txt");

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

Замість цього необхідно укласти команду до відповідних теги, як показує наступний приклад:

print "this is an invalid include file";

Функція include_once () робить те ж, що і include (), за одним винятком: перш ніж включати файл в програму, вона перевіряє, чи не був він включений раніше. Якщо файл вже був включений, виклик include_once () ігнорується, а якщо немає - відбувається стандартне включення файлу. У всьому іншому include_once () нічим не відрізняється від include (). Синтаксис функції include_once ():

include_once (file файл)

В цілому функція require () схожа на include () - вона теж включає шаблон в той файл, в якому знаходиться виклик require (). Синтаксис функції require ():

require (file файл)

Проте, між функціями require () і include () існує одна важлива відмінність. Файл, який визначається параметром require (), включається в сценарій незалежно від місцезнаходження require () в сценарії. Наприклад, при виклику requi ге () в блоці if за помилкової умови файл все одно буде включений в сценарій!

У багатьох ситуаціях буває зручно створити файл зі змінними та іншою інформацією, яка використовується в масштабах сайту, і потім підключати його в міру необхідності. Хоча ім'я цього файлу вибирається довільно, я зазвичай називаю його init.tpl (скорочення від «initializaion.template»). У лістингу 9.3 показано, як виглядає дуже простий файл init.tpl. У лістингу 9.4 вміст init.tpl включається в сценарій командою require ().

Лістинг 9.3. Приклад ініціалізації файлу

$ Site_title \u003d "(! LANG: PHP Recipes";!}

$ Contact_email \u003d " [Email protected]";

$ Contact_name \u003d "WJ Gilmore";

Лістинг 9.4. Використання файлу init.tpl

<? print $site_title; ?>

\\ "Mai1 to: $ contact_email \\"\u003e $ contact_name."; ?>

Передача URL при виклику require () допускається лише при включеному режимі «URL fopen wrappers» (цей режим включений за замовчуванням).

Зі збільшенням розмірів сайту може виявитися, що деякі файли включаються в сценарій по кілька разів. Іноді це не викликає проблем, але в деяких випадках повторне включення файлу призводить до скидання значень змінених змінних. Якщо у включається файлі визначаються функції, можуть виникнути конфлікти імен. З огляду на сказане, ми приходимо до наступної функції - require_once ().

Функція require_once () гарантує, що файл буде включатися в сценарій всього один раз. Після виклику requi rе_оnсе () всі подальші спроби включення того ж файлу ігноруються. Синтаксис функції requiге_оnсе ():

Ймовірно, ви станете частіше використовувати функції включення файлів у міру того, як ваші web-додатки почнуть збільшуватися в розмірах. Ці функції часто зустрічаються в прикладах даної книги, щоб скоротити надмірність програмного коду. Перші приклади розглядаються в наступному розділі, присвяченому принципам побудови базових шаблонів.

побудова компонентів

При визначенні структури типової web-сторінки я зазвичай розбиваю її на три частини: заголовок, основну частину і колонтитул. Як правило, в більшості правильно організованих web-сайтів присутній заголовок, який практично не змінюється; в основній частині виводиться запитувана зміст сайту, тому вона часто змінюється; нарешті, колонтитул містить інформацію про авторські права та навігаційні посилання. Колонтитул, як і заголовок, зазвичай залишається незмінним. Не зрозумійте мене неправильно - я зовсім не намагаюся придушувати ваші творчі устремління. Мені зустрічалося чимало чудових сайтів, які не слідували цим принципам. Я лише намагаюся виробити загальну структуру, яка може послужити відправною точкою для подальшої роботи.

Заголовок

Заголовки (на кшталт наведеного в лістингу 9.5) присутній практично в кожному з моїх web-сайтів з підтримкою PHP. У цьому файлі міститься

інформація, що діє на рівні всього сайту, - наприклад, заголовок, контактні дані та деякі компоненти коду HTML-сторінки.

Лістинг 9.5. Приклад файлу заголовка

// Файл: header.tpl

// Призначення: заголовки для сайту PhpRecipes.

$ Site_name \u003d "PHPRecipes";

$ Site_email \u003d " [Email protected]";

$ Site_path \u003d "http: // localhost / phprecipes";

<? print $site_name; ?>

// Вивести поточну дату і час

print date ( "F d, h: i a");

Досить часто доступ до включених файлів з боку відвідувачів обмежується, особливо якщо ці файли містять конфіденційну інформацію (наприклад, паролі). В Apache можна заборонити перегляд деяких файлів редагуванням файлів http.conf або htaccess. Наступний приклад показує, як заборонити перегляд всіх файлів з расшіреніем.tpl:

Order allow, deny

Allow from 127.0.0.1

PHP і проблеми безпеки сайтів докладно описані в главі 16.

колонтитул

Колонтитулом (footer) зазвичай називається інформація, розташована в нижній частині сторінок сайту, - контактні дані, посилання та інформація про авторські права. Цю інформацію можна розмістити в окремому файлі і включати як шаблон так само, як це робиться з заголовком. Припустимо, c настанням нового року вам потрібно змінити інформацію про авторські права і привести її до виду «Copyright © 2000-2001». Є два шляхи: витратити переддень Різдва на гарячковий редагування сотень статичних сторінок або скористатися шаблоном на зразок наведеного в лістингу 9.6. Одне просте зміна - і ви можете повертатися до святкових клопотів.

Лістинг 9.6. Приклад файлу колонтитула (footer.tpl)

contact |

Зверніть увагу на використання глобальної змінної $ site_email в файлі заголовка. Значення цієї змінної діє в масштабах всієї сторінки, а ми припускаємо, що файли header.tpl і footer.tpl будуть включені в одну підсумкову сторінку. Також зверніть увагу на присутність шляху $ site_path на засланні Privacy (Конфіденційність). Я завжди включаю в шаблони повні шляхи до всіх посилань - якби URL посилання складався з одного імені privacy.php, то файл колонтитула був би жорстко прив'язаний до конкретного каталогу.

Основна частина

В основній частині сторінки підключається вміст заголовка і заголовка. По суті, саме основна частина містить інформацію, цікаву для відвідувачів сайту. Тема ефектно виглядає, колонтитул містить корисні відомості, але саме заради основної частини сторінки користувачі знову і знову повертаються на сайт. Хоча я не зможу надати будь-яких рекомендацій з приводу конкретної структури сторінок, шаблони, подібні до наведеного в лістингу 9.7, грунтовно спрощують адміністрування сторінок.

Лістинг 9.7. Приклад основної частини сторінки (index_body.tpl)

/tutorials.php"\u003etutorials

Welcome to PHPRecipes. the starting place for PHP scripts, tutorials,

and information about gourmet cooking!

Всі разом: заголовок, колонтитул і основна частина

Ймовірно, мій настрій найкраще виражається фразою полковника «Ганнібала» Сміта (Джордж Пеппард) зі знаменитого серіалу «Команда А»: «Люблю, коли все стає на свої місця». Я відчуваю щось подібне, коли розрізнені шаблони об'єднуються і утворюють повний web-документ. Комбінуючи три секції документа: header.tpl, index_body.tpl і footer.tpl, - можна швидко побудувати найпростішу сторінку на зразок тієї, що наведена в лістингу 9.8.

Лістинг 9.8. Побудова сторінки index.php включенням декількох файлів

// Файл: index.php

// Призначення: домашняястраніца PHPRecipes

// Вивести заголовок

include ( "header.tpl");

// Вивести основну частину

include ( "index_body.tpl");

// Вивести колонтитул

include ( "footer.tpl");

Ну як? Три прості команди - і перед вами готова сторінка. Текст підсумкової сторінки приведений в лістингу 9.9.

Лістинг 9.9. Сторінка HTML, побудована в лістингу 9.8 (index.php)

PHPRecipes

August 23, 3:17 pm

tutorials

articles

scripts

contact

Welcome to PHPRecipes, the starting place for PHP scripts, tutorials,

and gourmet cooking tips and recipes!

Copyright 2000 PHPRecipes. All rights reserved.

contact |

your privacy

На рис. 9.1 показано, як отримана сторінка виглядає в браузері. Хоча я звичайно не користуюся рамками таблиць, на цей раз я їх вивів, щоб на малюнку більш наочно виділялися три частини сторінки.

Рис. 9.1. Зовнішній вигляд сторінки, побудованої в лістингу 9.8

оптимізація шаблонів

У другому (на мій погляд, більш кращому) варіанті шаблони оформляються у вигляді функцій, які перебувають в окремому файлі. Тим самим забезпечується додаткове структурування ваших шаблонів. Я називаю цей файл ініціалізації файл і зберігаю в ньому іншу корисну інформацію. Оскільки ми вже розглянули відносно довгі приклади заголовка і заголовка, вміст лістингів 9.10 і 9.11 було злегка скорочено для наочної демонстрації нової ідеї.

Лістинг 9.10. Оптимізований шаблон сайту (site_init.tpl)

// Файл: site_init.tpl

// Призначення: ініціалізації файл PhpRecipes

$ Site_name \u003d "PHPRecipes";

$ Site_email \u003d " [Email protected]";

$ Site_path \u003d "http: // localhost / phprecipes /";

function show_header ($ site_name) (

<? print $site_name: ?>

This is the header

function show footer ()

This Is the footer

Лістинг 9.11. Застосування ініціалізації файлу

// Включити ініціалізації файл

include ( "site_init.tpl");

// Вивести заголовок

show header ($ site_name);

// Вміст основної частини This is some body information

// Вивести колонтитул Show_footer ();

Проект: генератор сторінок

Хоча в більшості створених мною web-сайтів основний вміст сторінок формувалося на підставі інформації, прочитаної з бази даних, завжди знайдеться кілька сторінок, які практично не змінюються. Зокрема, на них можуть виводитися відомості про команду розробників, контактні дані, реклама і т. Д. Я зазвичай зберігаю цю «статичну» інформацію в окремій папці і використовую сценарій PHP для її завантаження при надходженні запиту. Звичайно, у вас виникає питання - якщо це статична інформація, для чого потрібен сценарій PHP? Чому б не завантажувати звичайні сторінки HTML? Перевага PHP полягає в тому, що ви можете використовувати шаблони і вставляти статичні фрагменти в міру необхідності.

<а href = "/static.php?content\u003d$content"\u003eStatic Page Name

Почнемо зі створення статичних сторінок. Для простоти я обмежуся трьома сторінками, що містять інформацію про сайт (лістинг 9.12), рекламу (лістинг 9.13) і контактні дані (лістинг 9.14).

Лістинг 9.12. Інформація про сайт (about.html)

About PHPRecipes

What programmer doesn "t mix all night programming with gourmet cookies. Here at PHPRecipes. Hardly a night goes by without one of our coders mixing a little bit of HTML with a tasty plate of Portobello Mushrooms or even Fondue. So we decided to bring you the best of what we love most: PHP and food!

That "s right, readers. Tutorials, scripts, souffles and more. 0nly at PHPRecipes.

Advertising Information

Regardless of whether they come to learn the latest PHP techniques or for brushing up on how

to bake chicken, you can bet our readers are decision makers. They are the Industry

professionals who make decisions about what their company purchases.

For advertising information, contact

">[Email protected].

Лістинг 9.14. Контактні дані (contact.html)

Contact Us

Have a coding tip?

Know the perfect topping for candied yams?

Let us know! Contact the team at [Email protected].

Переходимо до побудови сторінки static.php, яка виводить запитувану статичну інформацію. У цей файл (див. Лістинг 9.15) включаються компоненти сторінок нашого сайту і ініціалізації файл site_init.tpl.

Лістинг 9.15. Загальний висновок статичних сторінок (static.php)

// Файл: static.php

// Призначення: відображення запитуваних статичних сторінок.

// УВАГА: передбачається, що файл "site_init.tpl" і все

// статичні файли знаходяться в тому ж каталозі.

// Завантажити функції і змінні include ( "site_init.tpl"):

// Вивести заголовок show_header ($ site_name);

// Вивести запитувана зміст include ( "$ content.html"):

// Вивести колонтитул show footer ();

Тепер все готово до побудови основного сценарію. Просто включите в сторінку

<а href = "static.php?content=about">Static Page Name

Advertising Information

Contact Us

Якщо клацнути на будь-який з цих посилань, в браузері завантажується відповідна статична сторінка, впроваджена в static.php!

підсумки

У цьому розділі ви познайомилися з першочерговим завданням, для вирішення якого і створювався PHP, - динамічним побудовою web-сторінок. Були розглянуті наступні питання:

  • обробка URL;
  • побудова динамічного змісту;
  • включення і побудова базових шаблонів.

Глава завершується генератором сторінок - програмою, яка завантажує статичні сторінки в шаблон і дозволяє легко організувати підтримку великої кількості статичних сторінок HTML.

Наступна глава присвячена використанню PHP в поєднанні з формами HTML, помітно підвищують ступінь інтерактивності вашого сайту. А потім - взаємодія з базами даних! Вам належить дізнатися багато цікавого.

Кемерон Лейрд

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

різноманіття паралелізму

Спочатку відкладемо в сторону випадки, що лежать поза русла головної теми. У PHP складні взаємини з багатозадачністю або паралелізмом. На верхньому рівні PHP постійно залучений в багатозадачність - стандартні установки PHP на сервері (наприклад, модуль Apache) використовуються багатозадачним способом. Тобто кілька клієнтських додатків (Web-браузерів) можуть одночасно запросити одну і ту ж PHP-сторінку, і Web-сервер поверне її всім більш-менш одночасно.

Одна Web-сторінка не блокує передачу іншій, хоча вони можуть трохи заважати один одному при роботі з такими обмеженими ресурсами як пам'ять сервера або пропускна здатність мережі. Таким чином, системна вимога забезпечення паралелізму може цілком допускати засновані на PHP рішення. У термінах реалізації PHP покладає на Web-сервер відповідальність за паралелізм.

Паралелізм на клієнтській стороні під назвою Ajax теж привернув увагу розробників в останні кілька років. Хоча значення Ajax стало кілька неясним, одним з аспектів цієї технології є те, що браузер може одночасно виконувати обчислення і залишатися чутливим до таких дій користувача, як вибір пунктів меню. Це дійсно почасти багатозадачність. Закодований на PHP Ajax робить це, але без будь-якого спеціального участі PHP; інтегровані середовища Ajax для інших мов працюють так само.

Третім прикладом паралелізму, який тільки поверхнево зачіпає PHP, є PHP / TK. PHP / TK - це розширення PHP, надає переносяться зв'язування графічного інтерфейсу користувача (Graphical User Interface - GUI) ядру PHP. PHP / TK дозволяє створювати настільні GUI-додатки, написані на PHP. Його засновані на подіях аспекти моделюють форму паралелізму, яку легко вивчити, і вона менше схильна до помилок, ніж робота з потоками. Знову ж, паралелізм "успадкований" від додаткової технології, а не є фундаментальною функціональністю PHP.

Було кілька експериментів по додаванню підтримки поточности в сам PHP. Наскільки я знаю, жоден з них не був вдалим. Однак орієнтовані на події інтегровані середовища Ajax і PHP / TK показують, що події можуть ще краще висловити паралелізм для PHP, ніж це роблять потоки. PHP V5 доводить це.

PHP V5 пропонує stream_select ()

У стандартному PHP V4 і більш ранніх версіях вся робота PHP-додатки повинна виконуватися послідовно. Якщо програмі потрібно витягти ціну товару з двох комерційних сайтів, наприклад, вона запитує першу ціну, чекає отримання відповіді, запитує другу ціну і чекає знову.

Що, якби програма могла виконувати кілька завдань одночасно? Вона завершувалася б лише за частину того часу, який необхідний при послідовній роботі.

перший приклад

Нова функція stream_select, разом з кількома своїми друзями, надає цю можливість. Розглянемо наступний приклад:

0) ($ s \u003d stream_socket_client ( "phaseit.net:80", $ errno, $ errstr, $ timeout, STREAM_CLIENT_ASYNC_CONNECT / STREAM_CLIENT_CONNECT); if ($ s) ($ sockets [$ id ++] \u003d $ s; $ http_message \u003d " GET / demonstration / delay? delay \u003d ". $ delay." HTTP / 1.0 \\ r \\ nHost: phaseit.net \\ r \\ n \\ r \\ n "; fwrite ($ s, $ http_message);) else (echo" Stream ". $ id." failed to open correctly. ";) $ delay - \u003d 3;) while (count ($ sockets)) ($ read \u003d $ sockets; stream_select ($ read, $ w \u003d , $ e \u003d null , $ timeout); if (count ($ read)) (/ * stream_select зазвичай перемішує $ read, тому ми повинні обчислити, з якого сокета виконується читання. * / foreach ($ read as $ r) ($ id \u003d array_search ($ r, $ sockets); $ data \u003d fread ($ r, $ convenient_read_block); / * Сокет можна прочитати або тому що він має дані для читання, аБО тому що він в змозі EOF. * / if (strlen ($ data) \u003d \u003d 0) (echo "Stream". $ id. "closes at". date ( "h: i: s"). ". \\ n"; fclose ($ r); unset ($ sockets [$ id]); ) else ($ result [$ id]. \u003d $ data;))) else (/ * Тай Маут означає, що * все * потоки не дочекалися отримання відповіді. * / Echo "Time-out! \\ N"; break; ))?\u003e

Якщо виконати цю програму, відобразиться приблизно наступна інформація:

Program starts at 2:38:50. Stream 4 closes at 2:38:53. Stream 3 closes at 2:38:56. Stream 2 closes at 2:38:59. Stream 1 closes at 2:39:02. Stream 0 closes at 2:39:05.

Важливо розуміти, що тут відбувається. На високому рівні перша програма виконує кілька HTTP-запитів і отримує сторінки, які передає їй Web-сервер. Хоча реальне додаток, напевно, запитував би кілька різних Web-серверів (можливо google.com, yahoo.com, ask.com і т.д.), цей приклад передає всі запити на наш корпоративний сервер на Phaseit.net просто заради зменшення складності .

Запитані Web-сторінки повертають результати після змінної затримки, показаної нижче. Якби програма виконувала запити послідовно, для її завершення знадобилося б близько 15 + 12 + 9 + 6 + 3 (45) секунд. Як показано в лістингу 2, насправді вона завершується за 15 секунд. Потроєння продуктивності - це відмінний результат.

Таке стало можливим завдяки stream_select - нової функції в PHP V5. Запити ініціюються звичайним способом - відкриттям кількох stream_socket_clients і написанням GET до кожного з них, що відповідає http://phaseit.net/demonstration/delay?delay\u003d$DELAY. При запиті цього URL в браузері ви повинні побачити:


Хоча конкретна реалізація в лістингу 3 призначена для UNIX®, майже всі сценарії даної статті з тим же успіхом можна застосувати для установок PHP в Windows® (особливо після Windows 98) або UNIX. Зокрема, з лістингом 1 можна працювати на будь-якій операційній системі. Linux® і Mac OS X є варіаціями UNIX, і весь наведений тут код буде працювати в обох системах.

Запити до сервера затримки виконуються в наступному порядку:

delay \u003d 15 delay \u003d 12 delay \u003d 9 delay \u003d 6 delay \u003d 3

Метою stream_select є якомога більш швидке отримання результатів. В даному випадку порядок затримок протилежний порядку, в якому були зроблені запити. Через 3 секунди перша сторінка готова для читання. Ця частина програми є звичайним PHP-кодом - в даному випадку з fread. Також як і в іншій PHP-програмою читання могло б здійснюватися за допомогою fgets.

Обробка триває таким же чином. Програма блокується в stream_select, поки не будуть готові дані. Вирішальним є те, що вона починає читання, як тільки якесь з'єднання матиме дані, в будь-якому порядку. Саме так програма реалізує багатозадачність або паралельну обробку результатів декількох запитів.

Зверніть увагу на те, що при цьому немає додаткового навантаження на CPU хост-комп'ютера. Немає нічого незвичайного в тому, що мережеві програми, що виконують fread таким способом, незабаром починають використовувати 100% потужності CPU. Тут не цей випадок, оскільки stream_select має бажані властивості і відповідає негайно, як тільки яке-небудь читання стає можливим, але при цьому мінімальним чином завантажує CPU в режимі очікування між операціями читання.

Що потрібно знати про stream_select ()

Подібне засноване на подіях програмування не є елементарним завданням. Хоча лістинг 1 і зменшений до самих основних моментів, будь кодування, що базується на зворотних виклики або координації (що є необхідним в багатозадачних додатках) буде менш звичним в порівнянні з простою процедурної послідовністю. В даному випадку найбільша трудність полягає в масиві $ read. Зверніть увагу на те, що це посилання; stream_select повертає важливу інформацію шляхом зміни вмісту $ read. Так само як покажчики мають репутацію постійного джерела помилок в C, посилання, мабуть, є тією частиною PHP, яка представляє найбільшу складність для програмістів.

Таку методику запитів можна використовувати з будь-якого числа зовнішніх Web-сайтів, засвідчити в тому, що програма буде отримувати кожен результат якомога швидше, не чекаючи інших запитів. Фактично, дана методика коректно працює з будь-яким TCP / IP-з'єднанням, а не тільки з Web (порт 80), тобто в принципі ви можете управляти витяганням LDAP-даних, передачею SMTP, SOAP-запитами і т.д.

Але це не все. PHP V5 управляє різними сполуками як "потоками" (stream), а не простими сокетами. Бібліотека PHP Client URL (CURL) підтримує HTTPS-сертифікати, витікаючу FTP-завантаження, куки і багато іншого (CURL дозволяє PHP-додатків використовувати різні протоколи для з'єднання з серверами). Оскільки CURL надає інтерфейс stream, з точки зору програми з'єднання прозоро. У наступному розділі розповідається, як stream_select мультиплексирует навіть локальні обчислення.

Для stream_select існує кілька застережень. Ця функція не документована, тому не розглядається навіть в нових книгах по PHP. Кілька прикладів коду, доступні в Web, просто не працюють або незрозумілі. Другий і третій аргументи stream_select, керуючі каналами write і exception, відповідними каналам read в лістингу 1, майже завжди повинні бути рівні null. За деякими винятками вибір цих каналів є помилкою. Якщо ви не маєте достатнього досвіду, використовуйте тільки добре описані варіанти.

Крім того, в stream_select, по всій видимості, є помилки, по крайней мере, в PHP V5.1.2. Найбільш істотним є те, що значенням повернення функції не можна довіряти. Хоча я ще не налагодив реалізацію, мій досвід показав, що безпечно тестувати count ($ read) так, як в лістингу 1, але це не відноситься до значення повернення самої stream_select, незважаючи на офіційну документацію.

Локальний паралелізм PHP

Приклад і основна частина обговорення вище були присвячені тому, як керувати кількома віддаленими ресурсами одночасно і отримувати результати в міру їх появи, а не очікувати обробки кожного в порядку первинних запитів. Це, безсумнівно, важливе застосування паралелізму PHP. Іноді реальні програми можна прискорити в десять і більше разів.

Що якщо уповільнення відбувається ближче? Чи є спосіб прискорити отримання результатів в PHP при локальній обробці? Є декілька. Мабуть, вони ще менш відомі, ніж орієнтований на сокети підхід в лістингу 1. Цьому є кілька причин, в тому числі:

  • У своїй більшості PHP-сторінки достатньо швидкі. Краща продуктивність могла б бути перевагою, але цього недостатньо для виправдання інвестицій в новий код.
  • Використання PHP в Web-сторінках може зробити часткові прискорення коду неважливими. Перерозподіл обчислень таким чином, щоб отримувати проміжні результати швидше, не має значення, коли єдиним критерієм є швидкість доставки Web-сторінки в цілому.
  • Трохи локальних вузьких місць знаходиться під контролем PHP. Користувачі можуть висловлювати невдоволення тим, що вилучення інформації про обліковий запис займає 8 секунд, але це може бути обмеженням обробки бази даних або будь-яких інших ресурсів, зовнішніх для PHP. Навіть якщо зменшити час PHP-обробки до нуля, все одно буде витрачено понад 7 секунд просто на пошук.
  • Ще менша кількість обмежень піддається паралельній обробці. Припустимо, що конкретна сторінка обчислює рекомендовану ціну для перерахованих звичайних акцій, а обчислення досить складні і виконуються протягом багатьох секунд. Обчислення може бути послідовним по природі. Не існує очевидного способу розподілити його для "спільної роботи".
  • Мало PHP-програмістів розуміє потенціал PHP для реалізації паралельної обробки. Говорячи про можливість розпаралелювання, більшість з зустрінутих мною програмістів просто цитували фразу "PHP не працює з потоками" і поверталися до своєї сформованої моделі обчислень.

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

У світі PHP-обчислень такі приклади є рідкістю. Однак оскільки я більше ніде не знайшов точного опису, хочу привести тут приклад подібного прискорення.

array ( "pipe", "r"), 1 \u003d\u003e array ( "pipe", "w"), 2 \u003d\u003e array ( "file", $ error_log, "w")); $ Cmd \u003d "sleep". $ Delay. "; Echo" Finished with delay of ". $ Delay." "."; $ Handles [$ id] \u003d proc_open ($ cmd, $ descriptorspec, $ pipes); $ Streams [$ id] \u003d $ pipes; $ All_pipes [$ id] \u003d $ pipes; $ Delay - \u003d 2; ) While (count ($ streams)) ($ read \u003d $ streams; stream_select ($ read, $ w \u003d , $ e \u003d , $ timeout); foreach ($ read as $ r) ($ id \u003d array_search ($ r, $ streams); echo stream_get_contents ($ all_pipes [$ id]); if (feof ($ r)) (fclose ($ all_pipes [$ id]); fclose ($ all_pipes [$ id]); $ return_value \u003d proc_close ($ handles [$ id]); unset ($ streams [$ id]);)))?\u003e

Дана програма виведе на екран наступну інформацію:

Program starts at 10:28:41. Finished with delay of 1. Finished with delay of 3.

Сенс полягає в тому, що PHP запустив два незалежних субпроцеси, отримав дані від першого, а потім від другого, хоча останній стартував раніше. Якщо хост-комп'ютер є багатопроцесорним, а операційна система коректно налаштована, вона сама піклується про призначення різних субпрограмм різним процесорам. Це один із способів використання переваг багатопроцесорних машин в PHP.

резюме

PHP підтримує багатозадачність. PHP не підтримує обробку потоків так, як це роблять інші мови програмування, наприклад Java або C ++, але наведені вище приклади показали, що PHP має більш високий потенціал для прискорення роботи, ніж багато хто собі уявляє.

Якщо ви тільки що зіткнулися з PHP, то вам потрібно знати деякі визначення.
Перш за все, PHP - це мова програмування і служить він для написання команд (сценаріїв), адресованих сервера. Якщо говорити ще простіше, то за допомогою PHP ми можемо спілкуватися з сервером.
Команди PHP легко впроваджуються в HTML сторінки. Саме ця властивість є важливою перевагою мови PHP перед такими мовами, як Perl і C.

синтаксис PHP

PHP код сценарію починається після відкриває тега . Текст між цими двома тегами зчитується програмою, що знаходиться на сервері, а в HTML-документ виводиться отриманий результат. Розглянемо на прикладі:



приклад

include ( "sidebar.htm");
?>


Якщо нам потрібно щось вставити в html код сторінки необхідно використовувати команду include (вставити). Далі вказуємо адресу файлу, а закінчується рядок, як і в CSS;

Вставляємо HTML код в сторінки сайту

Як правило бічні колонки ( sidebar) І земельна ділянка ( footer) Залишаються незмінними на всіх сторінках сайту. отже коди

.....
і можна винести в окремі htm сторінки "sidebar.htm" і "footer.htm" і вставляти в сторінки сайту за допомогою команди include. Якщо при цьому винести в окремий файл і головне вміст -
.....
, То код нашої сторінки матиме вигляд:



приклад

include ( "sidebar.htm");
include ( "content.htm");
include ( "footer.htm");
?>


вміст sidebar.htm


тут
вміст
вашого
сайд-бару

Аналогічно з файлами content.htm і footer.htm.

При такій генерації сторінок Вам достатньо внести зміни в один файл "sidebar.htm", що б змінилися всі сторінки сайту. Що дуже зручно якщо Ваш сайт складається з сотні або тисячі сторінок.

PHP на Вашому комп'ютері

Щоб Ви могли працювати з PHP-скриптами і переглядати результати виконання в браузері, вам потрібно встановити працюючий веб сервер з PHP на локальному комп'ютері.
Найкраще для таких завдань підійде Денвер. (Офіційний сайт надає все необхідне безкоштовно) В комплект установки входить - Apache, php і MySQL. Іншими словами на Вашому комп'ютері буде знаходитися повнофункціональний сервер для хостингу сайтів.

Для того, що б PHP код працював в HTML сторінках необхідно відкрити файл .htaccess в будь-якому текстовому редакторі і прописати наступне:

AddHandler application / x-httpd-php .html

Даний запис дозволяє виконання PHP скриптів в HTML сторінках.

Або змінити розширення файлу. html на. php

можливості PHP

PHP здатний не тільки видавати HTML. Можливості PHP включають формування зображень, файлів PDF і навіть роликів Flash (з використанням libswf і Ming), створюваних "на льоту". PHP також здатний видавати будь-які текстові дані, такі, як XHTML і інші XML-файли. PHP здатний здійснювати автоматичну генерацію таких файлів і зберігати їх в файлової системі вашого сервера, замість того, щоб віддавати клієнту, організовуючи, таким чином, кеш динамічного змісту, розташований на стороні сервера.

Одним із значних переваг PHP є підтримка широкого кола баз даних. Словом, PHP може запропонувати вам дуже багато! Детально про переваги PHP можна ознайомитися на www.php.su.

February 1, 2015