Network Security Internet Technology Development Database Servers Mobile Phone Android Software Apple Software Computer Software News IT Information

In addition to Weibo, there is also WeChat

Please pay attention

WeChat public account

Shulou

Chapter 18 lamp Architecture

2025-01-16 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Servers >

Share

Shulou(Shulou.com)06/02 Report--

18.1 introduction to lamp

With the groundwork of the previous knowledge, we can learn the first commonly used web architecture today.

The so-called lamp, in fact, is a group of Linux+Apache+Mysql/MariaDB+Php/Perl/Python dynamic websites or server open source software, except Linux other parts themselves are independent programs, but because they are often used together, have a higher and higher degree of compatibility, together to form a powerful Web application platform.

LAMP refers to the first letters of Linux (operating system), Apache (HTTP server), MySQL (also MariaDB, database software) and PHP (sometimes Perl or Python). It is generally used to build web application platforms.

18.2 Web Server Workflow

Before we talk about building a lamp architecture platform, let's take a look at what is CGI, what is FastCGI, and what is.

The resources of web server are divided into two types: static resources and dynamic resources.

The so-called static resource refers to the static content, and the resource obtained by the client from the server is the same as the original file. It can be simply understood as resources stored directly in the file system.

Dynamic resources are usually program files, which need to be returned to the client after the server executes.

So how does the web server execute the program and return the results to the client? Here is a diagram to illustrate how the web server handles client requests

As shown in the above figure

Phase ① shows that the httpd server (that is, apache) and the php server communicate through the FastCGI protocol, and php runs as a separate service process

Phase ② shows communication between the php program and the mysql database through the mysql protocol. Php has nothing to do with mysql, but programs written in the Php language can interact with mysql. Similarly, programs written by perl and python can also interact with mysql databases.

18.2.1 cgi and fastcgi

FastCGI is mentioned in ① in the above figure. Let's take a look at CGI and FastCGI.

CGI (Common Gateway Interface, Universal Gateway Interface), CGI is the interface standard between external applications (CGI programs) and WEB servers, and it is the process of transmitting information between CGI programs and Web servers. The CGI specification allows Web servers to execute external programs and send their output to Web browsers, and CGI turns a simple set of static hypermedia documents from web into a complete new interactive media.

FastCGI (Fast Common Gateway Interface) is an improved version of CGI. CGI processes each request by enabling an interpreter process, which is time-consuming and resource-consuming, while FastCGI processes each request in the form of master-worker, that is, it starts a master main process, and then starts several worker processes according to the configuration. When the request comes in, master selects one of the worker processes to process the request. In this way, the frequent cpu context switching caused by repeated generation and killing processes is avoided, which is time-consuming.

18.2.2 the way httpd is combined with php

There are three ways to combine httpd with php:

A) modules:php will exist as an extension module of httpd. When dynamic resources need to be loaded, httpd can process resources directly through the php module and return them to the client.

Httpd prefork:libphp5.so (php of multi-process model)

Httpd event or worker:libphp5-zts.so (php for threading model)

B) when CGI:httpd needs to load dynamic resources, contact the php interpreter through CGI to obtain the result of php execution. In this case, httpd is responsible for establishing and disconnecting the connection with php.

C) FastCGI: using php-fpm mechanism to start as a service process, php runs as a service itself, and https communicates with php through socket

FastCGI is more commonly used than CGI, and few people use CGI to load dynamic resources.

18.2.3 web Workflow

Next, let's illustrate the workflow of web through the diagram above.

The client requests the web server resource through the http protocol. After receiving the request, the web resource determines whether the resource requested by the client is a static resource or a dynamic resource, and if the static resource is taken directly from the local file system, it is returned to the client. Otherwise, if it is a dynamic resource, contact the php server through the FastCGI protocol, schedule the worker process through the master process of the CGI program to obtain the dynamic resource requested by the client, and return the execution result to the httpd server through the FastCGI protocol. After receiving the execution result of the php, the httpd server encapsulates it as a http response message to the client. When executing the program to obtain the dynamic resources, if you need to obtain the resources in the database, the Php server interacts with the MySQL/MariaDB server through the mysql protocol, and then returns it to httpd,httpd to package the execution result received from the php server as a http response message to the client.

