如何在php中存储资源类型

时间:2019-01-03 17:17:59

标签: php c

如何在php中存储资源类型?它是内存中的字符串还是某种结构? 在文档中

  

资源是一个特殊变量,包含对外部变量的引用   资源。

它在php环境中如何工作?

1 个答案:

答案 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

的更多详细信息