網(wǎng)站案例網(wǎng)站套餐網(wǎng)站功能網(wǎng)站SEO優(yōu)化南昌網(wǎng)站建設(shè)九江網(wǎng)站建設(shè)萍鄉(xiāng)網(wǎng)站建設(shè)景德鎮(zhèn)網(wǎng)站建設(shè)新余網(wǎng)站建設(shè)鷹潭網(wǎng)站建設(shè)贛州網(wǎng)站建設(shè)吉安網(wǎng)站建設(shè)宜春網(wǎng)站建設(shè)撫州網(wǎng)站建設(shè)上饒網(wǎng)站建設(shè)樂平網(wǎng)站建設(shè)瑞昌網(wǎng)站建設(shè)共青城網(wǎng)站建設(shè)廬山網(wǎng)站建設(shè)貴溪網(wǎng)站建設(shè)南京網(wǎng)站建設(shè)沈陽網(wǎng)站建設(shè)石家莊網(wǎng)站建設(shè)哈爾濱網(wǎng)站建設(shè)杭州網(wǎng)站建設(shè)長沙網(wǎng)站建設(shè)濟南網(wǎng)站建設(shè)煙臺網(wǎng)站建設(shè)廣州網(wǎng)站建設(shè)武漢網(wǎng)站建設(shè)成都網(wǎng)站建設(shè)蘭州網(wǎng)站建設(shè)昆明網(wǎng)站建設(shè)臺北網(wǎng)站建設(shè)南寧網(wǎng)站建設(shè)銀川網(wǎng)站建設(shè)太原網(wǎng)站建設(shè)長春網(wǎng)站建設(shè)合肥網(wǎng)站建設(shè)鄭州網(wǎng)站建設(shè)西安網(wǎng)站建設(shè)西寧網(wǎng)站建設(shè)呼和浩特網(wǎng)站建設(shè)拉薩網(wǎng)站建設(shè)烏魯木齊網(wǎng)站建設(shè)貴陽網(wǎng)站建設(shè)深圳網(wǎng)站建設(shè)??诰W(wǎng)站建設(shè)南昌網(wǎng)站建設(shè)矩惠互動游戲微傳單企業(yè)郵箱小程序價格資訊中心
全國服務(wù)熱線:
0791-88196636

嘉興做網(wǎng)站:PHP內(nèi)核介紹及擴展開發(fā)核心思想基礎(chǔ)知識講解

 二維碼 69209
發(fā)表時間:2020-12-15 11:02作者:南昌莫非網(wǎng)絡(luò)科技公司來源:南昌莫非網(wǎng)絡(luò)科技公司網(wǎng)址:http://what-ismyip.com

嘉興做網(wǎng)站:PHP內(nèi)核介紹及擴展開發(fā)核心思想基礎(chǔ)知識講解。

一、 基礎(chǔ)知識


  本章簡要介紹一些Zend引擎的內(nèi)部機制,這些知識和Extensions密切相關(guān),同時也可以幫助我們寫出更加高效的PHP代碼。


  1.1 PHP變量的存儲


  1.1.1 zval結(jié)構(gòu)


  Zend使用zval結(jié)構(gòu)來存儲PHP變量的值,該結(jié)構(gòu)如下所示:


typedef union _zvalue_value {

    long lval;              /* long value */

    double dval;                /* double value */

    struct {

        char *val;

        int len;

    } str;

    HashTable *ht;              /* hash table value */

    zend_object_value obj;

} zvalue_value;


struct _zval_struct {

    /* Variable information */

    zvalue_value value;     /* value */

    zend_uint refcount;

    zend_uchar type;            /* active type */

    zend_uchar is_ref;

};


typedef struct _zval_struct zval;

