網(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è)樂(lè)平網(wǎng)站建設(shè)瑞昌網(wǎng)站建設(shè)共青城網(wǎng)站建設(shè)廬山網(wǎng)站建設(shè)貴溪網(wǎng)站建設(shè)南京網(wǎng)站建設(shè)沈陽(yáng)網(wǎng)站建設(shè)石家莊網(wǎng)站建設(shè)哈爾濱網(wǎng)站建設(shè)杭州網(wǎng)站建設(shè)長(zhǎng)沙網(wǎng)站建設(shè)濟(jì)南網(wǎng)站建設(shè)煙臺(tái)網(wǎng)站建設(shè)廣州網(wǎng)站建設(shè)武漢網(wǎng)站建設(shè)成都網(wǎng)站建設(shè)蘭州網(wǎng)站建設(shè)昆明網(wǎng)站建設(shè)臺(tái)北網(wǎng)站建設(shè)南寧網(wǎng)站建設(shè)銀川網(wǎng)站建設(shè)太原網(wǎng)站建設(shè)長(zhǎng)春網(wǎng)站建設(shè)合肥網(wǎng)站建設(shè)鄭州網(wǎng)站建設(shè)西安網(wǎng)站建設(shè)西寧網(wǎng)站建設(shè)呼和浩特網(wǎng)站建設(shè)拉薩網(wǎng)站建設(shè)烏魯木齊網(wǎng)站建設(shè)貴陽(yáng)網(wǎng)站建設(shè)深圳網(wǎng)站建設(shè)??诰W(wǎng)站建設(shè)南昌網(wǎng)站建設(shè)矩惠互動(dòng)游戲微傳單企業(yè)郵箱小程序價(jià)格資訊中心
全國(guó)服務(wù)熱線:
0791-88196636

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

 二維碼 69209
發(fā)表時(shí)間:2020-12-15 11:02作者:南昌莫非網(wǎng)絡(luò)科技公司來(lái)源:南昌莫非網(wǎng)絡(luò)科技公司網(wǎng)址:http://www.wopwch.cn

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

一、 基礎(chǔ)知識(shí)


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


  1.1 PHP變量的存儲(chǔ)


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


  Zend使用zval結(jié)構(gòu)來(lái)存儲(chǔ)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值來(lái)決定訪問(wèn)value的哪個(gè)成員,可用值如下:

  IS_NULLN/A


  IS_LONG對(duì)應(yīng)value.lval


  IS_DOUBLE對(duì)應(yīng)value.dval


  IS_STRING對(duì)應(yīng)value.str


  IS_ARRAY對(duì)應(yīng)value.ht


  IS_OBJECT對(duì)應(yīng)value.obj


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


  IS_RESOURCE對(duì)應(yīng)value.lval


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


  1.1.1 引用計(jì)數(shù)


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


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


  那么is_ref呢?


  1.1.2 zval狀態(tài)


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


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


  1.1.3 zval狀態(tài)切換


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


  情況I、看如下PHP代碼:


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

  全過(guò)程如下所示:


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


  1.1.1 參數(shù)傳遞


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


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


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


  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;   // 整個(gè)HashTable的雙鏈表

    struct bucket *pNext;       // pNext和pLast用于組成某個(gè)hash對(duì)應(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初始化時(shí)指定,銷毀Bucket時(shí)調(diào)用

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

    unsigned char nApplyCount;

    zend_bool bApplyProtection;

#if ZEND_DEBUG

    int inconsistent;

#endif

} HashTable;

  總的來(lái)說(shuō),Zend的HashTable是一種鏈表散列,同時(shí)也為線性遍歷進(jìn)行了優(yōu)化。


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


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


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


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


  l nTableMask是干什么的?


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


  l pDataPtr是干什么的?


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


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


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


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


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


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


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


  1.2.2 PHP數(shù)組


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


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


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


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


  數(shù)組的遍歷操作,即foreach、each等,是通過(guò)HashTable的雙向鏈表來(lái)進(jìn)行的,pInternalPointer作為游標(biāo)記錄了當(dāng)前位置。


  1.2.3 變量符號(hào)表


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


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


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


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


  1.3 內(nèi)存和文件


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


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


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


  emalloc()


  efree()


  estrdup()


  estrndup()


  ecalloc()


  erealloc()


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


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

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

網(wǎng)站建設(shè)行業(yè)方案
網(wǎng)站維護(hù)知識(shí)
網(wǎng)站制作常見(jiàn)問(wèn)題
SEO網(wǎng)站優(yōu)化教程
踏上云端,轉(zhuǎn)型升級(jí)融入互聯(lián)網(wǎng)時(shí)代,現(xiàn)在就聯(lián)系我們吧!
——      我們時(shí)刻為你提供更多優(yōu)質(zhì)互聯(lián)網(wǎng)技術(shù)服務(wù)      ——
姓名:
*
聯(lián)系方式:
*
咨詢項(xiàng)目:
內(nèi)容:
*
在線留言
關(guān)于我們:南昌莫非文化傳媒有限公司(簡(jiǎn)稱:莫非傳媒)專注于網(wǎng)站建設(shè),網(wǎng)站SEO優(yōu)化,小程序制作。提供全方位用戶體驗(yàn)規(guī)劃,品牌形象設(shè)計(jì)服務(wù)。為每一位企業(yè)客戶的成長(zhǎng)、騰飛助力!        網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)站開發(fā),就選網(wǎng)站建設(shè)公司-南昌莫非傳媒!
掃一掃微信便捷交流
|
|
|
|
|
|
|
|
|
|
|
|
|
地址:江西省南昌市西湖區(qū)洪城路6號(hào)國(guó)貿(mào)廣場(chǎng)A座巨豪峰
業(yè)務(wù)咨詢  :  
272482065
售后服務(wù) :
2401077293
服務(wù)熱線:
0791-88196636
______________________________________________________________________________________________________________________________________________________________________________________________________