Сравнение РНР как интерпретатора CGI и как модуля Apache

Сравнение РНР как интерпретатора CGI и как модуля Apache

Как было сказано выше, РНР можно компилировать 

    • в виде самостоятельного интерпретатора CGI
    • как модуль Apache.

Если  РНР сконфигурирован как интерпретатор  CGI, то всякий раз, когда нужно интерпретировать сценарий РНР, веб-сервер порождает экземпляр интерпретатора РНР, который и интерпретирует этот сценарий. Очевидно, что в результате несколько снижается производительность.

Если  РНР скомпилирован как модуль Apache (рис. 2.1), он выполняется в адресном пространстве процесса самого веб-сервера, благодаря чему обеспечивается заметное увеличение производительности по сравнению с обычными интерпретаторами CGI, являющимися самостоятельными процессами.

Некоторые функции, такие как постоянные соединения с базами данных (persistent database connections), доступны только в версии модуля Apache.

Программирование в среде Web. Зачем нужно использовать РНР?

Теперь, когда мы знаем, как устанавливать РНР, стоит  задаться вопросом, для чего вообще нужен РНР. Можно было бы ограничиться HTML - в конце концов, это старый испытанный метод создания веб-страниц. Почему необходимы «динамические» веб-страницы? Значительно проще овладеть в совершенстве HTML, чем изучать совершенно новую технологию.

Недостатки HTML

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

Однако Интернет и интранет все в большей степени используются для приложений, и большинство из них включает в себя базы данных. Эти сайты и приложения являются динамическими, поскольку их содержание меняется в зависимости от участвующих в них данных и действий пользователя. Именно здесь вступает в игру РНР. Благодаря запуску на сервере программ РНР можно создавать очень мощные приложения, взаимодействующие с базами данных и динамически создающие содержание.

Главное различие между страницами РНР и страницами HTML состоит в том, как с ними работает веб-сервер.

 

Что происходит со страницами HTML?

Когда от броузера поступает запрос страницы, веб-сервер делает следующие три шага:

• читает запрос от броузера;

• находит страницу на сервере;

• посылает страницу обратно броузеру через Интернет или интранет.

Что происходит со страницами РНР?

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

РНР примет некоторые решения и создаст страницу, соответствующую конкретной ситуации. Поэтому при использовании РНР сервер действует следующим образом:

  • читает запрос от броузера;
  • находит страницу на сервере;
  • выполняет инструкции РНР для модификации страницы;
  • посылает страницу обратно броузеру через Интернет или интранет.

 

 

Что же такого делает РНР, чего не может HTML?

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

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

Вот еще несколько примеров того, что можно делать с помощью  РНР, но нельзя делать с помощью только HTML:

  • упрощать изменение содержимого веб-страницы, обновляя содержание базы данных, а не кода HTML;
  • создавать страницы, настроенные на вывод данных, представляющих интерес для конкретного пользователя;
  • выводить и обновлять базы данных на веб-странице благодаря возможности сортировать данные в любом порядке или просматривать их подмножество;
  • создавать страницы, попеременно показывающие ряд графических изображений;
  • получать ответную реакцию пользователя и передавать ему информацию на основе этой реакции.

Этот перечень охватывает лишь то, что лежит на поверхности; в действительности РНР позволяет решать значительно более широкие задачи.

WWW - новое поколение

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

Статические публикации

Первое поколение было представлено статическими публикациями — страницами, образованными с помощью HTML и состоящими из статических картинок и текста, которые можно было точно расположить, указав координаты х и у. Такие страницы достаточно элементарны, и чтобы получить с помощью такой технологии действительно производящие впечатление результаты, нужно быть экспертом в HTML или привлекать художника-оформителя! Кроме того, для обновления страницы необходимо редактировать HTML вручную или с помощью редактора, а вдобавок, статические страницы не были совместимы с базами данных. Помимо отображения текста и изображений с их помощью можно было сделать немногое.

Активные веб-сайты

Некоторое время WWW развивалась в направлении активных веб-сайтов, позволяющих посылать пользователю заказные страницы и предоставляющих для просмотра более динамичное содержание. Такие сайты создаются с помощью сочетания ряда языков и технологий, которые можно использовать отдельно или в комбинациях независимо друг от друга (в том смысле, что изучение одной технологии не предполагает необходимости предварительного знания другой).

Эти технологии молено разбить на две группы: технологии на стороне  клиента и технологии на стороне сервера. В первую группу входят:

  • Управляющие элементы ActiveX, создаваемые с помощью Visual C++ или Visual Basic
  • Апплеты Java
  • Сценарии, выполняемые на стороне клиента, и динамический HTML

 

В число технологий, используемых на стороне сервера, входят:

  • CGI 
  • Фирменные API для веб-серверов, такие как ISAPI и NSAPI
  • Active Server Pages
  • JavaServer Pages и Java Servlets
  • PHP

Остановимся вкратце на каждой из них.

Динамические технологии на стороне клиента

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

Управляющие элементы ActiveX

