Логика объединения не выполняется по расписанию (Laravel 8.20.1)

#php #laravel #pool

Вопрос:

У меня в контроллере есть функция с логикой объединения, использующая библиотеку Spatie/Async. Все выполняется идеально, когда функция вызывается с помощью маршрутизации; но при вызове из расписания (в app/Console/Kernel.php), пул не выполняется.

Тот же код выполняется без проблем при локальном тестировании с использованием MAMP, но не в рабочей среде.

Вот упрощенная версия моего кода:

HomeController.php

 namespace AppHttpControllers;

use IlluminateHttpRequest;
use SpatieAsyncPool;
use Server;
use Ping;
use Setting;

class HomeController extends Controller
{
    
    public function __construct()
    {
        $this->middleware('auth');
    }
    
    
    public function executePing()
    {
        $servers = Server::where('deleted', 0)->get();
        $concurrency = Setting::where('type', 'concurrency')->value('value');
        $ping_timeout = Setting::where('type', 'ping_timeout')->value('value');
        $pool = Pool::create()->concurrency($concurrency)->timeout($ping_timeout);
        
        //Save Pings
        foreach ($servers as $server)
        {
            echo "Starting Pool...";
            $pool->async(function () use ($server) {
                
                $new_ping = new Ping; //Line added after editing my question
                
                //Execute Ping
                echo "Ping Executed.";
            })->then(function ($output) {
                //Handle success
            })->catch(function (Throwable $exception) {
                //Handle exception
            });
            
        }
        await($pool);
        $data['data'] = "Executed";
        echo json_encode($data);
    }
}
 

app/Console/Kernel.php

 namespace AppConsole;

use IlluminateConsoleSchedulingSchedule;
use IlluminateFoundationConsoleKernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    protected $commands = [
    //
    ];
    
    protected function schedule(Schedule $schedule)
    {
        $schedule->call('AppHttpControllersHomeController@executePing')->everyMinute()->runInBackground()->evenInMaintenanceMode();
    }
    
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');
        
        require base_path('routes/console.php' );
    }
}
 

Output when running php artisan schedule:run:

 Running scheduled command: AppHttpControllersHomeController@executePing
Starting Pool...
 

Поскольку я использую внешнюю библиотеку, мне было трудно найти аналогичные проблемы. Если у кого-нибудь может быть подсказка, почему это происходит, или даже альтернатива библиотеке, которую я использовал, это будет очень ценно.

Важное изменение:

Я заметил отсутствие разрешения в файле журнала (глупая ошибка). Я исправил это и получил ошибку. Что происходит, так это то, что все мои классы не распознаются при вызове из пула. Я не могу объявлять какие-либо новые объекты или выполнять запросы к базе данных. В приведенном выше примере (отредактированном после этого обновления) я получаю:

 local.ERROR: Class 'Ping' not found
#0 /home/website/web/website.com/public_html/vendor/spatie/async/src/Runtime/ChildRuntime.php(26): AppHttpControllersHomeController::{closure}()
#1 {main} {"exception":"[object] (Error(code: 0): Class 'Ping' not found

