Silex - 在JSON中序列化数据库结果集的最快方法是什么?
问题描述:
目前我使用DBAL从db中检索记录,然后我将每行都转换为相应的对象。每个对象被追加到一个数组,最后它是converted to json with json() function。 示例代码:Silex - 在JSON中序列化数据库结果集的最快方法是什么?
class MyController extends BaseController {
public function getById(Request $request, Application $app, $id) {
$this->app = $app;
$sql = "SELECT * FROM table ...";
$stmt = $app['db']->prepare($sql);
$stmt->execute();
$obj = $stmt->fetchAll(\PDO::FETCH_ASSOC);
return $app->json($this->convert($obj));
}
public function convert($resultset) {
$result = array();
foreach ($resultset as $key => $row) {
$myObj = new MyObj();
$myObj->setId($row['id']);
// and so on
}
return $result;
}
}
可以将此序列化方法修改得更快吗?把这种情况下,我必须发送一个REST客户端十万个对象,有没有a sort of streming mode like for files,所以我可以避免缓冲临时数组中的所有结果? 谢谢
答
如果您的类属性映射到数据库中的列名称,则可以使用PDO::FETCH_CLASS
直接获取对象。这不会给你任何流,但它会跳过这个转换步骤:
public function getById(Request $request, Application $app, $id) {
$this->app = $app;
$sql = "SELECT * FROM table ...";
$stmt = $app['db']->prepare($sql);
$stmt->execute();
// Generate an array of the required objects
$arr = $stmt->fetchAll(\PDO::FETCH_CLASS, "MyObj");
// Encode the array
return $app->json($arr);
}
+0
是的,少代码总是更好。 – Chris
http://blog.salsify.com/engineering/json-streaming-parser-for-php – castis
@castis:现在看来,这适用于阅读大json文件。 – Chris