2013-08-07 183 views
2

好像$阿賈克斯(jQuery的)不與PHP辛格爾頓很好地工作。

我有這樣定義的簡單類:

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文件得到那麼單獨的對象做一些事情。即:

<?php 
require "MySingleton.php"; 
$singleton = MySingleton::getInstance(); 
$singleton->someFunction(); 
$singleton->someOtherFunction(); 
?> 

在我的index.php,我試圖用$就爲我做一件事:

$.each(data, function(key, value) { 

      $.ajax({ 
       url: 'helper.php', 
       type: 'POST', 
       data: someData, 
       dataType: 'JSON' 
      }).always(function(result) { 

       ... 

      }); 

});//each 

,你可以在我的jQuery代碼看,我所說的$。阿賈克斯幾次。

我跟蹤MySingleton,而不是返回相同的實例,它創造了幾次(取決於$。每個環的大小)。

我讀了一篇文章: http://www.daniweb.com/web-development/php/threads/393405/php-singletone-pattern-in-php-files-where-ajaxs-requests-are-sent

,這是因爲單例模式的相同的請求時纔會工作。在我的情況下,我有幾個Ajax請求(再次,基於$ .each循環),這就是爲什麼它從來沒有工作。

我使用單例對象的原因是因爲我不想進行多個數據庫連接,MySingleton也會有一個數組(這將用於存儲一些對象),並且在MySingleton類中我將使用陣臨時儲存而不保存到數據庫中的一些信息)

所以反正是有解決我的問題?我真的想要使用$ .ajax和PHP Singleton。

+0

沒錯,每次運行PHP腳本時,都是從頭開始的。一次運行無法訪問上一次運行的上下文,除非將其保存在某處。你可以做到這一點,或者可以考慮使用'.each()'來構建一個單一的POST,一次完成所有的數據庫查詢。 – GreatBigBore

+0

它看起來像你的單身稍微關閉:http://stackoverflow.com/a/203359/16959但說實話,我不知道什麼部分是造成你的問題。可能是'新靜態'? –

+0

爲什麼我使用多個$ .ajax而不是一個大的POST是我想從服務器端得到結果並立即顯示它們。每個$ .ajax可能需要幾秒鐘,所以如果我使用一個大的POST,可能需要相當長的時間(超過10秒)才能將所有輸出顯示到索引主屏幕。 – Josh

回答

1

保存請求之間的數據存儲的地方它唯一的出路。這基本上意味着會話或文件或數據庫中。

我不認爲一次加載所有數據比只加載一個紀錄慢,因爲90%,如果這個加載時間創建請求,創建數據庫連接等,所以你怎麼樣嘗試加載的所有數據一次,如果它太慢,你可以添加一個緩存或其他的東西,但我很確定它會很快。

+0

實際上在我的__construct中我已經加載了數據庫中的所有內容並將其保存在數組中。所以我只會做一個快速數據庫連接。這只是MySingleton中的一些功能需要一些時間才能執行。這就是爲什麼我使用幾個$ .ajax請求而不是合併到一個大的,因爲@GreatBigBore建議 – Josh