PHP-4 Эффективная работа


И все-таки, почему PostgreSQL?
Как перестать беспокоиться и начать работать с PostgreSQL
Функции обслуживания СУБД PostgreSQL

СУБД PostgreSQL за свою многолетнюю историю прошла достаточно длинный и тернистый путь. Но сегодня это полноценная, надежная система управления базами данных, которая одна из немногих полностью поддерживает стандарт SQL-92, механизм транзакций, контроль целостности данных, а также средства, характерные для объектно-ориентированных баз данных. Но самое важное, что в PostgreSQL корректно реализована работа с кириллицей и, в частности, аккуратно поддерживается работа с кодировкой КОИ-8Р.

совет
       PostgreSQL представляет собой проект с открытым кодом, а следовательно, и сам сервер баз данных, и многочисленные продукты на его основе вы можете получить совершенно бесплатно с сервера www.postgresql.org.

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

16.1.И все-таки, почему PostgreSQL?

Я понимаю, что у ряда читателей, привыкших к описанию в посвященных РНР книгах исключительно сервера MySQL, мой выбор может вызвать недоумение, поэтому я постараюсь познакомить вас с этой СУБД и одновременно показать, что в мире открытых систем не существует «единственно верного и правильного решения», которое полностью отметает все прочие.

Свою родословную PostgreSQL ведет от старой доброй СУБД Ingres, которая была разработана в университете Беркли (1977-1985). Ветераны Linux наверняка помнят, что на первых компакт-дисках с системой ранние версии Postgres соседствовали с исходными текстами Ingres. В те времена Ingres также была доступна в исходных текстах и являлась одним из сильных продуктов. Затем код Ingres был модифицирован компаниями Relational Technologies и Ingres Corporation, которая выпустила на его базе один из первых коммерческих реляционных серверов баз данных. Позже Ingres Corporation была поглощена Computer Associates, но для нашего повествования это уже не столь важно — именитость предка говорит сама за себя.

Чуть позже, в 1986-1994 годах, там же, в Беркли, Марк Стоунбрейкер (Mark Stone- braker) организовал команду разработчиков, которая из исходных текстов Ingres разработала объектно-реляционный сервер баз данных, который получил название Postgres. Компания Illustra приобрела вновь разработанный сервер и довела его до уровня коммерческого продукта. Позже этот сервер был приобретен компанией Informix и включен в состав Informix's Universal Server [17]. Но этот сервер имел собственный язык программирования, который не имел никакого отношения к SQL. И только к 1995 году два студента университета Беркли, Джолли Чен (Jolly Chen) и Эндрю Ю (Andrew Yu), добавили в Postgres поддержку SQL. Этот проект получил название Postgres95. Именно с этого момента Postgres начинает обретать популярность среди разработчиков.

К лету 1996 года потребность в общедоступном сервере SQL становится настолько очевидной, что формируется целая команда по доводке Postgres. К этому моменту последние участники проекта в Беркли закончили учебу и занялись другими делами. Таким образом, Беркли остался лишь символом этой СУБД. Вначале вновь образованную команду разработчиков составляли всего четыре человека, имена которых уместно упомянуть на страницах этой книги:

  • Марк Фурнье (Mark Fournier), Канада;
  • Томас Локхарт (Thomas Lockhart), США;
  • Вадим Михеев, Красноярск;
  • Брюс Момжиан (Bruce Momjan), США.

примечание
       Теперь вам, надеюсь, понятно, почему в PostgreSQL корректно организована работа с кириллической локалью и предусмотрено много приятных мелочей для построения русско- язычных баз данных — над этим проектом изначально работали «наши агенты». Лично для меня удобство работы с кириллицей было одним из важных аргументов, которые склонили меня к работе именно с этой СУБД.

Коллектив разработчиков быстро рос, и усилия, прилагаемые к отладке кода и расширению его возможностей, привели к тому, что уже к концу 1996 года проект был переименован в PostgreSQL. С одной стороны, разработчики отдали дань уважения университету Беркли, где была разработана первая версия сервера, а с другой — название отражает его ориентированность на SQL.

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

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

На сегодняшний день последняя доступная автору версия PostgreSQL — 7.1.3. Пока я пишу эти строки, сервер шуршит винчестером, заполняя индексный указатель поисковой машины mnogoSearch, разработанной, кстати, российскими умельцами и стыкующейся с РНР 4.

16.2. Как перестать беспокоиться и начать работать с PostgreSQL

Не претендуя на решение абсолютно всех проблем, которые могут возникнуть в ходе установки и освоения сервера PostgreSQL, я все же рискну предложить свою методику, которая неоднократно опробована на практике.

16.2.1. Установка сервера

