Как преобразовать выборку getCollection в JSON?
        Здравствуйте.
Больше полгода у меня на сайте собиралась статистика геолокации, все писалось в созданную таблицу Geolocation. Теперь хочу все эти координаты наложить как метки на карту Google Maps. По клику кнопки идет Ajax-запрос на выборку из БД, возвращается json-строка с координатами меток. Ну и там дальше идет javascript для визуализации меток на карте. Так вот, не могу вернуть выборку в JSON формате. Получается 500 Internal error
Если выполнить в консоли то
Что не так с этим Json?
Вот код выборки:
    
    
                                                                                
            Больше полгода у меня на сайте собиралась статистика геолокации, все писалось в созданную таблицу Geolocation. Теперь хочу все эти координаты наложить как метки на карту Google Maps. По клику кнопки идет Ajax-запрос на выборку из БД, возвращается json-строка с координатами меток. Ну и там дальше идет javascript для визуализации меток на карте. Так вот, не могу вернуть выборку в JSON формате. Получается 500 Internal error
Если выполнить в консоли то
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 98570240 bytes) in /var/www/web4/www/core/xpdo/xpdo.class.php on line 2414Хотя в переменной $result есть массив объектов которые можно обработать в цикле и вывести их значения.Что не так с этим Json?
Вот код выборки:
<?php
$modx->getService('error','error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_INFO);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
if (isset($_POST['action'])) {
    $query= $modx->newQuery('Geolocations');
    $query->where(array('acc:<' => 1000));
    $result = $modx->getCollection('Geolocations', $query);
    $json = $modx->toJSON($result);
    return $json;   
    }
?>    Комментарии: 8
                Не хватает памяти на выполнение скрипта. Попробуй в начале скрипта установить своё значение memory_limit
                    ini_set('memory_limit', '500');А много вообще записей в БД?            
                Записей порядка 1000. Но почитав статьи Василия про xPDO, понял что лучше выборку делать через PDO и работать с массивами, а не с объектами. Оказывается объекты жрут память нехило. Ну и работу с Ajax запросами в MODx тоже переосмыслил. Теперь все работает и памяти хватает :) Спасибо.            
                    
                Объекты, действительно жрут много памяти, если использовать getCollection в том виде, как у вас. В случае использования getIterator с памятью все значительно лучше. Также можно использовать такой способ:
                    foreach($modx->getCollection('Geolocations', $q) as & $obj) {
.....
}Знак & после as и указание метода getCollection внутри foreach аналогично позволяет значительно снизить потребление памяти:-)            $result = $modx->getCollection('Geolocations', $query);Адский ад какой-то. Зачем в JSON нужно хранить массив классов? Нужно, вроде данные только нужны? Поэтому:
$json = $modx->toJSON($result);
foreach($modx->getCollection('Geolocations', $query) as & $geo) {
	$arr[] = $get->toArray();
}
$result = $modx->toJSON($arr);Если с памятью беда остается, то можно прогнать через getIterator:$geos = $modx->getIterator('Geolocations', $query);
foreach($geos as $geo) {
	$arr[] = $get->toArray();
}
$result = $modx->toJSON($arr);Если и это не спасает, то вообще без объектов обойтись и работать на PDO.            
                Спасибо, видимо я не совсем понял объектную модель MODx.
Сделал попроще:
                    Сделал попроще:
$q = $modx->newQuery('Geolocations', array('acc:<' => 1000));
        $q->prepare();
        $q->stmt->execute();
        $res = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
        $res = json_encode($res);            
                Собственно некое подобие этого кода я и подразумевал третьим пунктом:-) Единственное в if условиями запихнуть prepare и execute и остальное в случае успеха.            
                    Зачем в JSON нужно хранить массив классов?
$result = $modx->getCollection('Geolocations', $query);Мне кажется на выходе будет массив объектов. Массив классов, по моему вы не это имели ввиду.            
                Да, очепятка небольшая:-)            
                    
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.