diff --git a/composer.json b/composer.json index 3d626d7..07381f4 100644 --- a/composer.json +++ b/composer.json @@ -9,6 +9,12 @@ "email": "cvagnetoft@gmail.com" } ], + "keywords": [ + "ipc", + "shm", + "msgqueue", + "signals" + ], "require": {}, "repositories": [ { @@ -24,4 +30,4 @@ "NoccyLabs\\Ipc\\": "src/" } } -} \ No newline at end of file +} diff --git a/examples/channels.php b/examples/channels.php new file mode 100644 index 0000000..130c0d2 --- /dev/null +++ b/examples/channels.php @@ -0,0 +1,16 @@ +send([ + 'msg' => "Hello World" +]); + +// Receive at the other end using receive() +print_r($ch2->receive()); \ No newline at end of file diff --git a/examples/locks.php b/examples/locks.php new file mode 100644 index 0000000..b5cfd2f --- /dev/null +++ b/examples/locks.php @@ -0,0 +1,43 @@ +acquire()) { + echo "lock1 acquired\n"; +} else { + echo "lock1 not acquired\n"; +} + +// Test the locks like this +if ($lock1->isLocked()) { + echo "lock1 is locked\n"; +} else { + echo "lock1 is not locked\n"; +} +if ($lock2->isLocked()) { + echo "lock2 is locked\n"; +} else { + echo "lock2 is not locked\n"; +} + +// This will timeout after a second +if ($lock2->acquire(1)) { + echo "lock2 acquired\n"; +} else { + echo "lock2 not acquired\n"; +} + +// After releasing, you can acquire it +$lock1->release(); +if ($lock2->acquire(1)) { + echo "lock2 acquired\n"; +} else { + echo "lock2 not acquired\n"; +} diff --git a/examples/shmdata.php b/examples/shmdata.php new file mode 100644 index 0000000..289dde3 --- /dev/null +++ b/examples/shmdata.php @@ -0,0 +1,34 @@ +set("some.key", "Some value"); +// As does get +echo $shm->get("some.key")."\n"; + +// To make sure a value isn't modified while you are modifying it, use the third +// parameter to set... +// +// Let's start at 123 +$shm->set("some.counter", 123); +$counter = $shm->get("some.counter"); +echo "Counter is: ".$counter."\n"; +// And attempt to increase it +$shm->set("some.counter", $counter + 1, true); +$counter = $shm->get("some.counter"); +echo "Counter is: ".$counter."\n"; + +// If the value is modified, the call will fail +$shm2 = new SharedData($key); +$shm2->set("some.counter", 345); +if (!$shm->set("some.counter", $counter + 1, true)) { + echo "some.counter has been modified since last read\n"; +} + diff --git a/examples/signals.php b/examples/signals.php new file mode 100644 index 0000000..e3e54c2 --- /dev/null +++ b/examples/signals.php @@ -0,0 +1,29 @@ +addHandler(function () { + echo "First handler\n"; +}); +// If a handler returns true, it will prevent any further handlers from firing +$handler->addHandler(function () { + echo "Second and final handler\n"; + return true; +}); +// Thus, this one will not be called +$handler->addHandler(function() { + echo "Third handler, never called\n"; +}); + +// Dispatch the signal to ourselves +(new Signal(SIGUSR1))->dispatch(posix_getpid()); +// Default target of dispatch is the own pid +(new Signal(SIGUSR1))->dispatch(); + \ No newline at end of file diff --git a/examples/signaltraps.php b/examples/signaltraps.php new file mode 100644 index 0000000..56c6567 --- /dev/null +++ b/examples/signaltraps.php @@ -0,0 +1,16 @@ +isTrapped()) { + usleep(10000); +} + +echo "Thanks!\n"; \ No newline at end of file diff --git a/src/Shm/SharedData.php b/src/Shm/SharedData.php index fb4bc5b..9ee7d48 100644 --- a/src/Shm/SharedData.php +++ b/src/Shm/SharedData.php @@ -113,6 +113,7 @@ class SharedData extends SharedMemory // Update the data $this[self::IDX_DATA + $index] = [ md5($value), $value ]; + $this->checks[$key] = md5($value); $this->unlock(); return true; } diff --git a/src/Signal/Signal.php b/src/Signal/Signal.php index ee35363..5514486 100644 --- a/src/Signal/Signal.php +++ b/src/Signal/Signal.php @@ -17,8 +17,8 @@ class Signal pcntl_signal($this->signo, $handler); } - public function dispatch($pid):bool + public function dispatch($pid=null):bool { - return posix_kill($pid, $this->signo); + return posix_kill($pid?:posix_getpid(), $this->signo); } } \ No newline at end of file