PHP、Singleton和$.ajax
看起来$.ajax(jQuery)在PHP单例中不起作用 我有一个简单的类,定义如下:PHP、Singleton和$.ajax,php,jquery,ajax,singleton,Php,Jquery,Ajax,Singleton,看起来$.ajax(jQuery)在PHP单例中不起作用 我有一个简单的类,定义如下: class MySingleton { protected static $instance = null; private $array; protected function __construct() { ... $this->array = array(); //get something from database,
class MySingleton
{
protected static $instance = null;
private $array;
protected function __construct()
{
...
$this->array = array();
//get something from database,
$this->array[] = object from database;
$this->array[] = object from database;
...
}
protected function __clone()
{
}
public static function getInstance()
{
if (!isset(static::$instance)) {
static::$instance = new static;
}
return static::$instance;
}
public function someFunction() {
$this->array[0]->someField = "set something without saving it to database";
...
}
}
我还有一个helper.php文件,它获取singleton对象,然后执行一些操作。即:
<?php
require "MySingleton.php";
$singleton = MySingleton::getInstance();
$singleton->someFunction();
$singleton->someOtherFunction();
?>
正如您在我的jQuery代码中看到的,我已经调用了$.ajax几次
我跟踪了MySingleton,并没有返回相同的实例,而是创建了几次(取决于$each循环大小)
我读过一篇文章:
这是因为单例模式只在同一个请求中起作用。在我的例子中,我有几个ajax请求(同样,基于$each循环),这就是为什么它从来都不起作用
我之所以使用singleton对象,是因为我不想建立多个数据库连接,而且MySingleton将有一个数组(用于存储一些对象),在MySingleton类中,我将使用数组临时存储一些信息,而不将其保存回数据库)
那么,有没有办法解决我的问题呢?我真的很想使用$.ajax和PHP单例。在请求之间保存数据的唯一方法是将数据存储在某个地方。这基本上意味着会话、文件或数据库中
我不认为一次加载所有数据比只加载一条记录慢,因为90%的加载时间都是在创建请求、创建数据库连接等。所以,如果您尝试一次加载所有数据,如果速度太慢,您可以在其上添加缓存或其他内容,但我很确定它会足够快。没错,每次运行PHP脚本,都是从零开始的。一次运行无法访问上一次运行的上下文,除非您将其保存在某个位置。你可以这样做,或者可以考虑使用<代码> .eh()/Case>来建立一个在一次传递中执行所有DB查询的单子。看起来你的单体有点偏离:但是老实说,我不知道什么部分会引起你的问题。可能是
新的static
?我使用多个$.ajax而不是一篇大文章的原因是我希望从服务器端返回结果并立即显示它们。每个$.ajax可能需要几秒钟的时间,因此如果我使用一个大帖子,可能需要相当长的时间(超过10秒)才能将所有输出显示到索引主屏幕。实际上,在我的_构造中,我已经加载了数据库中的所有内容,并将其保存在数组中。所以我只做一个快速db连接。只是MySingleton中的一些函数需要一些时间才能执行。这就是为什么我使用了一些$.ajax请求,而不是像@GreatBigBore建议的那样合并成一个大的请求
$.each(data, function(key, value) {
$.ajax({
url: 'helper.php',
type: 'POST',
data: someData,
dataType: 'JSON'
}).always(function(result) {
...
});
});//each