我想用PHP脚本在我的MySQL数据库表中插入大约20万个条目(每个用户的几个计算的预订日期)。但是,尽管我的脚本继续运行,但数据库停止添加条目(通常在80k-85k条目/〜10MiB左右)。为什么?而我该如何运作呢?
实际的数据库操作发生在一个预订管理系统类中(使用mysqli准备的语句),从该类中,我为每个用户循环调用main方法。我通过ini_set('max_execution_time', 0)
和ini_set('mysql.connect_timeout', 0)
以及服务器内存限制ini_set('memory_limit', '812M')
最大限度地延长了执行时间,因此脚本和服务器本身都不会失败。
如果我将用户数量(计算得到其条目的数量)进行分割,则插入效果很好,因此对数据库站点也没有限制。
我最好的猜测是,我不知道插入运行的某种内存/高速缓存/缓冲区。这有意义吗?如果是这样,我该如何处理这种内存管理?还是其他原因?
预先感谢您的答复。
评论后编辑:
这是我的代码。不幸的是,我不能在我的类中发布执行数据库操作的所有方法,但是当查询的execute()
失败时,它们都是准备好的语句,它们会引发异常。我既没有错误也没有异常。该脚本只是继续运行,但是没有添加表行。
// Initialisation
...
ini_set('display_errors', '1');
ini_set('error_reporting', E_ERROR || E_WARNING);
ini_set('memory_limit', '812M');
ini_set('max_execution_time', 60000);
ini_set('mysql.connect_timeout', 0);
try{
$select = $mysqli->prepare("SELECT id FROM customers WHERE dept = ?");
$depts = array(24, 25, 29, 36, 93, 163, 108, 181);
foreach($depts as $id){
$select->bind_param('i', $id);
if($select->execute()){
$result = $select->get_result();
while($row = $result->fetch_object()){
$system->customerBooking($row->id);
}
$result->free();
} else {
echo '<br/>'.$select->error;
}
}
} catch(Exception $e){
var_dump($e);
}