#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).