Что такое РНР?
Архитектура РНР
Особенности PHP как средства разработки
Совместимость с другими технологиями
Переносимость
Проекты Open Source
Производительность
Нужен ли вам РНР?
Как построена эта книга
Типографские соглашения
От издательства
В то время как успехи некоторых проектов открытого программного обеспечения,
таких как Linux или Apache, на устах у всех, развитие РНР прошло незамеченным
«широкими массами общественности», хотя сама технология сегодня используется весьма широко. Более того, по некоторым оценкам, РНР сегодня является наиболее популярной технологией динамической генерации HTML-страниц. Для
весьма специализированного продукта такой успех выглядит достаточно впечатляющим!
Ряд исследователей утверждает, что популярность РНР непрерывно растет, и немалую роль в этом сыграл выход версии РНР 4.0. Это привело и к коммерциализации РНР: его поддержка была включена в коммерческий защищенный web-сервер
Stronghold, в некоторые дистрибутивы Linux, но что еще более удивительно — была
создана специализированная коммерческая компания Zend Technologies, которая
взяла на себя обязанности по сопровождению и расширению РНР.
РНР посвящено более 20 книг на английском языке и порядка 5-6 на русском
[14], [9], [10], [15]. Не умаляя достоинств вышедших изданий, отмечу, что они рассчитаны на читателя, уже работающего с РНР, и не содержат материала для начинающих и собственно руководства по языку программирования. Кроме того, я с удивлением обнаружил, что заголовок РНР 4 в большинстве книг является только
рекламным лозунгом, а большинство примеров написано на РНР 3!
Поэтому я взял на себя смелость познакомить широкие читательские массы с программированием на РНР 4, рассчитывая, что эта информация нужна отечественным разработчикам информационных систем и web-серверов. Вся книга написана
исключительно с использованием РНР 4.0.5, и в ней нет ни строчки устаревшего
кода. В ходе отладки примеров, приводимых в книге, выяснилось, что документация к РНР содержит ряд ошибок и неточностей. Возможно, и я не всегда правильно понимаю «дух РНР», но мои примеры по крайней мере работают...
РНР (РНР Hypertext Processor) представляет собой язык программирования,
используемый на стороне web-сервера для динамической генерации HTML-страниц. Основная идея, положенная в основу данной технологии, может быть сфор-
мулирована следующим образом. Web-серверы Internet и Intranet становятся все
более сложными, достигая и превышая пределы статических HTML-страниц. Современные web-серверы все чаще выступают в роли интерактивной платформы,
ориентированной на выполнение транзакций, позволяющих решать задачи электронной коммерции, разнообразных информационных систем и формирования
коллективных вычислительных сред. Наиболее критическим условием для решения этих задач является наличие удобной технологии генерации динамического
содержимого web-страниц.
Разработчики, и я в их числе, традиционно используют для построения динамических страниц сценарии CGI (Common Gateway Interface), которые обеспечивают ввод данных от пользователя, обработку запросов к базам данных и генерацию
выходных документов в виде HTML-страниц. Но так как CGI-программы представляют собой отдельные процессы, запускаемые на выполнение по мере поступления запросов от пользователей, степень масштабирования систем, построенных
на их основе, достаточно ограничена: вы легко можете исчерпать всю доступную
вам оперативную память и ресурсы процессора.
примечание
Конечно, все познается в сравнении. Для обслуживания телефонного справочника организации на две-три тысячи номеров вам окажется достаточно «старушки
486DX4-100 с 16 Мбайт оперативной памяти.
Чтобы преодолеть это ограничение и отказаться от непрерывного вызова внешних
программ, Расмус Лердорф (Rasmus Lerdorf) из Торонто в 1994 году разработал
набор макросов, встраиваемых сервером WWW в генерируемые HTML-страницы.
После того как Расмус перевел свою разработку в категорию открытого программного обеспечения, его идеи были «подхвачены миллионами» и программисты всего мира стали дорабатывать и расширять систему. Через три года, в 1997 году, Зиив
Сураски (Zeev Suraski) и Энди Гутмане (Andi Gutmans) из Израиля полностью
переписали код ядра РНР и преобразовали его в полноценный язык программирования. Нынешняя версия 4.0 представляет собой результат очередной переработки, направленной на устранение выявленных ошибок и шероховатостей. Но
этим дело не исчерпывается. Новая версия имеет несколько полезных нововведений, которые превращают ее в инструмент, действительно пригодный для построения серьезных приложений.
Применение PHP-технологии предполагает наличие трехкомпонентной архитектуры (рис. 1), которая реализуется настолько ненавязчиво, что большинство разработчиков даже не подозревает о ее существовании! Первым компонентом выступает тонкий клиент, которым является программа-навигатор. Вторым, проме-
жуточным компонентом, является РНР и web-сервер, которые вместе выступают
в роли сервера приложений. И наконец, третий компонент — это сервер базы данных, обеспечивающий хранение и обработку данных.
Рис. 1. Трехкомпонентная архитектура информационных систем на основе Интернет/Интранет-технологий
Программы на РНР часто включаются в состав HTML-страниц и разбираются на
стороне сервера, в результате чего программе-навигатору передается готовый
HTML-код. Подробнее это рассматривается в главе 3, а пока что взгляните на простейшую программу:
<? echo «Привет от РНР!»;?>
Такой метод используется при написании небольших фрагментов, с которых, скорее всего, вы и начнете практическое использование РНР. Более сложные приложения используют внешние библиотеки и программы, что позволяет лучше обеспечить структурирование задач.
В состав дистрибутива РНР 4 входит немало библиотек процедур и функций, которые упрощают генерацию страниц во многих типовых ситуациях, что позволяет
разработчикам сосредоточиться на решении прикладных задач пользователя и не
думать о рутине. В результате не только сокращаются сроки разработки приложений, но и упрощается процесс сопровождения прикладного программного обеспечения.
Вовсе не обязательно использовать РНР только как средство разработки динамических web-страниц. Вы можете скомпилировать РНР как автономный интерпретатор и использовать его для написания несложных программ общего назначения.
Вы можете, например, использовать РНР для сбора статистики о работе той или
иной базы данных и ежедневно отправлять отчет по электронной почте. Начиная
с версии 4.0 ядро языка может быть интегрировано в другие системы.
примечание
Ходят упорные слухи, что уже в ближайшем будущем РНР будет интегрирован в СУБД
MySQL в виде хранимой процедуры.
Сегодня сроки разработки web-приложений измеряются днями или неделями. Времена динозавров, разработка которых требовала нескольких лет, ушли в прошлое.
Впрочем, эпоха web-проектов этого времени просто не застала и стандарты здесь
совсем другие. Многочисленные конкурирующие коллективы разработчиков
непрерывно борются за сокращение сроков проектирования и требуют соответствующей поддержки со стороны инструментального программного обеспечения.
Новые возможности WWW-технологий заставили разработчиков информационных систем пересмотреть требования к используемым технологиям и методам.
Выбор правильной технологии является критичным для успеха всей разработки,
особенно в тех ситуациях, когда вы работаете «на переднем крае». К числу основных требований к «правильной технологии» относятся: функциональные возможности, совместимость, переносимость и производительность.
Основное преимущество РНР заключается в том, что он легко устанавливается на
большинство платформ в отличие от многих коммерческих продуктов. Кроме того,
РНР значительно опережает конкурентов — ASP, Mod_Perl и ColdFusion — по
меньшей мере на год. В течение нескольких лет РНР интенсивно расширяется и интегрирует все новые и новые механизмы и возможности.
Конечно, РНР не царит в гордом одиночестве. Существует Perl, представляющий
собой язык общего назначения, полноценные среды проектирования и исполнения
Java, интегрируемые средства Visual Basic Script и JSscript. Но РНР является
единственной системой, которая разработана специально для решения задач проектирования WWW-систем. Кроме того, в рамках проектирования web-серверов вы не столкнетесь с задачей, которая не могла бы быть решена исключительно
средствами РНР. В отличие от его конкурентов РНР лишен избыточности и «за-точен» исключительно на WWW, что позволяет решать задачи на нем легче и
быстрее.
Синтаксис и грамматика РНР во многом заимствованы у Си, а вот все те штучки,
которые мешают жить программистам — указатели, выделение и освобождение
памяти, строгая типизация, — из него, по примеру Perl, исключены. Программистам, знакомым с Си, Perl [3] или Java, для освоения РНР достаточно нескольких
дней. А прочитав эту книгу, вы сможете уже через пару дней создать собственное
приложение с небольшой базой данных.
Важной чертой РНР является его совместимость с огромным количеством других
систем и продуктов. Главным для нас является уже упоминавшаяся выше поддержка собственных интерфейсов разнообразных серверов баз данных, начиная
от открытых проектов, таких как MySQL или PostgreSQL, и заканчивая мощными
коммерческими программными комплексами — Oracle, SQL Server, DB2 и т. д.
примечание
Использование оригинальных интерфейсов серверов баз данных обеспечивает лучшую
производительность и более качественное управление со стороны РНР по сравнению
с многослойной архитектурой на основе таких средств, как ODBC (который используется
для серверов, недоступных для непосредственного управления).
Но одними СУБД дело не ограничивается. РНР поддерживает многие современные протоколы Интернета: ШАР, FTP, POP, XML, WDDX, LDAP, NIS и SNMP.
Кроме того, расширяемость языка позволяет вам легко включить в обработку специализированные форматы или заставить ваши приложения понимать различные
протоколы. Все это реализуется «в одном флаконе» дистрибутива и не требует приобретения дорогостоящих модулей сторонних разработчиков.
Обычно упоминание о переносимости вызывает в памяти образ языка Java, который изначально рекламировался как тотальное решение этой проблемы. Но на-
чиная с версии 4.0 РНР точно так же интегрируется в разнообразные WWW-серверы: iPlanet/Netscape Enterprise Server, IIS, Apache, Zeus, fhttpd и т. д. и т. п.
Реальная независимость от вычислительной платформы всегда была сильным аргументом в пользу РНР: сегодня он работает на всех популярных UNIX-платформах, в Windows, MacOS и даже в OS/2.
Сегодня всем уже очевидно, что переносимость является ключом к обеспечению
масштабируемости приложений. Вы можете запускать одно и то же приложение
как на маломощной машинке 486DX-4/100m, так и на многопроцессорном Onix от
Silicon Graphics, не задумываясь об особенностях той или иной платформы. Кроме
того, применяя РНР, вы можете эффективно использовать преимущества кластерной технологии, начиная от PVM и заканчивая решениями CISCO.
Поддержка многочисленных платформ не в последнюю очередь зависит от того,
что РНР поставляется в исходных текстах. Любой достаточно квалифицированный программист может перенести РНР на новую операционную систему. А выполненные модификации ядра системы достаточно быстро становятся доступными всему программистскому сообществу.
Вообще говоря, использование открытого программного обеспечения (Open Source)
предоставляет корпоративным информационным системам несколько существенных преимуществ. Доступность исходного текста делает возможным проведение сертификации на предмет отсутствия программных закладок в коде программ. Если
кто-либо из пользователей такого продукта все же обнаружит бреши в защите продукта, они, как правило, ликвидируются в течение нескольких часов или дней.
Кроме того, наличие полного исходного кода позволяет вам модифицировать его в
соответствии с собственными нуждами, без оглядки на то, что скажет какой-нибудь
заморский «авторитет», следовательно, вы больше не зависите от иностранного
производителя программного комплекса.
Второй аспект заключается в том, что в вашем распоряжении оказывается широчайшая сеть добровольных бесплатных консультантов. Разработчики РНР принимают активное участие в специализированных форумах, конференциях USENET
и IRC-каналах. Использование технологии открытого кода позволяет вам удерживаться на переднем крае технологии, что позволяет строить эффективную стратегию компании, динамично адаптирующуюся к вновь возникающим требованиям со стороны заказчиков.
Прошлая версия РНР 3.0 имела производительность достаточную для функционирования средних, не слишком интенсивно использующихся WWW-приложений. Масштабирование РНР узлов представляло собой довольно серьезную проблему. Однако новая версия 4.0 работает, без преувеличения, в несколько раз
быстрее предшественника, что позволяет получить действительно впечатляющие результаты. А если добавить к этому возможности современных многопроцессорных систем, то от открывающихся перспектив захватывает дух! Кроме
того, уже сегодня вы можете воспользоваться модулем Zend Optimizer, который
выполняет оптимизацию кода исполняемых приложений PHP-машины. Как правило, выполнение приложения с использованием этого модуля ускоряется в полтора-два раза.
Пристально вглядываясь в армию серверов, использующих PHP-машины, особое
внимание обращаешь на рост популярности РНР после появления версии 4.0. Сегодня РНР позволяет реализовать возлагаемые на него надежды: это отличное средство быстрого проектирования надежных и быстро работающих WWW-приложений. Если ваши информационные технологии основаны на WWW-приложениях,
вы должны рассмотреть РНР как один из серьезных кандидатов на роль основного
инструментального средства.
Давно прошли те дни, когда серьезный бизнес мог ориентироваться на набор статических HTML-страничек. И чтобы в полной мере овладеть информационными
потоками, которые вы хотите донести до пользователей, вам необходимо использовать современные технологические решения, позволяющие быстро проектировать надежные приложения. Одним из наиболее мощных инструментов для этого
и является РНР.
Начиная туристическую поездку, вы прежде всего знакомитесь с картой местности, куда вы собираетесь отправиться. Так же и с новой книгой. По большому счету, это попытка погрузиться в мир, придуманный автором. Так что в этом параграфе я попробую представить карту этой книги, которая, конечно же, не заменяет
содержание, но может служить в качестве путеводителя.
Глава 1 содержит подробные инструкции по установке РНР и его стыковке с сервером Apache. Изложение основано на ОС Linux как самой популярной при построении Интернет/Интранет-серверов.
Глава 2 предназначена для начинающих пользователей РНР и содержит описание
нескольких простых примеров, демонстрирующих возможности системы.
Глава 3 содержит начальные сведения о построении программы на РНР. В ней
описываются: синтаксис операторов, составляющих программу, типы данных и выражения, используемые в РНР.
Развивает эту тему глава 4, в которой рассматриваются способы определения констант и переменных РНР, а также перечисляются все предопределенные и заимствуемые из окружающей среды специальные переменные.
Глава 5 посвящена операторам языка РНР. Продвинутые программисты, владеющие Си или Perl, найдут в этой главе не слишком много новой информации, но
несколько моментов могут оказаться весьма полезными, поскольку наследие -
наследием, но есть и несколько весьма серьезных отличий.
В Главе 6 читатель найдет детальное обсуждение управляющих конструкций языка, среди которых начинающий программист на РНР обнаружит немало нового
и неизведанного.
Глава 7завершает обсуждение общих вопросов работы в РНР. Она посвящена рассмотрению объектной модели РНР. Конечно, использование объектно-ориентированного подхода нельзя рассматривать как самоцель, но в ряде ситуаций он обладает существенными преимуществами. Кроме того, многие библиотеки процедур
и функций РНР реализованы именно как объекты.
Глава 8 содержит описание функций, ориентированных на работу с массивами. В РНР массивы имеют столь же большое значение, как и в Perl, и являются
одним из наиболее интенсивно и разнообразно используемых типов данных.
Глава 9 посвящена обсуждению механизмов, позволяющих «на лету» создавать
функции и использовать их в программе. Конечно, чтобы в полной мере ощутить
прелесть этих средств, от читателя требуется некоторый опыт работы с Лиспом,
откуда, без сомнения, заимствованы рассматриваемые в главе приемы. Тем не менее для понимания механизма работы PHP-машины и «регулировки» ее в соответствии с собственными замыслами знать этот материал необходимо.
Глава 10 рассматривает различные аспекты взаимодействия PHP-машины с внешним миром, который для UNIX воплощен в виде файлов. Большая часть описываемых средств напрямую связана со стандартной библиотекой Си, но есть несколько полезных процедур, которые вы найдете только в РНР и которые вам, без
сомнения, понравятся.
Следующая глава, по моему опыту, является жизненно необходимой для отечественного разработчика, и как раз этого материала вы не найдете ни в одной
книге по РНР. В Главе 11 обсуждаются вопросы эффективного использования кириллицы в гетерогенных средах, характерным примером которых является Интернет. В главе рассматриваются и вопросы локализации, и приемы эффективной
перекодировки текстовых строк, встроенные в РНР, и даже вопросы построения
многоязычных программ с поддержкой стандартного механизма NLS.
Глава 12 посвящена вопросам интеграции в PHP-программы разнообразных почтовых функций. Освоив этот материал, вы сможете не только составить конкуренцию mail.ru, но и реализовать более тонкие и интересные возможности IMAP-
и РОР-серверов.
В Главе 13 обсуждаются вопросы представления даты и времени. Как вы увидите,
это далеко не тривиальная задача.
Глава 14, которая посвящена автоматизации обработки ошибок
в пользовательских программах. Из нее вы узнаете, как предотвратить аварийное
завершение программы, как установить собственный обработчик ошибочных ситуаций и как сгенерировать собственные события, которые обрабатываются как
ошибки РНР-машиной.
Глава 15 предназначена для той категории читателей, которой недостаточно «просто» генерировать странички с помощью РНР и которые хотят получить контроль
над HTTP-протоколом, используемым сервером. В этой главе рассматриваются
вопросы формирования специальных заголовков, отправляемых сервером, установки и считывания «плюшек», а также работа механизма передачи пользовательских файлов на сервер.
В Главе 16 рассматриваются вопросы организации доступа к ресурсам СУБД
PostgreSQL из программа на РНР. Почему предпочтение отдано именно этому
серверу баз данных? По нескольким причинам. Во-первых, о PostgreSQL у нас
пишут очень мало, хотя она достаточно популярна у разработчиков. Во-вторых,
это полноценный SQL-сервер, в котором реализован язык управления SQL-92 (без
каких-либо урезаний или модификации). В-третьих, это золотая середина между
быстрым, но урезанным по возможностям сервером MySQL и могучим и неповоротливым Oracle. Большая часть разрабатываемых мною систем базируется как
раз на PostgreSQL, и я надеюсь, что вы эту СУБД также оцените.
Глава 17 посвящена вопросам динамической генерации изображений, которые за-
нимают сегодня существенную долю в общем объеме информации, представляемой web-узлами. В этой главе подробно рассматриваются все функции и приво-
дится несколько полезных примеров практического использования графики.
Глава 18 посвящена практическому использованию встроенной в РНР-машину
поддержки XML. На практическом примере, упрощающем подготовку новостной
информации для сайта, показывается, как эффективно использовать SAX-анализаторы, построенные на базе библиотеки Expat.
Продолжает эту тему Глава 19, в которой содержится описание приемов работы
с WDDX — расширением XML, ориентированным на межплатформенный обмен
данными. В отличие от подавляющего большинства книг в этой главе приведен
полностью законченный пример, показывающий, как же все-таки необходимо сохранить данные, а потом загрузить их в программу.
И в завершение обратите внимание на Главу 20, посвященную вопросам обеспечения безопасности как самих PHP-программ, так и сетевых ресурсов, построенных
на основе PHP-машины. Впрочем, главный тезис главы полезно иметь в виду с самого начала работы с книгой: не теряйте бдительности!
Нет ничего хуже и скучнее, чем читать «гладкую» книгу, автор которой полагает,
что весь приведенный в ней материал равно интересен всем категориям читателей. Поэтому я постарался выделить отдельные фрагменты, которые, по моему
мнению, заслуживают большего или меньшего внимания.
примечание
Вот таким образом я выделил в книге некоторые тонкости, которые отражают мой личный взгляд на обсуждаемые вопросы и являются либо спорными, либо слишком тонкими
материями для начинающих программистов. При первом прочтении книги эти участки
вы можете безболезненно пропускать.
совет
Так на протяжении книги будут отмечены полезные советы и различные более или менее
хитрые приемы.
внимание
Некоторые моменты представляются мне принципиально важными, поэтому они выделены более «навязчивым» образом. С другой стороны, эти параграфы представляют интерес в основном для начинающих.
Ваши замечания, предложения, вопросы отправляйте по адресу электронной почты comp@piter.com (издательство «Питер», компьютерная редакция).
Мы будем рады узнать ваше мнение!
Все исходные тексты, приведенные в книге, вы можете найти по адресу http://
www.piter.com/download.
На web-сайте издательства http://www.piter.com/ вы найдете подробную информацию о наших книгах.
|