$processed = 0; while (true) { if ($data = self::$queue->Dequeue($processed)) { // Do the work self::Do_Work($data); $processed = 1; } else { // Or sleep if there's nothing to do usleep(50000); $processed = 0; } } } } // The shared object must be created before Nanoserv::Fork()ing My_Worker::$queue = Nanoserv::New_Shared_Object(new My_Queue()); pecho("master process launched, forking " . NUM_CHILDREN . " worker(s) ..."); $pids = array(); for ($a = 0; $a < NUM_CHILDREN; $a++) { if (($pid = Nanoserv::Fork()) === 0) { // Run the child process My_Worker::Run(); } else { $pids[] = $pid; } } pecho("worker(s) ready (" . implode(",", $pids) . ")"); $t = time(); $b = 0; $start_mt = microtime(true); while (My_Worker::$queue->num_done < WORK_LOAD) {
#!/opt/local/bin/php <?php require "nanoserv/handlers/HTTP/Server.php"; class dumb_httpd extends \Nanoserv\HTTP\Server { private $shared_obj; public function __construct($o) { $this->shared_obj = $o; } public function on_Request($url) { $val = $this->shared_obj->foo(); return "[" . posix_getpid() . "] Content of shared value : <b>{$val}</b>"; } } class foo_inc { public $value = 0; public function foo() { return ++$this->value; } } $o = \Nanoserv\Core::New_Shared_Object(new foo_inc()); $l = \Nanoserv\Core::New_Listener("tcp://0.0.0.0:800", "dumb_httpd", $o); $l->Set_Forking(); $l->Activate(); $o->value = 100; \Nanoserv\Core::Run();
#!/opt/local/bin/php <?php require "nanoserv/handlers/HTTP/XML_RPC/Persistent_Server.php"; class dumb_xmlrpc { public $bar; public function getFoo($bar) { return array("foo" => "foo{$bar}", "bar" => $this->bar++); } } $o = new dumb_xmlrpc(); $l = \Nanoserv\Core::New_Listener("tcp://0.0.0.0:800", '\\Nanoserv\\HTTP\\XML_RPC\\Persistent_Server', \Nanoserv\Core::New_Shared_Object($o)); $l->Set_Forking(); $l->Activate(); $o->bar = 100; \Nanoserv\Core::Run();
public $value = 0; public function set($v) { if (!($v % 1000)) { pecho("setting value to {$v}"); } $this->value = $v; } public function done($t) { pecho("10000 IPC ops in " . sprintf("%.2f", $t) . " sec."); exit; } } $o = new foo(); $so = \Nanoserv\Core::New_Shared_Object($o); pecho("master process launched, forking"); if (\Nanoserv\Core::Fork() > 0) { \Nanoserv\Core::Run(); } pecho("child process launched"); $t = microtime(true); for ($a = 1; $a <= 5000; $a++) { $so->set($a); if (($test = $so->value) !== $a) { pecho("ERROR: {$test} != {$a}"); } if (!($a % 1000)) { pecho('$so->value = ' . $test); } }