queue队列里orm查询报错 (不定时报错)

阿沁

问题描述

queue队列里orm查询报错 (不定时报错)

使用的是webman-admin 自带的La ORM

程序代码

<?php

namespace app\queue\redis;

use app\admin\model\Receipt;
use Carbon\Carbon;
use setasign\Fpdi\PdfParser\CrossReference\CrossReferenceException;
use setasign\Fpdi\PdfParser\Filter\FilterException;
use setasign\Fpdi\PdfParser\PdfParserException;
use setasign\Fpdi\PdfParser\Type\PdfTypeException;
use setasign\Fpdi\PdfReader\PdfReaderException;
use setasign\Fpdi\Tfpdf\Fpdi;
use Spatie\PdfToImage\Exceptions\PdfDoesNotExist;
use Spatie\PdfToImage\Pdf;
use support\Log;
use Webman\RedisQueue\Consumer;

class Job implements Consumer
{
    // 要消费的队列名
    public $queue = 'job';

    // 连接名,对应 plugin/webman/redis-queue/redis.php 里的连接`
    public $connection = 'default';

    // 消费

    /**
     * @throws PdfDoesNotExist
     * @throws PdfTypeException
     * @throws CrossReferenceException
     * @throws \Throwable
     * @throws PdfReaderException
     * @throws PdfParserException
     * @throws FilterException
     */
    public function consume($data)
    {
        try {
            $event = $data['event'];
            if ($event == 'generate_pdf') {
                $id = $data['id'];
                Log::info("开始生成pdf");
                $receipt = Receipt::find($id);
                // 初始化 FPDI
                Log::info('初始化 FPDI');
                $pdf = new Fpdi();
                Log::info('初始化 完成');
                // 导入现有 PDF 文件的第一页
                $pageCount = $pdf->setSourceFile(public_path('借款协议.pdf'));
                Log::info('导入现有 PDF 文件的第一页');
                for ($i = 1; $i <= $pageCount; $i++) {
                    // 导入 PDF 文件的每一页
                    $templateId = $pdf->importPage($i);
                    $pdf->AddPage();
                    $pdf->useTemplate($templateId);
                    $pdf->AddFont('SimHei', '', 'SimHei.ttf', true);
                    $pdf->SetFont('SimHei');
                    if ($i == 1) {
                        $pdf->SetFontSize(10);
                        $pdf->Text(56, 45.5, $receipt->ordersn);
                        $pdf->Text(56, 78.3, $receipt->toUser->truename);
                        $pdf->Text(56, 83.7, $receipt->toUser->idcard);
                        $pdf->Text(56, 89, $receipt->user->truename);
                        $pdf->Text(56, 94.7, $receipt->user->idcard);

                        $pdf->Text(56, 134, $receipt->amount);
                        $pdf->Text(56, 140, $receipt->rate);
                        $pdf->Text(56, 147, $receipt->interest);
                        $pdf->Text(56, 153.5, $receipt->amount_and_interest);
                        $pdf->Text(56, 160, $receipt->outstanding_amount);
                        $pdf->Text(56, 173.5, $receipt->start_date->toDateString());
                        $pdf->Text(56, 180, $receipt->end_date->toDateString());
                        $pdf->Text(56, 186.5, $receipt->reason);
                    }
                    if ($i == 4) {
                        $pdf->SetFontSize(10);
                        $pdf->Text(56, 167, $receipt->toUser->truename);
                        $pdf->Text(56, 172, $receipt->user->truename);
                        $pdf->Text(56, 178, date('Y-m-d'));
                    }
                }
                Log::info('1111');
                // 输出 PDF 文件
                $pdf->Output(public_path("/borrow/$receipt->id.pdf"), 'F'); // 保存为文件
                Log::info('输出 PDF 文件');
                $pdf = new Fpdi();
                // 导入现有 PDF 文件的第一页
                Log::info('导入现有 PDF 文件的第一页');
                $pageCount = $pdf->setSourceFile(public_path('授权确认书.pdf'));
                for ($i = 1; $i <= $pageCount; $i++) {
                    // 导入 PDF 文件的每一页
                    $templateId = $pdf->importPage($i);
                    // 添加新页面(基于导入的页面)
                    $pdf->AddPage();
                    // 使用模板
                    $pdf->useTemplate($templateId);
                    $pdf->AddFont('SimHei', '', 'SimHei.ttf', true);
                    $pdf->SetFont('SimHei');
                    if ($i == 1) {
                        $pdf->SetFontSize(10);
                        // 在页面上添加文本
                        $pdf->Text(60, 45.3, $receipt->ordersn);
                        $pdf->Text(60, 73, $receipt->toUser->truename);
                        $pdf->Text(60, 78.5, $receipt->toUser->idcard);
                    }
                    if ($i == 7) {
                        $pdf->SetFontSize(10);
                        // 在页面上添加文本
                        $pdf->Text(60, 40.5, '叁凯商贸');
                        $pdf->Text(60, 46, date('Y-m-d'));
                    }
                }
                Log::info('22222');
                // 输出 PDF 文件
                $pdf->Output(public_path("/cert/$receipt->id.pdf"), 'F'); // 保存为文件
                Log::info('输出 PDF 文件');
                $receipt->clause_rule = '/出借人重要条款提示.pdf';
                $receipt->borrow_rule = "/borrow/$receipt->id.pdf";
                $receipt->cert_rule = "/cert/$receipt->id.pdf";
                $borrow_images = [];
                // 初始化 PDF 对象
                $pdf = new Pdf(public_path($receipt->borrow_rule));
                Log::info('初始化 PDF 对象');
                // 获取总页数
                $pageCount = $pdf->pageCount();
                // 遍历每一页并转换为 Base64
                for ($page = 1; $page <= $pageCount; $page++) {
                    $tempImagePath = '/borrow/' . $receipt->id . '_' . $page . '.jpg';
                    $borrow_images[] = $tempImagePath;
                    $pdf->selectPage($page)->save(public_path($tempImagePath));
                }
                $cert_images = [];
                // 初始化 PDF 对象
                $pdf = new Pdf(public_path($receipt->cert_rule));
                Log::info('33333');
                // 获取总页数
                $pageCount = $pdf->pageCount();
                // 遍历每一页并转换为 Base64
                for ($page = 1; $page <= $pageCount; $page++) {
                    $tempImagePath = '/cert/' . $receipt->id . '_' . $page . '.jpg';
                    $cert_images[] = $tempImagePath;
                    $pdf->selectPage($page)->save(public_path($tempImagePath));
                }
                Log::info('4444444');
                $clause_images = [];
                // 初始化 PDF 对象
                $pdf = new Pdf(public_path($receipt->clause_rule));
                Log::info('5555555');
                // 获取总页数
                $pageCount = $pdf->pageCount();
                // 遍历每一页并转换为 Base64
                for ($page = 1; $page <= $pageCount; $page++) {
                    $tempImagePath = '/clause/' . $receipt->id . '_' . $page . '.jpg';
                    $clause_images[] = $tempImagePath;
                    $pdf->selectPage($page)->save(public_path($tempImagePath));
                }
                Log::info('6666666');
                $receipt->borrow_images = implode(',', $borrow_images);
                $receipt->cert_images = implode(',', $cert_images);
                $receipt->clause_images = implode(',', $clause_images);
                $receipt->save();
                Log::info('7777777');
            }
            if ($event == 'receipt_expire'){
                Log::info('aaaaa');
                $id = $data['id'];
                Log::info('bbbbb');
                $receipt = Receipt::find($id);
                Log::info('ccccc');
                if ($receipt->status == 0){
                    $receipt->status = 4;
                    $receipt->cancel_time = Carbon::now();
                    $receipt->save();
                }
                Log::info('dddddd');
            }
            Log::info('队列成功');
        } catch (\Throwable $e) {
            Log::info('队列失败');
            Log::info(json_encode($data));
            Log::info($e->getMessage(),$e->getTrace());
            throw $e;
        }
    }

}

