PHP Ошибка 500 Внутренняя ошибка сервера в Codeigniter 3 При большой транзакции - PullRequest
0 голосов
/ 24 февраля 2020

У меня проблема при выполнении большой транзакции в Codeigniter 3.

Я создаю транзакцию для переноса старых данных, как показано ниже:

// Controller
public function migrate_document_get()
{
    $this->benchmark->mark('code_start');

    $data = $this->Delivery_order_model->read_data_class_from_stock();

    foreach ($data as $obj) {
        $parameters = $this->Delivery_order_model->read_data_for_do($obj->class_no);
        $this->Delivery_order_model->create_data($parameters);
    }

    $this->benchmark->mark('code_end');

    $data['message'] = "Finish migrate document DO";
    $data['execution_time'] = round($this->benchmark->elapsed_time('code_start', 'code_end')) . " seconds";
    $this->response($data, REST_Controller::HTTP_OK);
}

// Model
function create_data($data)
{
    $error = array();
    $affected_rows = 0;

    $this->mysql->trans_start();

    foreach ($data as $row) {
        $sql_insert_product = "";

        $class_no = $row['class_no'];
        $article_vendor = $row['article_vendor'];
        $style = $row['style'];
        $sku_promo = $row['sku_promo'];
        $retail = $row['retail'];
        $unique_id = $this->generate_unique_id($class_no, $article_vendor, $style, $sku_promo, $retail);
        $sku_no = $class_no . $unique_id . $style . $sku_promo . $retail;
        $article_no = $class_no . $style . $sku_promo . $retail;
        $res_field = $unique_id . $style . $sku_promo;

        $format = array();
        $format['dept_no'] = $row['dept_no'];
        $format['class_no'] = $class_no;
        $format['sku_no'] = $sku_no;

        if (!empty($row['ref_no'])) {
            $format['ref_no'] = $row['ref_no'];
        }

        $format['article_vendor'] = $article_vendor;
        $format['article_no'] = $article_no;
        $format['res_field'] = $res_field;
        $format['style'] = $style;
        $format['category_no'] = $row['category_no'];
        $format['size_no'] = $row['size_no'];
        $format['color_no'] = $row['color_no'];
        $format['material_no'] = $row['material_no'];
        $format['unique_id'] = $unique_id;
        $format['sku_promo'] = $sku_promo;

        if (!empty($row['exp_promo']) and $row['sku_promo'] != "00") {
            $format['exp_promo'] = date('Y-m-d', strtotime(str_replace('/', '-', str_replace("'", "", $row['exp_promo']))));
        }

        $format['season_code'] = date('ym');
        $format['retail'] = $retail;
        $format['tag_type'] = $row['tag_type'];

        if (!empty($row['image'])) {
            $format['image'] = $row['image'];
        }

        $format['time_create'] = date('Y-m-d H:i:s');

        $sql_insert_product = $this->mysql->insert_ignore_string("msr_product", $format);

        // Transaction 1 -> INSERT msr_product
        $this->mysql->query($sql_insert_product);

        $sql_insert_do = "";
        $format_doc = "DO" . $class_no . date('Ymd');
        $do_id = $this->generate_do_id($format_doc);
        $doc_no = $format_doc . $do_id;
        $store_no = $row['store_no'];

        // INSERT msr_do
        $format_insert = array();
        $format_insert['do_no'] = $doc_no;
        $format_insert['store_no'] = $store_no;
        $format_insert['sku_no'] = $sku_no;
        $format_insert['do_date1'] = date('Y-m-d', strtotime(date('Ymd')));
        $format_insert['do_date2'] = date('Y-m-d', strtotime('60 day', strtotime(date('Ymd'))));
        $format_insert['do_status'] = 1;
        $format_insert['user_input'] = $row['nik'];
        $format_insert['ts_input'] = date('Y-m-d H:i:s');
        $format_insert['status_item'] = 0;
        $format_insert['qty_store'] = $row['qty'];

        $format_update['qty_store'] = "qty_store + " . $row['qty'];

        $sql_insert_do = $this->mysql->insert_on_duplicate_update_string("msr_do", $format_insert, $format_update, true, false);

        // Transaction 2 -> INSERT msr_do
        $this->mysql->query($sql_insert_do);

        $affected_rows += $this->mysql->affected_rows();
    }

    $this->mysql->trans_complete();

    if ($this->mysql->trans_status() === FALSE) {
        $error = $this->mysql->error();
        $error['sql_product'] = $sql_insert_product;
        $error['sql_do'] = $sql_insert_do;
    }

    return $this->commonutil->format_output($affected_rows, $error);
}

Когда я выполняю метод выше в l oop Я столкнулся с проблемой внутренней ошибки сервера 500.

, но когда я выполняю метод, описанный ниже, один за другим, а не в l oop, он работает нормально.

