тип данных resource php
Тип данных resource php
Например, ресурсы используются для хранения ссылок БД и дескрипторов файлов. Стандартная реализация de facto находится в модуле MySQL, но другие модули, такие как Oracle, также используют ресурсы.
Примечание: фактически ресурсом может быть указатель на что-либо, что вам необходимо обработать в функции (например, указатель на структуру), и пользователь должен лишь передать единственную переменную ресурса в вашу функцию.
Zend-функция для регистрации вашего обработчика ресурса определяется так:
return-значение это уникальный целочисленный ID (идентификатор) вашего типа ресурса.
Обработчик уничтожения ресурса (нормального или постоянного) имеет следующий прототип:
Передаваемый rsrc это указатель но следующую структуру:
Член void *ptr это фактический указатель на ваш ресурс.
Теперь мы знаем, как начать: мы определяем наш собственный ресурс, который хотим зарегистрировать в Zend. Это простая структура с двумя целочисленными членами:
Наш обработчик уничтожения ресурса будет, вероятно, выглядеть так:
Примечание: важно подчеркнуть: Если ваш ресурс это более сложная структура, которая к тому же содержит указатели на память, выделенную в процессе работы, вы должны освободить их перед освобождением самого ресурса!
Теперь, когда мы определили
что такое наш ресурс и
обработчик уничтожения ресурса,
создать глобальную переменную с расширение, содержащую ID ресурса, чтобы можно было получить к нему доступ из любой функции
определить имя ресурса
написать обработчик уничтожения ресурса
и, наконец, зарегистрировать обработчик
return-значение это уникальный целочисленный идентификатор данного ресурса.
Возвращаемый rsrc_id уникально идентифицирует вновь зарегистрированный ресурс. Вы можете использовать макрос RETURN_RESOURE для возвращения его пользователю:
PHP Resources
Definition and Usage
In PHP, Resource is a special data type that refers to any external resource. A resource variable acts as a reference to external source of data such as stream, file, database etc. PHP uses relevent functions to create these resources. For example, fopen() function opens a disk file and its reference is stored in a resource variable.
PHP’s Zend engine uses reference conting system. As a result, a resource with zero reference count is destroyed automatically by garbage collector. Hence, memory used by resource data type need not be freed manually.
Various types of resources can be handled in a PHP script, with the help of coresponding functions. Following table shows a select list −
Resource Type Name | Created By | Destroyed By | Definition |
bzip2 | bzopen() | bzclose() | Bzip2 file |
curl | curl_init() | curl_close() | Curl session |
ftp | ftp_connect(), | ftp_close() | FTP stream |
mssql link | mssql_connect() | mssql_close() | Link to Microsoft SQL Server database |
mysql link | mysql_connect() | mysql_close() | Link to MySQL database |
mysql result | mysql_db_query(), | mysql_free_result() | MySQL result |
oci8 connection | oci_connect() | oci_close() | Connection to Oracle Database |
ODBC link | odbc_connect() | odbc_close() | Link to ODBC database |
pdf document | pdf_new() | pdf_close() | PDF document |
stream | opendir() | closedir() | Dir handle |
stream | fopen(), tmpfile() | fclose() | File handle |
socket | fclose() | Socket handle | |
xml | xml_parser_create(), | xml_parser_free() | XML parser |
zlib | gzopen() | gzclose() | gz-compressed file |
zlib.deflate | deflate_init() | None() | incremental deflate context |
zlib.inflate | inflate_init() | None() | incremental inflate context |
In this context, PHP has get_resource_type() function that returns resource type of a variable.
Syntax
To declare an object of a class we need to use new statement
Following example shows resource type of a disk file
Example
Output
This will produce following result −
Following example uses get_resource_type() function
Тип данных resource php
Например, ресурсы используются для хранения ссылок БД и дескрипторов файлов. Стандартная реализация de facto находится в модуле MySQL, но другие модули, такие как Oracle, также используют ресурсы.
Примечание: фактически ресурсом может быть указатель на что-либо, что вам необходимо обработать в функции (например, указатель на структуру), и пользователь должен лишь передать единственную переменную ресурса в вашу функцию.
Zend-функция для регистрации вашего обработчика ресурса определяется так:
return-значение это уникальный целочисленный ID (идентификатор) вашего типа ресурса.
Обработчик уничтожения ресурса (нормального или постоянного) имеет следующий прототип:
Передаваемый rsrc это указатель но следующую структуру:
Член void *ptr это фактический указатель на ваш ресурс.
Теперь мы знаем, как начать: мы определяем наш собственный ресурс, который хотим зарегистрировать в Zend. Это простая структура с двумя целочисленными членами:
Наш обработчик уничтожения ресурса будет, вероятно, выглядеть так:
Примечание: важно подчеркнуть: Если ваш ресурс это более сложная структура, которая к тому же содержит указатели на память, выделенную в процессе работы, вы должны освободить их перед освобождением самого ресурса!
Теперь, когда мы определили
что такое наш ресурс и
обработчик уничтожения ресурса,
создать глобальную переменную с расширение, содержащую ID ресурса, чтобы можно было получить к нему доступ из любой функции
определить имя ресурса
написать обработчик уничтожения ресурса
и, наконец, зарегистрировать обработчик
return-значение это уникальный целочисленный идентификатор данного ресурса.
Возвращаемый rsrc_id уникально идентифицирует вновь зарегистрированный ресурс. Вы можете использовать макрос RETURN_RESOURE для возвращения его пользователю:
Ресурсы
Например, ресурсы используются для хранения ссылок БД и дескрипторов файлов. Стандартная реализация de facto находится в модуле MySQL, но другие модули, такие как Oracle, также используют ресурсы.
Примечание: фактически ресурсом может быть указатель на что-либо, что вам необходимо обработать в функции (например, указатель на структуру), и пользователь должен лишь передать единственную переменную ресурса в вашу функцию.
Чтобы создать новый ресурс, вам необходимо зарегистрировать обработчик уничтожения ресурса. Поскольку вы можете хранить как ресурс любой вид данных, Zend должна знать, как освободить этот ресурс, когда он больше не нужен. Это делается путём регистрации в Zend вашего собственного обработчика уничтожения ресурса/destruction, который, в свою очередь, вызывается Zend-машиной, когда ваш ресурс должен быть освобождён (вручную или автоматически). Регистрация вашего обработчика ресурса в Zend возвращает вам resource type handle\дескриптор типа (этого) ресурса. Этот дескриптор нужен в дальнейшем для обеспечения вашего доступа к ресурсу этого типа и хранится в большинстве случаев в глобальной статической переменной в вашем расширении. Нет необходимости беспокоиться здесь о безопасности потока, поскольку вы регистрируете ваш обработчик ресурса только один раз при инициализации модуля.
Zend-функция для регистрации вашего обработчика ресурса определяется так:
Есть две разновидности обработчиков уничтожения ресурса, которые вы можете передавать этой функции: обработчик нормальных ресурсов и обработчик постоянных ресурсов. Постоянные ресурсы используются, например, для соединений с базами данных (БД). При регистрации ресурса обязан иметься один из этих обработчиков. Для другого обработчика просто передайте NULL.
zend_register_list_destructors_ex() принимает следующие параметры:
ld | Вызов обработчика уничтожения нормального ресурса |
pld | Вызов обработчика уничтожения постоянного ресурса |
type_name | Строка, специфицирующая имя вашего ресурса. Хорошо бы всегда специфицировать уникальное имя типа ресурса РНР, чтобы, если пользователь, например, вызовет var_dump($resource);, он получил также имя ресурса. |
module_number | module_number является доступным автоматически в вашей функции PHP_MINIT_FUNCTION, и, следовательно, вы просто передаёте его. |
return-значение это уникальный целочисленный ID (идентификатор) вашего типа ресурса.
Обработчик уничтожения ресурса (нормального или постоянного) имеет следующий прототип:
Передаваемый rsrc это указатель но следующую структуру:
Член void *ptr это фактический указатель на ваш ресурс.
Теперь мы знаем, как начать: мы определяем наш собственный ресурс, который хотим зарегистрировать в Zend. Это простая структура с двумя целочисленными членами:
Наш обработчик уничтожения ресурса будет, вероятно, выглядеть так:
Примечание: важно подчеркнуть: Если ваш ресурс это более сложная структура, которая к тому же содержит указатели на память, выделенную в процессе работы, вы должны освободить их перед освобождением самого ресурса!
Теперь, когда мы определили
что такое наш ресурс и
обработчик уничтожения ресурса,
создать глобальную переменную с расширение, содержащую ID ресурса, чтобы можно было получить к нему доступ из любой функции
определить имя ресурса
написать обработчик уничтожения ресурса
и, наконец, зарегистрировать обработчик
Для регистрации нового ресурса вы можете использовать либо функцию zend_register_resource(), либо макрос ZEND_REGISTER_RESOURE(), определённые в zend_list.h. хотя аргументы для них обоих соответствуют 1:1, лучше всегда использовать макросы для обеспечения совместимости в будущем:
return-значение это уникальный целочисленный идентификатор данного ресурса.
Возвращаемый rsrc_id уникально идентифицирует вновь зарегистрированный ресурс. Вы можете использовать макрос RETURN_RESOURE для возвращения его пользователю:
Получив тот ресурс в некоторой точке, пользователь передаёт его обратно в одну из ваших функций. Контейнер value.lval внутри контейнера zval * содержит ключ/key к вашему ресурсу и, таким образом, может быть использован для получения этого ресурса с помощью макроса ZEND_FETCH_RESOURCE:
Этот макрос не имеет return-значения. Это сделано для удобства разработчиков. Он заботится о передаче TSRMLS-аргументов, а также проверяет, может ли ресурс быть получен. Он вызывает появление сообщения-предупреждения и возвращает текущую PHP-функцию с NULL, если была проблема с получением ресурса.
Разработка расширений для PHP. Ресурсы
Ресурсы автоматически уничтожаются, когда счетчик ссылок достигает 0 (см. главу «Данные и переменные»), при уничтожении вызывается функция-деструктор, если она была указана.
Регистрация ресурса
Регистрацию ресурса можно разделить на несколько простых действий:
Помимо идентификатора типа, ресурс также может иметь человекопонятное название типа, которое является константным значением. Название типа ресурса можно определить в заголовочном файле (или в файле с кодом) расширения следующим образом:
Данное имя является не обязательным и используется для того, чтобы сделать пользовательские вывод информации/сообщений об ошибках более понятными.
Первым делом необходимо зарегистрировать свой тип ресурса с помощью одной из из следующих функций:
int zend_register_list_destructors(void (*ld)(void*), void (*pld)(void*), int module_number)
int zend_register_list_destructors_ex(rsrc_dtor_func_t ld, rsrc_dtor_func_t pld, char* res_name, int module_number)
Вторая функция, в качестве третьего аргумента, принимает человекопонятное название ресурса.
Необходимо обратить внимание, на то, что функции принимают указатели на функции-деструкторы разного типа. Первая функция принимает указатель на void функцию-деструктор, которая не принимает никаких аргументов. Вторая функция принимает на функцию функцию-деструктор со следующим прототипом:
При вызове функции в качестве единственного аргумента в нее будет передан указатель на структуру zend_rsrc_list_entry :
Функции возвращают идентификатор типа ресурса, который необходимо присвоить глобальной переменной, объявленной в самом начале. В дальнейшем этот идентификатор будет использоваться при непосредственной регистрации ресурса, а также поиске/получении ресурса по его идентификатору.
Примеры регистрации типа ресурса:
После того как зарегистрирован тип ресурса и получен его уникальный идентификатор, пришло самое время зарегистрировать ресурс. Регистрация ресурса осуществляется с помощью макроса
По сути данный макрос является синонимом к функции zend_register_resource(zval *rsrc_result, void *rsrc_pointer, int rsrc_type) :
Примеры регистрации ресурса:
Выполнение следующего кода:
Получение ресурса
Аргументы функции:
Аргумент | Описание |
---|---|
rsrc_zval | контейнер, в котором содержится идентификатор ресурса |
rsrc_id | идентификатор ресурса |
rsrc_name | человекопонятное название ресурса, используется только в сообщениях об ошибках |
found_rsrc_type | указатель на переменную, в которую будет записан идентификатор типа найденного ресурса |
num_rsrc | кол-во идентификаторов типа ресурса |
… | идентификаторы типа ресурса |
Если в функцию в качестве аргумента found_rsrc_type передан указатель на переменную, то в эту переменную будет записан идентификатор типа найденного ресурса.
После аргумента num_rsrc_types в функцию передаются идентификаторы типов, с которыми будет сравниваться идентификатор типа найденного ресурса. Как только будет найдено совпадение, функция завершит свою работу, переменной found_rsrc_type будет присвоен идентификатор найденного типа.
Внутри функции zend_fetch_resource() сравнение происходит след. образом:
Изменим пример, который был приведен при рассмотрении функции zend_list_find() :
Результат работы скрипта:
Ниже представлены макросы, обертки над функцией zend_fetch_resource() :
Аргументы макросов:
Аргумент | Описание |
---|---|
rsrc | переменная-указатель, которой будет присвоен результат поиска |
resrc_type | тип к которому будет приведен найденный ресурс |
passed_id | zval-контейнер, в котором содержится идентификатор ресурса |
default_id | идентификатор ресурса |
resource_type_name | человекопонятное название ресурса, используется только в сообщениях об ошибках |
resource_type | идентификатор типа искомого ресурса |
ZEND_FETCH_RESOURCE2(rsrc, resrc_type, passed_id, default_id, resource_type_name, resource_type1, resource_type2)
ZEND_FETCH_RESOURCE2_NO_RETURN(rsrc, resrc_type, passed_id, default_id, resource_type_name, resource_type1, resource_type2)
Аргументы макросов:
Аргумент | Описание |
---|---|
rsrc | переменная-указатель, которой будет присвоен результат поиска |
resrc_type | тип к которому будет приведен найденный ресурс |
passed_id | _zval_-контейнер, в котором содержится идентификатор ресурса |
default_id | идентификатор ресурса |
resource_type_name | человекопонятное название ресурса, используется только в сообщениях об ошибках |
resource_type1 | идентификатор типа искомого ресурса |
resource_type2 | идентификатор типа искомого ресурса |
Уничтожение ресурса
Для уничтожения ресурса вызывается функция-деструктор, если она была зарегистрирована.
Для немедленного удаления ресурса его необходимо из хэш-таблицы EG**(regular_list) :