<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### 7.5.1 全局變量(資源) 使用C語言開發程序時經常會使用全局變量進行數據存儲,這就涉及前面已經介紹過的一個問題:線程安全,PHP設計了TSRM(即:線程安全資源管理器)用于解決這個問題,內核中頻繁使用到的EG、CG等都是根據是否開啟ZTS封裝的宏,同樣的,在擴展中也需要必須按照TSRM的規范定義全局變量,除非你的擴展不支持多線程的環境。 PHP為擴展的全局變量提供了一種存儲方式:每個擴展將自己所有的全局變量統一定義在一個結構體中,然后將這個結構體注冊到TSRM中,這樣擴展就可以像使用EG、CG那樣訪問這個結構體。 這個結構體的定義通過`ZEND_BEGIN_MODULE_GLOBALS(extension_name)`、`ZEND_END_MODULE_GLOBALS(extension_name)`兩個宏完成,這兩個宏必須成對出現,中間定義擴展需要的全局變量即可。 ```c ZEND_BEGIN_MODULE_GLOBALS(mytest) zend_long open_cache; HashTable class_table; ZEND_END_MODULE_GLOBALS(mytest) ``` 展開后實際就是個普通的struct: ```c typedef struct _zend_mytest_globals { zend_long open_cache; HashTable class_table; }zend_mytest_globals; ``` 接著創建一個此結構體的全局變量,這時候就會涉及ZTS了,如果未開啟線程安全直接創建普通的全局變量即可,如果開啟線程安全了則需要向TSRM注冊,得到一個唯一的資源id,這個操作也由專門的宏來完成:`ZEND_DECLARE_MODULE_GLOBALS(extension_name)`,展開后: ```c //ZTS:此時只是定義資源id,并沒有向TSRM注冊 ts_rsrc_id mytest_globals_id; //非ZTS zend_mytest_globals mytest_globals; ``` 最后需要定義一個像EG、CG那樣的宏用于訪問擴展的全局資源結構體,這一步將使用`ZEND_MODULE_GLOBALS_ACCESSOR()`宏完成: ```c #define MYTEST_G(v) ZEND_MODULE_GLOBALS_ACCESSOR(mytest, v) ``` 看起來是不是跟EG、CG的定義非常像?這個宏展開后: ```c //ZTS #define MYTEST_G(v) ZEND_TSRMG(mytest_globals_id, zend_mytest_globals *, v) //非ZTS #define MYTEST_G(v) (mytest_globals.v) ``` 接下來就可以在擴展中通過:MYTEST_G(opene_cache)、MYTEST_G(class_table)對結構體成員進行讀寫了。通常會把這個全局資源結構體及結構體的訪問宏定義在頭文件中,然后把全局變量的聲明放到源文件中: ```c //php_mytest.h #define MYTEST_G(v) ZEND_MODULE_GLOBALS_ACCESSOR(mytest, v) ZEND_BEGIN_MODULE_GLOBALS(mytest) zend_long open_cache; HashTable class_table; ZEND_END_MODULE_GLOBALS(mytest) //mytest.c ZEND_DECLARE_MODULE_GLOBALS(mytest) ``` > 在一個擴展中并不是只能定義一個全局變量結構,數目是不限制的。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看