// Controller
public function create_post()
{
    $this->benchmark->mark('code_start');

    $parameters = $this->post();

    if (!empty($parameters)) {
        $validate_param = $this->validate_parameter_create($parameters[0]);

        if ($validate_param->run() == TRUE) {
            $save = $this->Delivery_order_model->create_data($parameters);

            if (!empty($save) and $save['total_affected'] > 0) {
                $this->benchmark->mark('code_end');

                $output['status'] = REST_Controller::HTTP_OK;
                $output['error'] = false;
                $output['message'] = "Success create delivery order list.";
                $output['execution_time'] = $this->benchmark->elapsed_time('code_start', 'code_end') . " seconds.";
                $this->response($output, REST_Controller::HTTP_OK);
            } else {
                $this->benchmark->mark('code_end');

                $output['status'] = REST_Controller::HTTP_NOT_MODIFIED;
                $output['error'] = true;
                $output['error_detail'] = $save['error'];
                $output['message'] = "Failed create delivery order list!";
                $output['execution_time'] = $this->benchmark->elapsed_time('code_start', 'code_end') . " seconds.";
                $this->response($output, REST_Controller::HTTP_NOT_MODIFIED);
            }
        } else {
            $this->benchmark->mark('code_end');

            $output['status'] = REST_Controller::HTTP_UNPROCESSABLE_ENTITY;
            $output['error'] = true;
            $output['error_detail'] = $validate_param->error_array();
            $output['message'] = "Required JSON Array! [{.....}]";
            $output['execution_time'] = $this->benchmark->elapsed_time('code_start', 'code_end') . " seconds.";
            $this->response($output, REST_Controller::HTTP_UNPROCESSABLE_ENTITY);
        }
    } else {
        $this->benchmark->mark('code_end');

        $output['status'] = REST_Controller::HTTP_UNPROCESSABLE_ENTITY;
        $output['error'] = true;
        $output['message'] = "Required parameters!";
        $output['execution_time'] = $this->benchmark->elapsed_time('code_start', 'code_end') . " seconds.";
        $this->response($output, REST_Controller::HTTP_UNPROCESSABLE_ENTITY);
    }
}

// Model
function create_data($data)
{
    $error = array();
    $affected_rows = 0;

    $this->mysql->trans_start();

    foreach ($data as $row) {
        $sql_insert_product = "";

        $class_no = $row['class_no'];
        $article_vendor = $row['article_vendor'];
        $style = $row['style'];
        $sku_promo = $row['sku_promo'];
        $retail = $row['retail'];
        $unique_id = $this->generate_unique_id($class_no, $article_vendor, $style, $sku_promo, $retail);
        $sku_no = $class_no . $unique_id . $style . $sku_promo . $retail;
        $article_no = $class_no . $style . $sku_promo . $retail;
        $res_field = $unique_id . $style . $sku_promo;

        $format = array();
        $format['dept_no'] = $row['dept_no'];
        $format['class_no'] = $class_no;
        $format['sku_no'] = $sku_no;

        if (!empty($row['ref_no'])) {
            $format['ref_no'] = $row['ref_no'];
        }

        $format['article_vendor'] = $article_vendor;
        $format['article_no'] = $article_no;
        $format['res_field'] = $res_field;
        $format['style'] = $style;
        $format['category_no'] = $row['category_no'];
        $format['size_no'] = $row['size_no'];
        $format['color_no'] = $row['color_no'];
        $format['material_no'] = $row['material_no'];
        $format['unique_id'] = $unique_id;
        $format['sku_promo'] = $sku_promo;

        if (!empty($row['exp_promo']) and $row['sku_promo'] != "00") {
            $format['exp_promo'] = date('Y-m-d', strtotime(str_replace('/', '-', str_replace("'", "", $row['exp_promo']))));
        }

        $format['season_code'] = date('ym');
        $format['retail'] = $retail;
        $format['tag_type'] = $row['tag_type'];

        if (!empty($row['image'])) {
            $format['image'] = $row['image'];
        }

        $format['time_create'] = date('Y-m-d H:i:s');

        $sql_insert_product = $this->mysql->insert_ignore_string("msr_product", $format);

        // Transaction 1 -> INSERT msr_product
        $this->mysql->query($sql_insert_product);

        $sql_insert_do = "";
        $format_doc = "DO" . $class_no . date('Ymd');
        $do_id = $this->generate_do_id($format_doc);
        $doc_no = $format_doc . $do_id;
        $store_no = $row['store_no'];

        // INSERT msr_do
        $format_insert = array();
        $format_insert['do_no'] = $doc_no;
        $format_insert['store_no'] = $store_no;
        $format_insert['sku_no'] = $sku_no;
        $format_insert['do_date1'] = date('Y-m-d', strtotime(date('Ymd')));
        $format_insert['do_date2'] = date('Y-m-d', strtotime('60 day', strtotime(date('Ymd'))));
        $format_insert['do_status'] = 1;
        $format_insert['user_input'] = $row['nik'];
        $format_insert['ts_input'] = date('Y-m-d H:i:s');
        $format_insert['status_item'] = 0;
        $format_insert['qty_store'] = $row['qty'];

        $format_update['qty_store'] = "qty_store + " . $row['qty'];

        $sql_insert_do = $this->mysql->insert_on_duplicate_update_string("msr_do", $format_insert, $format_update, true, false);

        // Transaction 2 -> INSERT msr_do
        $this->mysql->query($sql_insert_do);

        $affected_rows += $this->mysql->affected_rows();
    }

    $this->mysql->trans_complete();

    if ($this->mysql->trans_status() === FALSE) {
        $error = $this->mysql->error();
        $error['sql_product'] = $sql_insert_product;
        $error['sql_do'] = $sql_insert_do;
    }

    return $this->commonutil->format_output($affected_rows, $error);
}

I Я уже проверяю размер временного пространства БД, и я уже проверяю способ, которым он работает нормально

что с этим не так, пожалуйста, дайте мне несколько советов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...