【问题标题】:Laravel 5.2 job jammed in database?Laravel 5.2 作业卡在数据库中?
【发布时间】:2016-06-01 19:13:45
【问题描述】:

我正在使用带有作业的 LARAVEL 队列在我的数据库中插入一个大型 excel,并且一些作业被卡住并且无法执行。

我将文件内容分块(每个作业 250 行)并插入其中的大部分内容直到它停止。

插入代码(插入 250 行或更少行的作业)

public function handle()
{
    $uuid = Uuid::generate(4);
    $defaultsSize = 0;
    $customSize = 0;
    $defaultsIdFields = [];
    $customFields = [];
    if (sizeof($this->matrixDefaultFields) > 0) {
        $defaultsSize = sizeof($this->matrixDefaultFields[0][0]); //size of one of the vecs in default values
        $defaultsIdFields = $this->matrixDefaultFields[0][0]; // all default fields id
    }
    if (sizeof($this->matrixCustomFields) > 0) {
        $customSize = sizeof($this->matrixCustomFields[0][0]); //sizeof one of the vecs in custom values
        $customFields = $this->matrixCustomFields[0][0]; // all custom fields id
    }


    for ($i = 0; $i < sizeof($this->matrixContacts); $i++) {
        $contact = Contact::create(['UUID' => $uuid, 'id_contact_list' => $this->matrixContacts[$i][1],
            'nome' => $this->matrixContacts[$i][2], 'email' => $this->matrixContacts[$i][3], 'unsub_code' => $this->matrixContacts[$i][4]]);

        for ($j = 0; $j < $defaultsSize; $j++) {
            $defaultsValuesFields = $this->matrixDefaultFields[$i][1];  //field value
            CompanyListFieldValues::create(['company_id' => $this->idCompany,
                'contact_id' => $contact->id,
                'field_id' => $defaultsIdFields[$j],
                'isDefault' => 1,
                'value' => $defaultsValuesFields[$j]]);
        }

        for ($k = 0; $k < $customSize; $k++) {
            $customValuesFields = $this->matrixCustomFields[$i][1];  //field value
            CompanyListFieldValues::create(['company_id' => $this->idCompany,
                'contact_id' => $contact->id,
                'field_id' => $customFields[$k],
                'isDefault' => 0,
                'value' => $customValuesFields[$j]]);
        }

    }

}

工作生成器的代码(这个工作正常)

      for ($row = $this->startFrom; $row <= $highestRow; $row++) {
        if ($rowMatrix == $chunksize) {
            // $job = (new importExcelInsert($matrixContacts, $matrixDefaultFields, $matrixCustomFields, $this->idCompany))->delay($jobDelay)->onQueue('excelInserts');
            //   var_dump($matrixContacts);
            $job = (new importExcelInsert($matrixContacts, $matrixDefaultFields, $matrixCustomFields, $this->idCompany, $rowMatrix))->delay($jobDelay)->onQueue('excelInserts');

            $this->dispatch($job);
            $njobs++;
            $matrixContacts = [];
            $matrixDefaultFields = [];
            $matrixCustomFields = [];
            $rowMatrix = 0;
        }
        $userEmail = $sheet->getCellByColumnAndRow($posEmail, $row)->getValue();
        if ($userEmail == '' || !filter_var($userEmail, FILTER_VALIDATE_EMAIL)) {
            $error++;
        } else if (Contact::where('email', '=', $userEmail)->where('id_contact_list', '=', $this->idList)->count()) {
            $ignored++;
        } else {
            // $uuid = Uuid::generate(4);
            $matrixContacts[$rowMatrix][1] = $this->idList; //CONTACT_LIST_ID
            $matrixContacts[$rowMatrix][2] = $sheet->getCellByColumnAndRow($posNome, $row)->getValue(); //Name
            $matrixContacts[$rowMatrix][3] = $userEmail; //Email
            $matrixContacts[$rowMatrix][4] = $unsubCode; //Unsubscribe Code

            $vecFieldId = [];
            $vecValues = [];
            $i = 0;
            if (!$this->arrayDefaultFields[0] == null) {
                for ($j = 0; $j < sizeof($this->arrayDefaultFields); $j += 2) {
                    $vecFieldId[$i] = $this->arrayDefaultFields[$j];
                    $vecValues[$i] = $sheet->getCellByColumnAndRow($this->arrayDefaultFields[$j + 1], $row)->getValue();
                    $i++;
                }
                $matrixDefaultFields[$rowMatrix][0] = $vecFieldId;
                $matrixDefaultFields[$rowMatrix][1] = $vecValues;
            }
            $i = 0;
            if (!$this->arrayCustomFields[0] == null) {
                for ($j = 0; $j < sizeof($this->arrayCustomFields); $j += 2) {
                    $vecFieldId[$i] = $this->arrayCustomFields[$j];
                    $vecValues[$i] = $sheet->getCellByColumnAndRow($this->arrayCustomFields[$j + 1], $row)->getValue();
                    $i++;
                }
                $matrixCustomFields[$rowMatrix][0] = $vecFieldId;
                $matrixCustomFields[$rowMatrix][1] = $vecValues;

            }
            $rowMatrix++;
        }
    }

    if (!empty($matrixContacts)) {
        $job = (new importExcelInsert($matrixContacts, $matrixDefaultFields, $matrixCustomFields, $this->idCompany, $rowMatrix + 1))->delay($jobDelay)->onQueue('excelInserts');
        $this->dispatch($job);
        $njobs++;
    }

编辑 - 数据库的打印屏幕

任何有关问题可能的见解或帮助将不胜感激。

【问题讨论】:

  • 您使用的是什么队列驱动程序?
  • 数据库(MySQL - Maria DB)
  • 你试过 ini_set('max_execution_time', 0);在 handle() 方法的开头?
  • 我已经将 PHP 文件中的时间限制增加到 5 分钟,从不设置为 0,但这应该会有所不同,它调用作业但不执行它,它只是增加了尝试值。
  • 日志文件夹中没有错误?

标签: php laravel queue laravel-5.2 laravel-queue


【解决方案1】:

将驱动程序更改为“同步”以查看作业中的错误。这样,您可以丢弃代码中的问题或查看发生了什么

【讨论】:

  • 在分析了大量代码后,我得出的结论是,由于 SQL 异常和超时限制,作业被卡住了......感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
  • 2017-01-03
相关资源
最近更新 更多