<span id="more-597"></span>Zend根據(jù)type值來決定訪問value的哪個成員,可用值如下:

  IS_NULLN/A


  IS_LONG對應(yīng)value.lval


  IS_DOUBLE對應(yīng)value.dval


  IS_STRING對應(yīng)value.str


  IS_ARRAY對應(yīng)value.ht


  IS_OBJECT對應(yīng)value.obj


  IS_BOOL對應(yīng)value.lval.


  IS_RESOURCE對應(yīng)value.lval


  根據(jù)這個表格可以發(fā)現(xiàn)兩個有意思的地方:首先是PHP的數(shù)組其實就是一個HashTable,這就解釋了為什么PHP能夠支持關(guān)聯(lián)數(shù)組了;其次,Resource就是一個long值,它里面存放的通常是個指針、一個內(nèi)部數(shù)組的index或者其它什么只有創(chuàng)建者自己才知道的東西,可以將其視作一個handle


  1.1.1 引用計數(shù)


  引用計數(shù)在垃圾收集、內(nèi)存池以及字符串等地方應(yīng)用廣泛,Zend就實現(xiàn)了典型的引用計數(shù)。多個PHP變量可以通過引用計數(shù)機制來共享同一份zval,zval中剩余的兩個成員is_ref和refcount就用來支持這種共享。


  很明顯,refcount用于計數(shù),當增減引用時,這個值也相應(yīng)的遞增和遞減,一旦減到零,Zend就會回收該zval。


  那么is_ref呢?


  1.1.2 zval狀態(tài)


  在PHP中,變量有兩種——引用和非引用的,它們在Zend中都是采用引用計數(shù)的方式存儲的。對于非引用型變量,要求變量間互不相干,修改一個變量時,不能影響到其他變量,采用Copy-On-Write機制即可解決這種沖突——當試圖寫入一個變量時,Zend若發(fā)現(xiàn)該變量指向的zval被多個變量共享,則為其復(fù)制一份refcount為1的zval,并遞減原zval的refcount,這個過程稱為“zval分離”。然而,對于引用型變量,其要求和非引用型相反,引用賦值的變量間必須是捆綁的,修改一個變量就修改了所有捆綁變量。


  可見,有必要指出當前zval的狀態(tài),以分別應(yīng)對這兩種情況,is_ref就是這個目的,它指出了當前所有指向該zval的變量是否是采用引用賦值的——要么全是引用,要么全不是。此時再修改一個變量,只有當發(fā)現(xiàn)其zval的is_ref為0,即非引用時,Zend才會執(zhí)行Copy-On-Write。


  1.1.3 zval狀態(tài)切換


  當在一個zval上進行的所有賦值操作都是引用或者都是非引用時,一個is_ref就足夠應(yīng)付了。然而,世界總不會那么美好,PHP無法對用戶進行這種限制,當我們混合使用引用和非引用賦值時,就必須要進行特別處理了。


  情況I、看如下PHP代碼:


<!--p $a = 1;   $b = &$a;   $c = &$b;   $d = $c;   // 在一堆引用賦值中,插入一個非引用-->

  全過程如下所示:


  這段代碼的前三句將把a、b和c指向一個zval,其is_ref=1, refcount=3;第四句是個非引用賦值,通常情況下只需要增加引用計數(shù)即可,然而目標zval屬于引用變量,單純的增加引用計數(shù)顯然是錯誤的, Zend的解決辦法是為d單獨生成一份zval副本。


  1.1.1 參數(shù)傳遞


  PHP函數(shù)參數(shù)的傳遞和變量賦值是一樣的,非引用傳遞相當于非引用賦值,引用傳遞相當于引用賦值,并且也有可能會導致執(zhí)行zval狀態(tài)切換。這在后面還將提到。


  1.2 HashTable結(jié)構(gòu)


  HashTable是Zend引擎中最重要、使用最廣泛的數(shù)據(jù)結(jié)構(gòu),它被用來存儲幾乎所有的東西。


  1.1.1 數(shù)據(jù)結(jié)構(gòu)


  HashTable數(shù)據(jù)結(jié)構(gòu)定義如下:


typedef struct bucket {

    ulong h;                // 存放hash

    uint nKeyLength;

    void *pData;            // 指向value,是用戶數(shù)據(jù)的副本

    void *pDataPtr;

    struct bucket *pListNext;   // pListNext和pListLast組成

    struct bucket *pListLast;   // 整個HashTable的雙鏈表

    struct bucket *pNext;       // pNext和pLast用于組成某個hash對應(yīng)

    struct bucket *pLast;       // 的雙鏈表

    char arKey[1];              // key

} Bucket;


