繁体   English   中英

内部服务器错误(500),Yii返回大数据集

[英]Internal Server Error (500) with Yii returning large data sets

我有一个Yii Web服务actionQuery ,它基于四个参数查询模型。 总共大约有1700项要查询,而我使用的是非常糟糕的网络主机(iPage)。 当我运行不带任何参数或字符串name非常常见的参数(例如“ a”)的查询时,我希望看到所有或几乎所有行。 相反,我返回了Yii显然没有产生的500 Internal server error,所以这是一个非常糟糕的错误。 当我尝试将其缩小到700或800行左右时,虽然需要一段时间,但还是可以完成。 我该如何纠正大数据集产生500个内部服务器错误的错误? 这是最大执行时间问题吗? 我需要对CDBCriteria做些不同的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));
                }
    }

最有可能您的内存不足。 有一个限制设置,一个PHP程序可以使用多少内存:您应该在error.log中看到超出内存的消息。

您可以尝试增加线程或此特定脚本的允许内存,但是请首先在错误日志中确认这是问题所在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM