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

Php 内部服务器错误(500),Yii返回大数据集,php,yii,internal-server-error,Php,Yii,Internal Server Error,我有一个Yii web服务actionQuery,它根据四个参数查询模型。总共有大约1700个项目需要查询,我使用的是一个非常糟糕的web主机(iPage)。当我运行一个没有参数或非常常见的参数的查询时,比如stringname中的“a”,我希望看到所有或几乎所有的行。相反,我得到了一个500内部服务器错误,这显然不是由Yii产生的,所以这是一个非常糟糕的错误。当我试着把它缩小到700或800行左右时,需要一段时间,但它完成了。如何更正产生500个内部服务器错误的大型数据集的此错误?这是最大执行

我有一个Yii web服务
actionQuery
,它根据四个参数查询模型。总共有大约1700个项目需要查询,我使用的是一个非常糟糕的web主机(iPage)。当我运行一个没有参数或非常常见的参数的查询时,比如string
name
中的“a”,我希望看到所有或几乎所有的行。相反,我得到了一个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));
                }
    }
公共函数actionQuery()
{
$this->_checkAuth();
开关($\u GET['model'])
{
“狗粮”案例:
$criteria=新的CDbCriteria();
如果($\u GET['name']&&&$\u GET['name']!='0'){
$criteria->addSearchCondition('name_df',$\u GET['name']);
}
如果($获得['Components']&&&$获得['Components']!='0'){
$ingredientsArray=爆炸(',',$获取['Components']);
foreach($InCreditsArray作为$Component){
$criteria->addSearchCondition('Components_df',$Component);
}
}
如果($\u获得['brand']&&&$\u获得['brand']!=0){
$criteria->addColumnCondition(数组('brand_-df'=>$\u-GET['brand']);
}
如果($\u GET['brandstring']&&&$\u GET['brandstring']!==0){
$criteriaForBrand=新的CDbCriteria();
$criteriaForBrand->addSearchCondition('name_dfb',$_GET['brandstring');
$brandInQuestion=dogfoodbrandfb::model()->find($criteriaForBrand);
$brandId=$brandInQuestion->id\u dfb;
$criteria->addColumnCondition(数组('brand_df'=>$brandId));
}
$models=DogfoodDf::model()->findAll($criteria);
打破
违约:
$this->\u发送响应(501,sprintf(
'错误:模型%s未实现模式查询',
$_GET['model']);
出口
}
if(空($models)){
$this->\u发送响应(200,
sprintf('找不到模型%s'的项目,$\u GET['model']);
}
否则{
$rows=array();
foreach($models作为$model){
$rows[]=$model->attributes;
}
$this->_sendsresponse(200,CJSON::encode($rows));
}
}

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


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

Ok-就是这样。另一个相关的注意事项是,是否有一种快速而肮脏的方法来剥离模型的元素,比如
$bareModel=$model->columns('a','c','d','f')我不知道,我对Yii不是很好。我会用一个简单的例子来回答一个单独的问题,说明你已经做了什么,你想做什么。。。如果您想要快速且脏:您可以手动启动
unset
ting stuf?