> 백엔드 개발 > PHP 튜토리얼 > php+php-fom+nginx 구성 매개변수를 최적화하는 방법에 대해 자세히 알아보세요.

php+php-fom+nginx 구성 매개변수를 최적화하는 방법에 대해 자세히 알아보세요.

青灯夜游
풀어 주다: 2023-04-10 22:12:02
앞으로
6358명이 탐색했습니다.

php+php-fom+nginx 구성 매개변수를 최적화하는 방법은 무엇입니까? 다음 글에서는 php+php-fom+nginx 구성 매개변수 튜닝 방법을 자세히 소개하겠습니다. 도움이 되셨으면 좋겠습니다.

php+php-fom+nginx 구성 매개변수를 최적화하는 방법에 대해 자세히 알아보세요.

1. 서문

새 서버의 경우 LNMP 환경 설치는 첫 번째 단계일 뿐입니다. 물론 두 번째 단계는 이러한 프로그램을 쉽게 만들 수 있도록 기본 구성 매개변수를 수정하는 것입니다. 사용하면 성능도 향상됩니다. 이 문서에서는 주로 php+php-fpm+nginx의 구성 매개변수에 대해 설명합니다. 해당 머신은 4GB 메모리를 갖춘 서버입니다. 관련 구성은 에 따릅니다. 4GB 메모리 서버가 구성되었습니다. LNMP环境只是第一步,第二步当然是要修改默认的配置参数,让这些程序变得好用,性能也提升起来。这篇文章主要讲述php+php-fpm+nginx的配置参数,机器是4GB内存的服务器,相关配置都是按照4GB内存的服务器来配置的。

1、mysql配置参数:

mysql配置参数调优(8GB内存和64GB内存)
mysql配置文件构成以及具体的配置demo

2、注意

      下面给出的一些配置都是相对来说会影响性能或者必须要配置的地方,没有提及的配置都是按照默认的来。这三个程序的配置参数很多,咱们的服务器刚开始也着实用不到太复杂的配置,下面的配置主要是为了尽量提升高并发能力以及尽量提高程序的性能。

php和php-fpm都是5.6版本的。(一切都是为了兼容老项目,,苦逼)

二、php参数配置及讲解

1、phpini的基本设置

(1)safe_mode  这份的配置采用默认的
(2)disable_functions  在默认的基础上,加上eval()函数
(3)expose_php = off
(4)register_globals和magic_quotes_gpc参数都在php5.4.0后被移除了
(5)错误提示以及日志部分采用默认的就行,现在大部分使用的都是框架,
查看框架的错误日志更方便
로그인 후 복사

      这几个参数是网上经常提及的,不过咱们这边并不是都要按照他们的配置来,毕竟年代已久,很多bug或者性能问题都已经被修复。

2、php参数设置

(1)max_execution_time  = 300

      脚本运行的最长时间,超出规定时间,脚本会自动杀死这个请求,为了能上传大文件,所以这个值设置的大一些。这个值太小也会造成程序502错误。

(2)memory_limit = 128M

      每个脚本使用的最大内存

(3)max_inpit_time = 300

      每个脚本等待输入数据的最长时间

(4)upload_max_filesize = 20M

      上传文件的最大许可大小

(5)allow_url_fopen = off

      禁止打开远程地址

(6)post_max_size = 20M
      post上传的大小,要>=upload_max_filesize

(7);cgi.fix_pathinfo=1
      默认打开,目前高版本的php已经避免了这个漏洞,php-fpmsecurity.limit_extensions 默认值早就是 .php了。所以咱们这个参数使用默认的就行。
参考:php fpm 设置项 cgi.fix_pathinfo=1 漏洞不再出现

      关于php.ini,要设置的参数就是这些了,主要是增加程序的运行时间,增加上传文件大小等,可以方便我们平时的php开发。

三、php-fpm设置

1、设置子进程数,增加并发量

log_level = notice		//notice级别的日志,默认的
rlimit_files = 4048		//调整最大打开文件数量
pm选用动态变化的dynamic