typedef struct _hashtable {

    uint nTableSize;

    uint nTableMask;

    uint nNumOfElements;

    ulong nNextFreeElement;

    Bucket *pInternalPointer;   /* Used for element traversal */

    Bucket *pListHead;

    Bucket *pListTail;

    Bucket **arBuckets;         // hash數(shù)組

    dtor_func_t pDestructor;    // HashTable初始化時指定,銷毀Bucket時調(diào)用

    zend_bool persistent;       // 是否采用C的內(nèi)存分配例程

    unsigned char nApplyCount;

    zend_bool bApplyProtection;

#if ZEND_DEBUG

    int inconsistent;

#endif

} HashTable;

  總的來說,Zend的HashTable是一種鏈表散列,同時也為線性遍歷進行了優(yōu)化。


  HashTable中包含兩種數(shù)據(jù)結(jié)構(gòu),一個鏈表散列和一個雙向鏈表,前者用于進行快速鍵-值查詢,后者方便線性遍歷和排序,一個Bucket同時存在于這兩個數(shù)據(jù)結(jié)構(gòu)中。


  關(guān)于該數(shù)據(jù)結(jié)構(gòu)的幾點解釋:


  l 鏈表散列中為什么使用雙向鏈表?


  一般的鏈表散列只需要按key進行操作,只需要單鏈表就夠了。但是,Zend有時需要從鏈表散列中刪除給定的Bucket,使用雙鏈表可以非常高效的實現(xiàn)。


  l nTableMask是干什么的?


  這個值用于hash值到arBuckets數(shù)組下標的轉(zhuǎn)換。當初始化一個HashTable,Zend首先為arBuckets數(shù)組分配nTableSize大小的內(nèi)存,nTableSize取不小于用戶指定大小的最小的2^n,即二進制的10*。nTableMask = nTableSize – 1,即二進制的01*,此時h & nTableMask就恰好落在 [0, nTableSize – 1] 里,Zend就以其為index來訪問arBuckets數(shù)組。


  l pDataPtr是干什么的?


  通常情況下,當用戶插入一個鍵值對時,Zend會將value復(fù)制一份,并將pData指向value副本。復(fù)制操作需要調(diào)用Zend內(nèi)部例程 emalloc來分配內(nèi)存,這是個非常耗時的操作,并且會消耗比value大的一塊內(nèi)存(多出的內(nèi)存用于存放cookie),如果value很小的話,將會造成較大的浪費??紤]到HashTable多用于存放指針值,于是Zend引入pDataPtr,當value小到和指針一樣長時,Zend就直接將其復(fù)制到pDataPtr里,并且將pData指向pDataPtr。這就避免了emalloc操作,同時也有利于提高Cache命中率。


  arKey大小為什么只有1?為什么不使用指針管理key?


  arKey是存放key的數(shù)組,但其大小卻只有1,并不足以放下key。在HashTable的初始化函數(shù)里可以找到如下代碼:


  1p = (Bucket *) pemalloc(sizeof(Bucket) - 1 + nKeyLength, ht->persistent);


  可見,Zend為一個Bucket分配了一塊足夠放下自己和key的內(nèi)存,


  l 上半部分是Bucket,下半部分是key,而arKey“恰好”是Bucket的最后一個元素,于是就可以使用arKey來訪問key了。這種手法在內(nèi)存管理例程中最為常見,當分配內(nèi)存時,實際上是分配了比指定大小要大的內(nèi)存,多出的上半部分通常被稱為cookie,它存儲了這塊內(nèi)存的信息,比如塊大小、上一塊指針、下一塊指針等,baidu的Transmit程序就使用了這種方法。


  不用指針管理key,是為了減少一次emalloc操作,同時也可以提高Cache命中率。另一個必需的理由是,key絕大部分情況下是固定不變的,不會因為key變長了而導致重新分配整個Bucket。這同時也解釋了為什么不把value也一起作為數(shù)組分配了——因為value是可變的。


  1.2.2 PHP數(shù)組


  關(guān)于HashTable還有一個疑問沒有回答,就是nNextFreeElement是干什么的?


  不同于一般的散列,Zend的HashTable允許用戶直接指定hash值,而忽略key,甚至可以不指定key(此時,nKeyLength為0)。同時,HashTable也支持append操作,用戶連hash值也不用指定,只需要提供value,此時,Zend就用nNextFreeElement作為hash,之后將nNextFreeElement遞增。


  HashTable的這種行為看起來很奇怪,因為這將無法按key訪問value,已經(jīng)完全不是個散列了。理解問題的關(guān)鍵在于,PHP數(shù)組就是使用HashTable實現(xiàn)的——關(guān)聯(lián)數(shù)組使用正常的k-v映射將元素加入HashTable,其key為用戶指定的字符串;非關(guān)聯(lián)數(shù)組則直接使用數(shù)組下標作為hash值,不存在key;而當在一個數(shù)組中混合使用關(guān)聯(lián)和非關(guān)聯(lián)時,或者使用array_push操作時,就需要用nNextFreeElement了。


  再來看value,PHP數(shù)組的value直接使用了zval這個通用結(jié)構(gòu),pData指向的是zval*,按照上一節(jié)的介紹,這個zval*將直接存儲在pDataPtr里。由于直接使用了zval,數(shù)組的元素可以是任意PHP類型。


  數(shù)組的遍歷操作,即foreach、each等,是通過HashTable的雙向鏈表來進行的,pInternalPointer作為游標記錄了當前位置。


  1.2.3 變量符號表


  除了數(shù)組,HashTable還被用來存儲許多其他數(shù)據(jù),比如,PHP函數(shù)、變量符號、加載的模塊、類成員等。


  一個變量符號表就相當于一個關(guān)聯(lián)數(shù)組,其key是變量名(可見,使用很長的變量名并不是個好主意),value是zval*。


  在任一時刻PHP代碼都可以看見兩個變量符號表——symbol_table和active_symbol_table——前者用于存儲全局變量,稱為全局符號表;后者是個指針,指向當前活動的變量符號表,通常情況下就是全局符號表。但是,當每次進入一個PHP函數(shù)時(此處指的是用戶使用PHP代碼創(chuàng)建的函數(shù)),Zend都會創(chuàng)建函數(shù)局部的變量符號表,并將active_symbol_table指向局部符號表。Zend總是使用active_symbol_table來訪問變量,這樣就實現(xiàn)了局部變量的作用域控制。


  但如果在函數(shù)局部訪問標記為global的變量,Zend會進行特殊處理——在active_symbol_table中創(chuàng)建symbol_table中同名變量的引用,如果symbol_table中沒有同名變量則會先創(chuàng)建。


  1.3 內(nèi)存和文件


  程序擁有的資源一般包括內(nèi)存和文件,對于通常的程序,這些資源是面向進程的,當進程結(jié)束后,操作系統(tǒng)或C庫會自動回收那些我們沒有顯式釋放的資源。


  但是,PHP程序有其特殊性,它是基于頁面的,一個頁面運行時同樣也會申請內(nèi)存或文件這樣的資源,然而當頁面運行結(jié)束后,操作系統(tǒng)或C庫也許不會知道需要進行資源回收。比如,我們將php作為模塊編譯到apache里,并且以prefork或worker模式運行apache。這種情況下apache進程或線程是復(fù)用的,php頁面分配的內(nèi)存將永駐內(nèi)存直到出core。


  為了解決這種問題,Zend提供了一套內(nèi)存分配API,它們的作用和C中相應(yīng)函數(shù)一樣,不同的是這些函數(shù)從Zend自己的內(nèi)存池中分配內(nèi)存,并且它們可以實現(xiàn)基于頁面的自動回收。在我們的模塊中,為頁面分配的內(nèi)存應(yīng)該使用這些API,而不是C例程,否則Zend會在頁面結(jié)束時嘗試efree掉我們的內(nèi)存,其結(jié)果通常就是crush。


  emalloc()


  efree()


  estrdup()


  estrndup()


  ecalloc()


  erealloc()


  另外,Zend還提供了一組形如VCWD_xxx的宏用于替代C庫和操作系統(tǒng)相應(yīng)的文件API,這些宏能夠支持PHP的虛擬工作目錄,在模塊代碼中應(yīng)該總是使用它們。宏的具體定義參見PHP源代碼”TSRM/tsrm_virtual_cwd.h”??赡苣銜⒁獾?,所有那些宏中并沒有提供close操作,這是因為close的對象是已打開的資源,不涉及到文件路徑,因此可以直接使用C或操作系統(tǒng)例程;同理,read/write之類的操作也是直接使用C或操作系統(tǒng)的例程。


