<?php
 
 
    include_once('class.nb_cli_1.0.php');
 
 
    # An example test plugin that would be the part added by the user to create their program
 
    class my_plugin extends nb_plugin {
 
        private $stdin;
 
        private $stdout;
 
 
        // so we can give this plugin some loop independence (run on their own timers)
 
        private $next_run       = []; // when a loop should run // An array so we can have multiple loops.
 
        private $loop_running   = []; // so we don't engage another loop until the other is finished processing
 
 
        public function __construct() {
 
            // Set non-blocking mode for STDOUT
 
            stream_set_blocking(STDOUT, false);
 
 
            // Set non-blocking mode for STDIN
 
            stream_set_blocking(STDIN, false);
 
 
            $this->stdin    = fopen('php://stdin', 'r');
 
            $this->stdout   = fopen('php://stdout', 'w');
 
 
            $this->welcome();
 
        }
 
 
        public function out($msg) {
 
            fwrite($this->stdout, $msg);
 
        }
 
 
        public function handleCommand($command) {
 
            // process commands from user when they press enter
 
            switch ($command) {
 
                case 'test':
 
                    $help = "Test command\n";
 
                    // fwrite($this->stdout, $help);
 
                    $this->out($help);
 
                    break;
 
 
                case 'help':
 
                case 'h':
 
                    $help = "---\n";
 
                    $help .= "Showing help for *TestPlugin*\n";
 
                    $help .= "Available commands:\n";
 
                    $help .= "  test - Test command\n";
 
                    $help .= "---\n\n";
 
 
                    $this->out($help);
 
                    break;
 
            }
 
        }
 
 
        public function welcome() {
 
            // triggered by main loop when code requests a welcome
 
            $welcome = "-- NonBlockingCLI test server --\n";
 
            $welcome .= "Welcome to the NonBlockingCLI test server.\n";
 
            $welcome .= "Type 'h' or 'help' for a list of commands.\n";
 
            $welcome .= "Type 'quit' to exit.\n";
 
            $welcome .= "\n\n";
 
 
            $this->out($welcome);
 
        }
 
 
        public function run() {
 
            // this loop runs at main class speed
 
            $this->run_loop_1(); // output current time every second
 
            // .. can add other loops. Use run_loop_1 as an example.
 
        }
 
 
        public function run_loop_1() {
 
            $loop_key = 1; // for $this->next_run and $this->loop_running
 
 
            // we want to take a slot in next_run in case we have other loops.
 
            if (!isset($this->next_run[$loop_key])) {
 
                $this->next_run[$loop_key] = 0.0; // initialize // example of potential values: 1 second = 1.0, 1.5 seconds = 1.5, etc.
 
                $this->loop_running[$loop_key] = false;
 
            }
 
            
 
            // check if we should run this time
 
            // $this->next_run = microseconds
 
            if ($this->loop_running[$loop_key] || microtime(true) < $this->next_run[$loop_key]) {
 
                return;
 
            }
 
 
            // set loop as running
 
            $this->loop_running[$loop_key] = true;
 
 
            $output = "Current time: " . date('Y-m-d H:i:s') . "\n";
 
            $this->out($output);
 
            
 
            // set pace of plugin loop (runs independent of main loop)
 
            // store our next run time in a variable
 
            $this->next_run[$loop_key]      = microtime(true) + 1.0; // 1 second = 1.0, 1.5 seconds = 1.5, etc.
 
 
            // set loop as not running
 
            $this->loop_running[$loop_key] = false;
 
        }
 
    }
 
 
    ## EXAMPLE: ##
 
    // create plugins
 
    $plugin_a = new my_plugin();
 
    $plugin_b = new my_plugin();
 
 
    // create main object that controls the plugins
 
    $cli = new nb_cli();
 
 
    // add plugins to main controller
 
    $cli->add_plugin($plugin_a);
 
    $cli->add_plugin($plugin_b);
 
 
    // run our main controller which will run the plugins welcome() functions
 
    $cli->welcome();
 
 
    // run our main controller which will run the plugins run() functions in a loop
 
    // maximum speed is set in main controller, but each plugin can time their own runs
 
    $cli->run();
 
 
?>
 
 |