Внутренняя ошибка сервера (500) с Yii, возвращающим большие наборы данных - PullRequest
0 голосов
/ 18 декабря 2011

У меня есть веб-сервис Yii actionQuery, который запрашивает модель на основе четырех параметров. Всего запрашивается около 1700 пунктов, и я использую довольно плохой веб-хостинг (iPage). Когда я запускаю запрос без параметров или чрезвычайно распространенных параметров, таких как «a» в строке name, я ожидаю увидеть все или почти все строки. Вместо этого я получаю 500 Внутренняя ошибка сервера, которая явно не генерируется Yii, так что это довольно серьезная ошибка. Когда я пытаюсь сузить его примерно до 700 или 800 рядов, это занимает некоторое время, но это делается. Как я могу исправить эту ошибку больших наборов данных, производящих 500 внутренних ошибок сервера? Это вопрос максимального времени выполнения? Есть ли что-то, что мне нужно сделать по-другому с CDBCriteria?

Вот actionQuery, который по общему признанию закодирован довольно плохо.

 public function actionQuery()
    {
                $this->_checkAuth();

        switch ($_GET['model'])
                {
                        case 'dogFood':
                                $criteria = new CDbCriteria();
                                if ($_GET['name'] && $_GET['name'] !== '0') {
                                        $criteria->addSearchCondition('name_df', $_GET['name']);
                                }
                                if ($_GET['ingredients'] && $_GET['ingredients'] !== '0') {
                                        $ingredientsArray = explode(',',$_GET['ingredients']);
                                        foreach ($ingredientsArray as $ingredient) {
                                                $criteria->addSearchCondition('ingredients_df', $ingredient);
                                        }
                                }
                                if ($_GET['brand'] && $_GET['brand'] != 0) {
                                        $criteria->addColumnCondition(array('brand_df' => $_GET['brand']));
                                }
                                if ($_GET['brandstring'] && $_GET['brandstring'] !== 0) {
                                        $criteriaForBrand = new CDbCriteria();
                                        $criteriaForBrand->addSearchCondition('name_dfb', $_GET['brandstring']);
                                        $brandInQuestion = DogfoodbrandDfb::model()->find($criteriaForBrand);
                                        $brandId = $brandInQuestion->id_dfb;
                                        $criteria->addColumnCondition(array('brand_df' => $brandId));
                                }
                                $models = DogfoodDf::model()->findAll($criteria);
                                break;
                        default:
                                $this->_sendResponse(501, sprintf(
                                        'Error: Mode <b>query</b> is not implemented for model <b>%s</b>',
                                        $_GET['model']));
                                exit;
                }

                if (empty($models)) {
                        $this->_sendResponse(200,
                                sprintf('No items were found for model <b>%s</b>', $_GET['model']));
                }
                else {
                        $rows = array();

                        foreach ($models as $model) {
                                $rows[] = $model->attributes;
                        }

                        $this->_sendResponse(200, CJSON::encode($rows));
                }
    }

1 Ответ

1 голос
/ 18 декабря 2011

Скорее всего, вам не хватает памяти. Существует ограничение, устанавливающее, сколько памяти может использовать PHP-программа: вы должны видеть сообщения о превышении памяти в вашем файле error.log.

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

...