1

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

这可以在不使用会话的情况下在 CodeIgniter/PHP 中实现吗?

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

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

这是我的对象的示例:

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

3 回答 3

3

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。您应该阅读» Office 服务器端自动化的注意事项,以获取有关所涉及的一般问题的更多信息。

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

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

于 2012-10-15T20:54:39.993 回答
1

我对 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';
        }
    }
}
于 2012-10-15T18:48:38.877 回答
1

请参阅有关创建库的 CodeIgniter 文档。

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

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

于 2012-10-15T18:50:04.757 回答