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

請教在webman中關(guān)于單例的疑問

oscar

實際需求:在控制器中需要對當(dāng)前訪問者進(jìn)行權(quán)限判斷。權(quán)限內(nèi)容保存在磁盤文件中data.db,文件容量大概1MB。
目前做法:因為也只有幾個路徑需要進(jìn)行判斷,沒有使用中間件,而是在基類中使用beforeAction來執(zhí)行判斷。

//權(quán)限判斷偽代碼
class AbcUtil
{
    private static $instance  =  null;
    private static $db = null;
    private function __construct(){
        self::$db = file_get_contents('data.db');
        echo 'init';
    }
    private function __clone() {}
    public static function getInstance(){
            if(!(self::$instance instanceof self)){
                self::$instance = new self();
            }
            return self::$instance;
    }

    public  function check($a){
        //TODO .....
    }
}

//基類Base中beforeAction使用
Base.php
public function beforeAction(Request $request){
    AbcUtil::getInstance()->check($request);
}

A extends Base {
    a(){}
    b(){}
}

B extends Base {
    c(){}
    d(){}
}

依次執(zhí)行控制器中的方法:
a()會打印init
b()不打印
c()打印init
d()不打印
a()不打印
b()不打印

我的疑問是,單例不是全局中只有一個實例么?上面多次打印init就是進(jìn)行了多次實例化,因為初始化要從磁盤上讀取文件內(nèi)容,這樣會不會有性能問題?
我想實現(xiàn)的是應(yīng)用啟動后只進(jìn)行一次資源讀取,后面只從內(nèi)存讀取,感覺我上面的做法不太合理。資源初始化應(yīng)該在哪里進(jìn)行呢?

謝謝大家不吝指教!

1985 2 0
2個回答

2548a

我不知道你怎么測試的,單例是只執(zhí)行一次,但是不代表進(jìn)程只有一個,10個進(jìn)程就會有10個單例,如果你通過訪問控制器的話,不代表它進(jìn)入的是同一個進(jìn)程,自然就會執(zhí)行初始化了.

  • oscar 2022-05-17

    ?。?!一語點醒夢中人!我怎么沒想到是進(jìn)程這個問題呢。同問,是每個進(jìn)程里都有一個相同的單例嗎?@liziyu

liziyu

不懂就問:是每個進(jìn)程里都有一個相同的單例嗎?

  • 2548a 2022-05-17

    進(jìn)程就相當(dāng)于干活的人數(shù),每個人干的活都是一樣的,但是他們的大腦都是獨立的,也就是里面的數(shù)據(jù)是不跟其它人共享的.所以也就會出現(xiàn)你上面說的,a進(jìn)程實例化了,等會安排到b進(jìn)程干活了,它又會再實例化一次,因為a的數(shù)據(jù)跟它沒有關(guān)系

  • oscar 2022-05-17

    很形象,我算是明白了。非常感謝!

  • liziyu 2022-05-17

    看來我猜中了一點點,謝謝大佬指點。

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