18.3 lamp platform construction

18.3.1 build lamp platform through yum installation

Build lamp under CentOS7:

The package to install: httpd,php,php-mysql,mariadb-server

Note: php requires httpd to use prefork MPM

Yum-y install httpd php php-mysql mariadb-serversystemctl start httpd.servicesystemctl start mariadb.service

Build lamp under CentOS6:

The package to install: httpd,php,php-mysql,mysql-server

Yum-y install httpd php php-mysql mysql-serverservice httpd startservice mysqld start

18.3.2 compile and install lamp

Http's support for fastcgi protocol:

A) httpd-2.2: additional fastcgi modules are required

Wget https://mirrors.tuna.tsinghua.edu.cn/apache//httpd/mod_fcgid/mod_fcgid-2.3.9.tar.bz2tar xf mod_fcgid-2.3.9.tar.bz2cd mod_fcgid-2.3.9./configure.apxsmakemake install

B) httpd-2.4: comes with fastcgi module

Installation order: httpd,MariaDB,php

Install httpd-2.2:

Cd / usr/srcwget http://mirror.bit.edu.cn/apache//httpd/httpd-2.2.32.tar.bz2tar xf httpd-2.2.32.tar.bz2cd httpd-2.2.32./configure-- prefix=/usr/local/httpdmakemake installecho 'PATH=/usr/local/httpd/bin:$PATH' > / etc/profile.d/httpd.shsource / etc/profile.d/httpd.shln-s / usr/local/httpd/include/ / usr/include/httpdecho' MANPATH / Usr/local/httpd/man' > > / etc/man.configapachectl start

Install MariaDB:

Cd / usr/srcwget http://ftpmirror.gnu.org/gcc/gcc-5.2.0/gcc-5.2.0.tar.bz2tar xf gcc-5.2.0.tar.bz2cd gcc-5.2.0./contrib/download_prerequisitesyum-y install gcc-c++ glibc-static gcc./configure-prefix=/usr/local/gcc-- enable-bootstrap-- enable-checking=release-- enable-languages=c C++-- disable-multilibmake-j $(cat / proc/cpuinfo | grep 'processor' | wc-l) make installecho' export PATH=/usr/local/gcc/bin:$PATH' > / etc/profile.d/gcc.sh. / etc/profile.d/gcc.shln-sv / usr/local/gcc/include/ / usr/include/gccecho'/ usr/local/gcc/lib64' > / etc/ld.so.conf.d/gcc.confecho'/ usr/local/gcc/lib' > > / etc/ld.so.conf.d/gcc.confldconfig-p | grep gcc # verify whether the header file cd / usr/srcyum install-y ncurses-devel openssl-devel openssl cmake mysql-develwget groupadd-r-g 306 mysqluseradd- R-g 306-u 306 mysqlmkdir-pv / data/mydatachown-R mysql.mysql / data/mydatatar xf mariadb-10.2.6.tar.gzcd mariadb-10.2.6cmake. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql\-DMYSQL_DATADIR=/data/mydata\-DSYSCONFDIR=/etc\-DWITH_INNOBASE_STORAGE_ENGINE=1\-DWITH_ARCHIVE_STORAGE_ENGINE=1\-DWITH_BLACKHOLE_STORAGE_ENGINE=1\-DWITH_READLINE=1-DWITH_SSL=system\-DWITH_ZLIB=system-DWITH_LIBWRAP=0\-DMYSQL_UNIX_ADDR=/tmp/mysql.sock\-DDEFAULT_CHARSET=utf8\-DDEFAULT_COLLATION=utf8_general_cimake-j $(cat / proc/cpuinfo | grep 'processor' | wc-l) make install

Cmake parameter description:

