游标数据
如果DB中取出的数据非常大,而PHP中却无法承受这么大量的内存可以用来处理,这时候就需要用到cursor
游标了
游标可以将复合条件的数据逐一取出,在程序中进行分批处理,从而降低大数据所带来的内存瓶颈
// 选择器,条件类模式完全一样,在获取数据时使用cursor方法 $rs =$this ->testDAO ->filter (array ('type' =>1))->cursor (array ('id' ,'name' ));// 通过 Database::step 逐个取出data数据,e.g: ['id'=>2, 'name'=>'test'] while ($data =Database::step ($rs )){do something... - }
如果在游标数据中需要再使用其他sql语句,则需要在cursor
方法中传第二个参数false
,否则在cursor未执行完之前其他语句无法执行
// 选择器,条件类模式完全一样,在获取数据时使用cursor方法 $rs =$this ->testDAO ->filter (array ('type' =>1))->cursor (array ('id' ,'name' ),false );// 通过 Database::step 逐个取出data数据,e.g: ['id'=>2, 'name'=>'test'] while ($data =Database::step ($rs )){// other sql... $count =$this ->testDAO ->count ();- }
如果使用SQL模版的话,也可以通过传递第三个参数Database::FETCH_TYPE_CURSOR
来实现游标的使用
// 使用方法跟上诉方式一样 $rs =$this ->testDAO ->filter (array ('type' =>1))- ->
select ('SELECT * FROM :table WHERE :where AND status=:status' ,array ('status' =>2), Database::FETCH_TYPE_CURSOR );// 通过 Database::step 逐个取出data数据,e.g: ['id'=>2, 'name'=>'test', 'type'=>1, 'status'=>2] while ($data =Database::step ($rs )){do something... - }
Biny 2.8.2之后cursor
第二个参数可传匿名函数function作为数据回调使用,使用方法如下:
$result =array ();// $data为迭代的数据,$index为索引 $this ->testDAO ->filter (array ('type' =>1))- ->
cursor ('*' ,function ($data ,$index )use (&$result ){do something... - });