Самые основы. Как работает PHP

19.01.17 7.7K

С помощью сессии PHP сервер идентифицирует вас и позволяет выполнять необходимые операции: изменение информации на различных веб-страницах, добавление новой информации и т.д. После завершения работы на сайте вы удаляете текущую сессию, нажав на кнопку «Выйти »:

Что такое сессия PHP?

Сессия PHP представляет собой способ хранения информации в переменных сессии, которые могут быть использованы для аутентификации на нескольких веб-страницах. В отличие от куков, информация сессии не хранится на компьютере пользователя. Вместо этого сессия создает файл на сервере во временном каталоге.

Эта информация, хранимая на протяжении сессии, доступна для всех веб-страниц ресурса. На сервере расположение временного файла определяется параметром session.save_path в конфигурационном файле php.ini .

При создании PHP-сессии выполняются следующие три действия:

  • Когда создается сессия, PHP генерирует уникальный идентификатор, который представляет собой случайную строку из 32 шестнадцатеричных чисел. Идентификатор времени жизни сессии PHP выглядит примерно так: 9c8foj87c3jj973actop1re472e8774 ;
  • Сервер отправляет на компьютер пользователя куки, называемые PHPSESSID , для хранения строки уникального идентификатора сессии;
  • Сервер генерирует в указанном временном каталоге файл, который содержит имя уникального идентификатора сессии с префиксом sess _g. sess_9c8foj87c3jj973actop1re472e8774 .

Эти установки помогают скрипту PHP извлекать из файла значения переменных сессии. На стороне клиента PHPSESSID содержит идентификатор сессии. Он подтверждает имя файла, который нужно искать в определенном каталоге на стороне сервера, из него переменные сессии могут быть извлечены и использованы для проверки.

Пользователь может завершить сеанс, нажав кнопку выхода из системы, которая вызывает функцию session_destroy() . Когда пользователь закрывает браузер, сессия PHP закрывается автоматически. Иначе сервер завершит сессию по истечении заданного периода времени.

Синтаксис сессий в PHP

При PHP авторизации через сессию она создается с помощью функции session_start() и удаляется с помощью функции session_destroy() . Глобальная переменная PHP , известная под именем $_SESSION , используется для установки значений переменных сессии. Сбросить все значения, установленные для переменных сессии, можно с помощью функции session_unset() .

Операции сессии

Мы рассмотрим следующие операции с использованием сессии PHP , а также их примеры.

  • Запуск сессии PHP и установка ее переменных сессии: новая сессия PHP запускается с помощью функции session_start() . После того, как сессия была создана, можно установить значения ее переменных сессии с помощью $_SESSION . Мы установили значения для переменных “userID ” — “php_user ” и “password ” — “tutorials ”:

PHP-сессии - создание Сессия PHP начата и переменные сессии заданы!"; ?>

Результат : в результате запуска приведенного выше PHP-кода на сервере будет выведено следующее сообщение:

  • Получение значений переменных сессии PHP : Можно получить значения переменных, которые мы установили во время последней PHP сессии авторизации. Когда мы открываем PHP-сессию в начале каждой страницы (session_start () ), должен указываться код, приведенный ниже. Мы извлекаем и выводим эти значения с помощью глобальной переменной $_SESSION :

PHP-сессия - получение значений
"; echo "Пароль - " . $_SESSION["password"] . "."; ?>

Результат : когда мы запустим на сервере приведенный выше PHP-код , в результате мы получим следующее сообщение. Выводятся значения переменных сессии, которые мы установили ранее, после создания сессии PHP .

  • Обновление значений переменных сессии PHP : Во время сессии можно обновить значения ее переменных. Сначала нам нужно открыть PHP-сессию в начале каждой страницы (session_start () ). В приведенном ниже коде мы обновляем значения переменных “userID ” — “new_php_user ” и “password ” — “education ”.

Можно вывести массив переменных сессии и их значений с помощью функции print_r($ _SESSION) , как показано ниже:

PHP-сессия - изменение значений
"; print_r($_SESSION); ?>

Результат : когда мы запустим на сервере приведенный выше PHP код, мы получим следующее сообщение. В нем будет приведен массив переменных сессии с их новыми значениями.

Как создать php файл?

Дата: 2010-09-08

Чем отличается php-файл от html-файла.

Создание автоматизированных сайтов, как Вы понимаете - это уже следующая ступенька в сайтостроении. Если простой сайт можно создать на обычном языке HTML, то автоматизированный сайт можно создать только с использованием PHP и очень часто с использованием баз (одной или нескольких) данных.

Но в основе web-страницы на PHP, лежит все таки язык HTML. А следовательно все правила создания страниц обоих типов общие. И я буду исходить из того, что Вы уже знакомы с HTML и знаете, как создаются простые web-страницы. Если не в курсе этого или же подзыбыли:) , то обновите свои познания в разделе . Отсюда вытекает очень важное правило: Все теги, которые мы изучали в разделе , так же прекрасно работают в php файлах и мы будем этими тегами пользоваться . Так что Вы должны знать HTML.

