【问题标题】:Persistent objects in CodeIgniterCodeIgniter 中的持久对象
【发布时间】:2012-10-05 18:58:06
【问题描述】:

我有一个 php 对象,我想随时访问它。我想创建一次这个对象并保持它的持久性,这样我就不必再次重新加载它。我也希望这个对象可以在我的控制器/模型等中访问。

这可以在 CodeIgniter/PHP 中不使用 session 实现吗?

或者也许使用会话,但我可以访问它的方法吗?

这个对象是使用我的 dll 文件中的 PHP COM 库创建的

这是我的对象的示例:

 $myDllObject = new COM("MyDLL.MyCLass");

【问题讨论】:

  • 您是要在 请求之间 保留 same 对象,还是只想确保在 中有一个单例对象单个请求(并且可以为每个请求创建一个新请求)?
  • 我想跨请求持久化我的对象。我想在内存中加载一个 dll 实例,并在我想要的控制器/模型等中调用它的函数

标签: php codeigniter dll com


【解决方案1】:

PHP 有一个执行模型,其中来自主机环境的每个 Web 请求都会生成一个新的、新鲜的 PHP 环境,该环境会在请求完成时被销毁。

所以简单的答案是否定的,你不能创建一个对象并在请求之间持久化它。您必须以其他方式“持久化”该对象:

  1. 通过序列化/反序列化,使用会话、数据库、APC 等键值存储、文件系统上的文件或其他方法。
  2. 通过让一个单独的长时间运行的进程保存对象,并让 PHP 对象通过一些 IPC 方法(例如共享内存、管道、套接字等)与其通信。

我对 COM 了解不多,但由于 COM 对象可以在运行进程之外创建,我怀疑可能有一些(非 PHP 特定的)方法可以连接到现有对象而不是创建新对象。 (这本质上是上面的选项 2,使用 COM 服务作为 IPC。)

稍微挖掘一下 PHP COM 库文档会发现 com_get_active_object() 函数,它可能会为您带来一个可行的解决方案。但是,您可能需要从非 PHP 资源中了解有关 COM 的更多信息。另外,阅读有关同时使用单个 COM 对象的大警告:

在 Web 服务器上下文中使用 com_get_active_object() 并不总是一个聪明的主意。大多数 COM/OLE 应用程序并非旨在同时处理多个客户端,甚至(或尤其是!)Microsoft Office。您应该阅读» Considerations for Server-Side Automation of Office 以了解有关所涉及的一般问题的更多信息。

这向我表明,创建一个在所有请求之间共享的单例 COM 对象实际上是您不想要做的!

如果这不起作用,PHP 有一个object serialization method,它允许您将对象的运行状态序列化为字符串并将其反序列化回相同的状态。您可以通过将__sleep() and __wakeup() 方法添加到您的类来自定义它。这种机制有一些怪癖,我不知道 PHP COM 库代理对象对它的支持程度。

【讨论】:

    【解决方案2】:

    我对 PHP COM 库不是很熟悉,但如果它是一个对象,你不能通过在基本控制器中创建一个对象并在那里创建它来维护它的状态。然后从您的 Base 类扩展您的其他类。

    class Base_Controller extends CI_Controller
    {
    
        public $myDllObject;
    
        public function __construct()
        {
            $this->myDllObject = new COM("MyDLL.MyCLass");
        }
    }
    

    /* MY_Controller.php 文件结束 / / 位置:./application/core/MY_Controller.php */

    示例控制器

    // ------------------------------------------------------------------------
    
    class YourController extends Base_Controller
    {
    
        public function __construct()
        {
            if (is_object($this->myDllObject))
            {
                echo 'Yep';
            }
            else 
            {
                echo 'Nope';
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      请参阅Creating Libraries 上的 CodeIgniter 文档。

      创建库后,您可以选择将其自动加载到 config/autoload.php,或者,您可以使用 $this->load->library('yourlib'); 加载库

      如果您需要在每个页面请求上创建此类的新实例,请考虑将实例化放在控制器的构造函数中。或者,create a base controller 类并将其放入该构造函数中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-18
        • 2013-12-03
        • 1970-01-01
        • 1970-01-01
        • 2011-12-25
        • 1970-01-01
        • 2011-05-07
        • 2021-04-05
        相关资源
        最近更新 更多