PHPackages                             pogo/scheduler - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. pogo/scheduler

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

pogo/scheduler
==============

Pogo Native Scheduler for Laravel

v0.0.2(5mo ago)024[1 issues](https://github.com/y-l-g/scheduler/issues)MITGoPHP ^8.5CI failing

Since Jan 4Pushed 1mo agoCompare

[ Source](https://github.com/y-l-g/scheduler)[ Packagist](https://packagist.org/packages/pogo/scheduler)[ RSS](/packages/pogo-scheduler/feed)WikiDiscussions main Synced today

READMEChangelog (3)Dependencies (3)Versions (3)Used By (0)

Pogo Scheduler
==============

[](#pogo-scheduler)

A small [Caddy](https://caddyserver.com) / [FrankenPHP](https://frankenphp.dev) module that acts as an embedded cron trigger for constrained or single-binary PHP deployments.

It runs a lightweight Go ticker and executes a configurable command, such as `php artisan schedule:run`, every minute aligned to the wall clock.

Pogo Scheduler is intentionally not a distributed scheduler. In Kubernetes production environments, prefer native `CronJob` resources.

Production status
-----------------

[](#production-status)

Pogo Scheduler is a small experimental module for constrained, single-binary, and single-node PHP deployments. Its API may change.

It is not a distributed scheduler. In horizontally scaled deployments, run it as a singleton service or rely on application-level shared locks. In Kubernetes production environments, prefer native `CronJob` resources.

Installation
------------

[](#installation)

### 1. Docker

[](#1-docker)

Build a FrankenPHP binary that includes Pogo Scheduler with `xcaddy`. See the official [FrankenPHP Docker documentation](https://frankenphp.dev/docs/docker/) for the base image details.

Example Dockerfile from this repository root:

```
FROM dunglas/frankenphp:builder AS builder

COPY --from=caddy:builder /usr/bin/xcaddy /usr/bin/xcaddy
COPY . /src/scheduler

RUN CGO_ENABLED=1 \
    XCADDY_SETCAP=1 \
    XCADDY_GO_BUILD_FLAGS="-ldflags='-w -s' -tags=nobadger,nomysql,nopgx" \
    CGO_CFLAGS="$(php-config --includes)" \
    CGO_LDFLAGS="$(php-config --ldflags) $(php-config --libs)" \
    xcaddy build \
        --output /usr/local/bin/frankenphp \
        --with github.com/dunglas/frankenphp=./ \
        --with github.com/dunglas/frankenphp/caddy=./caddy  \
        --with github.com/dunglas/caddy-cbrotli \
        --with github.com/y-l-g/scheduler/module=./src/scheduler/module

FROM dunglas/frankenphp AS runner

COPY --from=builder /usr/local/bin/frankenphp /usr/local/bin/frankenphp
```

Then copy your app and `Caddyfile` into the runner image as usual.

### 2. Configure Caddyfile

[](#2-configure-caddyfile)

Add a `pogo_scheduler` block to your Caddyfile. Example for Laravel:

```
{
    pogo_scheduler {
        command        php artisan schedule:run
        dir            /var/www/html
        timeout        5m
        overlap        allow
        shutdown_grace 30s
    }
}
```

- **command**: command to run every minute (default: `php artisan schedule:run`).
- **dir**: working directory for the command (optional).
- **timeout**: max duration per run (default: 5m).
- **overlap**: `allow` or `skip` (default: `allow`). When set to `skip`, a tick is skipped if the previous command is still running.
- **shutdown\_grace**: max time to let an active command finish during shutdown before it is cancelled (default: 30s).

### 3. Run Octane

[](#3-run-octane)

Start the server using the configured Caddyfile:

```
php artisan octane:frankenphp --caddyfile=Caddyfile
# or
./frankenphp run
```

---

How It Works
------------

[](#how-it-works)

1. **The Ticker (Go)**: A goroutine wakes up every 60 seconds, aligned to the start of each minute (`:00`).
2. **The Command**: At each tick, the module runs the configured command in a subprocess (e.g. `php artisan schedule:run`).
3. **Timeout**: Each run is bounded by the configured `timeout`; the process is killed if it exceeds it.
4. **Overlap Mode**: By default, every minute tick starts a command. Use `overlap skip` to drop a tick while the previous command is still running.
5. **Graceful Shutdown**: On Caddy shutdown or reload, no new commands are started. The active command can finish within `shutdown_grace`; after that, it is cancelled.

When To Use It
--------------

[](#when-to-use-it)

Good fits:

- Single VPS or single-server deployments.
- Docker Compose or small Docker setups where you want to avoid `cron`, `supervisord`, or a separate scheduler container.
- PaaS environments where the app has one long-running web process but no system cron.
- Development and staging environments where you want scheduler behavior without host setup.
- A dedicated singleton scheduler service using the same application image.

Poor fits:

- Kubernetes production. Use native `CronJob` resources instead.
- Horizontally scaled web replicas unless your application uses shared locks, such as Laravel `onOneServer()` / `withoutOverlapping()` with a shared cache backend.
- Critical exactly-once workflows without application-level idempotency and locking.

Overlap Behavior
----------------

[](#overlap-behavior)

The default starts a command on every minute boundary:

```
overlap allow
```

This matches Laravel's `schedule:run` behavior. Sub-minute tasks such as `everySecond()` keep `schedule:run` alive for most of the minute, and a small overrun at `:00` should not skip the whole next minute.

You can opt into a local overlap guard:

```
overlap skip
```

Use `skip` only when the command itself must never overlap. If one run is still active at the next minute boundary, the new run is skipped and a warning is logged.

###  Health Score

36

—

LowBetter than 79% of packages

Maintenance81

Actively maintained with recent releases

Popularity6

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity43

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 79.1% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~3 days

Total

2

Last Release

177d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/559468?v=4)[y-l](/maintainers/y-l)[@Y-L](https://github.com/Y-L)

---

Top Contributors

[![y-l-g](https://avatars.githubusercontent.com/u/116063953?v=4)](https://github.com/y-l-g "y-l-g (34 commits)")[![renovate[bot]](https://avatars.githubusercontent.com/in/2740?v=4)](https://github.com/renovate[bot] "renovate[bot] (9 commits)")

---

Tags

schedulerlaravelcronfrankenphpPoGo

### Embed Badge

![Health badge](/badges/pogo-scheduler/health.svg)

```
[![Health](https://phpackages.com/badges/pogo-scheduler/health.svg)](https://phpackages.com/packages/pogo-scheduler)
```

###  Alternatives

[unopim/unopim

UnoPim Laravel PIM

10.5k2.4k](/packages/unopim-unopim)[bagisto/bagisto

Bagisto Laravel E-Commerce

27.6k172.1k9](/packages/bagisto-bagisto)[laravel/octane

Supercharge your Laravel application's performance.

4.0k26.6M223](/packages/laravel-octane)[firefly-iii/data-importer

Firefly III Data Import Tool.

8035.8k](/packages/firefly-iii-data-importer)[markwalet/nova-modal-response

A Laravel Nova asset for Modal responses on an action.

17878.9k](/packages/markwalet-nova-modal-response)[ronasit/laravel-helpers

Provided helpers function and some helper class.

2085.6k31](/packages/ronasit-laravel-helpers)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
