【发布时间】:2015-04-28 14:54:08
【问题描述】:
我想知道这是否是一个好习惯,我的查询是否有很大的结果。
当我只有几行时,一切似乎都很好(即使这种方法不是一个好习惯),但当我有 10,000 行时,一切都变得疯狂(致命错误:允许的内存大小)。
abstract class System
{
public static function arrayOfObjectTo($reference, $rows)
{
$response = array();
foreach($rows as $row) {
$response[] = new $reference($row)
}
return $response;
}
public static function arrayOfObjectToJson($rows)
{
$response = array();
foreach ($rows as $object) {
$response[] = $object->toObject();
}
return json_encode($response);
}
}
class Report
{
public function __construct($data)
{
$this->setName($data['name']);
$this->setEmail($data['email']);
$this->setPassword($data['password']);
}
public function toObject()
{
$object = new stdClass();
$object->name = $this->getName();
$object->email = $this->getEmail();
$object->password = $this->getPassword();
return $object;
}
// getters and setters ...
}
class ReportModel
{
public function getAll()
{
$this->query('SELECT * FROM ...');
return System::arrayOfObjectTo('Report', $this->rows);
}
}
class ReportController
{
public function show()
{
$model = new ReportModel();
return System::arrayOfObjectToJson($model->getAll());
}
}
关注我的问题是处理我的报告对象、验证数据类型和其他内容的最佳方式。
最终的结果是向客户端显示所有经过处理和格式化的行。
[
{ name:"A", email:"a@.com", password:"1" },
{ name:"B", email:"b@.com", password:"2" },
{ name:"C", email:"c@.com", password:"3" }
...
]
这只是一个例子。有时我有一个需要显示许多列和行的 BIG 查询。
【问题讨论】:
-
“发疯”到底是什么样的?
-
我怀疑你会用大结果集耗尽内存。考虑将查询分块以将结果流式传输到客户端。
-
在您编辑之后,@ceejayoz 所说的 - 分块交付行,而不是一次。这意味着您将执行多个请求。另外,向客户端显示 10 000 行?什么人能够阅读 10 000 行?
-
看起来您正在这里构建自己的框架。您首先应该做的是评估各种现有的development frameworks,例如Laravel,因为可能有一个适合您的需求和风格。您在密码处理方面犯了一些需要解决的严重错误。
-
好的,太好了,这意味着您基本上是在构建某种 REST-ful 服务。一定要对响应进行分块,永远不要将表的全部内容粘贴到输出中。您可以为此提出一个小协议 - 例如,当“客户端”要求数据时,检查有多少行以及它们是否高于 X(例如,100)然后您可以发送一个响应说有 Y 行,客户端应该发送偏移量(您根据客户端的要求提供块,这正是 @ceejayoz 所指的内容)。