首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在php中存储资源类型

如何在php中存储资源类型
EN

Stack Overflow用户
提问于 2019-01-03 17:17:59
回答 1查看 574关注 0票数 2

如何在php中输入存储资源?是内存中的字符串还是某种结构?在文件中

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

它是如何在php环境中工作的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-03 21:23:48

通过基本结构ZVAL在PHP实现中的类型。每种类型都是结构ZVAL (Zend value)。

如我们所知

资源是一个特殊的变量,包含对外部资源的引用。资源由特殊函数创建和使用。

例如,fopen返回类型resurce。

代码语言:javascript
运行
复制
$fp = fopen('/proc/cpuinfo', 'r');

$fp -是资源类型,它意味着在php内核中通过结构创建了组合数据:

代码语言:javascript
运行
复制
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()的是我们的类型

完整的例子。

代码语言:javascript
运行
复制
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中工作的更多详细信息

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54026901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档