为什么我的脚本在输入几千个后会停止在数据库中插入?

时间:2019-02-01 13:42:59

标签: php mysql apache

我想用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);
}

0 个答案:

没有答案