2013-08-07 5 views
2

Кажется, что $ .ajax (jQuery) не работает с PHP Singleton.

У меня есть простой класс, определенный как это:

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, я пытался использовать $ .ajax, чтобы сделать что-то для меня:

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

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

       ... 

      }); 

});//each 

, как вы можете увидеть в моем коде JQuery, я назвал $. ajax несколько раз.

Я проследил MySingleton, и вместо того, чтобы возвращать тот же экземпляр, он создавался несколько раз (в зависимости от размера цикла $ .each).

Я прочитал статью: 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 я загрузил все из базы данных и сохранил его в массиве. Поэтому я сделаю только одно быстрое соединение db. Это просто некоторые функции в MySingleton, потребуется некоторое время для выполнения. Вот почему я использую несколько запросов $ .ajax вместо того, чтобы комбинировать их с большим, поскольку предлагалось @GreatBigBore – Josh