| ||||||||||||||||||||||||||||||||||||||
РесурсыРесурсы это особый вид данных в PHP. Термин resources\ресурсы означает не к какой-то определённый вид данных, а абстрактный метод обслуживания любого вида информации. Ресурсы хранятся в особом списке ресурсов внутри Zend. Каждое вхождение этого списка имеет соответствующее определение, которое указывает вид ресурса, на который оно ссылается. Zend внутренне обслуживает все ссылки на этот ресурс. Прямой доступ к ресурсу невозможен - это делается только через предоставляемый API. Когда все ссылки на специфический ресурс потеряны, вызывается соответствующая shutdown-функция. Например, ресурсы используются для хранения ссылок БД и дескрипторов файлов. Стандартная реализация de facto находится в модуле MySQL, но другие модули, такие как Oracle, также используют ресурсы.
Чтобы создать новый ресурс, вам необходимо зарегистрировать обработчик уничтожения ресурса. Поскольку вы можете хранить как ресурс любой вид данных, Zend должна знать, как освободить этот ресурс, когда он больше не нужен. Это делается путём регистрации в Zend вашего собственного обработчика уничтожения ресурса/destruction, который, в свою очередь, вызывается Zend-машиной, когда ваш ресурс должен быть освобождён (вручную или автоматически). Регистрация вашего обработчика ресурса в Zend возвращает вам resource type handle\дескриптор типа (этого) ресурса. Этот дескриптор нужен в дальнейшем для обеспечения вашего доступа к ресурсу этого типа и хранится в большинстве случаев в глобальной статической переменной в вашем расширении. Нет необходимости беспокоиться здесь о безопасности потока, поскольку вы регистрируете ваш обработчик ресурса только один раз при инициализации модуля. Zend-функция для регистрации вашего обработчика ресурса определяется так:
Есть две разновидности обработчиков уничтожения ресурса, которые вы можете передавать этой функции: обработчик нормальных ресурсов и обработчик постоянных ресурсов. Постоянные ресурсы используются, например, для соединений с базами данных (БД). При регистрации ресурса обязан иметься один из этих обработчиков. Для другого обработчика просто передайте NULL. zend_register_list_destructors_ex() принимает следующие параметры:
return-значение это уникальный целочисленный ID (идентификатор) вашего типа ресурса. Обработчик уничтожения ресурса (нормального или постоянного) имеет следующий прототип:
Передаваемый rsrc это указатель но следующую структуру:
Член void *ptr это фактический указатель на ваш ресурс. Теперь мы знаем, как начать: мы определяем наш собственный ресурс, который хотим зарегистрировать в Zend. Это простая структура с двумя целочисленными членами:
Наш обработчик уничтожения ресурса будет, вероятно, выглядеть так:
Теперь, когда мы определили
Для регистрации нового ресурса вы можете использовать либо функцию zend_register_resource(), либо макрос ZEND_REGISTER_RESOURE(), определённые в zend_list.h. хотя аргументы для них обоих соответствуют 1:1, лучше всегда использовать макросы для обеспечения совместимости в будущем:
return-значение это уникальный целочисленный идентификатор данного ресурса. Когда вы регистрируете новый ресурс, он вставляется во внутренний список Zend, а результат просто хранится в данном zval * -контейнере:
Возвращаемый rsrc_id уникально идентифицирует вновь зарегистрированный ресурс. Вы можете использовать макрос RETURN_RESOURE для возвращения его пользователю:
Теперь Zend отслеживает все обращения к данному ресурсу. Как только
все ссылки на данный ресурс будут утеряны, вызывается обработчик уничтожения
ресурса, зарегистрированный ранее для данного ресурса. Получив тот ресурс в некоторой точке, пользователь передаёт его обратно в одну из ваших функций. Контейнер value.lval внутри контейнера zval * содержит ключ/key к вашему ресурсу и, таким образом, может быть использован для получения этого ресурса с помощью макроса ZEND_FETCH_RESOURCE:
Этот макрос не имеет return-значения. Это сделано для удобства разработчиков. Он заботится о передаче TSRMLS-аргументов, а также проверяет, может ли ресурс быть получен. Он вызывает появление сообщения-предупреждения и возвращает текущую PHP-функцию с NULL, если была проблема с получением ресурса. Чтобы форсировать удаление ресурса из списка, используйте функцию zend_list_delete(). | ||||||||||||||||||||||||||||||||||||||
|