国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

如何控制指定哪個(gè)進(jìn)程來接收客戶端連接?

dignfei
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ù)據(jù),需要5秒。
}
$worker->onMessage = function($connection, $data)
{
    global $worker;
    global $ppp ;
    $pid = pcntl_fork();
    if  ($pid==0) { //父進(jìn)程會得到子進(jìn)程pid號,子進(jìn)程$pid是0
        $ppp = $pid;
        return;
    } else {
        $ppp = $pid;
    }
};
// 運(yùn)行worker
Worker::runAll();

需求:我需要把大量數(shù)據(jù)讀取到內(nèi)存,供客戶端查詢,需要做到0.2s內(nèi)響應(yīng)。數(shù)據(jù)同時(shí)在不斷更新,每5秒又要重新去讀取數(shù)據(jù)。
請問這個(gè)可以怎么實(shí)現(xiàn)?
我的不成熟想法:在onMessage中fork了一個(gè)進(jìn)程,總共2個(gè)進(jìn)程,
進(jìn)程1個(gè)提供服務(wù),進(jìn)程2去讀取最新數(shù)據(jù)
5秒后,進(jìn)程1去讀取最新數(shù)據(jù),進(jìn)程2提供服務(wù),
又5秒后,進(jìn)程1提供服務(wù),進(jìn)程2去讀取最新數(shù)據(jù)
問題是如何指定一個(gè)進(jìn)程來處理客戶端請求?

3173 3 0
3個(gè)回答

th

為什么不設(shè)置$worker->count = 進(jìn)程數(shù)???

  • dignfei 2020-03-14

    把數(shù)據(jù)讀取到PHP數(shù)組,會占用6000M內(nèi)存,用fork可以2個(gè)進(jìn)程共用這部分內(nèi)存

six

感覺不用fork進(jìn)程,開2個(gè)進(jìn)程弄個(gè)鎖就搞定了。

use Workerman\Worker;
require __DIR__.'/../vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:2120');
// 開啟2個(gè)進(jìn)程
$worker->count = 2;
$data = [];
$worker->onWorkerStart = function($worker)
{
     // 定時(shí)每5秒去load以下數(shù)據(jù)
     Workerman\Lib\Timer::add(5, function(){
         // 獲取鎖,避免2個(gè)進(jìn)程同時(shí)在load數(shù)據(jù)到內(nèi)存,沒有進(jìn)程提供查詢服務(wù)
         $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] : '');
};
// 運(yùn)行worker
Worker::runAll();
  • dignfei 2020-03-14

    把數(shù)據(jù)讀取到PHP數(shù)組,會占用6000M內(nèi)存,用fork可以2個(gè)進(jìn)程共用這部分內(nèi)存。開2個(gè)進(jìn)程,就要占用2份內(nèi)存

  • dignfei 2020-03-14

    進(jìn)程A讀取數(shù)據(jù),然后fork出進(jìn)程b1去提供查詢服務(wù)。然后進(jìn)程A繼續(xù)讀取新數(shù)據(jù),然后fork出進(jìn)程b2去提供查詢服務(wù),然后把b1進(jìn)程關(guān)閉。這樣比較好有2個(gè)優(yōu)點(diǎn):1.只需要一份內(nèi)存 2.進(jìn)程A每次只需要讀取增量的變化的數(shù)據(jù)

  • dignfei 2020-03-18

    有么有別的好的解決辦法??

  • six 2020-03-18

    加點(diǎn)硬件嘛,加個(gè)1G內(nèi)存很便宜。你想這么多天,人工成本早超過內(nèi)存了

dignfei

哪位大神能解答一下?????有什么好的解決辦法??

  • 暫無評論
年代過于久遠(yuǎn),無法發(fā)表回答
??