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

有没有办法在php页面之间共享对象?,php,connection-pooling,Php,Connection Pooling,我不熟悉php,但在其他web技术中,您可以在页面实例之间共享对象。例如,在JavaJSP页面中,您可以很容易地找到作为整个服务器实例的静态类存在的类。如何在php中实现这一点 我没有提到会话变量(至少我不这么认为)。这更多是为了资源池(可能是共享的套接字或数据库连接等)。因此,整个类需要在后续加载之间共享,而不仅仅是我可以存储在会话中的一些基本变量 我也研究过php单例类,但我相信该类只在同一页面内共享,而不是跨页面共享 为了让事情变得更清楚,我正在寻找一些可以帮助我共享的东西,比如说,一个连

我不熟悉php,但在其他web技术中,您可以在页面实例之间共享对象。例如,在JavaJSP页面中,您可以很容易地找到作为整个服务器实例的静态类存在的类。如何在php中实现这一点

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

我也研究过php单例类,但我相信该类只在同一页面内共享,而不是跨页面共享


为了让事情变得更清楚,我正在寻找一些可以帮助我共享的东西,比如说,一个连接到connectSocket.php页面服务器的套接字,以便加载该页面的所有用户都使用相同的套接字,而不打开新的套接字

这是一个有点难的答案,可能不是您想要的答案

PHP是建立在“无共享”架构之上的。如果在应用程序中需要某种类型的状态,则必须通过其他方式来实现

首先,我建议调查问题的核心。。你真的需要它吗?如果假设PHP应用程序可能会死亡(并失去状态),那么丢失数据可以吗

如果您必须维护该状态,即使在应用程序死亡或其他情况下,您也应该假设最好的数据存放位置是MySQL。PHP旨在作为围绕业务逻辑的一个薄层,因此我强烈建议您使用它

如果您不关心在重新启动后丢失数据,那么您正在寻找的问题域可能是缓存。如果您使用的是单机,我建议您查看。APC肯定会在一台机器上与Apache一起工作,但是如果您可能丢失数据,您仍然需要编写应用程序

如果您担心您的底层数据存储(MySQL)速度太慢,但重新启动后仍然需要维护数据,那么您应该研究这两个系统的组合。您始终可以从缓存中推拉数据,但只有在数据更新时才能将其发送到Mysql

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

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


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

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

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

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

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


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

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


问候

虽然您的答案是正确的,但通常不建议使用这些持久连接。创建新的连接通常非常便宜,这意味着您不必将所有连接保持很长时间。一般来说,我只在执行第一个查询时连接数据库,我会尽快将其删除。数据库很难扩展,PHP容易得多。不是这样,memcache呢?