php fork exec_PHP: pcntl_fork - Manual

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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值