2009-05-25 119 views
11

我是PHP的新手,但在其他Web技术中,您可以在页面实例之间共享对象。例如,在java jsp页面中,您可以轻松地将类存储为整个服务器实例的静态类。如何在PHP中做到这一点?有没有办法在php页面之间共享对象?

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

我也研究过做单身人士的课程,但我相信课程只在同一页面内共享,而不是跨页面共享。

为了让事情更清楚,我正在寻找一些能够帮助我分享连接到服务器的socket的connectSocket.php页面,以便加载该页面的所有用户使用相同的套接字并且没有打开一个新的。

回答

15

这是一个难以回答的问题,可能并不完全符合您的要求。

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

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

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

如果您不关心重新启动后丢失数据,则您要查找的问题域可能是缓存。我会建议您查看memcached或者如果您在单台机器上,apc。 APC肯定会在一台机器上为你工作,但是你仍然需要编写你的应用程序,假设你可能会丢失数据。

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

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

我已经亲自开发了一个相当大的多租户应用程序,虽然它是一个非常复杂的应用程序,但我从来不需要您寻找的真实状态。

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

1

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

+1

尽管您的答案是正确的,但通常不推荐使用这些持久连接。创建新的连接通常非常便宜,这意味着您不必长时间保留所有连接。 作为一个规则,我只在第一次查询时才与db连接,并且尽快将其删除。数据库难以扩展,PHP要容易得多。 – Evert 2009-05-25 22:49:40

3

这可能是部分答案,但您可以将类的实例保存到Session变量并在另一次存取它。

+3

这不幸的是不能用于打开套接字。 – Evert 2009-05-25 22:47:55

12

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

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

因此,在Web请求之间共享套接字是不可能的。

+0

不正确,那么memcache呢? – Pacerier 2014-10-18 16:04:46

0

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

问候!

相关问题