note 118023 added to function.pcntl-fork
| From: | laurent dot salomon at ymail dot com | Date: | Sat, 19 Sep 2015 23:46:53 +0000 |
| Subject: | note 118023 added to function.pcntl-fork | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-203821@lists.php.net to get a copy of this message | ||
The following exemple works with php5.6 and apcu. This was tested on debian 7 and Ubuntu 14.04.2
LTS.
Here is a proposition of a simple Job class which execute a task list upon a item queue with shared
memory capability :
class Job
{
const
CACHE_PREFIX = 'SHM/',
WORKER_NUMBER = 10;
private
$_queues = [],
$_tasks = [],
$_pids = [],
$_workerNumber,
$_cacheHandler,
$_prefix,
$_id;
public function __construct(array $queue, $workerNumber = self::WORKER_NUMBER)
{
$count = count($queue);
$length = ceil($count / $workerNumber);
$this->_queues = array_chunk($queue, $length);
$this->setWorkerNumber($workerNumber);
$this->_prefix = self::CACHE_PREFIX . microtime(true) . '/';
}
public function setWorkerNumber($workerNumber)
{
$this->_workerNumber = $workerNumber;
}
public function __get($key)
{
return apc_fetch($this->_prefix . $key);
}
public function __set($key, $value)
{
apc_store($this->_prefix . $key, $value);
}
public function add(Closure $task)
{
$this->_tasks[] = $task->bindTo($this, $this);
return $this;
}
public function run(Closure $task = null)
{
if (isset($task))
{
$this->add($task);
}
$i = 0;
do
{
$queue = $this->_queues[$i++];
$pid = pcntl_fork();
$this->_id = $i;
if ($pid === -1)
{
die("can't fork !");
}
elseif ($pid !== 0) // main
{
$this->_pids[$pid] = $pid;
}
else // child
{
foreach($this->_tasks as $task)
{
$task($queue);
}
exit(0);
}
}
while($i < $this->_workerNumber);
do // main
{
$pid = pcntl_wait($status);
unset($this->_pids[$pid]);
}
while(count($this->_pids));
}
}
$driver = new mysqli(':host', ':user', ':pwd', ':db');
$query = 'SELECT * FROM :table LIMIT :n';
if (false !== ($res = $driver->query($query)))
{
$resultSet = [];
while($row = mysqli_fetch_assoc($res))
{
$resultSet[] = $row;
}
$job = new Job($resultSet);
$job->test = [];
$job->run(function($queue = [])
{
// task
foreach($queue as $value)
{
$test = $this->test;
$value['workedId'] = $this->_id;
// ...
$test[] = $value;
$this->test = $test;
}
});
print_r($job->test);
}
----
Server IP: 72.52.91.14
Probable Submitter: 78.194.94.207
----
Manual Page -- http://php.net/manual/en/function.pcntl-fork.php
Edit -- https://master.php.net/note/edit/118023
Del: integrated -- https://master.php.net/note/delete/118023/integrated
Del: useless -- https://master.php.net/note/delete/118023/useless
Del: bad code -- https://master.php.net/note/delete/118023/bad+code
Del: spam -- https://master.php.net/note/delete/118023/spam
Del: non-english -- https://master.php.net/note/delete/118023/non-english
Del: in docs -- https://master.php.net/note/delete/118023/in+docs
Del: other reasons-- https://master.php.net/note/delete/118023
Reject -- https://master.php.net/note/reject/118023
Search -- https://master.php.net/manage/user-notes.php