По своей структуре PHP файл напоминает обычный HTML файл, но со специальными вставками php кода. Эти вставки кода вставляются в код web-страницы с помощью специальных операторов, которые иногда еще называют дескрипторами :

Дескриптор .

Примечание: Иногда можно встретить сокращенную запись дескрипторов: . Рекомендуется избегать такой записи. Сценарий PHP записанный в сокращенном виде может работать не на всех серверах.

Когда сервер (или локальный сервер) встречает такую вставку, то подключается (установленный на сервере), PHP-код обрабатывается и пользователю (посетителю сайта), выдается уже обработанная и готовая web-страница. Именно поэтому если мы попытаемся посмотреть код php-страницы уже загруженной браузером (правая кнопка мыши, Посмотреть HTML-код), мы не увидим таких вставок (они уже обработаны сервером).

Создается php файл так же, как и html файл простым переименование расширения текстового файла и сделать это можно в обычном Блокноте . Про это мы уже беседовали в уроке: " поэтому не буду повторяться.

PHP файл имеет расширение .php . Первый файл, загружаемый по умолчанию, так же как и в HTML всегда называется index.php , но как Вы заметили имеет расширение .php . Все PHP файлы имеют вид имя.php , конечно же все имена файлов пишутся по английски.

Сервер, когда у него запрашивают такой файл (проще говоря нажимают на ссылку), уже "понимает", что в этом файле содержится php-код и его нужно обработать прежде чем отдать посетителю. HTML-код при этом просто пропускается сервером, точнее препроцессором PHP без обработки.

Давайте теперь рассмотрим простейший файл с php-кодом. Для определенности назовем его например name.php . Итак смотрим Листинг 1 :

Листинг 1.

Как видите код этого php-файл отличается от html-файла расширением .php (в имени файла) и вставкой php-кода Листинг 2 :

Листинг 2.

"Привет, меня зовут Иван" ; ?>

Оператор echo - переводится как вывести , в данном случае имеется ввиду вывести на экран монитора. Т.е. надпись Привет, меня зовут Иван просто отобразится на мониторе при запуске этого файла.

После вывода каждой команды ставится точка с запитой (; ) . Если команда одна, как у нас сейчас, точку с запитой можно не ставить, но если команд несколько, то точка с запитой должны ставиться после каждой команды , тогда это разделитель между командами. После точки с запитой считается, что команда выполнена. Кроме того это считается хорошим тоном при программировании на PHP.


Итак, друзья, если Вы дошли до этого урока, то у Вас получилось либо установить локальный сервер, либо купить хостинг, на котором можно работать с PHP. Поздравляю - это большой шаг!

О PHP скажу коротко - этот язык программирования используется по всему миру и на нём можно создавать сайты всех уровней сложности, от сайтов-визиток до крупных порталов. Думаю, уже для многих не секрет, что крупнейшие социальные сети facebook.com (с нуля на php) и vk.com (движок на php) были написаны на языке PHP. Так что делаем выводы и начинаем работу!)

Принцип работы кода

Код PHP отрабатывается на стороне сервера . То есть готовой страницы нет. Например, в коде дана команда собрать данные о том, сколько пользователей зарегистрировано на данный момент на сайте. Посетитель сайта нажимает на ссылку все пользователи . Он хочет получить динамические данные , то есть те, которые постоянно изменяются. После того, как подсчёт на сервере будет закончен, с сервера придут данные в виде сгенерированного HTML-кода страницы с количеством пользователей. В результате, после клика-запроса по ссылке, пользователь получает страницу. Если просмотреть код полученной страницы, то можно увидеть только HTML, а PHP-код будет недоступен для просмотра. Грубо говоря, PHP - это указания серверу по тому, как и из каких блоков сделать страницу.

Как выглядит PHP код и куда его вставлять?

PHP-код можно внедрять непосредственно в HTML. PHP-код встраивается в HTML-страницы при помощи угловых скобок и знака вопроса , однако можно ограничиться скобками со знаками вопроса . Нужно будет только изменить расширение файла, например, с .html на .php

Код PHP (файл index.php )



Пример использования PHP


echo "Привет, мир!";
?>



Демонстрация Скачать исходники
Результатом работы кода будет вывод обычного текста Привет, Мир! . Спросите зачем писать код php, чтобы вывести обычный текст? Оператор echo , о котором поговорим чуть позже, нужен не просто для вывода текста. Чаще echo используют для отображения результата работы какой-то функции, которая производила подсчёт или брала данные из БД (Что такое База данных?). То есть для отображения динамических данных .

Оператор echo в PHP

