Учебник PHP

         

XXXVIII. Функции Hyperwave


Введение

Hyperwave был разработан IICM в Graz. Он начинался как Hyper-G и сменил название на Hyperwave при коммерциализации (насколько помню, это было в 1996).

Hyperwave это не бесплатная программа. Текущая версия, 5.5, доступна на www.hyperwave.com. Можно запросить оценочную версию с ограниченным временем использования (30 дней).

Hyperwave это информационная система, аналогичная database (HIS, Hyperwave Information Server). Она сфокусирована на хранении и обслуживании документов. Документом может быть любой блок данных, которые могут сохраняться в файле. Каждый документ сопровождается записью объекта. Запись объекта/object record содержит метаданные документа. Метаданные это список атрибутов, который может быть расширен пользователем. Некоторые атрибуты всегда устанавливаются Hyperwave-сервером, другие могут модифицироваться пользователем.
Атрибут это пара name/value (имя/значение) в форме name=value. Полная запись объекта содержит столько пар, сколько необходимо пользователю. Имя атрибута не обязано быть уникальным, например, заголовок/title может появляться несколько раз в записи объекта. Это имеет смысл, если вы хотите специфицировать title на различных языках.


На этот случай имеется соглашение о том, что каждому значению title предшествует аббревиатура языка из двух букв с последующим двоеточием, например, 'en:Title in English' или 'ge:Titel in deutsch'. Другие атрибуты вроде описания или ключевых слов являются потенциальными кандидатами. Вы можете также заменить аббревиатуру языка любой другой строкой, отделив её двоеточием от остальной части атрибута.

Каждая запись объекта имеет строковое представление, где каждая пара name/value отделена символами новой строки. Расширение Hyperwave знает также второе представление, которое является ассоциативным массивом с именем атрибута в качестве ключа. Многоязычные значения атрибутов сами образуют другой ассоциативный массив с ключом - аббревиатурой языка. Фактически любой многоязычный атрибут образует ассоциативный массив со строкой, в качестве значения ключа, слева от двоеточия в значении атрибута. (Это ещё не полностью реализовано. Только Title, Description и Keyword атрибута считаются пока что его свойствами.)

