有没有办法在php页面之间共享对象?

时间:2009-05-25 21:33:07

标签: php connection-pooling

我是php的新手,但在其他网络技术中,您可以在页面实例之间共享对象。例如,在java jsp页面中,您可以轻松拥有作为整个服务器实例的静态类存在的类。如何在PHP中执行此操作?

我没有引用会话变量(至少我不这么认为)。这更多是出于资源池的目的(可能是要共享的套接字或数据库连接等)。因此,需要在后续加载之间共享整个类,而不仅仅是我可以在会话中存储的一些原始变量。

我也考虑过做单例类,但我相信这个类只在同一页面内共享,而不是在页面之间共享。

为了使事情变得更加清晰,我正在寻找可以帮助我分享连接到服务器的套接字的东西,例如,加载该页面的所有用户都使用相同的套接字,并且没有开新的。

5 个答案:

答案 0 :(得分:15)

这有点难以回答,可能并不完全符合您的要求。

PHP建立在“无共享”架构之上。如果您的应用程序需要某种类型的状态,则必须通过其他方式执行此操作。

首先,我建议调查问题的核心..你真的需要吗?如果你认为PHP应用程序可能会死(并且丢失状态)是否可以丢失数据?

如果你必须保持状态,即使在应用程序死亡或其他情况下,你应该假设把数据放在MySQL中的最佳位置。 PHP旨在作为业务逻辑的薄层,因此我强烈推荐这一点。

如果您不关心重启后丢失数据,那么您正在寻找的问题域可能是缓存。我建议您查看memcached或者如果您使用的是apc。 APC肯定会在一台机器上为您使用Apache,但是如果您丢失了数据,您仍然需要编写应用程序代码。

如果您担心基础数据存储区(MySQL)太慢,但仍需要在重新启动后维护数据,则应该考虑这两个系统的组合。您始终可以从缓存中推送和提取数据,但只有在更新时才将数据发送到Mysql。

如果数据纯粹是用户或会话绑定,您可能只想查看会话系统。

我个人开发了一个相当大的多租户应用程序,虽然它是一个相当复杂的应用程序,但我从来不需要你正在寻找的真实状态。

更新:抱歉,我没有看到有关共享套接字的说明。您将需要一个单独的守护程序来处理这个问题,也许如果您可以进一步解释您的问题,可能还有其他方法。这是什么类型的插座?

答案 1 :(得分:12)

Web服务的Java和Web服务的解释语言(如PHP和Perl)之间存在根本区别。在Java中,您的Web服务器将具有维护状态的操作环境(即Tomcat)。使用解释型语言,对Web服务器的请求通常会生成一个新的Web服务器线程,从而为该线程(在本例中为PHP环境)加载新的操作环境。

因此,在PHP中,没有页面实例的概念。对Web服务器的每个请求都是一个全新的开始。所有类都被重新加载,因此没有类共享的概念,也没有资源池的概念,除非它是在外部实现的。

因此,实际上不可能在Web请求之间共享套接字。

答案 2 :(得分:3)

这可能是部分答案,但您可以将类的实例保存到Session变量中,并在其他时间访问它。

答案 3 :(得分:1)

大多数PHP数据库库已经使用连接池。例如,您调用pg_connect就像请求新连接一样,但如果连接字符串与已存在的连接相同,则会返回已建立的连接。如果您只关心数据库访问的池,那么您可以确认它存在于您正在使用的数据库库中。

答案 4 :(得分:0)

另一个可能的解决方案可能是将对象的数据加载到任何$ _SESSION变量,然后将其用户返回到另一个页面的对象中。 事实上,这是我将在我的项目中遵循的解决方案,直到我得到更好的解决方案。

问候!