[英]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.