process.max = 150		// 最大子进程,设置成和max_children一样就行
pm = dynamic
pm.max_children = 150	//最大子进程,假如一个进程30M,4G内存的话最大为:4048/30 = 135,取150
pm.start_servers = 20
pm.min_spare_servers = 6
pm.max_spare_serveres = 30   
//计算公式是:min_spare_servers ≤ start_servers ≤ max_spare_servers ≤ max_children
로그인 후 복사

      这块很多人都建议,如果你的内存比较大,那么设置静态的pm = static,这个时候,起作用的只有max_children参数,初始的时候就有max_children个进程,刚开始一个php-fpm进程只占用3M左右内存,我们4GB的机器按照一个进程20M计算,可以设置max_children200或者150。如果是专门的php服务器,建议是设置为静态的,性能最佳。

      如果设置成动态的也可以,这样的话是start_servers等程序起作用,会随着业务的增加而不断新增进程,不过最大进程数是不能超过max_children的。博主这边考虑到机器内存小而且机器上还跑了mysqlredis等,还是选用了动态的,这样一开始不会有很大的压力,等访问量上来了,可能会修改为静态的。

2、防止频繁出现502错误

(1)process_control_timeout = 20

      php-fpm

1. mysql 구성 매개변수:

mysql 구성 매개변수 조정(8GB 메모리 및 64GB 메모리)
mysql 구성 파일 구성 및 특정 구성 데모

2. /h3>🎜 아래 구성 중 일부는 성능에 상대적으로 영향을 줄 수 있거나 구성해야 합니다. 언급되지 않은 구성은 모두 기본값을 기반으로 합니다. 이 세 가지 프로그램에는 많은 구성 매개변수가 있습니다. 우리 서버는 처음에 너무 복잡한 구성을 사용할 수 없습니다. 다음 구성은 주로 높은 동시성을 최대화하고 프로그램 성능을 향상시키기 위한 것입니다. 🎜🎜🎜php와 php-fpm은 모두 버전 5.6입니다. (모든 것은 기존 프로젝트와의 호환성을 위한 것입니다.) 🎜🎜🎜2. PHP 매개변수 구성 및 설명🎜

🎜1. phpini🎜

#表示在emergency_restart_interval所设值内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果
#超过emergency_restart_threshold个php-fpm就会优雅重启。这两个选项一般保持默认值

emergency_restart_threshold = 30
emergency_restart_interval = 60s	//一分钟内出现30次上述信号即重启php-fpm
로그인 후 복사
로그인 후 복사
의 기본 설정🎜 이 매개변수는 인터넷에서 자주 언급됩니다. 하지만 여기서는 구성을 따를 필요가 없습니다. 오랜 시간이 걸려서 많은 버그나 성능 문제가 해결되었습니다. 🎜

🎜2.PHP 매개변수 설정🎜

🎜🎜 (1) max_execution_time = 300🎜🎜🎜 스크립트가 실행될 수 있는 최대 시간입니다. 지정된 시간을 초과하면 스크립트가 자동으로 요청을 순서대로 종료합니다. 대용량 파일을 업로드하기 위해 이 값을 더 크게 설정합니다. 이 값이 너무 작으면 프로그램 502 오류도 발생합니다. 🎜🎜🎜 (2) Memory_Limit = 128m🎜🎜🎜 - – –- 각 스크립트에 사용되는 최대 메모리 🎜🎜🎜 (3) max_inpit_time = 300 🎜🎜🎜. ‐ ‐ 업로드하려면 >=upload_max_filesize🎜🎜🎜(7);cgi.fix_pathinfo=1🎜
현재 상위 버전이 켜져 있어야 합니다. php는 이 취약점을 피했으며, php-fpmsecurity.limit_extensions 기본값은 오랫동안 .php였습니다. >. 따라서 이 매개변수에 기본값을 사용할 수 있습니다.
참고: php fpm 설정 항목 cgi.fix_pathinfo=1 취약점이 더 이상 나타나지 않습니다 🎜🎜 php.ini에 대해 설정하는 매개변수이며 주로 실행 시간을 늘리기 위해 설정됩니다. 업로드하는 파일 크기 등을 늘리면 일반적인 php 개발을 용이하게 할 수 있습니다. 🎜🎜3. php-fpm 설정🎜

