如何在php中存储资源类型?它是内存中的字符串还是某种结构? 在文档中
资源是一个特殊变量,包含对外部变量的引用 资源。
它在php环境中如何工作?
答案 0 :(得分:3)
PHP实现中的基本类型ZVAL中的类型。 每种类型都是ZVAL结构(Zend值)。
我们知道
资源是一个特殊变量,包含对外部变量的引用 资源。资源是由特殊功能创建和使用的。
例如fopen
返回类型resurce。
$fp = fopen('/proc/cpuinfo', 'r');
$ fp-是资源类型,表示在php核心中按结构创建了成分数据:
struct _zend_resource {
zend_refcounted_h gc;
int handle;
int type;
void *ptr;
};
在zend_refcounted_h
-我们的标头中,它完成了内存管理并表示哈希;
handle
是一个整数,引擎在内部使用该整数将资源定位到内部资源表中。 php在创建资源过程中创建它。
type
用于将相同类型的资源重新组合在一起。这意味着我们需要调用资源的析构函数,并帮助我们找到注册的析构函数。
ptr
是我们的抽象数据。
阶段创建资源:
1.使用zend_register_list_destructors_ex()
的注册析构函数。需要清理垃圾收集器中的内存。
2.注册新资源zend_register_resource()
并将指针附加到析构函数。我们的类型返回了zend_register_list_destructors_ex()
完整示例。
static void file_destructor(zend_resource *rsrc)
{
fclose((FILE *)rsrc->ptr);
}
type = zend_register_list_destructors_ex(
file_destructor, // pointer to destructor
NULL, // pointer to destructor for persistent resource, that non deleted after end request (example BD connection resource)
"file_resource", // name
module_number // PHP extension number
);
fp = fopen("/proc/cpuinfo", "r");
file_resource = zend_register_resource((void *)fp, type);
ZVAL_RES(&my_val, file_resource);
资源类型只是引擎将不同种类的 资源(“文件”,“ gzip”甚至“ mysql连接”类型) 相同的资源表。
有关资源类型,创建,删除和使用phpinternalsbook
的更多详细信息