# installation root directory-DCMAKE_INSTALL_PREFIX=/usr/local/mysql# data storage directory-DMYSQL_DATADIR=/data/mydata# UNIX socket files-DMYSQL_UNIX_ADDR=/tmp/mysql.sock# configuration files (my.cnf) directory-DSYSCONFDIR=/etc# default character set-DDEFAULT_CHARSET=utf8# default character proofreading-DDEFAULT_COLLATION=utf8_general_ci# TCP/IP port-DMYSQL_TCP_PORT=3306 # * ARCHIVE engine support-DWITH_ARCHIVE _ STORAGE_ENGINE=1# * ARIA engine support-DWITH_ARIA_STORAGE_ENGINE=1# * BLACKHOLE engine support-DWITH_BLACKHOLE_STORAGE_ENGINE=1 # * FEDERATEDX engine support-DWITH_FEDERATEDX_STORAGE_ENGINE=1# * PARTITION engine support-DWITH_PARTITION_STORAGE_ENGINE=1 # * PERFSCHEMA engine support-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 # * SPHINX engine support-DWITH_SPHINX_STORAGE_ENGINE=1# * XTRADB support-DWITH_XTRADB_STORAGE_ENGINE=1 # * innoDB engine Support-DWITH_INNOBASE_STORAGE_ENGINE=1# * Myisam engine support-DWITH_MYISAM_STORAGE_ENGINE=1# readline library-DWITH_READLINE=1 # enable loading of local data-DENABLED_LOCAL_INFILE=1# extension support encoding (all | utf8 Gbk,gb2312 | none)-DWITH_EXTRA_CHARSETS=all# extended character support-DEXTRA_CHARSETS=all# system transport using SSL encryption-DWITH_SSL=system# system transmission using zlib compression Save bandwidth-DWITH_ZLIB=system# libwrap library-DWITH_LIBWRAP=0# operating users-DMYSQL_USER=mysql# debug mode-DWITH_DEBUG=0

Configure MariaDB:

Cd / usr/local/mysql/scripts/mysql_install_db-- user=mysql-- datadir=/data/mydata/echo 'export PATH=/usr/local/mysql/bin:$PATH' > / etc/profile.d/mysql.sh. / etc/profile.d/mysql.shln-sv / usr/local/mysql/include/ / usr/local/include/mysqlecho'/ usr/local/mysql/lib' > / etc/ld.so.conf.d/mysql.confldconfig-vldconfig-p | grep mysqlcp support-files/mysql.server / etc/rc.d/init.d/mysqldchkconfig-- add mysqldchkconfig mysqld oncp support-files/my-large.cnf / etc/my.cnfsed-I'/\ [mysqld\] / a datadir=/data/mydata' / Etc/my.cnfservice mysqld startmysql-uroot-e 'GRANT all ON *. * TO root@ "localhost" identified by "qwe123!"

Install php: see 18.4.3 for details

18.3.3 Test

Php program execution environment: create a new index.php file in the / var/www/html directory with the following contents:

Test the php program to communicate with mysql: create a new index.php file in the / var/www/html directory with the following contents:

18.4 php

18.4.1 php interpreter interacts with MariaDB/mysql

The php interpreter itself does not need to interact with MariaDB, and only programs that use data storage systems need to interact with data stores.

Common data storage systems include the following:

A) File system: storing files

B) SQL:MariaDB,Oracle,MSSQL,...

C) NoSQL:redis,mongodb,hbase,...

NewSQL

18.4.2 php profile

Php official website: www.php.net

Php Accelerator: APC,eAccelerator,Xcache,OPcache