🎜1. 하위 프로세스 수를 설정하고 동시성 양을 늘리세요🎜

request_slowlog_timeout = 2   # 记录超过2s的请求
slowlog = /var/log/php-fpm/www-slow.log	#慢日志路径
로그인 후 복사
로그인 후 복사
🎜 많은 사람들이 메모리가 상대적으로 크다면 정적 pm = static, 현재는 max_children 매개변수만 작동합니다. 처음에는 max_children 프로세스와 php- fpm이 있습니다. 프로세스는 약 3M 메모리를 차지합니다. 우리 4GB 시스템은 20M 프로세스로 계산됩니다. max_children은 200 또는 150입니다. 전용 php 서버인 경우 최상의 성능을 위해 정적으로 설정하는 것이 좋습니다. 🎜🎜 동적으로 설정할 수도 있습니다. 이 경우 start_servers와 같은 프로그램이 작동하며 비즈니스가 증가함에 따라 새로운 프로세스가 계속 추가됩니다. 그러나 최대 프로세스 수는 초과할 수 없습니다. max_children. 블로거는 머신의 메모리가 작고 <code>mysql, redis 등도 실행한다고 생각하여 큰 부담이 되지 않도록 동적 머신을 선택했습니다. 처음에는 방문횟수가 증가할 경우 정적으로 수정될 수 있습니다. 🎜

🎜2. 빈번한 502 오류 방지🎜

🎜🎜(1) process_control_timeout = 20🎜🎜🎜                                                          >                                           하지만 ) request_terminate_timeout = 320초🎜🎜

      表示等待320秒后,结束那些没有自动结束的php脚本,以释放占用的资源。设置320s主要是因为php的程序运行时间是300s,所以对于php-fpm来说,这个值应该是大于php脚本规定的运行时间的(因为php脚本的运行可能还会带有mysql服务或者其他的一些服务,这个参数是杀掉这个进程,包括着纯php脚本以及其他服务)。

(3)自动重启设置

#表示在emergency_restart_interval所设值内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果
#超过emergency_restart_threshold个php-fpm就会优雅重启。这两个选项一般保持默认值

emergency_restart_threshold = 30
emergency_restart_interval = 60s	//一分钟内出现30次上述信号即重启php-fpm
로그인 후 복사
로그인 후 복사

(4)pm.max_requests = 1000

      每一个子进程的最大请求服务数量,如果超过了这个值,该子进程会被自动重启。

      比如max_requests这个参数,如果设置很大的话,那这个子进程要运行很多次才会重启,假如这个请求发生了错误或者内存泄漏,那么这个值设置很大是不合适的。但如果请求没有问题,这个值设置小的话就会频繁的重启,这样也会碰到不少502的问题,所以要仁者见仁,智者见智的设置了,这里初始化设置1000,如果测试没有内存泄漏等问题,可以再大一些。

3、php-fpm中的慢日志设置

      mysql中有慢日志这个概念,可以记录查询速度比较慢的sql,同样的,php-fpm也可以开启慢日志,记录执行速度比较慢的php请求,方便我们后续的调试和优化。

(1)慢日志的主要参数

request_slowlog_timeout : 默认是注释的,打开注释,设置为1,代表请求超过1s,就会记录这个脚本到慢日志文件中。也可以的更大,按照需求来。
slowlog  : 默认也是注释的,可以打开注释使用默认的慢日志路径,也可以自定义路径。

这里开启慢日志,如下:

request_slowlog_timeout = 2   # 记录超过2s的请求
slowlog = /var/log/php-fpm/www-slow.log	#慢日志路径
로그인 후 복사
로그인 후 복사

(2)利用sort/uniq命令分析汇总php-fpm慢日志:

grep -v “^$” www.log.slow.tmp | cut -d ” ” -f 3,2 | sort | uniq -c | sort -k1,1nr | head -n 50
로그인 후 복사

参数解释:

sort: 对单词进行排序
uniq -c: 显示唯一的行,并在每行行首加上本行在文件中出现的次数
sort -k1,1nr: 按照第一个字段,数值排序,且为逆序
head -10: 取前10行数据
로그인 후 복사

