单例注册表模式和与ajax的对象交互

时间:2014-01-08 18:44:34

标签: php jquery singleton

我认为我的问题可能非常具体。我已经尝试找到一些关于它的信息,看过很多网站,但没有成功。我是OO-php的新手。我将尝试在没有代码示例的情况下解释问题:

所以,我开发了面向对象的php应用程序。我的Registry类实现了singeltone模式(在整个应用程序中只有一个实例)并存储必须可在应用程序的任何部分访问的对象。此时我需要调用JQuery AJAX与用户进行交互而无需重新加载页面。但是通过AJAX调用php脚本给了我另一个我的Registry类的实例(当我尝试在调用的php文件中使用注册表时),这个实例肯定是空的(数组中没有对象)。我认为这是因为AJAX调用在不同的线程中工作(可能是我错了)。无论如何 - 使用注册表模式的某些方式需要丰富的功能?或者可能有另一种方法来实现它?我知道我可以使我的类静态,并静态使用对象,但不幸的是我不能这样做。我也知道全球变量 - 这不是我的方式......请帮助!

1 个答案:

答案 0 :(得分:1)

因此,对PHP应用程序的每个请求都由服务器上的单独进程处理。请求之间不共享内存/数据。在这种情况下,对PHP脚本的Ajax请求将无法访问您的其他请求的信息。

为了处理这个问题,您需要保持您尝试以其他方式存储的数据的状态。将其存储在数据库,会话等中。

所以说你有一个“singleton-ish”对象列表,这些对象是商店中可用的商品,库存中的数量及其元数据。

伪代码中的

$inventory = array(
       "cars" => array(SomeCarObject, AnotherCarObject), 
       "trucks" => array(SomeTruckObject, AnotherTruckObject)
    ); 

因为这不会在请求的共享内存中保存,所以每次需要在此列表上异步操作时,您需要获取它(从哪里保持状态),修改它,然后保存并适当回应。

您的流程可能如下所示:

客户请求$inventory =>服务器获取状态$inventory,做东西,resaves =>将$inventory发送回客户端。

您可能需要向数据库添加一个锁定机制,以指示另一个进程正在使用它,但这是您需要谨慎使用的,因为它可能导致其他请求等待将数据修改为完成之前完成。你不想引入竞争条件。 http://en.wikipedia.org/wiki/Race_condition