C PHP 扩展对象持久化

Posted

技术标签:

【中文标题】C PHP 扩展对象持久化【英文标题】:C PHP Extension object persistance 【发布时间】:2013-07-03 06:58:35 【问题描述】:

我为我编写的服务器应用程序开发了一个 php5 客户端扩展,到目前为止它运行良好,但它还不支持持久连接。 因为这是我想在发布第一个稳定版本之前实现的东西,所以我正在搜索有关持久性的文档并找到持久性分配例程(pemalloc、pecalloc 等)。 我无法理解的是如何在新请求时检索持久分配的对象,我的意思是,假设连接的持久 id 是:

<hostname>:<port>:<timeout>

我如何保存(或检查它是否已经创建)连接对象(它是一个 C 结构,而不是 zval 或任何与 PHP 严格相关的东西)? 给定它的 id 我以后如何检索它?

PS:我知道 PHP 持久流(我研究过 pfsockopen C 源代码),但我使用 C 客户端库,因此我无法直接访问套接字或修改 C 客户端库以使用 php 流而不是普通插座。

谢谢。

【问题讨论】:

持久连接被认为至少对于无状态 Web 服务器设计是有问题的。你为什么要实现这个?如果可能,我会尝试创建一个连接池,并尝试重新初始化和重用现有的连接池 是的,这也是一个好主意,但无论如何我都需要坚持,所以问题保持不变:) 有趣的问题,无论如何。 :) 我担心我无法为您提供更多帮助,因为您似乎已经像我一样对此了解得更多。但我添加了一个最爱,我很好奇答案会是什么样子。 你给了我一个好主意!一旦我弄清楚如何设置/获取持久对象,我会将其视为对标准单一持久连接的可能优化......所以,谢谢! ^^ 为什么不窃取会话或描述符的概念呢?启动您的持久连接作为后端进程,并传递您的不透明描述符以跟踪持久连接? 【参考方案1】:

找到了解决方案,似乎有一个“persistent_list”哈希对象,所以我可以这样做:

zend_hash_find(&EG(persistent_list), ...

查找持久数据(显然是用pemalloc分配的),以及

zend_hash_update(&EG(persistent_list), ...

保存新实例。

(在 PostgreSQL php 扩展源代码中找到这个。)

http://devzone.zend.com/446/extension-writing-part-iii-resources/#Heading8

任何对我的方法感兴趣的人,都在这里https://github.com/evilsocket/phpgibson

【讨论】:

以上是关于C PHP 扩展对象持久化的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖父对象的静态属性并让父对象访问 PHP 中的新值?

RabbitMQ的持久化

PHP 实现对象的持久层,数据库使用MySQL

PHP持久配置容器Yaconf

PHP持久配置容器Yaconf

mysqli 持久连接