报错信息

[2025-07-03 13:24:10] default.INFO: Call to a member function getBitwiseOperators() on null [{"file":"/www1/wwwroot/0303jietiao.62.hzgqapp.com/vendor/illuminate/database/Query/Builder.php","line":891,"function":"isBitwiseOperator","class":"Illuminate\Database\Query\Builder","type":"->"},{"file":"/www1/wwwroot/0303jietiao.62.hzgqapp.com/vendor/illuminate/database/Eloquent/Builder.php","line":331,"function":"where","class":"Illuminate\Database\Query\Builder","type":"->"},{"file":"/www1/wwwroot/0303jietiao.62.hzgqapp.com/vendor/illuminate/database/Eloquent/Builder.php","line":281,"function":"where","class":"Illuminate\Database\Eloquent\Builder","type":"->"},{"file":"/www1/wwwroot/0303jietiao.62.hzgqapp.com/vendor/illuminate/database/Eloquent/Builder.php","line":477,"function":"whereKey","class":"Illuminate\Database\Eloquent\Builder","type":"->"},{"file":"/www1/wwwroot/0303jietiao.62.hzgqapp.com/vendor/illuminate/support/Traits/ForwardsCalls.php","line":23,"function":"find","class":"Illuminate\Database\Eloquent\Builder","type":"->"},{"file":"/www1/wwwroot/0303jietiao.62.hzgqapp.com/vendor/illuminate/database/Eloquent/Model.php","line":2372,"function":"forwardCallTo","class":"Illuminate\Database\Eloquent\Model","type":"->"},{"file":"/www1/wwwroot/0303jietiao.62.hzgqapp.com/vendor/illuminate/database/Eloquent/Model.php","line":2384,"function":"__call","class":"Illuminate\Database\Eloquent\Model","type":"->"},{"file":"/www1/wwwroot/0303jietiao.62.hzgqapp.com/app/queue/redis/Job.php","line":44,"function":"__callStatic","class":"Illuminate\Database\Eloquent\Model","type":"::"},{"file":"/www1/wwwroot/0303jietiao.62.hzgqapp.com/vendor/workerman/redis-queue/src/Client.php","line":243,"function":"consume","class":"app\queue\redis\Job","type":"->"},{"file":"/www1/wwwroot/0303jietiao.62.hzgqapp.com/vendor/workerman/redis/src/Client.php","line":421,"function":"Workerman\RedisQueue\{closure}","class":"Workerman\RedisQueue\Client","type":"->"},{"file":"/www1/wwwroot/0303jietiao.62.hzgqapp.com/vendor/workerman/workerman/src/Connection/TcpConnection.php","line":741,"function":"Workerman\Redis\{closure}","class":"Workerman\Redis\Client","type":"->"},{"function":"baseRead","class":"Workerman\Connection\TcpConnection","type":"->"},{"file":"/www1/wwwroot/0303jietiao.62.hzgqapp.com/vendor/workerman/workerman/src/Events/Event.php","line":250,"function":"loop","class":"EventBase","type":"->"},{"file":"/www1/wwwroot/0303jietiao.62.hzgqapp.com/vendor/workerman/workerman/src/Worker.php","line":1740,"function":"run","class":"Workerman\Events\Event","type":"->"},{"file":"/www1/wwwroot/0303jietiao.62.hzgqapp.com/vendor/workerman/workerman/src/Worker.php","line":1545,"function":"forkOneWorkerForLinux","class":"Workerman\Worker","type":"::"},{"file":"/www1/wwwroot/0303jietiao.62.hzgqapp.com/vendor/workerman/workerman/src/Worker.php","line":1525,"function":"forkWorkersForLinux","class":"Workerman\Worker","type":"::"},{"file":"/www1/wwwroot/0303jietiao.62.hzgqapp.com/vendor/workerman/workerman/src/Worker.php","line":593,"function":"forkWorkers","class":"Workerman\Worker","type":"::"},{"file":"/www1/wwwroot/0303jietiao.62.hzgqapp.com/vendor/workerman/webman-framework/src/support/App.php","line":147,"function":"runAll","class":"Workerman\Worker","type":"::"},{"file":"/www1/wwwroot/0303jietiao.62.hzgqapp.com/vendor/webman/console/src/Commands/ReStartCommand.php","line":30,"function":"run","class":"support\App","type":"::"},{"file":"/www1/wwwroot/0303jietiao.62.hzgqapp.com/vendor/symfony/console/Command/Command.php","line":279,"function":"execute","class":"Webman\Console\Commands\ReStartCommand","type":"->"},{"file":"/www1/wwwroot/0303jietiao.62.hzgqapp.com/vendor/symfony/console/Application.php","line":1076,"function":"run","class":"Symfony\Component\Console\Command\Command","type":"->"},{"file":"/www1/wwwroot/0303jietiao.62.hzgqapp.com/vendor/symfony/console/Application.php","line":342,"function":"doRunCommand","class":"Symfony\Component\Console\Application","type":"->"},{"file":"/www1/wwwroot/0303jietiao.62.hzgqapp.com/vendor/symfony/console/Application.php","line":193,"function":"doRun","class":"Symfony\Component\Console\Application","type":"->"},{"file":"/www1/wwwroot/0303jietiao.62.hzgqapp.com/webman","line":71,"function":"run","class":"Symfony\Component\Console\Application","type":"->"}] []

截图报错信息里报错文件相关代码

截图

操作系统及workerman/webman等框架组件具体版本

"workerman/webman-framework": "^2.1",

laravel 官方回复:
截图

94 2 0
2个回答

walkor 打赏

需要提供能稳定重现这个错误的测试方法才能定位

  • 暂无评论
wolfcode

实例为空
数据在操作的时候提前判断下是否存在

  • 暂无评论
🔝