Учебник РНР (перевод Alexandr Pyramidin) Размещено на PHPClub.Net
Назад Вперёд

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' отображается в 'https://host/my_object', независимо от его положения в иерархии Hyperwave. объект с именем 'parent/my_object' может быть потомком объекта 'my_object' в иерархии Hyperwave, хотя в пространстве имён web это выглядит необычно, и пользователь может быть удивлён. Предотвратить это можно только выбором осмысленных имён объектов.

После принятия данного решения возникает вторая проблема. Как вызвать PHP? URL https://host/my_object не вызовет PHP-скрипт, если вы не сообщите вашему web-серверу, что нужно переписать URL на, к примеру, 'https://host/php3_script/my_object', и скрипт 'php3_script' вычислит переменную $PATH_INFO и запросит объект с именем 'my_object' с Hyperwave-сервер. Здесь есть только один недостаток, который можно легко устранить. Перезапись любого URL не позволит получить доступ к любым другим документам на web-сервере. PHP-скрипт для поиска на Hyperwave-сервере применить невозможно. Следовательно, вам понадобится как минимум второе правило перезаписи для исключения определённых URL вроде, к примеру, начинающихся с https://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 https://your.hostname/Hyperwave/name_of_object возвратит Hyperwave-объект с именем 'name_of_object'. В зависимости от типа объекта, скрипт должен реагировать соответственно. Если это collection/коллекция, он, вероятно, возвратит список потомков. Если это  документ, он возвратит mime-тип и content/содержимое. Можно добиться некоторого улучшения, если использовать машину перезаписи Apache. С точки зрения пользователя, лучше будет, если URL https://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/', будут затемнены. Итак, убедитесь, что вы не используете таких имён. Если вам нужны дополнительные директории, например, для изображений, просто добавьте ещё правила или поместите их все в одну директорию. Наконец, не забудьте включить машину перезаписи:

RewriteEngine on

Мой личный опыт показывает, что вам необходимы следующие скрипты:

  • для возвращения самого объекта

  • для поиска

  • для вашей идентификации

  • для установки вашего профиля/profile

  • по одному для каждой дополнительной функции вроде: функции показа атрибутов объекта, для показа информации о пользователях,для показа статуса сервера и т.д.

Todo/необходимо сделать

Есть и ещё несколько вещей, которые необходимо сделать:

  • hw_InsertDocument нужно разделить по hw_insertobject() и hw_putdocument().

  • Имена некоторых функций пока ещё не исправлены.

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

  • Конвертация из записи объекта в массив объекта требует обработки многочисленных атрибутов.

Содержание
hw_Array2Objrec - конвертирует атрибуты из массива объекта в запись объекта
hw_changeobject - изменяет атрибуты объекта (устарела)
hw_Children - ids объектов потомков
hw_ChildrenObj - записи объектов потомков
hw_Close - закрывает Hyperwave-соединение
hw_Connect - открывает соединение
hw_connection_info - печатает информацию о соединении с Hyperwave-сервером
hw_Cp - копирует объекты
hw_Deleteobject - удаляет объект
hw_DocByAnchor - object id объекта, принадлежащего якорю
hw_DocByAnchorObj - object record объекта, принадлежащего якорю
hw_Document_Attributes - object record hw_document'а
hw_Document_BodyTag - тэг body hw_document'а
hw_Document_Content - возвращает содержимое hw_document'а
hw_Document_SetContent - устанавливает/заменяет содержимое hw_document'а
hw_Document_Size - размер hw_document'а
hw_dummy - функция-заглушка Hyperwave
hw_EditText - запрашивает текстовый документ
hw_Error - номер ошибки
hw_ErrorMsg - возвращает сообщение об ошибке
hw_Free_Document - освобождает hw_document
hw_GetAnchors - object ids якорей документа
hw_GetAnchorsObj - object records якорей документа
hw_GetAndLock - возвращает запись объекта и блокирует объект
hw_GetChildColl - object ids коллекций потомка
hw_GetChildCollObj - object records коллекций потомка
hw_GetChildDocColl - object ids дочерних документов коллекции
hw_GetChildDocCollObj - object records дочерних документов коллекции
hw_GetObject - object record/запись объекта
hw_GetObjectByQuery - ищет объект
hw_GetObjectByQueryColl - ищет объект в коллекции
hw_GetObjectByQueryCollObj - ищет объект в коллекции
hw_GetObjectByQueryObj - ищет объект
hw_GetParents - object ids родителей
hw_GetParentsObj - object records родителей
hw_getrellink - получает ссылку из ресурса на цель относительно rootid
hw_GetRemote - получает удалённый документ
hw_GetRemoteChildren - получает потомков удалённого/remote документа
hw_GetSrcByDestObj - возвращает якоря, указывающие на объект
hw_GetText - запрашивает текстовый документ
hw_getusername - имя текущего вошедшего/logged in пользователя
hw_Identify - идентифицирует пользователя
hw_InCollections - проверяет, находятся ли ids объектов в коллекции
hw_Info - info о соединении
hw_InsColl - вставляет коллекцию/collection
hw_InsDoc - вставляет документ
hw_insertanchors - вставляет в текст только якоря
hw_InsertDocument - загружает любой документ
hw_InsertObject - вставляет object record
hw_mapid - отображает глобальный id/идентификатор в виртуальный локальный id
hw_Modifyobject - модифицирует object record
hw_Mv - перемещает объекты
hw_New_Document - создаёт новый документ
hw_Objrec2Array - конвертирует атрибуты из записи объекта в массив объекта
hw_Output_Document - печатает hw_document
hw_pConnect - делает постоянное соединение с БД
hw_PipeDocument - запрашивает любой документ
hw_Root - id объекта root
hw_setlinkroot - устанавливает id, на который вычисляются ссылки
hw_stat - возвращает status-строку
hw_Unlock - разблокирует объект
hw_Who - список текущих вошедших/logged in пользователей

Назад Оглавление Вперёд
setcookie Вверхhw_Array2Objrec