#0 /home/website/web/website.com/public_html/vendor/spatie/async/src/Runtime/ChildRuntime.php(26): App\Http\Controllers\HomeController::{closure}()
#1 {main} at /home/website/web/website.com/public_html/vendor/spatie/async/src/Output/SerializableException.php:29)
[stacktrace]
#0 /home/website/web/website.com/public_html/vendor/spatie/async/src/Process/ParallelProcess.php(122): Spatie\Async\Output\SerializableException->asThrowable()
#1 /home/website/web/website.com/public_html/vendor/spatie/async/src/Process/ProcessCallbacks.php(54): Spatie\Async\Process\ParallelProcess->resolveErrorOutput()
#2 /home/website/web/website.com/public_html/vendor/spatie/async/src/Pool.php(231): Spatie\Async\Process\ParallelProcess->triggerError()
#3 /home/website/web/website.com/public_html/vendor/spatie/async/src/Pool.php(327): Spatie\Async\Pool->markAsFailed(Object(Spatie\Async\Process\ParallelProcess))
#4 /home/website/web/website.com/public_html/vendor/spatie/async/src/Pool.php(153): Spatie\Async\Pool->Spatie\Async\{closure}(17, Array)
#5 /home/website/web/website.com/public_html/vendor/spatie/async/src/helpers.php(22): Spatie\Async\Pool->wait()
#6 /home/website/web/website.com/public_html/app/Http/Controllers/HomeController.php(1144): await(Object(Spatie\Async\Pool))
#7 /home/website/web/website.com/public_html/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): App\Http\Controllers\HomeController->executePing()
#8 /home/website/web/website.com/public_html/vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#9 /home/website/web/website.com/public_html/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\Container\Util::unwrapIfClosure(Object(Closure))
#10 /home/website/web/website.com/public_html/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#11 /home/website/web/website.com/public_html/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(66): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array)
#12 /home/website/web/website.com/public_html/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(32): Illuminate\Container\BoundMethod::callClass(Object(Illuminate\Foundation\Application), 'App\\Http\\Contro...', Array, NULL)
#13 /home/website/web/website.com/public_html/vendor/laravel/framework/src/Illuminate/Container/Container.php(610): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), 'App\\Http\\Contro...', Array, NULL)
#14 /home/website/web/website.com/public_html/vendor/laravel/framework/src/Illuminate/Console/Scheduling/CallbackEvent.php(80): Illuminate\Container\Container->call('App\\Http\\Contro...', Array)
#15 /home/website/web/website.com/public_html/vendor/laravel/framework/src/Illuminate/Console/Scheduling/ScheduleRunCommand.php(143): Illuminate\Console\Scheduling\CallbackEvent->run(Object(Illuminate\Foundation\Application))
#16 /home/website/web/website.com/public_html/vendor/laravel/framework/src/Illuminate/Console/Scheduling/ScheduleRunCommand.php(102): Illuminate\Console\Scheduling\ScheduleRunCommand->runEvent(Object(Illuminate\Console\Scheduling\CallbackEvent))
#17 /home/website/web/website.com/public_html/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Illuminate\Console\Scheduling\ScheduleRunCommand->handle(Object(Illuminate\Console\Scheduling\Schedule), Object(Illuminate\Events\Dispatcher), Object(NunoMaduro\Collision\Adapters\Laravel\ExceptionHandler))
#18 /home/website/web/website.com/public_html/vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#19 /home/website/web/website.com/public_html/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\Container\Util::unwrapIfClosure(Object(Closure))
#20 /home/website/web/website.com/public_html/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#21 /home/website/web/website.com/public_html/vendor/laravel/framework/src/Illuminate/Container/Container.php(610): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)
#22 /home/website/web/website.com/public_html/vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Illuminate\Container\Container->call(Array)
#23 /home/website/web/website.com/public_html/vendor/symfony/console/Command/Command.php(255): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#24 /home/website/web/website.com/public_html/vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#25 /home/website/web/website.com/public_html/vendor/symfony/console/Application.php(971): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#26 /home/website/web/website.com/public_html/vendor/symfony/console/Application.php(290): Symfony\Component\Console\Application->doRunCommand(Object(Illuminate\Console\Scheduling\ScheduleRunCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#27 /home/website/web/website.com/public_html/vendor/symfony/console/Application.php(166): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#28 /home/website/web/website.com/public_html/vendor/laravel/framework/src/Illuminate/Console/Application.php(93): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#29 /home/website/web/website.com/public_html/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(129): Illuminate\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#30 /home/website/web/website.com/public_html/artisan(37): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#31 {main}
"} 
 

Комментарии:

1. Удар в темноте, установлено ли расширение PCNTL в рабочей среде?

2. Да, он установлен и включен в php.ini

3. Обратите внимание: я отредактировал свой вопрос с более подробной информацией. Я совершил глупую ошибку, не проверив разрешение на запись в файл журнала. Теперь у меня есть ошибка, и, проще говоря, все классы «внутри пула» не распознаются при запуске по расписанию (Kernel.php).