我有一个php对象,我想随时随地访问它。我想创建一次这个对象并保持持久性,这样我就不必再次重新加载它了。此外,我希望可以在我的控制器/模型等中访问此对象。
这可以在不使用会话的情况下在CodeIgniter / PHP中实现吗?
或者可能使用会话,但我能够访问其方法吗?
此对象是使用我的dll文件中的PHP COM库创建的
以下是我的对象示例:
$myDllObject = new COM("MyDLL.MyCLass");
答案 0 :(得分:3)
PHP有一个执行模型,其中来自主机环境的每个Web请求都会生成一个新的,新的PHP环境,在请求完成时会被销毁。
所以简单的答案是否定的,你不能创建一个对象并在请求之间保持它。您必须以其他方式“持久化”对象:
我对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库代理对象有多好支持它。
答案 1 :(得分: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';
}
}
}
答案 2 :(得分:1)
请参阅Creating Libraries上的CodeIgniter文档。
创建库后,您可以选择在config/autoload.php
中自动加载库,或者,您可以使用$this->load->library('yourlib');
如果您需要在每个页面请求上创建此类的新实例,请考虑将实例化放在控制器的构造函数中。或者,create a base controller类并将其放在该构造函数中。