Как Вы уже поняли, оператор echo нужен для вывода данных. Содержимое (в нашем случае пока только текст) берём в кавычки , а в конце ставим точку с запятой ; это обозначает конец работы оператора.

В программирование при создании первой страницы принято употреблять фразу Hello, World! - то есть Привет, мир! Именно её и используем. В примере не будем использовать html, так как это не обязательно.

Код PHP

echo "Привет, Мир!";
?>
Программа выведет Привет, Мир! .
В самом первом примере мы вставляли в html небольшой код php. Теперь, наоборот, внедрим в php-код элементы html.

Код PHP

echo "";
echo "";
echo "Мой первый PHP скрипт";
echo "";
echo "";
echo "

Привет, Мир!

";
echo "";
?>
В результате получим пустую страничку с заголовком Привет, Мир!

Оператор print в PHP

В отличие от оператора echo, print выводит данные с учётом пробелов и переносов текста. Имеет некоторые ограничения - можно использовать только один аргумент, echo несколько. Отрабатывает дольше, чем echo. В дальнейшем будем прибегать к данному оператору при написании функций.

print "Привет, Мир!
Вторая строка текста"; // результат будет выведен в две строки
?>
Текст будет выведен также, как и написан.

Оператор вывода - синтаксис heredoc PHP

Как Вы уже успели заметить, выводить страницу путём постоянного использования оператора echo - это некрасиво и нечитаемо. Поэтому для вывода больших частей html кода есть другой оператор вывода, использующего синтаксис heredoc. Он тоже выводит данные в таком же виде, в каком они и были (пробелы и переносы).

echo <<

Пример


Пример вывода большого объема текста с использованием html


Второй абзац такого же объёмного текста.


HERE;
?>

Памятка к уроку

Код PHP может:

1. не содержать ни одного html-элемента. Страница и текст всё равно отобразятся. html нужен для красивой разметки содержимого.

2. быть как включен в html-код, так и содержать его внутри своих операторов вывода (echo, print и тд). Главное не забывать конструкцию

3. страницы с php-кодом должны иметь соответствующее расширение: .php .phtml

Со следующих уроков мы разберём основы создания сайтов на 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

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

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=stream_socket_client("phaseit.net:80", $errno, $errstr, $timeout, STREAM_CLIENT_ASYNC_CONNECT/STREAM_CLIENT_CONNECT); if ($s) { $sockets[$id++]=$s; $http_message="GET /demonstration/delay?delay=" . $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 -= 3; } while (count($sockets)) { $read=$sockets; stream_select($read, $w=null, $e=null, $timeout); if (count($read)) { /* stream_select обычно перемешивает $read, поэтому мы должны вычислить, из какого сокета выполняется чтение. */ foreach ($read as $r) { $id=array_search($r, $sockets); $data=fread($r, $convenient_read_block); /* Сокет можно прочитать либо потому что он имеет данные для чтения, ЛИБО потому что он в состоянии EOF. */ if (strlen($data) == 0) { echo "Stream " . $id . " closes at " . date("h:i:s") . ".\n"; fclose($r); unset($sockets[$id]); } else { $result[$id] .= $data; } } } else { /* Таймаут означает, что *все* потоки не дождались получения ответа. */ echo "Time-out!\n"; break; } } ?>

Если выполнить эту программу, отобразится примерно следующая информация:

Program starts at 02:38:50. Stream 4 closes at 02:38:53. Stream 3 closes at 02:38:56. Stream 2 closes at 02:38:59. Stream 1 closes at 02:39:02. Stream 0 closes at 02: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=$DELAY . При запросе этого URL в браузере вы должны увидеть:


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

Запросы к серверу задержки выполняются в следующем порядке:

delay=15 delay=12 delay= 9 delay= 6 delay= 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 => array("pipe", "w"), 2 => array("file", $error_log, "w")); $cmd="sleep " . $delay . "; echo "Finished with delay of " . $delay . ""."; $handles[$id]=proc_open($cmd, $descriptorspec, $pipes); $streams[$id]=$pipes; $all_pipes[$id]=$pipes; $delay -= 2; } while (count($streams)) { $read=$streams; stream_select($read, $w=null, $e=null, $timeout); foreach ($read as $r) { $id=array_search($r, $streams); echo stream_get_contents($all_pipes[$id]); if (feof($r)) { fclose($all_pipes[$id]); fclose($all_pipes[$id]); $return_value=proc_close($handles[$id]); unset($streams[$id]); } } } ?>

Данная программа выведет на экран следующую информацию:

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

Смысл заключается в том, что PHP запустил два независимых субпроцесса, получил данные от первого, а затем от второго, хотя последний стартовал раньше. Если хост-компьютер является многопроцессорным, а операционная система корректно настроена, она сама заботится о назначении различных субпрограмм разным процессорам. Это один из способов использования преимуществ многопроцессорных машин в PHP.

Резюме

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

Понравилась статья? Поделиться с друзьями: