我有一个Yii网络服务actionQuery
,它根据四个参数查询模型。总共要查询大约1700个项目,我使用的是一个非常糟糕的网络主机(iPage)。当我运行没有参数的查询或字符串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));
}
}
答案 0 :(得分:1)
很可能你的内存不足。有一个限制设置了PHP程序可以使用多少内存:你应该在error.log中看到内存超出的消息。
您可以为线程或此特定脚本尝试并启动允许的内存,但请首先在错误日志中验证这是问题所在。