企業(yè)新聞
關(guān)于南昌莫非網(wǎng)絡(luò)科技公司2022年元旦放假安排通知.元旦:1月1日(星期六)至1月3號(星期一)放假,共計三天(無調(diào)休),1月4日(星期二)上班。
關(guān)于南昌莫非網(wǎng)絡(luò)科技公司2021年國慶節(jié)放假安排通知。根據(jù)《國務(wù)院辦公廳關(guān)于2021年部分節(jié)假日安排的通知》(國辦發(fā)明電〔2020〕27號),結(jié)合我單位工作實際情況,現(xiàn)就2021年國慶放假的有關(guān)事項安排如下。
南昌莫非網(wǎng)絡(luò)科技公司2021年中秋節(jié)放假通知.一、假期從:2021年09月19日到2021年09月21日結(jié)束,假期共3天(9月18日正常上班,9月26日正常休息)。二、如有緊急情況,請各位同仁及時配合相關(guān)部門主管人員把事情處理妥善。做好防火、防盜工作并督促各部門關(guān)好辦公區(qū)域的門、窗等。
根據(jù)《國務(wù)院辦公廳關(guān)于2021年部分節(jié)假日安排的通知》(國辦發(fā)明電〔2020〕27號),結(jié)合我單位工作實際情況,現(xiàn)就2021年端午節(jié)放假的有關(guān)事項安排如下:一、放假時間:2021年6月12日(星期六)至2021年6月14日(星期一),共放假3天。
南昌莫非網(wǎng)絡(luò)科技公司2021年五一勞動節(jié)放假通知.現(xiàn)就2021年五一勞動節(jié)放假的有關(guān)事項安排如下:一、放假時間,2021年5月1日(星期六)至2020年5月5日(星期三),共放假5天。4月25日(星期日)上班,5月6日(星期四)正常上班。
南昌莫非網(wǎng)絡(luò)科技公司2021年清明節(jié)放假通知.2021年4月3日(星期六)-2021年4月5日(星期一)放假,共3天。4月6日(星期二)正常上班。放假期間,各項業(yè)務(wù)照常運行,售后問題您可以直接相關(guān)負責人提交服務(wù)單,技術(shù)人員將在12小時之內(nèi)處理。
關(guān)于南昌莫非網(wǎng)絡(luò)科技公司2021年春節(jié)放假安排通知.一、春節(jié)放假時間:2021年2月5日(農(nóng)歷臘月二十四)至2021年2月18日(農(nóng)歷正月初七)放假,共13天,2月19日(星期五)開始上班,2月21日星期日(農(nóng)歷正月初十)恢復(fù)正常上班。由于疫情,假期時間可能會有所變化,具體以通知為準。
關(guān)于南昌莫非網(wǎng)絡(luò)科技公司2021年01月01日元旦放假通知。一、放假時間:2021年1月1日(星期五)至2021年1月3日(星期日)放假,共3天;2021年1月4日(星期一)正常上班。公司放假期間如有相關(guān)業(yè)務(wù)及服務(wù)事宜敬請撥打我司24小時服務(wù)熱線:0791-8819-6636或咨詢客服QQ:2401077293,可隨時與我司進行聯(lián)系。
南昌莫非網(wǎng)絡(luò)科技公司2020年中秋節(jié)+國慶節(jié)放假通知。根據(jù)《國務(wù)院辦公廳關(guān)于2020年部分節(jié)假日安排的通知》,為了讓大家度過一個充實、平安的假期,現(xiàn)把2020年中秋國慶放假時間及溫馨提示通知如下!
南昌莫非網(wǎng)絡(luò)科技公司2020年五一放假通知.在過去的歲月里,南昌莫非網(wǎng)絡(luò)科技公司與新老客戶一直保持著愉快的合作,這離不開大家的鼎立支持和幫助。在未來的日子里還需要更多朋友們的支持與幫助,希望你們能始終如一的支持南昌莫非網(wǎng)絡(luò)科技,并提出您寶貴的意見及建議。
南昌莫非網(wǎng)絡(luò)科技公司2020年春節(jié)寒假放假安排通知。南昌莫非網(wǎng)絡(luò)科技公司提前祝全國合作伙伴新春快樂、闔家幸福!預(yù)祝全體員工春節(jié)快樂!
南昌莫非網(wǎng)絡(luò)科技公司2020年元旦節(jié)放假安排通知.元旦將至,南昌莫非網(wǎng)絡(luò)科技公司預(yù)祝全體員工元旦快樂!現(xiàn)將2020年元旦節(jié)放假安排通告如下:一、放假時間:2020年1月1日,共1天。
地區(qū)做網(wǎng)站導航
南昌網(wǎng)站建設(shè)  九江網(wǎng)站建設(shè)  萍鄉(xiāng)網(wǎng)站建設(shè) 景德鎮(zhèn)網(wǎng)站建設(shè)  新余網(wǎng)站建設(shè)  鷹潭網(wǎng)站建設(shè) 贛州網(wǎng)站建設(shè)  吉安網(wǎng)站建設(shè)  宜春網(wǎng)站建設(shè)  撫州網(wǎng)站建設(shè)  上饒網(wǎng)站建設(shè)  樂平網(wǎng)站建設(shè) 瑞昌網(wǎng)站建設(shè)  共青城網(wǎng)站建設(shè)  廬山網(wǎng)站建設(shè)  貴溪網(wǎng)站建設(shè)  南京網(wǎng)站建設(shè)  沈陽網(wǎng)站建設(shè)  石家莊網(wǎng)站建設(shè)  哈爾濱網(wǎng)站建設(shè)  杭州網(wǎng)站建設(shè)  長沙網(wǎng)站建設(shè)  濟南網(wǎng)站建設(shè) 煙臺網(wǎng)站建設(shè)  廣州網(wǎng)站建設(shè)  武漢網(wǎng)站建設(shè)  成都網(wǎng)站建設(shè) 蘭州網(wǎng)站建設(shè)  昆明網(wǎng)站建設(shè)  臺北網(wǎng)站建設(shè) 南寧網(wǎng)站建設(shè)  銀川網(wǎng)站建設(shè)  太原網(wǎng)站建設(shè)  長春網(wǎng)站建設(shè)  合肥網(wǎng)站建設(shè)  鄭州網(wǎng)站建設(shè)  西寧網(wǎng)站建設(shè) 西安網(wǎng)站建設(shè)  呼和浩特網(wǎng)站建設(shè)  拉薩網(wǎng)站建設(shè)  烏魯木齊網(wǎng)站建設(shè)  貴陽網(wǎng)站建設(shè) 深圳網(wǎng)站建設(shè)  海口網(wǎng)站建設(shè)

