use Workerman\Worker;
require __DIR__.'/../vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:2120');
$worker->count = 1;
$worker->onWorkerStart = function($worker)
{
// 讀取數(shù)據,需要5秒。
}
$worker->onMessage = function($connection, $data)
{
global $worker;
global $ppp ;
$pid = pcntl_fork();
if ($pid==0) { //父進程會得到子進程pid號,子進程$pid是0
$ppp = $pid;
return;
} else {
$ppp = $pid;
}
};
// 運行worker
Worker::runAll();
需求:我需要把大量數(shù)據讀取到內存,供客戶端查詢,需要做到0.2s內響應。數(shù)據同時在不斷更新,每5秒又要重新去讀取數(shù)據。
請問這個可以怎么實現(xiàn)?
我的不成熟想法:在onMessage中fork了一個進程,總共2個進程,
進程1個提供服務,進程2去讀取最新數(shù)據
5秒后,進程1去讀取最新數(shù)據,進程2提供服務,
又5秒后,進程1提供服務,進程2去讀取最新數(shù)據
問題是如何指定一個進程來處理客戶端請求?
感覺不用fork進程,開2個進程弄個鎖就搞定了。
use Workerman\Worker;
require __DIR__.'/../vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:2120');
// 開啟2個進程
$worker->count = 2;
$data = [];
$worker->onWorkerStart = function($worker)
{
// 定時每5秒去load以下數(shù)據
Workerman\Lib\Timer::add(5, function(){
// 獲取鎖,避免2個進程同時在load數(shù)據到內存,沒有進程提供查詢服務
$fp = fopen(__FILE__, 'r');
if (!flock($fp, LOCK_EX | LOCK_NB )) {
return;
}
global $data;
$data = your_load_function();
flock($fp, LOCK_UN);
});
}
$worker->onMessage = function($connection, $msg)
{
global $data;
$key = $_GET['key'];
$connecion->close(isset($data[$key]) ? $data[$key] : '');
};
// 運行worker
Worker::runAll();
進程A讀取數(shù)據,然后fork出進程b1去提供查詢服務。然后進程A繼續(xù)讀取新數(shù)據,然后fork出進程b2去提供查詢服務,然后把b1進程關閉。這樣比較好有2個優(yōu)點:1.只需要一份內存 2.進程A每次只需要讀取增量的變化的數(shù)據