所以,我知道PHP中的一般思想是每次加载页面时都会加载并执行整个应用程序。但是为了优化需要移植的大型面向对象的PHP应用程序... 是否可以将对象加载到可用于每个请求的内存中,而不是为每个请求重新创建?
我见过人们使用$_SESSION
变量来做这样的事情,但这似乎是a)丑陋,b)会占用服务器上的大量空间,而c)不会真的做我需要的东西,因为它是一个会话式的东西。
有某种$_ALL_SESSIONS
吗? ;)
(或者,从不同角度处理这个问题,每次使用标准Apache mod-php安装加载页面时,纯粹是静态对象加载到内存中吗?)
答案 0 :(得分:3)
也许您可以将其序列化并将其存储在memcache中?我不知道那会更快。
答案 1 :(得分:3)
您或多或少在PHP中寻找等效的ASP / IIS Application object。 AFAIK没有一个。
有EG(persistent_list),一个“对象”列表,在提供请求后没有(必然)删除。它由mysql_pconnect(),pg_pconnect()等函数使用,但是脚本代码无法直接访问它。
memchache已被提及。你能详细说明“纯静态物体”吗?
答案 2 :(得分:1)
不是默认情况下,不是。您将不得不使用一些解决方法,无论是第三方工具(memcached,DBMS等),还是内置机制(会话,序列化到文件等)是否比重新创建对象更快每条记录都取决于你。
你也可以为此编写一个PHP插件。 :)或者也许已经有一个。一个快速的谷歌搜索没有透露,但我没有尝试。
如果您决定自己写一个,那么就知道它并不像听起来那么简单。例如,Apache等Web服务器会生成多个子进程,以便并行处理请求。你必须要把数据传递给他们很棘手。更不用说正确的锁定(如果请求挂起则锁定中断),Web服务器集群的处理等等。
答案 3 :(得分:1)
你可以做的是使用CLI的CLI版本来编写一个'守护进程'应用程序,该应用程序在请求和维护状态等之间保持不变,然后有一个常规的基于Web的脚本,可以通过套接字或其他一些机制与之通信( here's one example)
答案 4 :(得分:0)
如果服务器是您自己的计算机,那么应该可以在后台运行一个可以执行“全局操作”的进程。您可以使用SOAP与它进行通信。
您只需要创建一个SOAP对象。
这是我看到真正为php创建一个长期存在的对象的唯一方法。其他一切都只是序列化。尽管如此,PHP之外可能还有一种技术。
老实说,我认为你的对象不够庞大和复杂,因此创建和填充的时间比进行SOAP调用所需的时间长。但是如果创建这个对象需要大量的数据库连接 - 那么我的想法可能会有所帮助......