4、php-fpm中的backlog是干啥的?

      如果worker进程不够用,master进程会prefork更多进程,如果prefork达到了pm.max_children上限,worker进程又全都繁忙,这时master进程会把请求挂起到连接队列backlog里,而backlog默认值是511,除了加大pm.max_children,调整backlog也是有必要的。

      也就说这个backlog是在优化高并发的时候必须要设置的,这个值的大小和fpmqps也有关。backlog太大,fpm处理不过来照样会报错504(超时)。这个对于目前的机器来说,我设置的max_children = 150,然而backlog的默认值是511,所以在短期内是完全够用的,不过也可以在php-fpm.conf里面显式的制定backlog的值,比如制定:listen.backlog = 1024 #2的n次幂

参考:

PHP参数调优
nginx报错502:connect() to unix:/var/run/php5-fpm.sock failed (2: No such file or directory)
php-fpm进程数管理
关于PHP-FPM的backlog的默认值
PHP-FPM中backlog参数变更的一些思考
PHP-fpm

四、nginx配置参数调优

1、nginx中的一些层级关系

      一般打开nginx配置文件,会发现有httpserver,location等,那么他们的层级关系是什么样的呢?

答案是: 一个http里面可以有多个server,一个server里面可以有多个location

      我们配置的时候,各个server共用的部分可以配置在http模块里面。每个server自己特有的一些部分,按照各自的需求配置在server模块里面。同样的,对于location是分的更细的,按照每个server的每个location需求来配置。

      其次是如果在conf.d文件夹下有其他的配置文件,那么我们的nginx.conf就是公用的配置文件了,一些公用的部分都可以配置在nginx.conf文件中,各个站点特殊的配置就放在conf.d文件下。

参考:
nginx短篇(4):模块、配置指令、块之间的关系

2、nginx.conf 实例及解释