Управляющие элементы ActiveX являются отдельными программами, которые известны как компоненты. Разрабатываются они на таких языках, как С++ или Visual Basic. Располагаясь на веб-странице, такой элемент реализует какую-либо специальную функцию, например, выводит диаграммы и графики, играет роль таймера, производит аутентификацию клиента или доступ к базе данных. Управляющие элементы ActiveX добавляются к страницам HTML с помощью тега <OBJECT>, который вошел в стандарт HTML. Встроенные в веб-страницу управляющие элементы ActiveX могут выполняться броузером или сервером.

Существует  некоторое препятствие: управляющие  элементы ActiveX разработаны Microsoft и, несмотря на совместимость со стандартом HTML, функционируют только в Internet Explorer. Некоторая поддержка ActiveX обеспечивается и для броузера Netscape при использовании подключаемого модуля (plug-in), поставляемого фирмой NCompass. Следовательно, на практике нельзя рассматривать ActiveX как не зависящий от платформы способ создания динамических страниц.

Апплеты Java

Апплет - это программа, написанная на языке программирования Java, которую можно включить в страницу HTML способом, похожим на тот, которым включается графический образ. Если для просмотра страницы, содержащей апплет, используется броузер, поддерживающий Java, код апплета пересылается на машину и выполняется броузером. Поскольку апплет написан на Java, он использует все преимущества этого языка, являясь автономным и не зависящим от платформы.

Сценарии на стороне клиента и DHTML

Языки сценариев  предоставляют новичкам более легкий доступ к программированию. Языки сценариев для использования в Сети на стороне клиента были разработаны с целью создания динамической альтернативы статическому HTML. Когда броузер находит в коде HTML команду сценария, он транслирует этот сценарий в чистый HTML (если броузер понимает данный язык сценариев). Это позволяет разработчику создавать более интерактивные веб-страницы со значительно расширенной по сравнению со страницами чистого HTML функциональностью.

Основным  языком сценариев, используемым на стороне  клиента, служит JavaScript. Он поддерживается как Netscape Navigator (с версии 2), так и Microsoft Internet Explorer (с версии 3). Используемый на стороне клиента VBScript поддерживается только в Internet Explorer и потому не очень  полезен для создания универсальных сценариев для Интернета. Тем не менее, он иногда применяется в интранет, использующих исключительно решения Microsoft.

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

Технологии на стороне сервера

Несколько лет  назад единственным практическим решением для размещения в Сети динамического содержания была технология под названием Common Gateway Interface (CGI - интерфейс общего шлюза). CGI-программы предоставляли сравнительно простой способ создания веб-приложения, получающего введенные пользователем данные, выполняющего запрос к базе данных и возвращающего результаты обратно броузеру. Как Microsoft, так и Netscape разработали собственные API, с помощью которых для обслуживания веб-запросов можно было создавать код, выполняющийся в рамках того же процесса (in-process). В число новейших предлагаемых технологий на стороне сервера входят Active Server Pages (ASP), Java Servlets и JavaServer Pages (JSP), хотя существует много других.

Интерфейс общего шлюза - Common Gateway Interface (CGI)

CGI является  наиболее часто используемой  сетевой технологией, используемой на стороне сервера, и чуть ли не каждый существующий сегодня веб-сервер имеет поддержку CGI-программ. CGI-программа может быть написана почти на любом языке, хотя чаще всего для программирования CGI используется Perl. Веб-серверы, реализующие CGI, действуют как шлюз между запросом пользователя и требуемыми данными. Для этого сначала создается новый процесс, в котором будет выполняться программа (рис. 3.3). Затем в него загружается необходимая среда времени выполнения и сама программа. Наконец, передается объект, представляющий запрос, и вызывается программа. По окончании работы программы веб-сервер считывает из stdout данные, которые она возвратила.

Наиболее  крупным недостатком CGI-программирования является то, что оно плохо масштабируется. При каждом получении веб-сервером запроса создается совершенно новый процесс. Каждый процесс состоит из собственного набора переменных окружения, отдельного экземпляра необходимой среды этапа исполнения, экземпляра программы и памяти, выделенной для использования программой. Нетрудно представить себе, что может произойти с сервером, когда одновременно приходит большое количество запросов. Ресурсы сервера подвергаются большому испытанию, что может вызвать его отказ.

Фирменные API веб-серверов (ISAPI, NSAPI)

Видимо, в  ответ на неэффективность CGI Microsoft и Netscape разработали собственные API, позволяющие разработчикам создавать серверные приложения в виде библиотек совместного доступа. Эти библиотеки загружаются в процесс веб-сервера и могут обслуживать несколько запросов, не создавая новых процессов. Они могут загружаться при запуске веб-сервера или по мере необходимости в них. Если в течение определенного времени они не используются, веб-сервер выгружает их из памяти.

Хотя выполняемые  в рамках процесса библиотеки являются эффективным расширением веб-сервера, с ними тоже возникает ряд проблем:

  • •   Поскольку эти API специфичны для каждой платформы, написанные с их использованием программы могут работать только на соответствующей платформе. Перенесение этих программ в другую среду является очень сложной задачей.
  • •   Поскольку доступ к этим библиотекам осуществляется одновременно несколькими пользователями, они должны быть написаны с применением методов обеспечения безопасности потоковых переменных (thread-safe). Это означает, что доступ к глобальным и статическим переменным должен осуществляться с большой осторожностью.
  • •   Если в выполняемой на сервере программе происходит нарушение прав доступа, то поскольку она находится в том же процессе, что и сам веб-сервер, может произойти авария всего веб-сервера.

Active Server Pages (ASP)

ASP имеет  сходство с РНР, сочетая HTML, сценарии и компоненты на стороне сервера в одном файле, называемом активной серверной страницей (Active Server Page). Если сервер получает запрос файла ASP, то сначала ищет скомпилированную страницу, а затем выполняет ее. Если страница еще не скомпилирована, сервер компилирует ее, а затем выполняет. Результатом файла ASP является законченная веб-страница, возвращаемая броузеру.

Active Server Page может  быть написана с использованием HTML, Jscript (вариант JavaScript, созданный  Microsoft) и VBScript. Благодаря использованию сценариев, Active Server Page может иметь доступ к компонентам на стороне сервера. Компоненты можно создавать на любом языке, который предоставляет интерфейс к СОМ (спецификация компонентов, разработанной Microsoft). Несомненным; недостатком активных серверных страниц является то, что их можно использовать только с веб-сервером Microsoft (US, PWS) под операционными системами Microsoft (Win9x, WinNT). Существуют переносы на другие платформы и веб-серверы, но отсутствие широкой поддержки СОМ снижает их эффективность.

Java Servlets и JSP

Java-сервлеты (Java Servlets) и JavaServer Pages (JSP) являются технологиями, применяемыми на стороне сервера и использующими язык Java. Недавно Sun представила ряд новых API, позволяющих подключать программы к корпоративным службам и данным. Java Servlet API является одним из краеугольных камней этих расширений платформы Java, предоставляя мощный способ создания динамического содержания и расширения функциональности веб-серверов.

Сервлет Java является программой, выполняемой на стороне сервера, обслуживающей запросы HTTP и возвращающей результаты в виде ответа HTTP. В этом отношении она очень похожа на CGI, но на этом сходство и заканчивается. Хорошей аналогией сервлета является невидимый апплет, выполняемый на веб-сервере. Его жизненный цикл аналогичен жизненному циклу апплета, а выполняется он внутри виртуальной машины Java (JVM).

JavaServer Pages (JSP) аналогичны активным серверным страницам Microsoft (ASP). Страница JavaServer содержит HTML, код Java и компоненты JavaBean. JSP позволяет встраивать в страницы компоненты и обеспечивать выполнение ими работы по генерации страницы, посылаемой в конечном итоге клиенту. При запросе пользователем файла JSP веб-сервер сначала генерирует соответствующий сервлет, если его еще не существует. Затем веб-сервер запускает сервлет и возвращает созданное им содержание броузеру.

JavaServer Pages и Java Servlets страдают тем же недостатком, что и язык Java, используемый на стороне клиента: Java относительно сложен для изучения программистами-новичками.

РНР

Последняя из рассматриваемых нами технологий на стороне сервера служит темой  данной книги: РНР. РНР был разработан в 1994 году Расмусом Лер-дорфом (Rasmus Lerdorf) с целью отслеживания тех, кто просматривал его электронное резюме, и был выпущен на следующий год под названием Personal Home Page Tools (средства разработки личной домашней страницы). Позднее в том же году он был переработан и объединен с интерпретатором форм HTML Form Interpreter, получив название PHP/FI Version 2. Популярность продукта быстро росла, и в середине 1997 года РНР перестал быть личным проектом Расмуса Лердорфа, превратившись в важную сетевую технологию. Зив Сураски (Zeev Suraski) и Энди Гутмане (Andi Gutmans) полностью переписали синтаксический анализатор, и в июне 1998 года был выпущен РНР 3..

РНР работает аналогично JSP и ASP: разделы сценария заключаются в теги <?php.. ?> и встраиваются в страницу HTML. Эти сценарии выполняются на сервере перед тем, как послать страницу броузеру, поэтому проблемы поддержки броузером РНР не существует. Однако, в отличие от ASP, РНР является независимым от платформы, и существуют различные версии для разных вариантов Windows, Unix и Linux, а также ряда веб-серверов, в том числе Apache и IIS. Определяющее значение имеет то, что он является бесплатным продуктом с открытым кодом (open source).

Преимущества обработки на стороне сервера

Обработка и  генерация веб-страниц на стороне сервера имеет ряд преимуществ перед технологиями, используемыми только на стороне клиента:

  • уменьшается поток данных в сети в результате уменьшения необходимости многократного общения броузера и сервера друг с другом;
  • способствует уменьшению времени загрузки, поскольку в итоге фактически загружается только страница HTML;
  • устраняются проблемы совместимости броузеров;
  • клиенту могут поставляться данные, которые отсутствуют на его машине;
  • обеспечивается лучшая защита данных, поскольку код невозможно просмотреть броузером.

Сравнение РНР как интерпретатора CGI и как модуля Apache