Использование таблиц постоянных ресурсов
Использование таблиц постоянных ресурсов
В PHP 3.0 существует методы хранения постоянных ресурсов (ресурсов, которые сохраняются между вызовами). Один из модулей, который использует эту возможность - модуль MySQL, а также mSQL; вы можете изучить правила использования постоянных ресурсов читая код mysql.c. Следует обратить внимание на функции:
php3_mysql_do_connect |
php3_mysql_connect() |
php3_mysql_pconnect() |
Основная идея таблиц постоянных ресурсов заключается в следующем:
- Программируется модуль для работы с обычными списками ресурсов (см. секцию 9)
- Программируется дополнительные функции связи, которые проверяют, существует ли ресурс в таблице постоянных ресурсов. Если да, он регистрируется как в обычном списке ресурсов указателем на таблицу постояннвых ресурсов. После этого все должно заработать (см. 1.). Если ресурса не существует, тогда необходимо создать его, добавить в таблицу постоянных ресурсов и добавить указатель на нее в таблицу обчных ресурсов.
Если вы откроете файл mysql.c, вы заметите, что переписывать ничего не пришлось, за исключением более сложных функций связи.
Существует набор функций для работы с таблицами постоянных ресурсов, в котором функции для работы с таблицами постоянных ресурсов аналогичны функциям для работы с обычными списками ресурсов. В этом случае 'list' заменяется на 'plist':
- php3_plist_insert(ptr, type) - возвращает дескриптор созданного ресурса
- php3_plist_delete(id) - удаляет ресурс с дескриптором id
- php3_plist_find(id,*type) - возвращает указатель на ресурс с дескриптором id, устанавливает 'type'
Однако, эти функции могут оказаться бесполезными когда вы создаете постоянный модуль. Можно пользоваться тем, что постоянные таблицы ресурсов реализованы как хэш-таблицы. Например, в модулях MySQL/mSQL, когда вызывается pconnect(), создается строка на основе имени хоста, имени пользователя и его пароля и эта строка помещается в хэш-таблицу как ключ. В следующий раз когда будет вызвана pconnect() с теми же параметрами хоста, пользователя и пароля, будет сгенерирован тот же самый ключ и SQL-связь будет найдено в списке постоянных ресурсов.
Чтобы более полно понять работу функций plist* с хэш-таблицами ознакомтесь с файлами mysql.c или msql.c.
Внимание: ресурсы, предназначеные для таблицы постоянных ресурсов НЕ ДОЛЖНЫ создаваться с помощью менеджера памяти, т.е. они не должны быть созданы с использованием emalloc(), estrdup() и т.д. Вместо этого вы должные использовать обычные malloc(), strdup() и т.д. Причина этого проста: после исполнения запроса каждый участок памяти, выделенный меджером, удаляется. Следовательно не можете использовать менеджер памяти, так как список постоянных ресурсов не должен быть удален в конце сеанса.
Когда вы регистрите ресурс, который собираетесь добавить в таблицу постоянных, вы должны добавить деструкторы
для них и в таблицу постоянных ресурсов, и обычных. Дескриптор в таблице обычных ресурсов должен быть пустым.
Напротив, деструктор постоянного ресурса должен правильно освободить память, SQL-связи и т.д. Помните, что вы
обязаны предусмотреть деструктор для любого типа ресурсов, даже если он будет пустым. Помните так же о том, что
из-за того, что функции типа emalloc() не используются с постоянными ресурсами, вы не должны пользоваться в
деструкторе функциями типа efree().
Содержание раздела