user www-data;
worker_processes auto; #自动检测CPU的核数
worker_rlimit_nofile 65535;  #worker进程的最大打开文件数限制
error_log   /var/log/nginx/error.log;
include /etc/nginx/modules-enabled/*.conf;
pid /run/nginx.pid;

events {
    worker_connections  10240;  #子进程最大连接数,总连接数:worker_processes * worker_connections
    use epoll; #使用epoll模型
}

http {
    include       mime.types; # #文件扩展名与文件类型映射表
    default_type  application/octet-stream;  #这个类型会让浏览器认为响应是普通的文件流,并提示用户下载文件

        #记录都有哪些变量可以记录到log_format
        log_format  main  '$remote_addr $host $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_accept_language" "$request_time" '
                      '"$upstream_response_time" "$upstream_addr" "$upstream_status" "$http_x_real_ip" "$proxy_add_x_forwarded_for"';

    sendfile        on;  #立即将数据从磁盘读到OS缓存
    tcp_nopush      on;  #告诉nginx在一个数据包里发送所有头文件
    tcp_nodelay     on;  # 告诉nginx不要缓存数据,而是一段一段的发送
    keepalive_timeout  30; #服务器将在这个超时时间过后关闭链接
    types_hash_max_size 2014;

    #resolver xxx;  #用于解析上游服务器名称的名称服务器配置到地址中
    gzip_static on;
    gzip  on;
    gzip_http_version 1.1;
    gzip_vary off;
    gzip_comp_level 4;  #数据的压缩等级,9是最慢但是压缩比最大的
    gzip_proxied off;
    gzip_buffers 16 8k;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";
    #设置需要压缩的数据格式
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/hero-res;

    client_max_body_size 20m;  #设置网页上传文件的最大值,和php.ini中的上传设置保持一致
    server_names_hash_max_size 2048;  #保存服务器名字的hash表

    include /etc/nginx/client.conf;
    include /etc/nginx/conf.d/*.conf;
}
로그인 후 복사

(1)worker_rlimit_nofile

更改worker进程的最大打开文件数限制。

查看当前进程可以打开的文件数:

ulimit-n			
//结果:65535
로그인 후 복사

查看当前系统可以打开的最大文件数:

ljf@hx:cat /proc/sys/fs/file-max
813544
로그인 후 복사

(2)log_format中的内容

参考官网:https://nginx.org/en/docs/http/ngx_http_core_module.html#var_status

remote_addr:对应客户端的地址
remote_user:是请求客户端请求认证的用户名,如果没有开启认证模块的话是值为空。
time_local:表示nginx服务器时间
request:表示request请求头的行
status:表示response的返回状态
body_bytes_sent:表示从服务端返回给客户端的body数据大小
http_referer:表示请求的上一级页面
http_user_agent:表示agent信息
http_x_forwarded_for:会记录每一级请求中信息
로그인 후 복사

(3)gzip压缩相关解释

参考:https://www.jb51.net/article/95041.htm

(4)client_max_body_size设置

      这个参数规定客户端上传的body的最大值,和php.ini中的最大上传数保持一致,不然的话,就算php.ini设置上传的最大文件是1G,如果nginx
不设置这个参数的话,那么上传一样会报错的。

3、对于conf.d文件夹中的配置

(1)配置实例代码

server{
      listen IP:80;
    server_name xxx;
    access_log  /var/log/nginx/access.log;  #access日志

    fastcgi_intercept_errors on; #支持nginx404重定向

    index index.php index.html  index.htm;

    root /product/ucool/production/manage/htdocs/backend/web/;

        send_timeout 15;
        #客户端与服务器建立连接后发送request body的超时时间(小于keepalive_timeout)
        client_body_timeout 20;
        #客户端向服务器发送一个完整的request header的超时时间(小于keepalive_timeout)
        client_header_timeout 20;
        fastcgi_connect_timeout         300;    #指定连接到后端FastCGI的超时时间
        fastcgi_send_timeout            300;    #指定向FastCGI传送请求的超时时间
        fastcgi_read_timeout            300;    #指定接收FastCGI应答的超时时间
        fastcgi_buffer_size 64k;               #指定读取FastCGI应答第一部分需要用多大的缓冲区
        fastcgi_buffers 4 64k;                 #定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求


      location ~* ^.+\.(git|svn|sql|bak|old|rar|tgz|7z|bz2|tar|idea)$ {
        return 404;
      }
      location ~ \.php$ {
                fastcgi_pass unix:/var/run/php/php5.6-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
                include fastcgi_params;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      }
        location ~ /\.git { deny all; }
}
로그인 후 복사

(2)主要是fastcgi的一些配置

这里不考虑负载均衡和反向代理,关于fastcgi的优化可以参考:

https://www.jb51.net/article/145222.htm

(3)关于send_timeout

    send_timeout 15;
    #客户端与服务器建立连接后发送request body的超时时间(小于keepalive_timeout)
    client_body_timeout 20;
    #客户端向服务器发送一个完整的request header的超时时间(小于keepalive_timeout)
    client_header_timeout 20;
로그인 후 복사

      这几个参数最好是再小一些,包括keepalive_timeout,小一些的话,能处理更多的有效请求,有利于提升nginx的处理性能,大佬们的设置如下:

client_body_timeout 12;
client_header_timeout 12;
keepalive_timeout 15;
send_timeout 10;
로그인 후 복사

4、保存编辑之后检查配置文件的正确性

(1)检查配置文件是否正确

ljf@hx:/etc/nginx$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
로그인 후 복사

      返回successful并且没有报错信息的话,说明配置文件里面的语法是没问题的,如果报错了那就是语法出错了,导致配置无法正常读取。

(2)检查子级配置文件是否正确

nginx -t -c /etc/nginx/conf.d/xxx.conf
로그인 후 복사

例如:

ljf@hx:/etc/nginx$ sudo nginx -t -c /etc/nginx/conf.d/api.conf
nginx: [emerg] "server" directive is not allowed here in /etc/nginx/conf.d/api.conf:1
nginx: configuration file /etc/nginx/conf.d/api.conf test failed
로그인 후 복사

很明显配置文件是错的。

五、影响程序超时的参数

php.ini中有max_execution_time 参数。
php-fpm中有request_terminate_timeout参数
nginx.conf中有 fastcgi_connect_timeout 等参数。
로그인 후 복사

1、关于php和php-fpm超时时间的设置

      首先是max_execution_time 这个值限定了脚本的最大执行时间,但是仅限于php脚本,对于脚本中的流操作和数据库操作等耗费的时间是不算进去的。而php-fpmrequest_terminate_timeout 代表单个请求的超时中止时间,并不会受其他脚本影响,定义10s结束,那么10s就准时结束该php脚本的运行。所以配置超时时间的时候,request_terminate_timeout 可以比max_execution_time  稍微大一些。

      还有一种说法,在服务器正常运行的时候,php-fpm.conf中的request_terminate_timeout 会覆盖php.ini中的max_execution_time,所以request_terminate_timeout 的值更代表我们对于脚本执行时间的预期。如果服务器性能足够好,可以设置request_terminate_timeout = 0代表永不超时。

      当程序运行时间大于规定的参数的时候,php-fpm会终止该php子进程。

2、nginx中的超时设置

      nginxfastcgi_connect_timeout 操作影响的是ningx的超时,一般来说,如果是php或者php-fpm超时,那么报错502 Bad Gateway(网关错误)  。如果是nginx超时的话,报错是:504 Gateway Time-out (网关超时) ,到时候我们可以根据这个报错信息来定位问题。一般来说,为防止频繁的出现超时错误,设置fastcgi_connect_timeout 相关时间为300s是合适的。

fastcgi_read_timeout=10으로 설정하면 test.php의 실행 시간은 100초, 그 다음에는 10초입니다. 나중에 웹서버PHP에 대한 연결을 닫습니다. 즉, 프로그램 실행 시간이 지정된 매개변수보다 클 경우 webserverPHP와의 연결을 닫고 시간 초과 오류가 발생합니다. 따라서 이 fastcgi의 시간 초과는 php-fpmrequest_terminate_timeout과 가장 일치합니다. fastcgi_read_timeout=10test.php执行时间100秒,则10秒后webserver会关闭和PHP的连接。也就是说当程序运行时间大于规定的参数的时候,webserver会关闭和PHP的连接,出现超时错误。所以这个fastcgi的超时时间最好是和php-fpm中的request_terminate_timeout 保持一致。

3、nginx中的keepalive_timeout

      keepalive_timeout参数是一个请求完成之后还要保持连接多久,不是请求时间多久,目的是保持长连接,减少创建连接过程给系统带来的性能损耗,类似于线程池,数据库连接池。

4、总结

      对于程序超时时间来说,并不能单纯的设置php或者设置php-fpm就能完全解决这个问题。因为它们是协调工作的,所以设置这几个参数的时候是要相互考虑的,防止因为木桶原理,最低的那个板子影响系统的性能。

      以上就是对于php+php-fpm+nginx

3. nginx의 keepalive_timeout

keepalive_timeout 매개변수는 요청에 걸리는 시간이 아니라 요청이 완료된 후 연결을 유지하는 시간입니다. 긴 연결을 유지하고 생성을 줄입니다. 시스템에 대한 연결 프로세스로 인해 발생하는 성능 손실은 스레드 풀 및 데이터베이스 연결 풀과 유사합니다.

4. 요약

프로그램 타임아웃의 경우 단순히 php 설정이나 php-fpm 설정만으로는 완전히 해결되지 않는 문제입니다. 이들은 서로 협력하여 작동하므로 가장 낮은 보드가 배럴 원리로 인해 시스템 성능에 영향을 미치는 것을 방지하려면 이러한 매개변수를 설정할 때 서로를 고려해야 합니다.

위 내용은 php+php-fpm+nginx에 대한 매개변수 조정입니다. 이러한 구성은 로컬로 설정되었으며 수정된 값은 의 사용을 극대화하기 위한 것입니다. 우리 서버 성능. 실제 효과는 프로덕션 환경에서 테스트해 보아야 하는데 기본 구성보다는 확실히 좋습니다. ㅋㅋㅋ                                                                 

위 내용은 php+php-fom+nginx 구성 매개변수를 최적화하는 방법에 대해 자세히 알아보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:voycn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