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,所以我可以避免缓冲临时数组中的所有结果? 谢谢

+0

http://blog.salsify.com/engineering/json-streaming-parser-for-php – castis

+0

@castis:现在看来,这适用于阅读大json文件。 – Chris

如果您的类属性映射到数据库中的列名称,则可以使用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