如何在php中输入存储资源?是内存中的字符串还是某种结构?在文件中
资源是一个特殊的变量,包含对外部资源的引用。
它是如何在php环境中工作的?
发布于 2019-01-03 21:23:48
通过基本结构ZVAL在PHP实现中的类型。每种类型都是结构ZVAL (Zend value)。
如我们所知
资源是一个特殊的变量,包含对外部资源的引用。资源由特殊函数创建和使用。
例如,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它是我们的抽象数据。
阶段创建资源
zend_register_list_destructors_ex()注册析构函数。它需要清理垃圾收集器中的内存。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);资源类型只是引擎将不同类型的资源(类型为“file”、“gzip”甚至“mysql connection”)混合到同一个资源表中的一种方式。
有关资源类型、创建、删除和在http://www.phpinternalsbook.com/php7/internal_types/zend_resources.html中工作的更多详细信息
https://stackoverflow.com/questions/54026901
复制相似问题