Configuration file: / etc/php.ini,/etc/php.d/*.ini

Php.ini core configuration option: http://php.net/manual/zh/ini.core.php

List of php.ini configuration options: http://php.net/manual/zh/ini.list.php

The configuration file (php.ini) is read when php starts. For the server module version of php, it is read only once when the web server starts. For CGI and CLI versions, each call reads the

18.4.3 php compilation installation

Php compilation and installation steps:

A) resolve dependencies

After configuring the yum source (system installation lake and Epel source), execute the following command:

Yum-y groupinstall 'Desktop Platform Development'yum-y install epel-releaseyum-y install bzip2-devel libmcrypt-devel libxml2-devel

B) compile and install php

Cd / usr/srcwget http://cn2.php.net/distributions/php-5.6.30.tar.xzxz-d php-5.6.30.tar.xztar xf php-5.6.30.tarcd php-5.6.30. / configure-prefix=/usr/local/php-- with-mysql=/usr/local/mysql-- with-openssl-- with-mysqli=/usr/local/mysql/bin/mysql_config-- enable-mbstring-- with-freetype-dir-- with-jpeg -dir-with-png-dir-- with-zlib-- with-libxml-dir=/usr-- enable-xml-- enable-sockets-- with-apxs2=/usr/local/httpd/bin/apxs-- with-mcrypt-- with-config-file-path=/etc-- with-config-file-scan-dir=/etc/php.d-- with-bz2-- enable-maintainer-zts-- with-mysql=mysqlnd-- with-pdo-mysql=mysqlnd-- with-mysqli=mysqlnd-- enable-opcache

Description:

To support the worker or event MPM of apache, the-- enable-maintainer-zts option is used at compile time

If you are using PHP5.3 or above, you can specify mysqlnd in order to link to the mysql database, so that you do not need to install mysql or mysql development packages on the machine first.

Mysqlnd is available from php5.3 and can be bound to it at compile time (without having to rely on specific mysql client bindings), but it has been set by default since php5.4

. / configure-with-mysql=mysqlnd-with-pdo-mysql=mysqlnd-with-mysqli=mysqlndmake#make testmake installecho 'export PATH=/usr/local/php/bin:$PATH' > / etc/profile.d/php.sh. / etc/profile.d/php.sh

C) provide configuration files for php

Cp php.ini-production / etc/php.ini

D) Edit the apache configuration file httpd.conf to support php

Add the following two lines:

AddType application/x-httpd-php .phpAddType application/x-httpd-php-source .phps

Navigate to DirectoryIndex index.html and modify it to:

DirectoryIndex index.php index.html

Then restart httpd or reload the configuration file to test whether php is working properly

E) install xcache for php acceleration (php5.5 and below)

Install xcache:

Cd / usr/srcwget http://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.bz2tar xf xcache-3.2.0.tar.bz2cd xcache-3.2.0/usr/local/php/bin/phpize./configure-enable-xcache-with-php-config=/usr/local/php/bin/php-configmake & & make install

At the end of the installation, something like the following line appears:

Installing shared extensions: / usr/local/php/lib/php/extensions/no-debug-zts-20131226/

Edit php.ini, integrate php and xcache:

First import the sample configuration provided by xcache into php.ini:

Cat xcache.ini > > / etc/php.ini

Description: the xcache.ini file is in the source directory of xcache

Next, edit / etc/php.ini, find the line at the beginning of zend_extension, and modify it as follows:

Zend_extension = / usr/local/php/lib/php/extensions/no-debug-zts-20131226/xcache.so

Note: if there are multiple zend_extension command lines in the php.ini file, make sure that this new line comes first

Edit / etc/php.ini and modify the following:

Xcache.admin.user = "admin" # generate the password through the openssl passwd-1 PASSWORD command, and then encrypt the password on the http://xcache.lighttpd.net/demo/cacher/mkpassword.php page xcache.admin.pass = "21232f297a57a5a743894a0e4a801fc3" xcache.mmap_path = "/ tmp/xcache"

Create the / tmp/xcache file and authorize:

Touch / tmp/xcachechmod 777 / tmp/xcache

Restart httpd:

Apachectl restart

Then check the phpinfo page to see if there is a xcache module

F) OPcache (5.5 + version acceleration)

Later versions of PHP5.5.0 come with Opcache Accelerators, but are not enabled by default. So if we want to enable the PHP accelerator, we should add the parameter-enable-opcache to make the compilation.

For users who have compiled and installed PHP5.5.0 or above but did not enable the accelerator at the beginning, they can compile and add like the PHP add module. The steps are as follows:

Cd / usr/src/php-5.6.30/ext/opcache/usr/local/php/bin/phpize./configure-- with-php-config=/usr/local/php/bin/php-configmake & & make install

Finally, it will tell you that opcache.so has been compiled successfully and put it in the / usr/local/php/lib/php/extensions/no-debug-zts-20131226/ directory

Edit the php.ini file to configure opcache

Vim / etc/php.ini

Modify or add the following code and save the exit:

[opcache] zend_extension=/usr/local/php/lib/php/extensions/no-debug-zts-20131226/opcache.soopcache.enable=1opcache.enable_cli=1opcache.memory_consumption=200opcache.interned_strings_buffer=8opcache.max_accelerated_files=20000opcache.revalidate_freq=1opcache.fast_shutdown=1

Then restart the httpd service, you can use the php-m command or in the phpinfo interface to see that opcache has been turned on

Introduction to commonly used opcache configurations:

Opcache.enable= {0 | 1} # turns off or enables the opcache function. The default is 0 (off) opcache.enable_cli= {0 | 1} # turn off or enable the amount of memory available for CLIopcache.memory_consumption=528 # opcache (in Mb). Depending on your own situation, it determines how much precompiled PHP code opcache.interned_strings_buffer=8 # zend optimizer + can be stored in the pool. The total amount of memory occupied by strings in the pool (in MB) It is recommended to set the limit for 8opcache.max_accelerated_files=10000# to multi-cache files. The maximum number of cached files is between 100000 and 200. If the hit rate is less than 100%, you can try to increase this value. It is recommended that 4000opcache.revalidate_freq=1 # Opcache will check the modification time of files within a certain period of time. Here, the time period for checking is 2 by default, and the unit is seconds. It is recommended to set it to 60. Note that 0 always checks rather than closes opcache.fast_shutdown=1 # to open and close quickly. When opening this PHP Request Shutdown, the speed of reclaiming memory will increase the percentage of opcache.max_wasted_percentage=5 # memory wasted to this value, and a restart schedule will be initiated. Opcache.use_cwd=0 # turns on this directive, and Zend Optimizer + automatically appends the name of the current working directory to the script key to eliminate key naming conflicts between files with the same name. Turning off this directive will improve performance, but will damage existing applications. Opcache.validate_timestamps=1 # turns on file timestamps to verify that opcache.revalidate_path=0 # optimizes opcache.save_comments=1 #, which allows or disables file searches in include_path, to save comments for files / functions. If apigen, Doctrine, ZF2, PHPUnit require file comments It is recommended to set to 0opcache.load_comments=1 # whether or not to load comments on files / functions opcache.enable_file_override=0 # allows you to override the optimization characteristics of file existence (file_exists, etc.) opcache.optimization_level=0xffffffff # defines how many optimization processes to start opcache.inherited_hack=1 # enable this Hack to temporarily resolve the "can't redeclare class" error opcache.dups_fix=0 # enable this Hack to temporarily resolve the "can't redeclare class" error Opcache.blacklist_filename= # set the blacklist that is not cached PHP files starting with cache_ in the specified directory are not cached. For example, / png/www/example.com/public_html/cache/cache_opcache.max_file_size=0 # removes the cache of large files by file size. By default, all files are cached opcache.consistency_checks=0 # every N requests to check the cache check. The default value of 0 means that checking is disabled. Since calculating the check value is detrimental to performance, this instruction should turn on opcache.force_restart_timeout=180 # tightly during development and debugging. After the cache is not accessed, wait how long (in seconds) to schedule the restart of the opcache.error_log= # error log file name. Leaving blank indicates the preferred background for using standard error output (stderr) opcache.log_verbosity_level=1 # to write error messages to the server (Apache, etc.) log opcache.blank _ memory_model= # memory share. Leave blank is to let the system select opcache.protect_memory=0 # to prevent the shared memory script from being accidentally written during execution, only for internal debugging

G) enable server status (edit httpd.conf)

The mod_status module allows administrators to view the execution status of the server, which displays the statistics of the current server through a HTML page. These data usually include, but are not limited to:

Number of worker processes in the working state

Number of worker processes in idle state

The status of each worker, including the number of requests that this worker has responded to, and the number of bytes of content sent by this worker

Total number of bytes sent by the current server

The time since the server was last started or restarted to the current time

Average number of requests per second, average number of bytes sent per second, average number of bytes requested per request

Enabling the status page is simple by adding the following to the main configuration file:

SetHandler server-status Allow from all # httpd-2.2 version uses this license Require all granted # httpd-2.4 version uses this license # Note: Allow statement and Require statement choose one of the two statements and cannot be used at the same time

It should be reminded that the status information here should not be accessed by everyone at will. Therefore, it should be restricted to clients with certain addresses. For example, use Require ip 172.16.0. Candl 16 to restrict the viewing of pages to hosts with specified network segments.

You can use http://ip/server-status to view the status interface

18.4.4 configure php that works in fpm mode

A) resolve dependencies

Yum-y groupinstall "X Software Development"

To make the compiled php support the mcrypt extension, execute the following command:

Yum-y install libmcrypt libmcrypt-devel mhash mhash-devel

B) compile and install php

Cd / usr/srcwget http://cn2.php.net/distributions/php-5.5.38.tar.xzxz-d php-5.5.38.tar.xztar xf php-5.5.38.tarcd php-5.5.38./configure-prefix=/usr/local/php5-with-mysql=/usr/local/mysql-with-openssl-with-mysqli=/usr/local/mysql/bin/mysql_config-enable-mbstring-with-freetype-dir-with-jpeg -dir-with-png-dir-- with-zlib-- with-libxml-dir=/usr-- enable-xml-- enable-sockets-- enable-fpm-- with-mcrypt-- with-config-file-path=/etc-- with-config-file-scan-dir=/etc/php.d-- with-bz2make & & make installcp php.ini-production / etc/php.ini

C) configure php-fpm

Provide a SysV init script for php-fpm and add it to the service list:

Cp sapi/fpm/init.d.php-fpm / etc/rc.d/init.d/php-fpmchmod + x / etc/rc.d/init.d/php-fpmchkconfig-- add php-fpmchkconfig php-fpm on

Provide a configuration file for php-fpm:

Cp / usr/local/php/etc/php-fpm.conf.default / usr/local/php/etc/php-fpm.conf

Edit the configuration file for php-fpm (/ usr/local/php/etc/php-fpm.conf):

Configure the relevant options for fpm to the values you need, and enable the pid file (the last line below):

Pm.max_children = 50 # provide up to 50 processes at the same time provide 50 concurrent services pm.start_servers = 5 # start 5 processes pm.min_spare_servers = 2 # minimum number of idle processes pm.max_spare_servers = 8 # maximum number of idle processes pid = / usr/local/php/var/run/php-fpm.pid

Start php-fpm:

Service php-fpm start

Verify with the following command (if there are several php-fpm processes in the output of this command indicating that the startup was successful):

Ps aux | grep php-fpm

By default, fpm listens on port 9000 at 127.0.0.1, or you can use the following command to verify that it is listening on the corresponding socket:

Ss-tanlp | grep php-fpm

18.4.5 configuring httpd-2.4.9

Httpd-2.4.9 configuration:

A) enable the relevant modules of httpd

Since apache httpd 2.4, there has been a special module for the implementation of FastCGI, this module is mod_proxy_fcgi.so, which is actually an extension of the mod_proxy.so module, so both modules have to load, edit the httpd.conf file, and add the following two lines:

LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

B) configure virtual hosts to support the use of fcgi

Add two lines similar to the following in the virtual host that needs to use fcgi:

ProxyRequests Off# closes the forward agent ProxyPassMatch ^ / (. *\ .php) $fcgi://127.0.0.1:9000/PATH/TO/DOCUMENT_ROOT/$1

Such as:

ProxyPassMatch ^ / (. *\ .php) $fcgi://127.0.0.1:9000/var/www/html/idfsoft.com/$1

Indicates that requests for files ending in .php are sent to the php-fpm process, and php-fpm at least needs to know the directory and URI in which it is running

Therefore, these two parameters are specified directly after fcgi://127.0.0.1:9000. The transfer of other parameters has been encapsulated by mod_proxy_fcgi.so and does not need to be specified manually.

Example:

DocumentRoot "/ var/www/html/idfsoft.com" ServerName idfsoft.com ServerAlias www.idfsoft.com ProxyRequests Off ProxyPassMatch ^ / (. *\ .php) $fcgi://127.0.0.1:9000/var/www/html/idfsoft.com/$1 Options none AllowOverride none Require all granted

C) Edit the apache configuration file httpd.conf so that apache can recognize the page in php format and support the home page in php format

Add the following two lines:

AddType application/x-httpd-php .phpAddType application/x-httpd-php-source .phps

Navigate to DirectoryIndex index.html and modify it to:

DirectoryIndex index.php index.html

Then restart httpd or reload the configuration file to test whether php is working properly

Note: in versions prior to Apache httpd 2.4, PHP was either run as a module of apache or a third-party module was added to support PHP-FPM implementation

Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.

Views: 0

*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.

Share To

Servers

Wechat

© 2024 shulou.com SLNews company. All rights reserved.

12
Report