Я реализую настроенную очередь приоритетов на основе PHP SPLPriorityQueue в приложении Zend.Он содержит пользовательские объекты PriorityQueueItens вместо чистых значений помимо значения приоритета.При хранении очереди в APC (или memcache) я должен убедиться, что очередь и ее элементы сериализуемы, поэтому я настроил их для реализации интерфейса Serializable с использованием кода из будущей Zend Framework 2.
public function serialize()
{
$data = array();
while ($this->valid()) {
$data[] = $this->current();
$this->next();
}
foreach ($data as $item) {
$this->insert($item['data'], $item['priority']);
}
return serialize($data);
}
public function unserialize($data)
{
foreach (unserialize($data) as $item) {
$this->insert($item['data'], $item['priority']);
}
}
После извлечения очереди из APC и получения верхнего элемента в приоритетной очереди, используя $this->extract()
, я не получаю элемент, но массив, который создается во время сериализации.
Итак, вместо PriorityQueueItem
, базового класса, который я использую для объектов, хранящихся в очереди, я получаю ассоциативный массив с индексами data и priority (аналогично массиву в функции сериализации).Чтобы получить фактический элемент, мне нужно извлечь часть массива data вместо того, чтобы рассматривать возвращенный элемент как элемент, как это работает, когда не хранится очередь в APC, и как я предполагал, что это будет работатьи сейчас.
Это особенность сериализации объектов или я неправильно к ней подхожу?
Обновление: Проблема заключалась в том, что у меня былотдельная функция, которая делала дополнительные бесполезные действия, кроме extract()
.Эта функция возвращала элемент в виде массива, но как только я явно вызвал extract()
, я получил элемент, как и ожидалось.Существуют ли определенные меры предосторожности для использования с открытыми функциями в сериализованных объектах?