phpgt / daemon
Background script execution with cross-platform compatible streaming.
Fund package maintenance!
Requires
- php: >=8.1
- ext-pcntl: *
Requires (Dev)
- phpmd/phpmd: ^2.13
- phpstan/phpstan: ^v1.10
- phpunit/phpunit: ^10.5
- squizlabs/php_codesniffer: ^3.7
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
Execute background processes asynchronously using an object oriented process pool.
Example usage
<?php use GT\Daemon\Process; use GT\Daemon\Pool; // Create three long-running processes: $pingProcess = new Process("ping google.com"); $infiniteProcess = new Process("while true; do echo 'background...'; sleep 3; done"); $dateProcess = new Process("while true; do echo $(date -d now); sleep 2; done"); // Add all three processes to a pool: $pool = new Pool(); $pool->add("Ping", $pingProcess); $pool->add("Loop", $infiniteProcess); $pool->add("Date", $dateProcess); // Start the execution of all processes: $pool->exec(); // While processes are running, write their output to the terminal: do { echo $pool->read(); // Sleep to avoid hogging the CPU. sleep(1); } while($pool->numRunning() > 0);
Outputs something similar to:
[Ping] PING google.com (172.217.169.78) 56(84) bytes of data.
[Ping] 64 bytes from lhr48s09-in-f14.1e100.net (172.217.169.78): icmp_seq=1 ttl=52 time=8.78 ms
[Loop] background...
[Date] Mon 19 Aug 09:58:54 BST 2019
[Ping] 64 bytes from lhr48s09-in-f14.1e100.net (172.217.169.78): icmp_seq=2 ttl=52 time=8.75 ms
[Ping] 64 bytes from lhr48s09-in-f14.1e100.net (172.217.169.78): icmp_seq=3 ttl=52 time=8.75 ms
[Date] Mon 19 Aug 09:58:56 BST 2019
[Ping] 64 bytes from lhr48s09-in-f14.1e100.net (172.217.169.78): icmp_seq=4 ttl=52 time=8.75 ms
[Loop] background...
[Ping] 64 bytes from lhr48s09-in-f14.1e100.net (172.217.169.78): icmp_seq=5 ttl=52 time=8.80 ms
[Date] Mon 19 Aug 09:58:58 BST 2019
Notice how the date process is only set to loop three times, and after it is complete the other two infinite processes continue to run.
Automatically restarting workers
ContinuousPool extends Pool with a non-blocking tick() method and a configurable restart delay (one second by default). Use isActive() for the supervising loop: numRunning() can be zero while completed workers wait to restart. close() cancels restarts before stopping workers, and unread output is retained across executions.
See the ContinuousPool documentation for a complete example and lifecycle details.