?
Worker, pthreads, , Threaded , . , pthreads Pool Workers, .
pthreads, , , Pool::collect. Pool::collect , Threaded boolean true, .
...
, Pool
:
<?php
define("LOG", Mutex::create());
function slog($message, $args = []) {
$args = func_get_args();
if (($message = array_shift($args))) {
Mutex::lock(LOG);
echo vsprintf(
"{$message}\n", $args);
Mutex::unlock(LOG);
}
}
class Request extends Threaded {
public function __construct($url) {
$this->url = $url;
}
public function run() {
$response = @file_get_contents($this->url);
slog("%s returned %d bytes",
$this->url, strlen($response));
$this->reQueue();
}
public function getURL() { return $this->url; }
public function isQueued() { return $this->queued; }
public function reQueue() { $this->queued = true; }
protected $url;
protected $queued = false;
}
$pool = new Pool(50);
while (@$i++<50) {
$pool->submit(new Request(sprintf(
"http://google.com/?q=%s", md5($i))));
}
do {
$queue = array();
$pool->collect(function($request) use ($pool, &$queue) {
if ($request->isQueued()) {
$queue[] =
$request->getURL();
return true;
}
});
if (count($queue)) {
foreach ($queue as $queued)
$pool->submit(new Request($queued));
}
usleep(2.5 * 1000000);
} while (true);
?>