codeigniter 停止事务而不记录错误

时间:2021-01-27 08:16:09

标签: php mysql codeigniter mariadb

我的 Codeigniter 应用程序有问题。它接受一个 xml 作为输入,并将其存储在 mariadb 数据库中。 xml 有一个树结构,它由数据库上的大约 10 个表映射。 该应用程序基于单个事务,具有最终提交和发生异常时的回滚。

如果是小 xml,我没有问题,但我尝试导入 200M xml,但我遇到了问题,因为 35 分钟后插入事务无故死亡,我找不到任何错误日志。 我在 apache、mariadb 和 codeigniter 中搜索过日志,但没有出现错误或异常。

我在 mariadb 设置中增加了最大执行 mariadb 设置一些变量,并且我还在 config.php 和 php.ini 中增加了 sess_time_to 更新。

xml 具有树结构,在其中一个表中插入大约 35000 次后它就会停止。 我打印了 mariadb 查询,我注意到它会在每个事务中多次锁定 ci_session 表,也许在 codeigniter 中设置了最大连接数? 应用程序在 table13 中的最后一次插入时停止,其中插入了大约 50000 条记录。 该代码显示了插入物的结构,其中显示了一些 annidated 插入物。我认为并发访问尚未插入的数据存在问题,但我没有日志。会话处于活动状态。 谢谢。

config.php

$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'ci_sessions_'.preg_replace('/[^a-z0-9]/i', '', crypt($_SERVER['DOCUMENT_ROOT'], $config['encryption_key']) );
$config['sess_expiration'] = 180000; #72000;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] =  180000; #18000;
$config['sess_regenerate_destroy'] = FALSE;

mariadb

max_allowed_packet=33554432

代码

try {
                $this->db->trans_begin();
                // INSERT
                $sc_table1 = array(
                    ...
                );

                $sc_table1_id = $this->table1_model->insert($sc_table1);


                if (!$sc_table1_id) {
                    $error = $this->db->error();
                    $message = $error['message'];
                    log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT SCHEDE sc_table1]: $message");
                    throw new Exception($message);
                }

                // INSERT
                    $sc_table2 = array(
                    'sc_table1_id' => $sc_table1_id,
                ....
                );

                $sc_table2_id = $this->table2_model->insert($sc_table2);

                log_message('debug', "table1 | DB - 001 | sc_table2 inserted into DB");

                if (!$sc_table2_id) {
                    $error = $this->db->error();
                    $message = $error['message'];
                    log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table3 sc_table2]: $message");
                    throw new Exception($message);
                }
                // INSERT sc_table3
                $sc_table3 = $xml->table3;
                $sc_table3->sc_table1_id = $sc_table1_id;
                $sc_table3->sc_table2_id = $sc_table2_id;
                $table3_id = $this->table3_model->insert($sc_table3);

                if (!$table3_id) {
                    $error = $this->db->error();
                    $message = $error['message'];
                    log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table3 sc_table3]: $message");
                    throw new Exception($message);
                }

                log_message('debug', "table1 | DB - 002 | sc_table3 inserted into DB");

                // INSERT 
                // ----------------------------------------------------------------------------------------
                $xml_table4 = $xml->table4;


                // municipality validation
                $uxxx = $this->table1_model->get_user_istat_code_admin();
                
                $sc_table5 = array(
                    'sc_table1_id' => $sc_table1_id,
                    ...
                );
                $sc_table5_id = $this->table5_model->insert($sc_table5);

                if (!$sc_table5_id) {
                    $error = $this->db->error();
                    $message = $error['message'];
                    log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table4 sc_table5]: $message");
                    throw new Exception($message);
                }
                // INSERT sc_table2
                $table2 = $xml->table4->xpath($namespacePrefixes["opengis"].':Polygon')[0];
.               $sc_table2 = array(
                    'sc_table1_id' => $sc_table1_id,
                    ...
                );
                $sc_table2_id = $this->table2_model->insert($sc_table2);
                if (!$sc_table2_id) {
                    $error = $this->db->error();
                    $message = $error['message'];
                    log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table4 sc_table2]: $message");
                    throw new Exception($message);
                }

                // INSERT sc_table4
                $sc_table4 = clone $xml_table4;
                $sc_table4->sc_table1_id = $sc_table1_id;
                $sc_table4->sc_table5_id = $sc_table5_id;
                $sc_table4->sc_table2_id = $sc_table2_id;
                $sc_table4_id = $this->table4_model->insert($sc_table4);


                if (!$sc_table4_id) {
                    $error = $this->db->error();
                    $message = $error['message'];
                    log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table4 sc_table4]: $message");
                    throw new Exception($message);
                }

                log_message('debug', "table1 | DB - 003 | sc_table4  inserted into DB");

                // INSERT sc_City
                $cities = $xml_table4->City;
                $i = 0;
                foreach ($cities as $city) {
                    $sc_City = array(
                        'sc_table1_id'     => $sc_table1_id,
                        'SC_table4_id' => $sc_table4_id,
                        'ln'                        => $xml->table4->xpath('City')[$i]->attributes()['ln'],
                        'City'                      => $city,
                    );
                    $sc_City_id = $this->City_model->insert($sc_City);

                    if (!$sc_City_id) {
                        $error = $this->db->error();
                        $message = $error['message'];
                        log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table4 sc_City]: $message");
                        throw new Exception($message);
                    }
                    $i++;
                }


                // INSERT table6
                // ----------------------------------------------------------------------------------------
                foreach ($xml->table6 as $xml_table6) {
                    // INSERT sc_table6
                    $sc_table6 = clone $xml_table6;
                    $sc_table6->sc_table1_id = $sc_table1_id;
                    $sc_table6_id = $this->table6_model->insert($sc_table6);

                    if (!$sc_table6_id) {
                        $error = $this->db->error();
                        $message = $error['message'];
                        log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table6 sc_table6]: $message");
                        throw new Exception($message);
                    }
                    // table6_table7
                    $xml_table6_table7 = $xml_table6->table6_table7;
                    // INSERT sc_table5
                    $sc_table5 = array(
                        'sc_table1_id' => $sc_table1_id,
                        
                    );
                    $sc_table5_id = $this->table5_model->insert($sc_table5);
                    if (!$sc_table5_id) {
                        $error = $this->db->error();
                        $message = $error['message'];
                        log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table6 table6_table7 sc_table5]: $message");
                        throw new Exception($message);
                    }

    
                    // INSERT sc_table6_table7
                    $sc_table6_table7 = clone $xml_table6->table6_table7;
                
                    $sc_table6_table7_id = $this->table6_table7_model->insert($sc_table6_table7);
                    if (!$sc_table6_table7_id) {
                        $error = $this->db->error();
                        $message = $error['message'];
                        log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table6 sc_table6_table7]: $message");
                        throw new Exception($message);
                    }
                    // table6table8
                    $xml_table6table8 = $xml_table6->table6table8;
                    // INSERT sc_table5
                    $sc_table5 = array(
                        'sc_table1_id' => $sc_table1_id,
                    );
                    $sc_table5_id = $this->table5_model->insert($sc_table5);
                    if (!$sc_table5_id) {
                        $error = $this->db->error();
                        $message = $error['message'];
                        log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table6 table6table8 sc_table5]: $message");
                        throw new Exception($message);
                    }
                    // INSERT sc_table6table8
                    $sc_table6table8 = clone $xml_table6->table6table8;
                    $sc_table6table8->sc_table1_id = $sc_table1_id;
                    $sc_table6table8->sc_table6_id = $sc_table6_id;
                    $sc_table6table8->sc_table5_id = $sc_table5_id;
                    $sc_table6table8_id = $this->table6table8_model->insert($sc_table6table8);
                    if (!$sc_table6table8_id) {
                        $error = $this->db->error();
                        $message = $error['message'];
                        log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table6 sc_table6table8]: $message");
                        throw new Exception($message);
                    }
                }

                // INSERT table9
                // ----------------------------------------------------------------------------------------
                foreach ($xml->table9 as $xml_table9) {
                    // INSERT sc_table9
                    $sc_table9 = clone $xml_table9;
                    $sc_table9->sc_table1_id = $sc_table1_id;
                    $sc_table9_table6 = $this->table6_model->getByCode($sc_table9->table6Code, $sc_table1_id);

                    if (!isset($sc_table9_table6)) {
                        $message = 'table6 Code "' . $sc_table9->table6Code . '" not found';
                        log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table9 sc_table9]: $message");
                        throw new Exception($message);
                    }
                    unset($sc_table9->table6Code); // Foreign Key
                    $sc_table9->sc_table6_id = $sc_table9_table6->id;
                    $sc_table9_id = $this->table9_model->insert($sc_table9);
                    if (!$sc_table9_id) {
                        $error = $this->db->error();
                        $message = $error['message'];
                        log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table9 sc_table9]: $message");
                        throw new Exception($message);
                    }
                    // table9table10
                    $xml_table9table10 = $xml_table9->table9table10;
                    // INSERT sc_table5
                    $sc_table5 = array(
                        'sc_table1_id' => $sc_table1_id
                    );
                    $sc_table5_id = $this->table5_model->insert($sc_table5);
                    if (!$sc_table5_id) {
                        $error = $this->db->error();
                        $message = $error['message'];
                        log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table9 table9table10 sc_table5]: $message");
                        throw new Exception($message);
                    }
                    
                    // INSERT sc_table9table10
                    $sc_table9table10 = clone $xml_table9->table9table10;
                    $sc_table9table10->sc_table1_id = $sc_table1_id;
                    $sc_table9table10->sc_table9_id = $sc_table9_id;
                    $sc_table9table10->sc_table5_id = $sc_table5_id;
                    $sc_table9table10->sc_gml_Point_id = $sc_gml_Point_id;
                
                    $sc_table9table10_id = $this->table9table10_model->insert($sc_table9table10);
                    if (!$sc_table9table10_id) {
                        $error = $this->db->error();
                        $message = $error['message'];
                        log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table9 sc_table9table10]: $message");
                        throw new Exception($message);
                    }
                    //OTHER 3 INSERT
                }


                // INSERT table11
                // ----------------------------------------------------------------------------------------
                foreach ($xml->table11 as $xml_table11) {
                    // INSERT sc_table11
                    $sc_table11 = clone $xml_table11;
                    $sc_table11->sc_table1_id = $sc_table1_id;
                    $sc_table11_table9 = $this->table9_model->getByCode($sc_table11->table9ID, $sc_table1_id);

                    if (!isset($sc_table11_table9)) {
                        log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table11 sc_table11]: $message");
                        throw new Exception($message);
                    }
                    
                    $sc_table11_id = $this->table11_model->insert($sc_table11);

                    if (!$sc_table11_id) {
                        $error = $this->db->error();
                        $message = $error['message'];
                        log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table11 sc_table11]: $message");
                        throw new Exception($message);
                    }
                    //OTHER 2 INSERT
                    // table11table12
                    foreach ($xml_table11->table11table12 as $xml_table11table12) {
                        // INSERT sc_table5
                        $sc_table5 = array(
                            'sc_table1_id' => $sc_table1_id,
                            'ValidityStartDate'     => $validityStartDate,
                            'ValidityEndDate'       => $validityEndDate,
                            'Source'                => $xml_table4->Source,
                            'Scale'                 => $xml_table4->Scale,
                        );
                        $sc_table5_id = $this->table5_model->insert($sc_table5);

                        if (!$sc_table5_id) {
                            $error = $this->db->error();
                            $message = $error['message'];
                            log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table11 table11table12 sc_table5]: $message");
                            throw new Exception($message);
                        }
                        // INSERT sc_table11table12
                        $sc_table11table12 = clone $xml_table11table12;
                        
                        $sc_table11table12_id = $this->table11table12_model->insert($sc_table11table12);

                        if (!$sc_table11table12_id) {
                            $error = $this->db->error();
                            $message = $error['message'];
                            log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table11 sc_table11table12]: $message");
                            throw new Exception($message);
                        }
                    }

                    // table13
                    foreach ($xml_table11->table13 as $xml_table13) {
                        
                        $sc_table5 = array(
                            'sc_table1_id' => $sc_table1_id,
                            'ValidityStartDate'     => $validityStartDate,
                            'ValidityEndDate'       => $validityEndDate,
                            'Source'                => $xml_table4->Source,
                            'Scale'                 => $xml_table4->Scale,
                        );
                        $sc_table5_id = $this->table5_model->insert($sc_table5);

                        if (!$sc_table5_id) {
                            $error = $this->db->error();
                            $message = $error['message'];
                            log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table11 table13 sc_table5]: $message");
                            throw new Exception($message);
                        }
                        // INSERT sc_table13
                        $sc_table13 = clone $xml_table13;
                        
                        $sc_table13_table11table12 = $this->table11table12_model->getByCode($sc_table13->table11table12ID, $sc_table1_id);
                        if (!isset($sc_table13_table11table12)) {
                            $message = 'Light Spot table12 ID "' . $sc_table13->table11table12ID . '" not found';
                            log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table11 sc_table13]: $message");
                            throw new Exception($message);
                        }
                        unset($sc_table13->table11table12ID);
                        $sc_table13->sc_table11table12_id = $sc_table13_table11table12->id;

                        //log_message('debug', 'table1 | Upload | OK | H table13ID: '.$sc_table13->table13ID.' '.time());

                        $sc_table13_id = $this->table13_model->insert($sc_table13);

                        if (!$sc_table13_id) {
                            $error = $this->db->error();
                            $message = $error['message'];
                            log_message('error', "table1 | Upload | ERROR | Error uploading XML [INSERT table11 sc_table13]: $message");
                            throw new Exception($message);
                        }
                    }
                }
            } catch
            (Exception $e) {
                $this->db->trans_rollback();
                $this->response($message, REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
                die;
            }

            try {
                $this->db->trans_commit();
            }
            catch (Exception $e) {
                log_message('error', 'Commit failed');
                //$this->db->trans_rollback();
           }
        }
        $this->set_response('success', REST_Controller::HTTP_OK);;

0 个答案:

没有答案