Насколько сложен любой сервер SQL с точки зрения разработчика, настолько же прост PostgreSQL в установке. Если вы планируете установить новую версию, то вам достаточно извлечь из Интернета (www.postgresql.org) свежую версию системы (дальнейшее описание построено на примере версии 7.1.3).

Все эти архивы вы распаковываете в один каталог — postgresql-7.1.3. Теперь вы должны запустить программу конфигурации, которой необходимо передать следующую командную строку:

./configure --enable-locale --with-perl --with-openssl

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

Вот еще одна тонкость, которая может оказаться полезной. Как правило, серверы SQL в мире UNIX взаимодействуют с внешним миром посредством сетевых соединений TCP/IP. Это позволяет строить достаточно гибкие распределенные системы, в которых серверы объединяются в единую систему самой сетью. Так, например, в одном из моих проектов оказалось, что сервер базы данных пришлось отделить от сервера WWW и вынести на отдельную машину, отделив также от индексатора поисковой машины. Но это было достаточно серьезное приложение, в котором было необходимо обслуживать информационное хранилище объемом около 8 Гбайт.

В подавляющем же большинстве применений, таких, как Интернет-магазины или справочные системы, ресурсов одной машины вполне хватает и на работу СУБД и на обслуживание http-запросов. Но в такой ситуации организовывать TCP/IP-coединение с сервером просто ни к чему! Вы можете вполне обойтись внутренними сетевыми гнездами, так называемыми UNIX-sockets. Чтобы активизировать этот механизм, вам необходимо запустить сервер с ключом - i. Адрес гнезда, если оно активизировано, вы сможете найти в файле/tmp/.s.PGSQL5432.

Следует иметь в виду, что конкретный способ открытия базы данных в программе на РНР зависит от режима загрузки сервера PostgreSQL в самой системе. В разных ситуациях вам может потребоваться использовать разные наборы аргументов (см. табл. 16.1).

Таблица 16.1. Взаимосвязь между ключами запуска сервера PostgreSQL и РНР
Запуск сервера Postmaster Открытие базы данных в РНР / Завершение операции
postmasterpg_connect(«dbname=MyDbName»);OK
postmaster -ipg_connect(«dbname=MyDbName»);OK
postmasterpg_connect(«host=localhost dbname=MyDbName»);Unable to connect to PostgreSQL server: connectDB() failed:Is the postmaster running and accepting TCP/IP (with -i)connection at 'localhost' on port '5432'? in /path/to/file.php3 on line 20.
postmaster -i pg_connect(«host=localhost dbname=MyDbName»);OK

16.2.2. ODBC-драйверы

Для PostgreSQL существует сразу два набора ODBC-драйверов: PsqlODBC и Open- Link ODBC. Первый из них входит в состав дистрибутива сервера и доступен, как вы понимаете, в исходных текстах. При желании его вместе со всей необходимой документацией можно получить с сервера ftp://ftp.postgresql.org/pub/odbc/.

Второй набор драйверов доступен по адресу http://ww.openlinksw.com/. Он обеспечивает работу с любым клиентским программным обеспечением ODBC на самых различных платформах. Надо отметить, что эта версия распространяется преимущественно как коммерческий продукт, но на сервере вы всегда сможете найти и бесплатную версию.

16.2.3. Работа с двоичными массивами

И еще один момент. Довольно часто определяющим фактором при переходе от простых СУБД, таких как mySQL, к серьезным серверам является возможность работы с большими неструктурированными объектами, которые в просторечии именуются «блобами» (с легкой руки фирмы Borland, введшей в обиход термин Binary Large OBject — BLOB). Как правило, в таких объектах хранятся графические или звуковые файлы, которые могут занимать достаточно много места и явно не помещаются в прокрустово ложе стандартных типов данных.

Для работы с таким объектами PostgreSQL в PHP-машине предусмотрен специальный интерфеейс 1о.

примечание
       В этом отношении РНР отличается от Perl, в котором работа с подобными объектами реа- лизуется через внешние файлы.

Для применения этого механизма необходимо использовать его внутри транзакции, поскольку считывание или запись объекта может потребовать выполнения нескольких элементарных операций чтения-записи. Транзакция открывается выполнением оператора begi n и завершается операторами commit или end. Но если выполнение транзакции завершается аварийно, то ее закрытие производится операторами rollback или abort.

Вот небольшой пример, иллюстрирующий эту возможность:
<?php
       $database = pg_Connect ("dbname=jacarta") ;
       pg_exec ($database, "begin");
       $oid = pg_locreate ($database);
       echo ("$oid\n") ;
       $handle = pg_loopen ($database, $oid, "w");
       echo ("$handle\n") ;
       pg_lowrite ($handle, "gaga");
       pg_\oclose (Shandle) ;
       pg_exec ($database, "commit");
       ?>
назад
далее

Сайт управляется системой uCoz