<?php
 
/**
 
 * PHP_Fork class usage examples
 
 * ==================================================================================
 
 * NOTE: In real world you surely want to keep each class into
 
 * a separate file, then include() it into your application.
 
 * For this examples is more useful to keep all_code_into_one_file,
 
 * so that each example shows a unique feature of the PHP_Fork framework.
 
 * ==================================================================================
 
 * passing_vars.php
 
 * 
 
 * This example shows variable exchange between the parent process
 
 * and started pseudo-threads. This was not possible in previous releases because
 
 * parent and child processes lives into different memory spaces,
 
 * they are separate processes with their own PID and not separate instances living
 
 * into the same JVM; this is just forking, not real threading...
 
 * This framework offers a workaround based Shared Memory usage.
 
 * 
 
 * ==================================================================================
 
 * 
 
 * Copyright (c) 2003-2002 by Luca Mariano ([email protected])
 
 * http://www.lucamariano.it
 
 * 
 
 * This program is free software. You can redistribute it and/or modify
 
 * it under the terms of the GNU General Public License as published by
 
 * the Free Software Foundation; either version 2 of the License.
 
 */
 
// Import of base class
 
require_once ("../Fork.php");
 
// number of executeThreads we want
 
define ("NUM_THREAD", 2);
 
// Class definition; as into previos example (basic.php), this class simply
 
// increment a counter each second; instead of printing the value to stdout,
 
// we'll store it into an accessible location for latter use.
 
class executeThread extends PHP_Fork {
 
    var $counter;
 
 
    function executeThread($name)
 
    {
 
        $this->PHP_Fork($name);
 
        $this->counter = 0;
 
    } 
 
 
    function run()
 
    {
 
        while (true) {
 
            // setVariable is a method inherited from PHP_Fork super class
 
            // it sets a variable that can be accessed thru its name
 
            // by parent process (calling the getVariable() method)
 
            $this->setVariable('counter', $this->counter++);
 
            sleep(1);
 
        } 
 
    } 
 
 
    function getCounter()
 
    { 
 
        // parent process can call this facility method
 
        // in order to get back the actual value of the counter
 
        return $this->getVariable('counter');
 
    } 
 
} 
 
// Main program. Bring up NUM_THREAD instances of the executeThread class that
 
// runs concurrently. It's a multi-thread app with a few lines of code!!!
 
// Into this example we have a console to control thread behaviour and test
 
// their counter value.
 
for ($i = 0;$i < NUM_THREAD;$i++) {
 
    $executeThread[$i] = new executeThread ("executeThread-" . $i);
 
    $executeThread[$i]->start();
 
    echo "Started " . $executeThread[$i]->getName() . " with PID " . $executeThread[$i]->getPid() . "...\n";
 
} 
 
 
echo "This is the main process.\nPress [X] to terminate, [G] to read pseudo-thread's counter.\n";
 
// Console simple listener
 
while (true) {
 
    echo ">";
 
 
    $opt = _getInputCLI();
 
    echo "\n";
 
    switch ($opt) {
 
        case "X": 
 
            // stops all threads
 
            for ($i = 0;$i < NUM_THREAD;$i++) {
 
                $executeThread[$i]->stop();
 
                echo "Stopped " . $executeThread[$i]->getName() . "\n";
 
            } 
 
            exit;
 
            break;
 
        case "G":
 
            for ($i = 0;$i < NUM_THREAD;$i++) {
 
                echo $executeThread[$i]->getName() . " returns " . $executeThread[$i]->getCounter() . "\n";
 
            } 
 
            break;
 
    } 
 
} 
 
// Functions used by the console
 
function _getInputCLI()
 
{
 
    $opt = _read();
 
    $opt = strtoupper (trim($opt));
 
    return $opt;
 
} 
 
 
function _read()
 
{
 
    $fp = fopen("php://stdin", "r");
 
    $input = fgets($fp, 255);
 
    fclose($fp);
 
 
    return $input;
 
} 
 
 
?>
 
 
 |