南昌莫非網(wǎng)絡(luò)科技公司專汪做網(wǎng)站,網(wǎng)頁設(shè)計,網(wǎng)站制作,網(wǎng)站開發(fā),建網(wǎng)站,定制網(wǎng)站。十三年品牌值得信賴!

網(wǎng)站建設(shè)行業(yè)方案
網(wǎng)站維護知識
網(wǎng)站制作常見問題
SEO網(wǎng)站優(yōu)化教程
踏上云端,轉(zhuǎn)型升級融入互聯(lián)網(wǎng)時代,現(xiàn)在就聯(lián)系我們吧!
——      我們時刻為你提供更多優(yōu)質(zhì)互聯(lián)網(wǎng)技術(shù)服務(wù)      ——
姓名:
*
聯(lián)系方式:
*
咨詢項目:
內(nèi)容:
*
在線留言
關(guān)于我們:南昌莫非文化傳媒有限公司(簡稱:莫非傳媒)專注于網(wǎng)站建設(shè),網(wǎng)站SEO優(yōu)化,小程序制作。提供全方位用戶體驗規(guī)劃,品牌形象設(shè)計服務(wù)。為每一位企業(yè)客戶的成長、騰飛助力!        網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、網(wǎng)站制作、網(wǎng)站開發(fā),就選網(wǎng)站建設(shè)公司-南昌莫非傳媒!
掃一掃微信便捷交流
|
|
|
|
|
|
|
|
|
|
|
|
|
地址:江西省南昌市西湖區(qū)洪城路6號國貿(mào)廣場A座巨豪峰
業(yè)務(wù)咨詢  :  
272482065
售后服務(wù) :
2401077293
服務(wù)熱線:
0791-88196636
______________________________________________________________________________________________________________________________________________________________________________________________________
克山县| 古交市| 晋江市| 和平县| 连江县| 钦州市| 恩施市| 石景山区| 德清县| 城固县| 观塘区| 黑龙江省| 武强县| 双柏县| 疏勒县| 绥宁县| 邵武市| 山丹县| 革吉县| 桐乡市| 博野县| 大方县| 扎兰屯市| 旺苍县| 英吉沙县| 姜堰市| 伊金霍洛旗| 大同县| 准格尔旗| 渭源县| 呈贡县| 桑日县| 桂东县| 莱州市| 游戏| 合江县| 交口县| 苏尼特右旗| 卓资县| 邹平县| 固镇县|