在 Laravel 中手动运行相同功能时计划任务失败

问题描述 投票:0回答:1

我有一个脚本,可以连接到多个服务器并返回每个服务器上的现有库存。我的系统在 Debian 上运行,有自己的 postgres 数据库,我正在从 MSSQL 数据库请求信息。

下面是我的辅助函数,它允许我从 Kernel.php(计划)和控制器(手动)进行调用。当我手动调用它时,一切正常。通过设置为每 15 分钟运行一次的计划任务,我得到了

PDOException: could not find driver in ...vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:65

一切都运行良好,直到我运行

composer update
将 Laravel 从 v10.13.5 更新到 v10.48.9 以使包正常工作。

function auto_update_branch_stocks()
{
    $branches = Branch::orderBy('branch_code', 'asc')->where('active', "1")->get();
    $servers = '';

    foreach ($branches as $branch) {
        DB::purge('company_branch');
        Config::set('database.connections.company_branch', [
            'driver' => 'sqlsrv',
            'url' => '',
            'host' => $branch->host,
            'port' => $branch->port,
            'database' => $branch->database,
            'username' => config('database.connections.dripsvr.username'),
            'password' => config('database.connections.dripsvr.password'),
            'charset' => 'utf8',
            'prefix' => '',
            'prefix_indexes' => true,
        ]);
        
        try {
            $branch_stock = DB::connection('company_branch')
            ->table('dbo.StkItem')
            ->select('dbo.StkItem.Code as item_code', 'dbo.StkItem.Description_1 as item_description', 'dbo.StkItem.StockLink as stock_id', 'dbo._etblStockQtys.WhseID as warehouse_id', 'dbo._etblStockQtys.QtyOnHand as qty', 'dbo._etblStockCosts.AverageCost as avg_cost', 'dbo._etblStockCosts.LatestCost as last_cost', 'dbo._etblPriceListPrices.fExclPrice as sp_excl', 'dbo._etblStockDetails.GroupID as group_id', 'dbo.GrpTbl.StGroup as group', 'dbo.GrpTbl.Description as group_description')
            ->leftJoin('dbo._etblStockQtys', 'dbo.StkItem.StockLink', '=', 'dbo._etblStockQtys.StockID')
            ->leftJoin('dbo._etblStockCosts', 'dbo.StkItem.StockLink', '=', 'dbo._etblStockCosts.StockID')
            ->leftJoin('dbo._etblPriceListPrices', 'dbo.StkItem.StockLink', '=', 'dbo._etblPriceListPrices.iStockID')
            ->leftJoin('dbo._etblStockDetails', 'dbo.StkItem.StockLink', '=', 'dbo._etblStockDetails.StockID')
            ->leftJoin('dbo.GrpTbl', 'dbo._etblStockDetails.GroupID', '=', 'dbo.GrpTbl.idGrpTbl')
            ->where('dbo._etblStockQtys.WhseID', '=', $branch->warehouse_id)
            ->where('dbo._etblStockCosts.WhseID', '=', $branch->warehouse_id)
            ->where('dbo._etblPriceListPrices.iWarehouseID', '=', 1)
            ->where('dbo._etblPriceListPrices.iPriceListNameID', '=', 1)
            ->where('dbo._etblStockDetails.WhseID', '=', $branch->warehouse_id)
            ->get()->map(function($stock, $key) {
                return [
                    'item_code' => (string)$stock->item_code,
                    'item_description' => (string)$stock->item_description,
                    'stock_id' => (int)$stock->stock_id,
                    'warehouse_id' => (int)$stock->warehouse_id,
                    'qty' => (int)$stock->qty,
                    'avg_cost' => $stock->avg_cost,
                    'last_cost' => $stock->last_cost,
                    'sp_excl' => $stock->sp_excl,
                    'group_id' => (int)$stock->group_id,
                    'group' => (string)$stock->group,
                    'group_description' => (string)$stock->group_description
                ];
            })->all();
            Stock::where('warehouse_id', $branch->warehouse_id)->delete();
            Stock::insert($branch_stock);
        } 
        
        catch (\Exception $e) {
            Log::info('Error for ' . $branch->name . ', ' . $e);
            $servers = $servers . ', ' . $branch->name;
        }

    }
}

随时批评我的代码,总是乐于改进。但我认为错误不在这个片段中,它必须在其他地方。

php laravel
1个回答
0
投票

Web 服务器和 cron 作业运行的 PHP 版本不同,这解释了为什么前者在 php.ini 中启用了正确的扩展,而后者则不然。

要使用正确的 PHP 版本运行作业,您可以修改命令以使用

php
二进制文件的绝对路径:

cd /var/www/html/driptech && /usr/bin/php8.2 artisan schedule:run
© www.soinside.com 2019 - 2024. All rights reserved.