2014-01-08 3 views
0

Моя проблема может быть очень конкретной, я думаю. Я уже пытался найти информацию об этом, просмотрел множество сайтов, но без успеха. И я новичок в OO-php. Я попытаюсь объяснить проблему без образцов кода:singleton-registry pattern и object-взаимодействие с ajax

Итак, у меня есть объектно-ориентированное приложение php. Мой класс реестра реализует шаблон singleeltone (имеет только один экземпляр в целом приложении) и сохраняет объекты, которые должны быть доступны в любой части приложения. В этот момент мне нужно вызвать JQuery AJAX для взаимодействия с пользователем без перезагрузки страницы. Но вызов php-скрипта через AJAX дает мне еще один экземпляр моего класса реестра (когда я пытаюсь использовать реестр в вызываемом php-файле), этот экземпляр, конечно, пуст (не имеет объектов в массиве). Я думаю, это произошло потому, что AJAX вызывает работу в разных потоках (возможно, я ошибаюсь). В любом случае - где какой-то способ для богатых нуждался в функциональности с использованием шаблона реестра? Или, может быть, есть другие способы его достижения? Я знаю, что могу сделать свои классы статичными и использовать объекты статически, но, к сожалению, я не могу этого сделать. Я также знаю о глобальных варнах - это не мой путь ... Любая помощь, пожалуйста!

+0

Erm, если у вас нет непрерывного PHP-приложения (которое редко, редко используется и обычно больше подходит для других языков), не так ли, что на каждом запросе _normal_ (non-ajax) нужно восстановить или хотя бы воссоздать свой объект реестра? Таким образом, это был бы способ пойти с запросами ajax. Как вы в настоящее время сохраняете свой сингл в реестре, как вы его воссоздаете при следующем запросе, и что отличает нас от вызовов ajax? – Wrikken

+0

Например: $ instance = Application_Models_Registry :: getInstance(); $ instance-> set ('mySubjectList', $ subjectList); Класс реестра - это просто стандартный одноклассный магазин-класс. Затем в любой части приложения я могу снова создать экземпляр реестра и получить доступ к методу getList $ subjectList – Victor

+1

Эти синглэты не выживают до следующего запроса, если вы не храните их где-нибудь (кеш/сеансы). – Wrikken

ответ

1

Таким образом, каждый запрос к приложению PHP обрабатывается отдельным процессом на сервере. В запросах нет данных/данных. В этом случае запрос Ajax к скрипту PHP не будет иметь доступа к информации вашего другого запроса.

Чтобы справиться с этим, вам необходимо сохранить состояние данных, которые вы пытаетесь сохранить каким-либо другим способом. Храните его в БД, сеансах и т. Д.

Скажите, что у вас есть список объектов «Singleton-ish», которые являются предметами, доступными в магазине, количеством на складе и их метаданными.

в псевдокоде:

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

Поскольку это не хранятся в общей памяти accross запросов, каждый раз, когда вам нужно асинхронно оперировать в этом списке, вам нужно получить его (откуда бы ты сохраняя его состояние), измените его, затем сохраните и ответьте соответствующим образом.

Ваш поток может выглядеть примерно так:

запрос клиента $inventory => сервер извлекает состояние из $inventory, делает вещи, resaves => посылает $inventory обратно клиенту.

Вам, вероятно, потребуется добавить механизм блокировки в БД, чтобы указать, что другой процесс использует его, но это то, о чем вам следует проявлять осторожность, поскольку это может привести к тому, что другие запросы ждут чего-то, что изменяет ваши данные чтобы закончить, прежде чем они смогут закончить. Вы не хотите вводить условие гонки. http://en.wikipedia.org/wiki/Race_condition

+0

Хорошо, это понятно и ожидалось. И я понимаю, что я могу хранить свои данные-объекты каким-то образом, например json ....Но что, если мне нужен доступ к несериализованному классу, например, - я храню объекты в коллекции, у класса коллекции есть некоторые методы для управления объектами, и мне нужно применить эти методы для сбора async., Поэтому мне нужен объект коллекции с все методы, а не только данные. Я заполняю то, что я неправильно понимаю ... – Victor

+0

Если у вас есть коллекция, вам нужно сериализовать коллекцию, когда вам нужно ее сохранить и десериализировать, когда вам это нужно. Я добавлю примечания к ответу для дальнейшего объяснения – Brad