[{"data":1,"prerenderedAt":1031},["ShallowReactive",2],{"navigation":3,"\u002Fextensions\u002Fqueue":65,"\u002Fextensions\u002Fqueue-surround":1026},[4,25,50],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fgetting-started","1.getting-started",[10,15,20],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Building FrankenPHP","\u002Fgetting-started\u002Fbuilding-frankenphp","1.getting-started\u002F3.building-frankenphp","i-lucide-hammer",{"title":26,"icon":6,"path":27,"stem":28,"children":29,"page":6},"Extensions","\u002Fextensions","2.extensions",[30,35,40,45],{"title":31,"path":32,"stem":33,"icon":34},"Queue","\u002Fextensions\u002Fqueue","2.extensions\u002F1.queue","i-lucide-list-checks",{"title":36,"path":37,"stem":38,"icon":39},"Scheduler","\u002Fextensions\u002Fscheduler","2.extensions\u002F2.scheduler","i-lucide-calendar-clock",{"title":41,"path":42,"stem":43,"icon":44},"Pogo","\u002Fextensions\u002Fpogo","2.extensions\u002F3.pogo","i-lucide-split",{"title":46,"path":47,"stem":48,"icon":49},"WebSocket","\u002Fextensions\u002Fwebsocket","2.extensions\u002F4.websocket","i-lucide-radio",{"title":51,"icon":6,"path":52,"stem":53,"children":54,"page":6},"Reference","\u002Freference","3.reference",[55,60],{"title":56,"path":57,"stem":58,"icon":59},"Caddy Reference","\u002Freference\u002Fcaddy","3.reference\u002F1.caddy","i-lucide-settings-2",{"title":61,"path":62,"stem":63,"icon":64},"PHP API","\u002Freference\u002Fphp-api","3.reference\u002F2.php-api","i-lucide-file-code-2",{"id":66,"title":31,"body":67,"description":1019,"extension":1020,"links":1021,"meta":1022,"navigation":1023,"path":32,"seo":1024,"stem":33,"__hash__":1025},"docs\u002F2.extensions\u002F1.queue.md",{"type":68,"value":69,"toc":1006},"minimark",[70,75,79,82,86,89,92,105,108,119,123,126,183,187,190,332,335,401,404,408,413,416,432,439,471,474,497,500,644,648,651,665,668,739,742,837,840,843,873,901,905,953,957,1002],[71,72,74],"h2",{"id":73},"overview","Overview",[76,77,78],"p",{},"Pogo Queue is a FrankenPHP queue module with Laravel and Symfony Messenger drivers.",[76,80,81],{},"It runs a Go worker loop inside the FrankenPHP process, reserves jobs from Redis Streams, delivers each job to a PHP worker script, and acknowledges, releases, or fails the delivery through native PHP functions.",[71,83,85],{"id":84},"status-and-fit","Status and fit",[76,87,88],{},"Pogo Queue is designed for production use with Redis Streams and at-least-once delivery. Job handlers must be idempotent because a reserved job can be delivered more than once after a timeout, process restart, or worker failure.",[76,90,91],{},"Use it when:",[93,94,95,99,102],"ul",{},[96,97,98],"li",{},"You already operate Redis.",[96,100,101],{},"You want queue workers inside the FrankenPHP deployment model.",[96,103,104],{},"Laravel or Symfony Messenger already owns your job definitions and retry policy.",[76,106,107],{},"Avoid it when:",[93,109,110,113,116],{},[96,111,112],{},"You need a dashboard or Horizon replacement.",[96,114,115],{},"You cannot make job handlers idempotent.",[96,117,118],{},"You need exactly-once job execution.",[71,120,122],{"id":121},"build","Build",[76,124,125],{},"Compile the module into FrankenPHP:",[127,128,134],"pre",{"className":129,"code":130,"filename":131,"language":132,"meta":133,"style":133},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","xcaddy build \\\n  --with github.com\u002Fdunglas\u002Ffrankenphp@v1.12.3 \\\n  --with github.com\u002Fdunglas\u002Ffrankenphp\u002Fcaddy@v1.12.3 \\\n  --with github.com\u002Fy-l-g\u002Fqueue\u002Fmodule@main\n","Terminal","bash","",[135,136,137,154,165,175],"code",{"__ignoreMap":133},[138,139,142,146,150],"span",{"class":140,"line":141},"line",1,[138,143,145],{"class":144},"sBMFI","xcaddy",[138,147,149],{"class":148},"sfazB"," build",[138,151,153],{"class":152},"sTEyZ"," \\\n",[138,155,157,160,163],{"class":140,"line":156},2,[138,158,159],{"class":148},"  --with",[138,161,162],{"class":148}," github.com\u002Fdunglas\u002Ffrankenphp@v1.12.3",[138,164,153],{"class":152},[138,166,168,170,173],{"class":140,"line":167},3,[138,169,159],{"class":148},[138,171,172],{"class":148}," github.com\u002Fdunglas\u002Ffrankenphp\u002Fcaddy@v1.12.3",[138,174,153],{"class":152},[138,176,178,180],{"class":140,"line":177},4,[138,179,159],{"class":148},[138,181,182],{"class":148}," github.com\u002Fy-l-g\u002Fqueue\u002Fmodule@main\n",[71,184,186],{"id":185},"caddy-configuration","Caddy configuration",[76,188,189],{},"Production Redis backend:",[127,191,196],{"className":192,"code":193,"filename":194,"language":195,"meta":133,"style":133},"language-caddyfile shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  frankenphp\n\n  pogo_queue {\n    backend redis {\n      url {$POGO_REDIS_URL}\n      key_prefix pogo\n      group default\n      consumer {$HOSTNAME}\n      tls false\n    }\n\n    worker public\u002Fqueue-worker.php\n    queues default,mail,notifications\n    concurrency 8\n    worker_threads 8\n    max_payload_bytes 1048576\n    visibility_timeout 90s\n    reserve_timeout 1s\n    shutdown_timeout 30s\n    max_attempts 3\n  }\n}\n","Caddyfile","caddyfile",[135,197,198,203,208,214,219,225,231,237,243,249,255,261,266,272,278,284,290,296,302,308,314,320,326],{"__ignoreMap":133},[138,199,200],{"class":140,"line":141},[138,201,202],{},"{\n",[138,204,205],{"class":140,"line":156},[138,206,207],{},"  frankenphp\n",[138,209,210],{"class":140,"line":167},[138,211,213],{"emptyLinePlaceholder":212},true,"\n",[138,215,216],{"class":140,"line":177},[138,217,218],{},"  pogo_queue {\n",[138,220,222],{"class":140,"line":221},5,[138,223,224],{},"    backend redis {\n",[138,226,228],{"class":140,"line":227},6,[138,229,230],{},"      url {$POGO_REDIS_URL}\n",[138,232,234],{"class":140,"line":233},7,[138,235,236],{},"      key_prefix pogo\n",[138,238,240],{"class":140,"line":239},8,[138,241,242],{},"      group default\n",[138,244,246],{"class":140,"line":245},9,[138,247,248],{},"      consumer {$HOSTNAME}\n",[138,250,252],{"class":140,"line":251},10,[138,253,254],{},"      tls false\n",[138,256,258],{"class":140,"line":257},11,[138,259,260],{},"    }\n",[138,262,264],{"class":140,"line":263},12,[138,265,213],{"emptyLinePlaceholder":212},[138,267,269],{"class":140,"line":268},13,[138,270,271],{},"    worker public\u002Fqueue-worker.php\n",[138,273,275],{"class":140,"line":274},14,[138,276,277],{},"    queues default,mail,notifications\n",[138,279,281],{"class":140,"line":280},15,[138,282,283],{},"    concurrency 8\n",[138,285,287],{"class":140,"line":286},16,[138,288,289],{},"    worker_threads 8\n",[138,291,293],{"class":140,"line":292},17,[138,294,295],{},"    max_payload_bytes 1048576\n",[138,297,299],{"class":140,"line":298},18,[138,300,301],{},"    visibility_timeout 90s\n",[138,303,305],{"class":140,"line":304},19,[138,306,307],{},"    reserve_timeout 1s\n",[138,309,311],{"class":140,"line":310},20,[138,312,313],{},"    shutdown_timeout 30s\n",[138,315,317],{"class":140,"line":316},21,[138,318,319],{},"    max_attempts 3\n",[138,321,323],{"class":140,"line":322},22,[138,324,325],{},"  }\n",[138,327,329],{"class":140,"line":328},23,[138,330,331],{},"}\n",[76,333,334],{},"Local-only memory backend:",[127,336,338],{"className":192,"code":337,"filename":194,"language":195,"meta":133,"style":133},"{\n  frankenphp\n\n  pogo_queue {\n    backend memory {\n      max_messages 1000\n      max_total_bytes 67108864\n    }\n\n    worker public\u002Fqueue-worker.php\n    queues default\n    concurrency 2\n  }\n}\n",[135,339,340,344,348,352,356,361,366,371,375,379,383,388,393,397],{"__ignoreMap":133},[138,341,342],{"class":140,"line":141},[138,343,202],{},[138,345,346],{"class":140,"line":156},[138,347,207],{},[138,349,350],{"class":140,"line":167},[138,351,213],{"emptyLinePlaceholder":212},[138,353,354],{"class":140,"line":177},[138,355,218],{},[138,357,358],{"class":140,"line":221},[138,359,360],{},"    backend memory {\n",[138,362,363],{"class":140,"line":227},[138,364,365],{},"      max_messages 1000\n",[138,367,368],{"class":140,"line":233},[138,369,370],{},"      max_total_bytes 67108864\n",[138,372,373],{"class":140,"line":239},[138,374,260],{},[138,376,377],{"class":140,"line":245},[138,378,213],{"emptyLinePlaceholder":212},[138,380,381],{"class":140,"line":251},[138,382,271],{},[138,384,385],{"class":140,"line":257},[138,386,387],{},"    queues default\n",[138,389,390],{"class":140,"line":263},[138,391,392],{},"    concurrency 2\n",[138,394,395],{"class":140,"line":268},[138,396,325],{},[138,398,399],{"class":140,"line":274},[138,400,331],{},[76,402,403],{},"The memory backend is not durable and must not be used for critical production work.",[71,405,407],{"id":406},"application-integration","Application integration",[409,410,412],"h3",{"id":411},"laravel","Laravel",[76,414,415],{},"Install the driver:",[127,417,419],{"className":129,"code":418,"filename":131,"language":132,"meta":133,"style":133},"composer require pogo\u002Flaravel-queue\n",[135,420,421],{"__ignoreMap":133},[138,422,423,426,429],{"class":140,"line":141},[138,424,425],{"class":144},"composer",[138,427,428],{"class":148}," require",[138,430,431],{"class":148}," pogo\u002Flaravel-queue\n",[76,433,434,435,438],{},"Configure ",[135,436,437],{},"config\u002Fqueue.php",":",[127,440,444],{"className":441,"code":442,"filename":437,"language":443,"meta":133,"style":133},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","'pogo' => [\n    'driver' => 'pogo',\n    'queue' => env('POGO_QUEUE', 'default'),\n    'retry_after' => 90,\n],\n","php",[135,445,446,451,456,461,466],{"__ignoreMap":133},[138,447,448],{"class":140,"line":141},[138,449,450],{},"'pogo' => [\n",[138,452,453],{"class":140,"line":156},[138,454,455],{},"    'driver' => 'pogo',\n",[138,457,458],{"class":140,"line":167},[138,459,460],{},"    'queue' => env('POGO_QUEUE', 'default'),\n",[138,462,463],{"class":140,"line":177},[138,464,465],{},"    'retry_after' => 90,\n",[138,467,468],{"class":140,"line":221},[138,469,470],{},"],\n",[76,472,473],{},"Set the environment:",[127,475,480],{"className":476,"code":477,"filename":478,"language":479,"meta":133,"style":133},"language-dotenv shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","QUEUE_CONNECTION=pogo\nPOGO_QUEUE=default\nPOGO_REDIS_URL=redis:\u002F\u002Fredis:6379\u002F0\n",".env","dotenv",[135,481,482,487,492],{"__ignoreMap":133},[138,483,484],{"class":140,"line":141},[138,485,486],{},"QUEUE_CONNECTION=pogo\n",[138,488,489],{"class":140,"line":156},[138,490,491],{},"POGO_QUEUE=default\n",[138,493,494],{"class":140,"line":167},[138,495,496],{},"POGO_REDIS_URL=redis:\u002F\u002Fredis:6379\u002F0\n",[76,498,499],{},"Create a FrankenPHP queue worker entrypoint:",[127,501,504],{"className":441,"code":502,"filename":503,"language":443,"meta":133,"style":133},"\u003C?php\n\nuse Illuminate\\Queue\\WorkerOptions;\nuse Laravel\\Octane\\ApplicationFactory;\nuse Laravel\\Octane\\FrankenPhp\\FrankenPhpClient;\nuse Laravel\\Octane\\Worker;\nuse Pogo\\Queue\\Laravel\\PogoJob;\n\nrequire_once dirname(__DIR__) . '\u002Fvendor\u002Fautoload.php';\n\n$basePath = $_SERVER['APP_BASE_PATH'] ?? dirname(__DIR__);\n$worker = tap(new Worker(new ApplicationFactory($basePath), new FrankenPhpClient()))->boot();\n$options = new WorkerOptions();\n$connection = $_ENV['POGO_CONNECTION'] ?? 'pogo';\n\ntry {\n    while (frankenphp_handle_request(static function (string $message) use ($worker, $options, $connection): void {\n        $delivery = json_decode($message, true, flags: JSON_THROW_ON_ERROR);\n        $app = $worker->application();\n        $queue = $app['queue']->connection($connection);\n        $job = PogoJob::fromDelivery($app, $queue, $delivery);\n\n        $app['queue.worker']->process($connection, $job, $options);\n    })) {\n    }\n} finally {\n    $worker->terminate();\n}\n","public\u002Fqueue-worker.php",[135,505,506,511,515,520,525,530,535,540,544,549,553,558,563,568,573,577,582,587,592,597,602,607,611,616,622,627,633,639],{"__ignoreMap":133},[138,507,508],{"class":140,"line":141},[138,509,510],{},"\u003C?php\n",[138,512,513],{"class":140,"line":156},[138,514,213],{"emptyLinePlaceholder":212},[138,516,517],{"class":140,"line":167},[138,518,519],{},"use Illuminate\\Queue\\WorkerOptions;\n",[138,521,522],{"class":140,"line":177},[138,523,524],{},"use Laravel\\Octane\\ApplicationFactory;\n",[138,526,527],{"class":140,"line":221},[138,528,529],{},"use Laravel\\Octane\\FrankenPhp\\FrankenPhpClient;\n",[138,531,532],{"class":140,"line":227},[138,533,534],{},"use Laravel\\Octane\\Worker;\n",[138,536,537],{"class":140,"line":233},[138,538,539],{},"use Pogo\\Queue\\Laravel\\PogoJob;\n",[138,541,542],{"class":140,"line":239},[138,543,213],{"emptyLinePlaceholder":212},[138,545,546],{"class":140,"line":245},[138,547,548],{},"require_once dirname(__DIR__) . '\u002Fvendor\u002Fautoload.php';\n",[138,550,551],{"class":140,"line":251},[138,552,213],{"emptyLinePlaceholder":212},[138,554,555],{"class":140,"line":257},[138,556,557],{},"$basePath = $_SERVER['APP_BASE_PATH'] ?? dirname(__DIR__);\n",[138,559,560],{"class":140,"line":263},[138,561,562],{},"$worker = tap(new Worker(new ApplicationFactory($basePath), new FrankenPhpClient()))->boot();\n",[138,564,565],{"class":140,"line":268},[138,566,567],{},"$options = new WorkerOptions();\n",[138,569,570],{"class":140,"line":274},[138,571,572],{},"$connection = $_ENV['POGO_CONNECTION'] ?? 'pogo';\n",[138,574,575],{"class":140,"line":280},[138,576,213],{"emptyLinePlaceholder":212},[138,578,579],{"class":140,"line":286},[138,580,581],{},"try {\n",[138,583,584],{"class":140,"line":292},[138,585,586],{},"    while (frankenphp_handle_request(static function (string $message) use ($worker, $options, $connection): void {\n",[138,588,589],{"class":140,"line":298},[138,590,591],{},"        $delivery = json_decode($message, true, flags: JSON_THROW_ON_ERROR);\n",[138,593,594],{"class":140,"line":304},[138,595,596],{},"        $app = $worker->application();\n",[138,598,599],{"class":140,"line":310},[138,600,601],{},"        $queue = $app['queue']->connection($connection);\n",[138,603,604],{"class":140,"line":316},[138,605,606],{},"        $job = PogoJob::fromDelivery($app, $queue, $delivery);\n",[138,608,609],{"class":140,"line":322},[138,610,213],{"emptyLinePlaceholder":212},[138,612,613],{"class":140,"line":328},[138,614,615],{},"        $app['queue.worker']->process($connection, $job, $options);\n",[138,617,619],{"class":140,"line":618},24,[138,620,621],{},"    })) {\n",[138,623,625],{"class":140,"line":624},25,[138,626,260],{},[138,628,630],{"class":140,"line":629},26,[138,631,632],{},"} finally {\n",[138,634,636],{"class":140,"line":635},27,[138,637,638],{},"    $worker->terminate();\n",[138,640,642],{"class":140,"line":641},28,[138,643,331],{},[409,645,647],{"id":646},"symfony","Symfony",[76,649,650],{},"Install the bundle:",[127,652,654],{"className":129,"code":653,"filename":131,"language":132,"meta":133,"style":133},"composer require pogo\u002Fsymfony-queue\n",[135,655,656],{"__ignoreMap":133},[138,657,658,660,662],{"class":140,"line":141},[138,659,425],{"class":144},[138,661,428],{"class":148},[138,663,664],{"class":148}," pogo\u002Fsymfony-queue\n",[76,666,667],{},"Configure Messenger:",[127,669,674],{"className":670,"code":671,"filename":672,"language":673,"meta":133,"style":133},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","framework:\n  messenger:\n    transports:\n      pogo: 'pogo-queue:\u002F\u002Fdefault'\n    routing:\n      'App\\Message\\YourMessage': pogo\n","config\u002Fpackages\u002Fmessenger.yaml","yaml",[135,675,676,686,693,700,716,723],{"__ignoreMap":133},[138,677,678,682],{"class":140,"line":141},[138,679,681],{"class":680},"swJcz","framework",[138,683,685],{"class":684},"sMK4o",":\n",[138,687,688,691],{"class":140,"line":156},[138,689,690],{"class":680},"  messenger",[138,692,685],{"class":684},[138,694,695,698],{"class":140,"line":167},[138,696,697],{"class":680},"    transports",[138,699,685],{"class":684},[138,701,702,705,707,710,713],{"class":140,"line":177},[138,703,704],{"class":680},"      pogo",[138,706,438],{"class":684},[138,708,709],{"class":684}," '",[138,711,712],{"class":148},"pogo-queue:\u002F\u002Fdefault",[138,714,715],{"class":684},"'\n",[138,717,718,721],{"class":140,"line":221},[138,719,720],{"class":680},"    routing",[138,722,685],{"class":684},[138,724,725,728,731,734,736],{"class":140,"line":227},[138,726,727],{"class":684},"      '",[138,729,730],{"class":148},"App\\Message\\YourMessage",[138,732,733],{"class":684},"'",[138,735,438],{"class":684},[138,737,738],{"class":148}," pogo\n",[76,740,741],{},"Create a worker entrypoint:",[127,743,745],{"className":441,"code":744,"filename":503,"language":443,"meta":133,"style":133},"\u003C?php\n\nuse App\\Kernel;\nuse Symfony\\Bundle\\FrameworkBundle\\Console\\Application;\nuse Symfony\\Component\\Console\\Input\\ArrayInput;\n\nrequire_once __DIR__ . '\u002F..\u002Fvendor\u002Fautoload_runtime.php';\n\nreturn static function (array $context) {\n    $kernel = new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']);\n    $app = new Application($kernel);\n    $app->setDefaultCommand('messenger:consume', true);\n    $app->run(new ArrayInput([\n        'receivers' => ['pogo'],\n        '--time-limit' => 3600,\n    ]));\n\n    return $app;\n};\n",[135,746,747,751,755,760,765,770,774,779,783,788,793,798,803,808,813,818,823,827,832],{"__ignoreMap":133},[138,748,749],{"class":140,"line":141},[138,750,510],{},[138,752,753],{"class":140,"line":156},[138,754,213],{"emptyLinePlaceholder":212},[138,756,757],{"class":140,"line":167},[138,758,759],{},"use App\\Kernel;\n",[138,761,762],{"class":140,"line":177},[138,763,764],{},"use Symfony\\Bundle\\FrameworkBundle\\Console\\Application;\n",[138,766,767],{"class":140,"line":221},[138,768,769],{},"use Symfony\\Component\\Console\\Input\\ArrayInput;\n",[138,771,772],{"class":140,"line":227},[138,773,213],{"emptyLinePlaceholder":212},[138,775,776],{"class":140,"line":233},[138,777,778],{},"require_once __DIR__ . '\u002F..\u002Fvendor\u002Fautoload_runtime.php';\n",[138,780,781],{"class":140,"line":239},[138,782,213],{"emptyLinePlaceholder":212},[138,784,785],{"class":140,"line":245},[138,786,787],{},"return static function (array $context) {\n",[138,789,790],{"class":140,"line":251},[138,791,792],{},"    $kernel = new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']);\n",[138,794,795],{"class":140,"line":257},[138,796,797],{},"    $app = new Application($kernel);\n",[138,799,800],{"class":140,"line":263},[138,801,802],{},"    $app->setDefaultCommand('messenger:consume', true);\n",[138,804,805],{"class":140,"line":268},[138,806,807],{},"    $app->run(new ArrayInput([\n",[138,809,810],{"class":140,"line":274},[138,811,812],{},"        'receivers' => ['pogo'],\n",[138,814,815],{"class":140,"line":280},[138,816,817],{},"        '--time-limit' => 3600,\n",[138,819,820],{"class":140,"line":286},[138,821,822],{},"    ]));\n",[138,824,825],{"class":140,"line":292},[138,826,213],{"emptyLinePlaceholder":212},[138,828,829],{"class":140,"line":298},[138,830,831],{},"    return $app;\n",[138,833,834],{"class":140,"line":304},[138,835,836],{},"};\n",[71,838,61],{"id":839},"php-api",[76,841,842],{},"The framework drivers use these native functions:",[127,844,846],{"className":441,"code":845,"language":443,"meta":133,"style":133},"pogo_queue_push(string $queue, string $payload, int $delaySeconds = 0): string;\npogo_queue_ack(string $queue, string $deliveryId): int;\npogo_queue_release(string $queue, string $deliveryId, int $delaySeconds = 0): int;\npogo_queue_fail(string $queue, string $deliveryId, string $reason = ''): int;\npogo_queue_status(?string $queue = null): string;\n",[135,847,848,853,858,863,868],{"__ignoreMap":133},[138,849,850],{"class":140,"line":141},[138,851,852],{},"pogo_queue_push(string $queue, string $payload, int $delaySeconds = 0): string;\n",[138,854,855],{"class":140,"line":156},[138,856,857],{},"pogo_queue_ack(string $queue, string $deliveryId): int;\n",[138,859,860],{"class":140,"line":167},[138,861,862],{},"pogo_queue_release(string $queue, string $deliveryId, int $delaySeconds = 0): int;\n",[138,864,865],{"class":140,"line":177},[138,866,867],{},"pogo_queue_fail(string $queue, string $deliveryId, string $reason = ''): int;\n",[138,869,870],{"class":140,"line":221},[138,871,872],{},"pogo_queue_status(?string $queue = null): string;\n",[76,874,875,878,879,882,883,882,886,888,889,892,893,896,897,900],{},[135,876,877],{},"pogo_queue_push()"," returns a JSON string containing ",[135,880,881],{},"ok",", ",[135,884,885],{},"id",[135,887,135],{},", and ",[135,890,891],{},"message"," fields. ",[135,894,895],{},"pogo_queue()"," is still available as a deprecated v1 helper for immediate dispatch to the ",[135,898,899],{},"default"," queue.",[71,902,904],{"id":903},"operations","Operations",[93,906,907,910,917,923,946],{},[96,908,909],{},"Enable Redis persistence for production deployments.",[96,911,912,913,916],{},"Set ",[135,914,915],{},"visibility_timeout"," above the normal maximum job runtime.",[96,918,912,919,922],{},[135,920,921],{},"max_attempts"," according to your retry policy.",[96,924,925,926,882,929,882,932,882,935,882,938,941,942,945],{},"Monitor ",[135,927,928],{},"pending",[135,930,931],{},"reserved",[135,933,934],{},"delayed",[135,936,937],{},"failed",[135,939,940],{},"backend_errors",", and payload rejection counts through ",[135,943,944],{},"pogo_queue_status()",".",[96,947,948,949,952],{},"During deploys, FrankenPHP stops reserving new work and lets in-flight workers finish until ",[135,950,951],{},"shutdown_timeout","; unacknowledged Redis messages remain pending and can be reclaimed by another consumer.",[71,954,956],{"id":955},"troubleshooting","Troubleshooting",[93,958,959,973,983,993],{},[96,960,961,965,966,969,970,972],{},[962,963,964],"strong",{},"Worker unavailable:"," confirm the binary includes ",[135,967,968],{},"pogo_queue",", the Caddyfile has a ",[135,971,968],{}," block, and the worker script path is correct.",[96,974,975,978,979,982],{},[962,976,977],{},"Queue unknown:"," add the queue name to the ",[135,980,981],{},"queues"," directive.",[96,984,985,988,989,992],{},[962,986,987],{},"Payload too large:"," increase ",[135,990,991],{},"max_payload_bytes"," or reduce job payload size.",[96,994,995,998,999,1001],{},[962,996,997],{},"Growing reserved count:"," check PHP worker errors and make sure ",[135,1000,915],{}," is not shorter than normal job runtime.",[1003,1004,1005],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":133,"searchDepth":141,"depth":156,"links":1007},[1008,1009,1010,1011,1012,1016,1017,1018],{"id":73,"depth":156,"text":74},{"id":84,"depth":156,"text":85},{"id":121,"depth":156,"text":122},{"id":185,"depth":156,"text":186},{"id":406,"depth":156,"text":407,"children":1013},[1014,1015],{"id":411,"depth":167,"text":412},{"id":646,"depth":167,"text":647},{"id":839,"depth":156,"text":61},{"id":903,"depth":156,"text":904},{"id":955,"depth":156,"text":956},"Redis Streams backed queue workers for Laravel and Symfony Messenger.","md",null,{},{"icon":34},{"title":31,"description":1019},"x_0AKynlyHdu0c4IHpkowDRxbBQ4nExHK7a4rUtlVpA",[1027,1029],{"title":21,"path":22,"stem":23,"description":1028,"icon":24,"children":-1},"Compile a FrankenPHP binary with one or more Pogo plugins.",{"title":36,"path":37,"stem":38,"description":1030,"icon":39,"children":-1},"Embedded cron-style command trigger for single-binary FrankenPHP deployments.",1779731238168]