Помимо документов, все гиперссылки, содержащиеся в документе, также хранятся как записи объекта. Гиперссылки в документе будут удалены из него и сохранены в отдельных объектах, когда документ будет вставляться в БД. Запись объекта ссылки содержит информацию о том, где она стартует и где заканчивается. Чтобы получить оригинал документа, вам нужно будет запросить документ без ссылок и список ссылок и вновь вставить их в него (функции hw_pipedocument() и hw_gettext() сделают это для вас. Преимущества отделения ссылок от объектов очевидны. Если объект, на который указывает ссылка, изменяет своё имя, ссылка легко может быть модифицирована. Документ, содержащий ссылку, вообще не будет затронут. Вы можете даже добавить ссылку в документ без его изменения.

Сказать, что hw_pipedocument() и hw_gettext() автоматически делают вставку ссылки, было бы слишком просто. Вставка ссылок предполагает определённую иерархию документов. На web-сервере это делается файловой системой, но Hyperwave имеет свою собственную иерархию, и имена не отражают позицию объекта в этой иерархии. Следовательно, создание ссылок требует прежде всего отображения из иерархии и пространства имён Hyperwave в соответствующее web-пространство имён web-иерархии.
Принципиальное отличие Hyperwave от web в том, что имеется ясное различие именами и иерархией Hyperwave. Имя не содержит никакой информации о позиции объекта в иерархии. В web - имя содержит также и информацию о том, где объект размещён в иерархии. Это даёт два различных способа отображения. Либо иерархия и имя Hyperwave Hyperwave-объекта отражаются в URL, либо только имя. Для упрощения используется второй подход. Hyperwave-объект с именем 'my_object' отображается в 'http://host/my_object', независимо от его положения в иерархии Hyperwave. объект с именем 'parent/my_object' может быть потомком объекта 'my_object' в иерархии Hyperwave, хотя в пространстве имён web это выглядит необычно, и пользователь может быть удивлён. Предотвратить это можно только выбором осмысленных имён объектов.

После принятия данного решения возникает вторая проблема. Как вызвать PHP? URL http://host/my_object не вызовет PHP-скрипт, если вы не сообщите вашему web-серверу, что нужно переписать URL на, к примеру, 'http://host/php3_script/my_object', и скрипт 'php3_script' вычислит переменную $PATH_INFO и запросит объект с именем 'my_object' с Hyperwave-сервер. Здесь есть только один недостаток, который можно легко устранить. Перезапись любого URL не позволит получить доступ к любым другим документам на web-сервере. PHP-скрипт для поиска на Hyperwave-сервере применить невозможно. Следовательно, вам понадобится как минимум второе правило перезаписи для исключения определённых URL вроде, к примеру, начинающихся с http://host/Hyperwave. Это будет разделением пространства имён между web и Hyperwave-сервером.

Основываясь на вышеприведённом механизме, ссылки вставляются в документы.

Это несколько усложняется, если PHP запущен не как серверный модуль или CGI-скрипт, а как отдельное приложение, например, для дампа содержимого Hyperwave-сервера на CD-ROM. В таком случае имеет смысл сохранить иерархию Hyperwave и отобразить её в файловую систему. Это конфликтует с именами объектов, если они отражают свою собственную иерархию (например, избрав имена, включающие '/'). Следовательно, '/' должен быть заменён другим символом, например, '_'.

Сетевой протокол для соединения с Hyperwave-сервером называется HG-CSP (Hyper-G Client/Server Protocol). Он основан на сообщениях для инициации определённых действий, например, получения записи объекта. В ранних версиях Hyperwave Server предоставлялись два клиента (Harmony, Amadeus) для соединения с сервером. Они были убраны при коммерциализации Hyperwave. В качестве замены был предоставлен так называемый wavemaster. Это wavemaster является чем-то вроде конвертера протоколов из HTTP в HG-CSP. Идея состоит в том, чтобы делать всё администрирование БД и визуализацию документов через web-интерфейс. Wavemaster реализует набор заглушек/placeholders для определённых акций, чтобы специализировать интерфейс. Этот набор заглушек называется PLACE Language. В PLACE отсутствуют многие возможности реального языка программирования, и любое расширение его только расширяет список заглушек. Это привело к использованию JavaScript, IMO которого не делает жизнь легче.

Добавление поддержки Hyperwave в PHP должно заполнить отсутствующий интерфейс специализации. Он реализует все сообщения, как определено HG-CSP, но предоставляет также и более мощные команды для, например, запрашивания полных документов.

Hyperwave имеет свою собственную терминологию для именования определённых блоков информации. Она была широко использована и расширена. Почти все функции оперируют с данными одного из следующих типов.

  • ID объекта: Уникальное целочисленное значение для каждого объекта в Hyperwave-сервере. Это также один из атрибутов записи объекта (ObjectID). ids объектов часто используются как параметр ввода для специфицирования объекта.

  • Запись объекта/object record: Строка с парами атрибут-значение в форме attribute=value. Пары разделены символами возврата каретки. Запись объекта можно легко конвертировать в массив объекта функцией hw_object2array(). Несколько функций возвращают записи объектов. Имена таких функций заканчиваются на obj.

  • массив объекта: Ассоциированный массив со всеми атрибутами объекта. Ключом является имя атрибута. Если атрибут появляется более чем однократно в записи объекта, это даст другой ассоциированный или индексированный массив. Атрибуты, зависящие от языка (вроде title, keyword, description), сформируют ассоциативный массив с ключами - аббревиатурами языков. Все иные множественные атрибуты сформируют индексированный массив. Функции PHP никогда не возвращают массивы объектов.

  • hw_document: Это совершенно новый тип данных, содержащий реальный документ, например, HTML, PDF etc. Он оптимизирован для HTML-документов, но может использоваться для любого формата.

Некоторые функции, возвращающие массив записей объекта, возвращают также ассоциативный массив со статистической информацией о нём. Этот массив является последним элементом массива записей объекта. Статистический массив содержит следующие вхождения:

Hidden

Количество записей объектов с атрибутом PresentationHints, установленным в Hidden.

CollectionHead

Количество записей объектов с атрибутом PresentationHints, установленным в CollectionHead.

FullCollectionHead

Количество записей объектов с атрибутом PresentationHints, установленным в FullCollectionHead.

CollectionHeadNr

Индекс в массиве записей объекта с атрибутом PresentationHints, установленным в CollectionHead.

FullCollectionHeadNr

Индекс в массиве записей объекта с атрибутом PresentationHints, установленным в FullCollectionHead.

Total

Всего: Количество записей объекта.


Интеграция с Apache

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

Поскольку PHP с поддержкой Hyperwave, встроенный в Apache, предполагается заменить Hyperwave-решением на базе Wavemaster, я буду считать, что Apache-сервер будет работать только как Hyperwave web-интерфейс. Это не обязательно, но упрощает конфигурацию.
Концепция довольно проста. Прежде всего вам необходим PHP-скрипт, вычисляющий переменную PATH_INFO и рассматривающий её значение как имя Hyperwave-объекта. Назовём этот скрипт 'Hyperwave'. URL http://your.hostname/Hyperwave/name_of_object возвратит Hyperwave-объект с именем 'name_of_object'. В зависимости от типа объекта, скрипт должен реагировать соответственно. Если это collection/коллекция, он, вероятно, возвратит список потомков. Если это  документ, он возвратит mime-тип и content/содержимое. Можно добиться некоторого улучшения, если использовать машину перезаписи Apache. С точки зрения пользователя, лучше будет, если URL http://your.hostname/name_of_object возвратит объект.

Правило перезаписи довольно лёгкое:
RewriteRule ^/(.*) /usr/local/apache/htdocs/HyperWave/$1 [L]

Теперь каждый URL имеет отношение к объекту на Hyperwave-сервере. Это облегчает решение проблемы. Нет иного способа выполнить скрипт, например, для поиска, кроме 'Hyperwave'-скрипта. Это можно решить с помощью другого правила перезаписи, наподобие следующего:

RewriteRule ^/hw/(.*) /usr/local/apache/htdocs/hw/$1 [L]

Это зарезервирует директорию /usr/local/apache/htdocs/hw для дополнительных скриптов и других файлов. Просто убедитесь, что это правило вычисляется до вышеприведённого. Здесь есть один маленький недостаток: все Hyperwave-объекты, чьи имена начинаются с 'hw/', будут затемнены. Итак, убедитесь, что вы не используете таких имён. Если вам нужны дополнительные директории, например, для изображений, просто добавьте ещё правила или поместите их все в одну директорию. Наконец, не забудьте включить машину перезаписи:

Содержание раздела