Может быть, мне не хватает чего-то легкого здесь … или, может быть, я просто кодировал это так долго, что не могу увидеть мою проблему, но использование CakePHP (1.3) и выполнение select (MySQL) должно быть в состоянии вернуться результаты, даже если есть, скажем, 2000 записей … правильно?
$options = array( 'conditions' => array( 'Lead.campaign_id' => $campaign['Campaign']['id'] ), 'recursive' => -1, 'order' => 'Lead.goal DESC', 'contain' => false, ); $leads = $this->Lead->find('all',$options);
Тем не менее, этот запрос дает мне белый экран смерти (с define('LOG_ERROR', 2);
set).
Если я добавлю 'limit' => 300,
(или аналогичное число … не должно быть ровно 300) в массив $options
тогда он вытащит результаты, поэтому я знаю, что сам запрос не является проблемой.
Кроме того, я попытался ограничить столбцы, возвращаемые с помощью параметра 'fields'
в массиве $options
… даже указав, что он возвращает только поле 1, но это тоже не сработало.
Я также повторил инструкцию SQL, которую он использует через
$log = $this->Lead->getDataSource()->getLog(false, false); debug($log);
Конечно, мне пришлось поставить 'limit'
для этого, чтобы он появился (иначе я просто получу белый экран смерти). Затем я копирую / вставляю этот запрос (без ограничения) в phpMyAdmin и возвращает записи просто отлично (даже если «показать мне 1000 строк»). Это приводит меня к мысли, что система может обрабатывать запрос и вывод, но, возможно, я делаю предположение, которого я не должен быть.
Причина, по которой я пытаюсь получить все строки и не разбивать страницы на записи, – это то, что мне нужно вывести их в файл csv для загрузки пользователем (эта часть уже работает … когда запрос работает).
Мне было предложено, что это, вероятно, проблема с тайм-аутом, и я должен просто поднять это, но это кажется взломом для меня, и должно быть лучшее решение.
Так как я делаю загрузку csv-файла, возможно, есть способ передать запрос в файл, который затем загружается? Или, может быть, есть даже лучшее решение?
Вероятно, у вас не хватает памяти (проверьте журналы ошибок веб-сервера) – Cake загрузит все 2000 строк в массив, который, вероятно, перейдет через ограничение по памяти вашего сценария.
Вы можете увеличить лимит памяти для скриптов, но есть и другие варианты:
Вам действительно нужно вернуть все 2000 строк? Отображение того, что многие данные пользователю будут непонятны для пользователя. Будет ли разбивка на страницы лучше работать?
Если вы планируете выполнять вычисления на основе всех данных, возможно, вы можете повторно написать свой запрос для выполнения вычислений в запросе?
Если вам нужно использовать PHP для обработки данных, верните его в куски (скажем, 100 записей за раз). Возможно, вам потребуется установить время ожидания сценария на большое значение, если процесс может занять много времени …