note 118023 added to function.pcntl-fork

From: 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

« previous php.notes (#203821) next »