robotomarvin/symfony-process-manager
A lightweight PHP manager for Symfony Process that simplifies running, tracking, and controlling multiple concurrent processes. Handle output, errors, exit codes, and lifecycle events through a clean, fluent API.
consumers: model lets one consumer declare multiple transports: (scalar or list), with list order as priority order. A PM can now standardize a [main, failed] pattern for primary/fallback draining in a single worker pool instead of standing up a separate pool per transport — a direct cost and operational-complexity decision for queue architecture.AutoscalerLoop now emits pool gauges (autoscaler_target_workers, autoscaler_current_workers, autoscaler_unmet_demand, worker_busy_workers) at start(), so Fixed-strategy pools and freshly booted workers are visible immediately. This makes autoscaler behavior observable from the first second, supporting decisions about whether to trust autoscaling in production or keep static worker counts.{transport} to {consumer} on lifecycle counters (worker_starts_total, worker_failures_total, worker_backoffs_total, worker_exits_total) to avoid inflating rate() queries by transport-list length. Per-transport health remains available via messenger_messages_failed_total{transport,message_class}. This is a deliberate cardinality vs. granularity trade-off that product and SRE should agree on, because it defines what alerts and dashboards can be built.$transport template variable becomes $consumer, and panels were reflowed. Re-importing is a user-facing migration step that affects anyone who built workflows on the old dashboard.Consider it when:
[main, failed]) without multiplying worker pools, and can accept that priority order is list order.messenger_messages_failed_total.Look elsewhere when:
transports: to consumers: and relabeling lifecycle counters in a 0.0.x release signals the public contract is still moving; if downstream dashboards are customer-facing or contractually pinned, wait for 1.0 or vendor a fork.{consumer} is mandatory, and if you cannot rework those queries, this release is not adoptable as-is.For executives: This package turns queue worker operations into a managed, observable capability: autoscaling decisions are visible immediately at startup, one worker pool can drain primary and fallback transports in priority order, and lifecycle metrics are deliberately bounded so dashboards and rate() queries stay fast as transport lists grow. The trade-off is maturity — v0.0.2 ships breaking config and metric changes, so adoption should be scoped as a pinned-version pilot with a dashboard migration, not a company-wide standard yet.
For engineering: Expect a short but mandatory migration: rename transports: to consumers: in bundle config, migrate Grafana/Prom queries pinned to the transport label on worker lifecycle counters to consumer, and re-import the bundled dashboard ($transport → $consumer, panels reflowed). Transport-level failure visibility is preserved via messenger_messages_failed_total{transport,message_class}; do not expect per-transport fan-out on start/failure/backoff/exits counters. Worker logs now use [worker N consumer-label] with extra.consumer in JSON context, which simplifies log-based debugging by consumer.
For product/ops: The multi-transport consumer is the headline capability — encode [main, failed] as the standard pattern for failover, and reserve separate consumers for workloads that need fair sharing. The autoscaler gauge fix eliminates the cold-start blind spot that made Fixed-strategy pools and Grafana template variables look broken; verify /metrics is populated at worker start as an acceptance criterion. Given the pre-1.0 churn, treat the metric and config schema as an internal interface to pin and review each release, and budget migration effort for any dashboard consumers outside the platform team.
How can I help you explore Laravel packages today?