正常result()
的文档中描述的方法似乎立即加载的所有记录。 我的应用程序需要以时间来加载大约30,000行,一个,并将其提交给第三方搜索索引API。 显然,一切都加载到内存中一次(因为过多的内存错误出)不能很好地工作。
所以我的问题是,我怎么能实现常规的MySQLi API方法,你在一个循环中的一次加载一行的影响?
正常result()
的文档中描述的方法似乎立即加载的所有记录。 我的应用程序需要以时间来加载大约30,000行,一个,并将其提交给第三方搜索索引API。 显然,一切都加载到内存中一次(因为过多的内存错误出)不能很好地工作。
所以我的问题是,我怎么能实现常规的MySQLi API方法,你在一个循环中的一次加载一行的影响?
这里是你可以做的。
while ($row = $result->_fetch_object()) {
$data = array(
'id' => $row->id
'some_value' => $row->some_field_name
);
// send row data to whatever api
$this->send_data_to_api($data);
}
这在当时得到一个排。 检查CodeIgniter的源代码,你会看到,当你执行的结果()方法,他们会做到这一点。
对于那些谁想要节省大量结果集的记忆:
因为笨3.0.0,有一个unbuffered_row
功能,
上述所有方法都会加载整个结果到存储器(预取)。 使用unbuffered_row(),用于处理大的结果集。
此方法返回单个结果行而不在存储器中作为行预取整的结果()一样。 如果你的查询有多个行,它返回当前行并移动内部数据指针领先。
$query = $this->db->query("YOUR QUERY");
while ($row = $query->unbuffered_row())
{
echo $row->title;
echo $row->name;
echo $row->body;
}
可以以指定返回值的类型任选地通“对象”(默认)或“阵列”:
$query->unbuffered_row(); // object
$query->unbuffered_row('object'); // object
$query->unbuffered_row('array'); // associative array
正式文件: https://www.codeigniter.com/userguide3/database/results.html#id2
那么,there'se的行()方法,后者返回只有一行作为对象,或row_array()方法,它不相同,但返回的阵列(当然)。
所以,你可以这样做
$sql = "SELECT * FROM yourtable";
$resultSet = $this->db->query($sql);
$total = $resultSet->num_rows();
for($i=0;$i<$total;$i++) {
$row = $resultSet->row_array($i);
}
这将提取的循环,从整个结果集的每一行。
这大约是一样取everyting和循环在$this->db->query($sql)->result()
方法调用,我相信。
如果你想在同一时间连续要么你让30.000电话,或者你可以选择所有结果,并获取他们一次在一个或者获取所有走在阵列上。 我看不到任何出路了。
那么,事情是, result()
界外查询的全部答复。 row()
简单地取第一种情况和转储休息。 但是查询仍然可以获取30个000行regardles它的功能使用。
将适合你的事业的一个设计是:
$offset = (int)@$_GET['offset'];
$query = $this-db->query("SELECT * FROM table LIMIT ?, 1", array($offset));
$row = $query->row();
if ($row) {
/* Run api with values */
redirect(current_url().'?offset'.($offset + 1));
}
这将需要一排,将其发送到API,更新页面,并使用下一行。 它将阿洛斯阻止该网页有超时。 然而,它最有可能采取与30 000条记录,并刷新了一段时间,所以你可能会想调整自己的LIMIT ?, 1
至更高的数量比1
,进入result()
和foreach()
每个页面加载多个API。