Skip to content

Instantly share code, notes, and snippets.

@polonskiy
Created December 4, 2014 09:32
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save polonskiy/6b21065008c21170d9d6 to your computer and use it in GitHub Desktop.
PHProutines
<?php
// https://gist.github.com/elimisteve/4442820
// challenge accepted :)
require __DIR__ . '/PHProutines.php';
function intDoubler($ch, $n) {
$ch->write($n * 2);
}
$runner = new Runner;
$ch = new Chan;
$answer = new Chan;
$runner->go('intDoubler', $ch, 10);
$runner->go('intDoubler', $ch, 20);
$runner->go(function($a, $b) use ($ch) {
$ch->write($a + $b);
}, 30, 40);
$runner->go(function() use ($ch, $answer) {
list($x, $y, $z) = [$ch->read(), $ch->read(), $ch->read()];
$answer->write(sprintf('%d + %d + %d = %d', $x, $y, $z, $x + $y + $z));
});
printf("%s\n", $answer->read());
<?php
class Runner {
public function __construct() {
pcntl_signal(SIGCHLD, SIG_IGN);
}
public function go() {
if (pcntl_fork()) return;
$args = func_get_args();
$func = array_shift($args);
call_user_func_array($func, $args);
die;
}
}
class Chan {
protected $size;
protected $in;
protected $out;
public function __construct($size = 8192) {
$this->size = $size;
list($this->in, $this->out) = stream_socket_pair(
STREAM_PF_UNIX,
STREAM_SOCK_DGRAM,
STREAM_IPPROTO_IP
);
}
public function read() {
return fread($this->in, $this->size);
}
public function write($data) {
return fwrite($this->out, $data);
}
}
@elimisteve
Copy link

elimisteve commented Jul 18, 2016

Impressive! Looks like stream_socket_pair is built into PHP?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment