[{"data":1,"prerenderedAt":593},["ShallowReactive",2],{"navigation":3,"\u002Fextensions\u002Fscheduler":65,"\u002Fextensions\u002Fscheduler-surround":588},[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":36,"body":67,"description":581,"extension":582,"links":583,"meta":584,"navigation":585,"path":37,"seo":586,"stem":38,"__hash__":587},"docs\u002F2.extensions\u002F2.scheduler.md",{"type":68,"value":69,"toc":568},"minimark",[70,75,79,82,109,112,116,119,122,138,141,156,160,163,209,213,284,287,390,394,399,406,430,441,445,451,483,486,489,493,523,527,564],[71,72,74],"h2",{"id":73},"overview","Overview",[76,77,78],"p",{},"Pogo Scheduler is a small Caddy app that runs one configured command on every wall-clock minute.",[76,80,81],{},"The common Laravel command is:",[83,84,90],"pre",{"className":85,"code":86,"filename":87,"language":88,"meta":89,"style":89},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","php artisan schedule:run\n","Terminal","bash","",[91,92,93],"code",{"__ignoreMap":89},[94,95,98,102,106],"span",{"class":96,"line":97},"line",1,[94,99,101],{"class":100},"sBMFI","php",[94,103,105],{"class":104},"sfazB"," artisan",[94,107,108],{"class":104}," schedule:run\n",[76,110,111],{},"The scheduler runs in the FrankenPHP process. It is intentionally small and does not try to be a distributed scheduler.",[71,113,115],{"id":114},"status-and-fit","Status and fit",[76,117,118],{},"Pogo Scheduler is experimental. Its best fit is constrained, single-binary, and single-node deployments.",[76,120,121],{},"Use it when:",[123,124,125,129,132,135],"ul",{},[126,127,128],"li",{},"You run a single VPS or single server.",[126,130,131],{},"You use Docker Compose or a small container setup and want to avoid host cron.",[126,133,134],{},"You run a dedicated singleton scheduler service from the same application image.",[126,136,137],{},"Your framework handles locking, overlap, and task-level safety.",[76,139,140],{},"Avoid it when:",[123,142,143,150,153],{},[126,144,145,146,149],{},"You run production Kubernetes. Use native ",[91,147,148],{},"CronJob"," resources.",[126,151,152],{},"You scale web replicas without shared application locks.",[126,154,155],{},"You need exactly-once execution without idempotency or locking.",[71,157,159],{"id":158},"build","Build",[76,161,162],{},"Compile the module into FrankenPHP:",[83,164,166],{"className":85,"code":165,"filename":87,"language":88,"meta":89,"style":89},"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\u002Fscheduler\u002Fmodule@main\n",[91,167,168,180,191,201],{"__ignoreMap":89},[94,169,170,173,176],{"class":96,"line":97},[94,171,172],{"class":100},"xcaddy",[94,174,175],{"class":104}," build",[94,177,179],{"class":178},"sTEyZ"," \\\n",[94,181,183,186,189],{"class":96,"line":182},2,[94,184,185],{"class":104},"  --with",[94,187,188],{"class":104}," github.com\u002Fdunglas\u002Ffrankenphp@v1.12.3",[94,190,179],{"class":178},[94,192,194,196,199],{"class":96,"line":193},3,[94,195,185],{"class":104},[94,197,198],{"class":104}," github.com\u002Fdunglas\u002Ffrankenphp\u002Fcaddy@v1.12.3",[94,200,179],{"class":178},[94,202,204,206],{"class":96,"line":203},4,[94,205,185],{"class":104},[94,207,208],{"class":104}," github.com\u002Fy-l-g\u002Fscheduler\u002Fmodule@main\n",[71,210,212],{"id":211},"caddy-configuration","Caddy configuration",[83,214,219],{"className":215,"code":216,"filename":217,"language":218,"meta":89,"style":89},"language-caddyfile shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  frankenphp\n\n  pogo_scheduler {\n    command php artisan schedule:run\n    dir \u002Fvar\u002Fwww\u002Fhtml\n    timeout 5m\n    overlap allow\n    shutdown_grace 30s\n  }\n}\n","Caddyfile","caddyfile",[91,220,221,226,231,237,242,248,254,260,266,272,278],{"__ignoreMap":89},[94,222,223],{"class":96,"line":97},[94,224,225],{},"{\n",[94,227,228],{"class":96,"line":182},[94,229,230],{},"  frankenphp\n",[94,232,233],{"class":96,"line":193},[94,234,236],{"emptyLinePlaceholder":235},true,"\n",[94,238,239],{"class":96,"line":203},[94,240,241],{},"  pogo_scheduler {\n",[94,243,245],{"class":96,"line":244},5,[94,246,247],{},"    command php artisan schedule:run\n",[94,249,251],{"class":96,"line":250},6,[94,252,253],{},"    dir \u002Fvar\u002Fwww\u002Fhtml\n",[94,255,257],{"class":96,"line":256},7,[94,258,259],{},"    timeout 5m\n",[94,261,263],{"class":96,"line":262},8,[94,264,265],{},"    overlap allow\n",[94,267,269],{"class":96,"line":268},9,[94,270,271],{},"    shutdown_grace 30s\n",[94,273,275],{"class":96,"line":274},10,[94,276,277],{},"  }\n",[94,279,281],{"class":96,"line":280},11,[94,282,283],{},"}\n",[76,285,286],{},"Defaults:",[288,289,290,306],"table",{},[291,292,293],"thead",{},[294,295,296,300,303],"tr",{},[297,298,299],"th",{},"Directive",[297,301,302],{},"Default",[297,304,305],{},"Description",[307,308,309,325,338,353,375],"tbody",{},[294,310,311,317,322],{},[312,313,314],"td",{},[91,315,316],{},"command",[312,318,319],{},[91,320,321],{},"php artisan schedule:run",[312,323,324],{},"Command and arguments to run each minute.",[294,326,327,332,335],{},[312,328,329],{},[91,330,331],{},"dir",[312,333,334],{},"empty",[312,336,337],{},"Optional working directory.",[294,339,340,345,350],{},[312,341,342],{},[91,343,344],{},"timeout",[312,346,347],{},[91,348,349],{},"5m",[312,351,352],{},"Maximum duration for one command run.",[294,354,355,360,365],{},[312,356,357],{},[91,358,359],{},"overlap",[312,361,362],{},[91,363,364],{},"allow",[312,366,367,368,370,371,374],{},"Use ",[91,369,364],{}," or ",[91,372,373],{},"skip",".",[294,376,377,382,387],{},[312,378,379],{},[91,380,381],{},"shutdown_grace",[312,383,384],{},[91,385,386],{},"30s",[312,388,389],{},"Time to wait for an active command before cancellation.",[71,391,393],{"id":392},"application-integration","Application integration",[395,396,398],"h3",{"id":397},"laravel","Laravel",[76,400,401,402,405],{},"Use the default command and keep Laravel's scheduler definitions in ",[91,403,404],{},"routes\u002Fconsole.php"," or your normal scheduler setup:",[83,407,409],{"className":215,"code":408,"filename":217,"language":218,"meta":89,"style":89},"pogo_scheduler {\n  command php artisan schedule:run\n  dir \u002Fvar\u002Fwww\u002Fhtml\n}\n",[91,410,411,416,421,426],{"__ignoreMap":89},[94,412,413],{"class":96,"line":97},[94,414,415],{},"pogo_scheduler {\n",[94,417,418],{"class":96,"line":182},[94,419,420],{},"  command php artisan schedule:run\n",[94,422,423],{"class":96,"line":193},[94,424,425],{},"  dir \u002Fvar\u002Fwww\u002Fhtml\n",[94,427,428],{"class":96,"line":203},[94,429,283],{},[76,431,432,433,436,437,440],{},"When running more than one replica, use Laravel locks such as ",[91,434,435],{},"onOneServer()"," and ",[91,438,439],{},"withoutOverlapping()"," with a shared cache backend.",[395,442,444],{"id":443},"symfony-or-custom-php","Symfony or custom PHP",[76,446,447,448,450],{},"Point ",[91,449,316],{}," at any CLI command that can run once per minute:",[83,452,454],{"className":215,"code":453,"filename":217,"language":218,"meta":89,"style":89},"pogo_scheduler {\n  command php bin\u002Fconsole app:run-scheduled-tasks\n  dir \u002Fvar\u002Fwww\u002Fhtml\n  timeout 10m\n  overlap skip\n}\n",[91,455,456,460,465,469,474,479],{"__ignoreMap":89},[94,457,458],{"class":96,"line":97},[94,459,415],{},[94,461,462],{"class":96,"line":182},[94,463,464],{},"  command php bin\u002Fconsole app:run-scheduled-tasks\n",[94,466,467],{"class":96,"line":193},[94,468,425],{},[94,470,471],{"class":96,"line":203},[94,472,473],{},"  timeout 10m\n",[94,475,476],{"class":96,"line":244},[94,477,478],{},"  overlap skip\n",[94,480,481],{"class":96,"line":250},[94,482,283],{},[71,484,61],{"id":485},"php-api",[76,487,488],{},"Pogo Scheduler does not expose PHP functions. It is configured entirely through the Caddy global option.",[71,490,492],{"id":491},"operations","Operations",[123,494,495,498,501,511,517],{},[126,496,497],{},"Run the scheduler-enabled service as a singleton unless your application uses shared locks.",[126,499,500],{},"Keep scheduled tasks idempotent.",[126,502,367,503,506,507,510],{},[91,504,505],{},"overlap allow"," for Laravel's ",[91,508,509],{},"schedule:run",", especially when sub-minute tasks can keep the command alive for most of the minute.",[126,512,367,513,516],{},[91,514,515],{},"overlap skip"," only when the command itself must never overlap locally.",[126,518,519,520,522],{},"Set ",[91,521,344],{}," high enough for normal command duration but low enough to prevent stuck processes.",[71,524,526],{"id":525},"troubleshooting","Troubleshooting",[123,528,529,540,549,555],{},[126,530,531,535,536,539],{},[532,533,534],"strong",{},"Command never runs:"," confirm the binary includes ",[91,537,538],{},"pogo_scheduler"," and the global Caddyfile block is loaded.",[126,541,542,545,546,548],{},[532,543,544],{},"Wrong working directory:"," set ",[91,547,331],{}," to your application root.",[126,550,551,554],{},[532,552,553],{},"Duplicate scheduled work:"," run only one scheduler process or add framework-level shared locks.",[126,556,557,560,561,563],{},[532,558,559],{},"Command cancelled during deploy:"," increase ",[91,562,381],{}," or make the command shorter and resumable.",[565,566,567],"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 .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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":89,"searchDepth":97,"depth":182,"links":569},[570,571,572,573,574,578,579,580],{"id":73,"depth":182,"text":74},{"id":114,"depth":182,"text":115},{"id":158,"depth":182,"text":159},{"id":211,"depth":182,"text":212},{"id":392,"depth":182,"text":393,"children":575},[576,577],{"id":397,"depth":193,"text":398},{"id":443,"depth":193,"text":444},{"id":485,"depth":182,"text":61},{"id":491,"depth":182,"text":492},{"id":525,"depth":182,"text":526},"Embedded cron-style command trigger for single-binary FrankenPHP deployments.","md",null,{},{"icon":39},{"title":36,"description":581},"TR3bxS3nutSaBljKL8nmwbcuiUf758Q4YaZ7el7BqRo",[589,591],{"title":31,"path":32,"stem":33,"description":590,"icon":34,"children":-1},"Redis Streams backed queue workers for Laravel and Symfony Messenger.",{"title":41,"path":42,"stem":43,"description":592,"icon":44,"children":-1},"Request-scoped parallel PHP jobs for fan-out and fan-in work.",1779731238168]