PHP Execution principle

Source: Internet
Author: User
Tags sapi scalar sprintf
php Execution Principle

PHP is a very simple application, the development of a very high efficiency of a language, its weak type of variable can save the programmer a lot of time and effort to define variables, type conversion and so on. It is a dynamic language for web development.

1. Principles and features of PHP design

    • Multi-Process Model: This enables processes to be unaffected by each other, making resource utilization faster and easier for processes

    • Weakly typed languages: Unlike strongly typed languages C, C + +, Java and other languages, the type of variables in PHP is not determined from the beginning, he is determined at run time, can be implicitly or explicitly type conversion, which makes it very flexible in development, programmers do not need to pay attention to the problem of variable type

    • Zend Engine + component (EXT) mode reduces internal coupling

    • Middle tier (SAPI) isolated from Web server and PHP

    • The grammar is simple and flexible, the specification is few. This point has both advantages and disadvantages ...

2. PHP four-tier system

PHP from top to bottom altogether four layers system:

    • Zend Engine : Zend Overall with C implementation, is the core part of PHP, it translates php code into executable opcode, processing and implementation of the corresponding processing method (principle: Bird Brother's blog), the realization of the basic data structure, memory allocation and management, Providing the appropriate API method for external use is at the heart of everything.

    • Extensions: Around the Zend Engine, Extensions provides a variety of basic services through components, commonly used built-in functions array, standard library, etc. are implemented through extension, Users can also implement their own extension in order to achieve functional expansion and other purposes, such as paste is in use in the PHP middle layer, Rich text parsing is the typical application of extension.

    • Sapi: SAPI Full Name server application programing Interface, that is, the service-side application programming interface, SAPI through some column hook function, so that PHP can interact with the peripheral data, This is a very elegant and successful PHP design, through SAPI successfully decoupled PHP itself and the upper application decoupling, PHP can no longer consider how to be compatible with different applications, and the application itself can be used for their own characteristics to achieve different processing methods.

    • Upper Application : This is the application written by the programmer, through different sapi ways to get a variety of application patterns, such as the implementation of the Web application through webserver, run as a script in the command line and so on

3. Sapi

As before, SAPI through the interface of some columns, so that the external application can and PHP Exchange data and can be based on different application characteristics to achieve a specific processing method, the common SAPI are:

    • Apache2handler: With Apache as the webserver, the use of mod_php mode operation time, is now the most widely used

    • CGI: This is another way of interacting with Webserver and PHP, which is the FASTCGI protocol

    • CLI: Command Debug Application Mode

4. Execution flow of PHP code

As can be seen, PHP through the Zend engine to achieve a typical dynamic language execution process: to get a snippet of code, through lexical parsing, parsing and other stages, the source program is translated into a single instruction (opcodes), and then Zend Virtual machine order to execute these instructions. PHP itself is implemented in C language, so the final call is also the C language function.

The core of PHP execution is a translation of an instruction, that is, opcode

opcode is the most basic unit of PHP program execution . A opcode consists of two parameters (OP1,OP2), a return value, and a handler function. The PHP program is eventually translated into a set of opcode processing functions in the order of execution.

Several functions are commonly used:

    • End_assign_spec_cv_cv_handler: Variable allocation (A=B)

    • Zend_do_fcall_by_name_spec_handler: Function call

    • Zend_concat_spec_cv_cv_handler: string concatenation a.b

    • Zend_add_spec_cv_const_handler: addition Operation A+2

    • Zend_is_equal_spec_cv_const: judging Equality a==1

    • Zend_is_identical_spec_cv_const: judging Equality a===1

5. Zend Engine Introduction

Zend Engine as the core of PHP, the main design mechanism is:

5.1 Implementing Hashtable data structures

Hashtable is the core data structure of Zend, which is used in PHP for almost all functions, and the PHP Data Array () is a typical application. In addition, inside Zend, such as function symbol table, panorama variable are implemented by Hashtable.

Zend Hash table implements a typical hash list hash structure, and by attaching a doubly linked list, it provides the function of forward, reverse, and iterate array, structure

It can be seen that in hash table, there are both key->value forms of hash structure and bidirectional linked list mode, which makes it very convenient to support fast lookup and linear traversal.
Hash structure : The hash structure of Zend is a typical hash table model, which solves the conflict by means of a linked list. It is important to note that the Zend hash table is a self-growing data structure that, when the number of hash tables is full, dynamically expands and re-positions the elements in twice-fold ways. The initial size is 8. In addition, in the Key->value Quick Find, Zend itself has done some optimization, through the way of space-changing time to speed up. For example, in each element, a variable nkeylength is used to identify the length of the key for quick determination.
doubly linked list : Zend hash table The linear traversal of elements is realized through a linked list structure. In theory, it is enough to do a traversal using a one-way list, the reason is to use a doubly linked list, the main purpose is to quickly delete, avoid traversal. Zend hash table is a composite structure that, when used as an array, supports common associative arrays that can also be used as sequential index numbers, and even allow a mixture of 2.
php Associative arrays : Associative arrays are typical hash_table applications. A single query process takes the following steps (as you can see from the code, this is a common hash query process and adds some quick judgments to speed up lookups):

  getkeyhashvalue h;02  index = n & ntablemask;03  Bucket *p = arbucket[index];04 while  (p) {      if ((p->h = = h) && (p->nkeylength = = nkeylength)) {          RETURN p->data;      }08      p=p->next;09  }10  RETURN falture;

php indexed array: The index array is our common array, accessed by subscript. For example, Arr[0],zend Hashtable internally is normalized , and for the index type key is also assigned a hash value and Nkeylength(0). The internal member variable nnextfreeelement is the maximum ID currently assigned to it, and automatically adds one after each push. It is this normalization that enables PHP to implement associative and non-associative blending. because of the specificity of the push operation, the index key in the PHP array order is not determined by the subscript size, but by the push of the successive decision. for example arr[1] = 2; ARR[2] = 3; For a double type of key,zend Hashtable will treat him as an index key

5.2 How PHP variables are implemented

PHP is a weakly typed language and does not strictly differentiate between types of variables. PHP variables can be divided into simple types (int, sting, BOOL), set type (array, resource, object), and constants (const), all of which have the same structure at the bottom zval

Zval is a very important data structure in Zend, which is used to label and implement PHP variables with the following data structures:

struct _zval_struct {    zvalue_value value;     /* Value */    zend_uint refcount__gc;  /* Variable ref count */    Zend_uchar type;          /* Active type */    Zend_uchar is_ref__gc;    /* If it is a ref variable */};typedef struct _zval_struct zval;

which

    • Zval_value value is the actual value of the variable, specifically a Zvalue_value union:

typedef Union _ZVALUE_VALUE {    long lval;                  /* Long value */    double dval;                /* Double value */    struct {/                    * String */        char *val;        int len;    } STR;    HashTable *ht;              /* Hash table value,used for array */    zend_object_value obj;      /* Object */} Zvalue_value;
    • Zend_uint refcount__gc is a counter that stores how many variables (or symbols, symbols) point to the Zval. When a variable is generated, its refcount=1, a typical assignment operation such as $ A = $b will add 1 to the Zval RefCount, and the unset operation will be reduced by 1 accordingly. Before PHP5.3, using the mechanism of reference counting to implement GC, if a zval refcount less than 0, then the Zend engine will assume that there is no variable pointing to the Zval, thus releasing the memory space occupied by the Zval. But things are not that simple at times. In the following we will see that the simple reference counting mechanism cannot GC out the zval of the circular reference, even if the variable pointing to the Zval has been unset, resulting in a memory leak (memories Leak).

    • Zend_uchar type This field is used to indicate the actual type of the variable. Variables in PHP include four scalar types (bool,int,float,string), two composite types (array, object), and two special types (resource and null). Within Zend, these types correspond to the following macro (code location phpsrc/zend/zend.h)

#define Is_null     0#define is_long     1#define is_double   2#define is_bool     3#define is_array    4#define Is_object   5#define is_string   6#define is_resource 7#define is_constant 8#define is_constant_array   9# Define Is_callable 10
    • is_ref__gc This field is used to mark whether a variable is a reference variable. For a normal variable, the value is 0, and for a reference-type variable, the value is 1. This variable will affect zval sharing, separation, etc.

5.2.1 Integer, floating-point variable

Integer, floating-point number is one of the basic types in PHP and is also a simple variable. for integers and floating-point numbers, the corresponding values are stored directly in the Zvalue. The types are long and double, respectively.
As can be seen from the zvalue structure, for the integer type, and C and other strongly typed languages,PHP is not distinguished from int, unsigned int, long, long long, and so on, for it, there is only one type of integer is long. Thus, it can be seen that in PHP, the value range of integers is determined by the number of compiler bits rather than fixed. What happens if integers are out of bounds in PHP? PHP automatically converts integers to floating-point type

For floating-point numbers, similar to integers, it does not differentiate between float and double but only double one type

5.2.2-character variable

Like integers, character variables are the underlying type and simple variable in PHP. The Zvalue structure shows that in PHP, strings are made up of pointers and length structures that point to actual data, which is similar to string in C + +. Because of the length by an actual variable, and C, its string can be 2 binary data (including 0), while in PHP, the string length strlen is an O (1) operation

Common string stitching method and speed comparison:

Suppose there are 4 variables: stra= ' 123 '; StrB = ' 456 '; inta=123; intb=456;
Now for the following several string stitching method to do a comparison and description:
1 res = STRA.STRB and res = "STRASTRB"
In this case, the Zend will re-malloc a piece of memory and handle it accordingly, at a speed normal.
2 Stra = STRA.STRB
This is the fastest, Zend will be directly relloc on the current stra basis, to avoid duplicate copies
3 res = INTA.INTB
This is slower, because implicit format conversion is required, and the actual program should be careful to avoid
4 Stra = sprintf ("%s%s", STRA,STRB);
This is the slowest way, because sprintf is not a language structure in PHP, it takes more time to recognize and process the format itself, and the mechanism itself is malloc. However, the sprintf is the most readable, in practice can be flexibly selected according to the specific circumstances.

5.2.3 Array Variables

The PHP array is naturally implemented by Zend Hash table.

How is the foreach operation implemented? a foreach to an array is done by traversing a doubly linked list in the Hashtable. For indexed arrays, the foreach traversal efficiency is much higher than for a for, eliminating the Key->value lookup. The count operation calls the Hashtable->numofelements,o (1) operation directly. For a string such as ' 123 ', the Zend is converted to its integer form. arr[' 123 '] and arr[123]

5.3 PHP Variable Management-reference count and write-time copy

Reference counting is widely used in areas such as memory reclamation, string manipulation, and so on. The reference count of Zval is implemented through member variables is_ref and Ref_count, and by reference counting, multiple variables can share the same data. Avoid the large amount of consumption caused by frequent copying. when an assignment is performed, Zend points the variable to the same zval while ref_count++, corresponding to the ref_count-1 when the unset operation. Only Ref_count minus 0 o'clock will actually perform the destroy operation. if it is a reference assignment, Zend modifies is_ref to 1.

PHP variables share data by reference counting, so what if you change one of the variable values? When attempting to write a variable, Zend discovers that the variable points to the Zval is shared by more than one variable, it copies a copy of Ref_count 1 zval, and decrements the zval of the original refcount, this process is called "Zval separation." Visible, the copy operation is only performed when there is a write operation, so it is also called copy-on-write (copy on Zend).

For reference variables, the requirement is the opposite of the non-reference type, and the variable that references the assignment must be bundled, and modifying a variable modifies all the bundle variables.

5.4 PHP Local variables and the implementation of global variables:

How are local variables and global variables implemented in PHP? For a request, PHP can see two symbol tables (symbol_table and active_symbol_table)at any time, where the former is used to maintain global variables. The latter is a pointer to the currently active variable symbol table, and when the program enters a function, Zend assigns it a symbol table x and points active_symbol_table to a. The distinction between global and local variables is realized in this way.

Gets the value of the variable: the PHP symbol table is implemented through hash_table, assigning a unique identifier to each variable, and retrieving the corresponding zval from the table when it gets returned.

Global variables are used in functions: In functions, we can use global variables by explicitly declaring global. Create a reference to a variable with the same name in Active_symbol_table (the value of the reference variable is updated with the update), and if there is no variable with the same name in the symbol_table, it is created first.

Reference:

    • http://www.php.cn/

    • http://www.php.cn/

    • [http://www.php.cn/


PHP Execution principle

PHP is a very simple application, the development of a very high efficiency of a language, its weak type of variable can save the programmer a lot of time and effort to define variables, type conversion and so on. It is a dynamic language for web development.

1. Principles and features of PHP design

    • Multi-Process Model: This enables processes to be unaffected by each other, making resource utilization faster and easier for processes

    • Weakly typed languages: Unlike strongly typed languages C, C + +, Java and other languages, the type of variables in PHP is not determined from the beginning, he is determined at run time, can be implicitly or explicitly type conversion, which makes it very flexible in development, programmers do not need to pay attention to the problem of variable type

    • Zend Engine + component (EXT) mode reduces internal coupling

    • Middle tier (SAPI) isolated from Web server and PHP

    • The grammar is simple and flexible, the specification is few. This point has both advantages and disadvantages ...

2. PHP four-tier system

PHP from top to bottom altogether four layers system:

    • Zend Engine : Zend Overall with C implementation, is the core part of PHP, it translates php code into executable opcode, processing and implementation of the corresponding processing method (principle: Bird Brother's blog), the realization of the basic data structure, memory allocation and management, Providing the appropriate API method for external use is at the heart of everything.

    • Extensions: Around the Zend Engine, Extensions provides a variety of basic services through components, commonly used built-in functions array, standard library, etc. are implemented through extension, Users can also implement their own extension in order to achieve functional expansion and other purposes, such as paste is in use in the PHP middle layer, Rich text parsing is the typical application of extension.

    • Sapi: SAPI Full Name server application programing Interface, that is, the service-side application programming interface, SAPI through some column hook function, so that PHP can interact with the peripheral data, This is a very elegant and successful PHP design, through SAPI successfully decoupled PHP itself and the upper application decoupling, PHP can no longer consider how to be compatible with different applications, and the application itself can be used for their own characteristics to achieve different processing methods.

    • Upper Application : This is the application written by the programmer, through different sapi ways to get a variety of application patterns, such as the implementation of the Web application through webserver, run as a script in the command line and so on

3. Sapi

As before, SAPI through the interface of some columns, so that the external application can and PHP Exchange data and can be based on different application characteristics to achieve a specific processing method, the common SAPI are:

    • Apache2handler: With Apache as the webserver, the use of mod_php mode operation time, is now the most widely used

    • CGI: This is another way of interacting with Webserver and PHP, which is the FASTCGI protocol

    • CLI: Command Debug Application Mode

4. Execution flow of PHP code

As can be seen, PHP through the Zend engine to achieve a typical dynamic language execution process: to get a snippet of code, through lexical parsing, parsing and other stages, the source program is translated into a single instruction (opcodes), and then Zend Virtual machine order to execute these instructions. PHP itself is implemented in C language, so the final call is also the C language function.

The core of PHP execution is a translation of an instruction, that is, opcode

opcode is the most basic unit of PHP program execution . A opcode consists of two parameters (OP1,OP2), a return value, and a handler function. The PHP program is eventually translated into a set of opcode processing functions in the order of execution.

Several functions are commonly used:

    • End_assign_spec_cv_cv_handler: Variable allocation (A=B)

    • Zend_do_fcall_by_name_spec_handler: Function call

    • Zend_concat_spec_cv_cv_handler: string concatenation a.b

    • Zend_add_spec_cv_const_handler: addition Operation A+2

    • Zend_is_equal_spec_cv_const: judging Equality a==1

    • Zend_is_identical_spec_cv_const: judging Equality a===1

5. Zend Engine Introduction

Zend Engine as the core of PHP, the main design mechanism is:

5.1 Implementing Hashtable data structures

Hashtable is the core data structure of Zend, which is used in PHP for almost all functions, and the PHP Data Array () is a typical application. In addition, inside Zend, such as function symbol table, panorama variable are implemented by Hashtable.

Zend Hash table implements a typical hash list hash structure, and by attaching a doubly linked list, it provides the function of forward, reverse, and iterate array, structure

It can be seen that in hash table, there are both key->value forms of hash structure and bidirectional linked list mode, which makes it very convenient to support fast lookup and linear traversal.
Hash structure : The hash structure of Zend is a typical hash table model, which solves the conflict by means of a linked list. It is important to note that the Zend hash table is a self-growing data structure that, when the number of hash tables is full, dynamically expands and re-positions the elements in twice-fold ways. The initial size is 8. In addition, in the Key->value Quick Find, Zend itself has done some optimization, through the way of space-changing time to speed up. For example, in each element, a variable nkeylength is used to identify the length of the key for quick determination.
doubly linked list : Zend hash table The linear traversal of elements is realized through a linked list structure. In theory, it is enough to do a traversal using a one-way list, the reason is to use a doubly linked list, the main purpose is to quickly delete, avoid traversal. Zend hash table is a composite structure that, when used as an array, supports common associative arrays that can also be used as sequential index numbers, and even allow a mixture of 2.
php Associative arrays : Associative arrays are typical hash_table applications. A single query process takes the following steps (as you can see from the code, this is a common hash query process and adds some quick judgments to speed up lookups):

  getkeyhashvalue h;02  index = n & ntablemask;03  Bucket *p = arbucket[index];04 while  (p) {      if ((p->h = = h) && (p->nkeylength = = nkeylength)) {          RETURN p->data;      }08      p=p->next;09  }10  RETURN falture;

php indexed array: The index array is our common array, accessed by subscript. For example, Arr[0],zend Hashtable internally is normalized , and for the index type key is also assigned a hash value and Nkeylength(0). The internal member variable nnextfreeelement is the maximum ID currently assigned to it, and automatically adds one after each push. It is this normalization that enables PHP to implement associative and non-associative blending. because of the specificity of the push operation, the index key in the PHP array order is not determined by the subscript size, but by the push of the successive decision. for example arr[1] = 2; ARR[2] = 3; For a double type of key,zend Hashtable will treat him as an index key

5.2 How PHP variables are implemented

PHP is a weakly typed language and does not strictly differentiate between types of variables. PHP variables can be divided into simple types (int, sting, BOOL), set type (array, resource, object), and constants (const), all of which have the same structure at the bottom zval

Zval is a very important data structure in Zend, which is used to label and implement PHP variables with the following data structures:

struct _zval_struct {    zvalue_value value;     /* Value */    zend_uint refcount__gc;  /* Variable ref count */    Zend_uchar type;          /* Active type */    Zend_uchar is_ref__gc;    /* If it is a ref variable */};typedef struct _zval_struct zval;

which

    • Zval_value value is the actual value of the variable, specifically a Zvalue_value union:

typedef Union _ZVALUE_VALUE {    long lval;                  /* Long value */    double dval;                /* Double value */    struct {/                    * String */        char *val;        int len;    } STR;    HashTable *ht;              /* Hash table value,used for array */    zend_object_value obj;      /* Object */} Zvalue_value;
    • Zend_uint refcount__gc is a counter that stores how many variables (or symbols, symbols) point to the Zval. When a variable is generated, its refcount=1, a typical assignment operation such as $ A = $b will add 1 to the Zval RefCount, and the unset operation will be reduced by 1 accordingly. Before PHP5.3, using the mechanism of reference counting to implement GC, if a zval refcount less than 0, then the Zend engine will assume that there is no variable pointing to the Zval, thus releasing the memory space occupied by the Zval. But things are not that simple at times. In the following we will see that the simple reference counting mechanism cannot GC out the zval of the circular reference, even if the variable pointing to the Zval has been unset, resulting in a memory leak (memories Leak).

    • Zend_uchar type This field is used to indicate the actual type of the variable. Variables in PHP include four scalar types (bool,int,float,string), two composite types (array, object), and two special types (resource and null). Within Zend, these types correspond to the following macro (code location phpsrc/zend/zend.h)

#define Is_null     0#define is_long     1#define is_double   2#define is_bool     3#define is_array    4#define Is_object   5#define is_string   6#define is_resource 7#define is_constant 8#define is_constant_array   9# Define Is_callable 10
    • is_ref__gc This field is used to mark whether a variable is a reference variable. For a normal variable, the value is 0, and for a reference-type variable, the value is 1. This variable will affect zval sharing, separation, etc.

5.2.1 Integer, floating-point variable

Integer, floating-point number is one of the basic types in PHP and is also a simple variable. for integers and floating-point numbers, the corresponding values are stored directly in the Zvalue. The types are long and double, respectively.
As can be seen from the zvalue structure, for the integer type, and C and other strongly typed languages,PHP is not distinguished from int, unsigned int, long, long long, and so on, for it, there is only one type of integer is long. Thus, it can be seen that in PHP, the value range of integers is determined by the number of compiler bits rather than fixed. What happens if integers are out of bounds in PHP? PHP automatically converts integers to floating-point type

For floating-point numbers, similar to integers, it does not differentiate between float and double but only double one type

5.2.2-character variable

Like integers, character variables are the underlying type and simple variable in PHP. The Zvalue structure shows that in PHP, strings are made up of pointers and length structures that point to actual data, which is similar to string in C + +. Because of the length by an actual variable, and C, its string can be 2 binary data (including 0), while in PHP, the string length strlen is an O (1) operation

Common string stitching method and speed comparison:

Suppose there are 4 variables: stra= ' 123 '; StrB = ' 456 '; inta=123; intb=456;
Now for the following several string stitching method to do a comparison and description:
1 res = STRA.STRB and res = "STRASTRB"
In this case, the Zend will re-malloc a piece of memory and handle it accordingly, at a speed normal.
2 Stra = STRA.STRB
This is the fastest, Zend will be directly relloc on the current stra basis, to avoid duplicate copies
3 res = INTA.INTB
This is slower, because implicit format conversion is required, and the actual program should be careful to avoid
4 Stra = sprintf ("%s%s", STRA,STRB);
This is the slowest way, because sprintf is not a language structure in PHP, it takes more time to recognize and process the format itself, and the mechanism itself is malloc. However, the sprintf is the most readable, in practice can be flexibly selected according to the specific circumstances.

5.2.3 Array Variables

The PHP array is naturally implemented by Zend Hash table.

How is the foreach operation implemented? a foreach to an array is done by traversing a doubly linked list in the Hashtable. For indexed arrays, the foreach traversal efficiency is much higher than for a for, eliminating the Key->value lookup. The count operation calls the Hashtable->numofelements,o (1) operation directly. For a string such as ' 123 ', the Zend is converted to its integer form. arr[' 123 '] and arr[123]

5.3 PHP Variable Management-reference count and write-time copy

Reference counting is widely used in areas such as memory reclamation, string manipulation, and so on. The reference count of Zval is implemented through member variables is_ref and Ref_count, and by reference counting, multiple variables can share the same data. Avoid the large amount of consumption caused by frequent copying. when an assignment is performed, Zend points the variable to the same zval while ref_count++, corresponding to the ref_count-1 when the unset operation. Only Ref_count minus 0 o'clock will actually perform the destroy operation. if it is a reference assignment, Zend modifies is_ref to 1.

PHP variables share data by reference counting, so what if you change one of the variable values? When attempting to write a variable, Zend discovers that the variable points to the Zval is shared by more than one variable, it copies a copy of Ref_count 1 zval, and decrements the zval of the original refcount, this process is called "Zval separation." Visible, the copy operation is only performed when there is a write operation, so it is also called copy-on-write (copy on Zend).

For reference variables, the requirement is the opposite of the non-reference type, and the variable that references the assignment must be bundled, and modifying a variable modifies all the bundle variables.

5.4 PHP Local variables and the implementation of global variables:

How are local variables and global variables implemented in PHP? For a request, PHP can see two symbol tables (symbol_table and active_symbol_table)at any time, where the former is used to maintain global variables. The latter is a pointer to the currently active variable symbol table, and when the program enters a function, Zend assigns it a symbol table x and points active_symbol_table to a. The distinction between global and local variables is realized in this way.

Gets the value of the variable: the PHP symbol table is implemented through hash_table, assigning a unique identifier to each variable, and retrieving the corresponding zval from the table when it gets returned.

A global variable is used in the

function: In a function, we can use global variables by explicitly declaring global. Create a reference to the variable with the same name in Active_symbol_table (the value of the reference variable will be updated together), if there is no variable with the same name in Symbol_table, it will be created first.

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.