Получение ресурса Zend без знания типа ресурса

Можно ли получить ресурсы Zend (zend_fetch_resource), не зная типа загружаемого ресурса? Если да, то как?

Примечание. Я пишу расширение PHP.


person innocenat    schedule 02.08.2010    source источник


Ответы (1)


Да, ты можешь.

zend_fetch_resource не будет работать, потому что он получает типы ресурсов, которые допустимы, и терпит неудачу, если найденный не является одним из них.

Просто используйте

void *zend_list_find(int id, int *type);

Из ресурса zval вы можете извлечь идентификатор с помощью Z_RESVAL(zval). Аргумент type будет заполнен типом найденного ресурса.

Однако я не вижу особого применения для этого, разве что для создания клона var_dump. Проблема в том, что как только вы получите произвольный ресурс, что вы собираетесь с ним делать?... В общем, вы ничего не знаете о возвращаемой структуре данных.

Вы можете получить имя ресурса напрямую с помощью:

char *zend_rsrc_list_get_rsrc_type(int resource TSRMLS_DC);
person Artefacto    schedule 02.08.2010
comment
О, спасибо. Мне нужно использовать то, что я заканчиваю расширения потока PECL (для CLI), потому что я хочу создать сервер. Но с сервером мне нужно иметь возможность передавать ресурсы между двумя потоками, и я не могу просто скопировать zval из одного потока в другой, верно? Поэтому я думаю, что могу извлечь ресурс в настоящий глобальный для хранения, а при запросе просто зарегистрировать новый ресурс zval с тем же указателем ресурса (void*). - person innocenat; 02.08.2010
comment
@Nat Это не сработает. Список ресурсов является локальной переменной потока. См. en.wikipedia.org/wiki/Inter-process_communication. - person Artefacto; 02.08.2010
comment
Что я собираюсь сделать, так это получить ресурс в исходном потоке, сохранить ресурс (в форме void*) в истинно глобальном (не Zend TSRM) и вернуть его в zval в целевом потоке. Это должно сработать, а? IPC невозможен, потому что ресурс не сериализуем, не так ли? - person innocenat; 02.08.2010
comment
@Nat Вам все равно придется синхронизировать доступ к данным, на которые указывает указатель ресурса. - person Artefacto; 02.08.2010
comment
Да, я использую мьютекс блокировки как для глобального хранения ресурсов, так и для использования ресурсов в php. Большое спасибо за помощь. - person innocenat; 02.08.2010
comment
@Artefacto on: я не вижу особого применения для этого. Случай: Ресурс создается расширением PHP, назовем его ext1. Пусть ext2 будет другим расширением, которое имеет функцию для обработки объекта в ресурсе, но не знает le_ext1 ext1, полученный при инициализации ext1 как le_ext1=zend_register_list_destructors_ex(.. ); Таким образом, ext2 не может правильно вызвать zend_fetch_resource() и получить переданный ресурс. Имеет ли это смысл ? - person A. Genchev; 07.06.2020