• 转:win2000/2003 Discuz生存环境搭建及基础优化


    原帖地址   http://club.muzone.cn/viewthread.php?tid=27794

    原文:
    首先,下载需要安装的软件,我已经整理好,放到穆族社区的服务器,请根据连接下载。

    Php-4.4.1
    http://www.muzone.cn/soft/php-4.4.1-Win32.zip

    ZendOptimizer-2.6.0
    http://www.muzone.cn/soft/ZendOptimizer-2.6.0-Windows-i386.exe

    Mysql-4.0.26
    http://www.muzone.cn/soft/mysql-4.0.26-win32.zip

    Eaccelerator 加速及缓存软件
    http://www.muzone.cn/soft/eaccelerator.rar
    当然,这个eaccelerator针对php有不同版本的,如果您安装的不是php4.4.1,可以在这里找到您需要的版本
    http://www.arnot.info/eaccelerator/


    phpMyAdmin-2.7.0-pl1  Mysql管理软件,日常维护必备
    http://www.muzone.cn/soft/phpMyAdmin-2.7.0-pl1.zip

    第一节,基础安装。
    一,安装mysql
    首先,我们安装Mysql 4.0.26,之所以选择这个版本,是因为这个版本比较稳定,
    而且有关字符集和兼容性也没那么麻烦,如果没有特殊需要,不推荐使用Mysql4.1和mysql5.0
    新的版本,也许功能上更强,但是没有经历过太长时间的考验,稳定性和兼容性及使用便捷性不是很佳

    下载mysql-4.0.26-win32.zip,解压缩,直接运行安装文件。
    我是装在D:/mysql 因为C盘经常会因为各种原因重装系统,数据放在该盘不易备份和转移
    选择安装目录, D:/mysql  ,提示目录不存在,建立与否,确认,然后按照提示一路安装下去即可

    安装完毕后,运行 D:/mysql/bin/mysqld-nt.exe
    然后运行  D:/mysql/bin/winmysqladmin.exe
    输入帐号 root 密码 任意输入  (因为这一步的密码设置,实际上是不生效的,需要使用phpmyadmin修改确认)
    重新启动服务器,检查系统服务中,是否如图所示


    至此mysql的基本 安装完成,进一步的设置和My.ini优化,将在下一节说明

    二,安装PHP

    需要说明的是
    php有CGI和ISAPI是两种  运行的方式

    CGI 更消耗资源,容易因为超时而没有反映,但是实际上比较安全
    ISAPI是大C推荐的模式,负载能力强,节省资源,但是安全性略差于CGI
    我的教程中说的是ISAPI方式

    解压缩php-4.4.1-Win32.zip,将第二层目录php-4.4.1-Win32,改名为 php
    然后复制到 c:/ 成为 c:/php 并将其目录安全属性,添加 everyone 可读取和运行权限
    但是鉴于NT系统种种怪异现象,我们可以给与everyone所有权限,只是安全性有一点点问题
    (其理论性,只需要Guest组具备读取和运行权限,以及IIS所用到的IIS_WPG可以读取运行就行,但实际上往往会出现一些比较离奇的问题,本教程不作深入探讨)
    然后将php.ini-dist 改名为 php.ini
    将php4ts.dll复制到系统目录的 system32目录中
    win2000:  c:/winnt/system32/
    win2003:  c:/windows/system32/
    打开,php.ini 找到
     
    extension_dir = "./"

    改为

    extension_dir = "c:/php/extensions/"

    然后打开 Internet 信息服务(IIS)管理器
    修改你的站点属性,选中主目录,使其可以使用纯脚本




    然后点 配置  进入 应用程序配置 点添加 如图所示




    可执行文件   C:\php\sapi\php4isapi.dll
    扩展名   .php
    将“脚本引擎”“确认文件是否存在”选中,然后确认。

    win2000中,到此一般就可以支持php脚本了。

    2K和03中也可以再设置ISAPI筛选其保其运行正常



    如果状态为绿色箭头,即可,该步非必要性操作。

    win2003中,还需要设置IIS的WEB服务扩展器
    添加一个新的WEB扩展器,扩展名为.php,要求的文件C:\php\sapi\php4isapi.dll,设置扩展状态为允许。
    设置完后如图




    完成所有操作后,重新启动IIS服务。
    到此,PHP的基本安装已经完成,我们已经使网站支持PHP脚本。
    检查方法是,新建一个文本文件,内容为
     
    <?php phpinfo(); ?>

    改名为 php.php
    放到您的网站根目录,访问这个文件,如果显示了您的php详细信息,即成功,类似





    关于进一步设置和php.ini的优化,我们将在下一节继续探讨。

    三,安装ZendOptimizer

    安装ZendOptimizer,不仅是一些商用PHP必备的条件,也可以大幅度的提高php文件运行的效率。
    下载ZendOptimizer-2.6.0-Windows-i386.exe 直接运行安装
    请注意如下提示,根据提示仔细安装。
    必须选择您使用的WEB SERVER 为IIS,否则将有不可预知的错误发生。如图




    确认后,下一步,点击浏览,选择您的php.ini所在目录,这一点也不能错。如图




    然后根据提示安装,过程中,他会 停止 和 重新启动 您的IIS服务,并将原 php.ini 备份为 php.ini.Zend_Optimizer_bak
    如果一切顺利,您的 php.ini文件的尾部,将多出

     
    [Zend]
    zend_extension_manager.optimizer_ts="C:\Program Files\Zend\Optimizer\lib\Optimizer-2.6.0"
    zend_extension_ts="C:\Program Files\Zend\Optimizer\lib\ZendExtensionManager.dll"
    zend_optimizer.optimization_level=15

    并且检查C:\Program Files\Zend\Optimizer\lib\Optimizer-2.6.0 的目录安全属性是否有系统读取和运行的权限

    至此,ZendOptimizer的基本安装已经完成,更多设置和优化,将在下一节说明。

    基本安装到此结束,此环境已经完全可以运行discuz及各种php程序。
    下面我们来讲基本的设置和优化。

    基础设置及优化

    第二节,基础设置及优化
    关键字   my.ini  php.ini  eaccelerator 穆亦风

    一,Mysql的进一步设置及优化。
    登录数据库
      “命令提示字符”窗口录入,
      录入cd C:\mysql\bin 并按下回车键,将目录切换为 cd C:\mysql\bin
      再键入命令mysql -uroot -p,回车后提示你输密码,如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是:mysql>

      修改密码
      C:\mysql\bin提示符下录入:
      格式:mysqladmin –u用户名 -p旧密码 password 新密码
      例如:给root加个密码ab12。键入以下命令:
      mysqladmin -uroot password ab12

      建立数据库
      格式:create database 库名;
      例如:建立新数据库discuz
      在MYSQL的提示符下:mysql> 录入 create database discuz;

      显示数据库
      格式:show databases;
      注意是databases而不是database

      建立新用户
      格式:grant all privileges on 数据库.* to 用户名@登录主机 identified by "密码";
      例如:增加一个用户test密码为1234,让他只可以在localhost上登录,并可以对数据库discuz进行所有的操作(localhost指本地主机,即MYSQL数据库所在的那台主机),
      在MYSQL的提示符下:mysql> 录入grant all privileges on discuz.* to test@localhost identified by "1234";

      通过以上操作,你建立一个新的数据库 discuz,并增加了一个名为test对discuz数据库有所有操作权限。

      注意:以上仅仅是简单的Mysql操作命令,如果你需要了解更加详细的资料,请查阅Mysql相关操作说明文档。

    点击  《MySQL管理员指南》

    首先,在上一节,我们安装的mysql,实际上没有设置root帐号的密码,这是极不安全的
    下载 phpMyAdmin-2.7.0-pl1.zip 将子目录 phpMyAdmin-2.7.0-pl1 修改为 任意名称,复制到您的网站根目录
    这个目录的名称最好复杂,不易被猜解,防止他人使用
    然后修改config.default.php
    找到

     
    $cfg['PmaAbsoluteUri'] = '';
    修改为
    $cfg['PmaAbsoluteUri'] = 'http://test.muzone.cn/89xd983s';

    即您的网站网址及phpmyadmin具体所在目录

    找到

    $cfg['blowfish_secret'] = '';
    修改为
    $cfg['blowfish_secret'] = 'muzone';
    这个地方的值主要用作与加密您的cookie,可以任意设置

    找到
    $cfg['Servers'][$i]['auth_type']     = 'config';
    修改为
    $cfg['Servers'][$i]['auth_type']     = 'cookie';

    此处为关键修改,设置完后,只有输入正确的帐号和密码才可以管理您的mysql

    全部修改完毕,保存后,通过您的phpmyadmin 访问并管理您的mysql
    第一次登陆,由于我们没有设置root的密码,所以帐号填 root 密码空,即可登陆
    进入后第一件事情,就是修改root帐号的密码
    登陆以后,点权限,修改root帐号,点最后的编辑按钮
    设置密码,如图




    密码设置成功后,需要重新登陆,至此,便可以对mysql进行各种管理,phpmyadmin的操作网上有很多教程
    我这里就不详细讲了
    至于 my.ini的设置,我们将在下一节详细讲解

    二,安装 Eaccelerator 加速及缓存软件
    安装 Eaccelerator 加速及缓存软件,可以加速php文件的读取和运行速度,并将一些mysql查询及php文件缓存起来
    减轻服务器的负担,从而达到对论坛的大幅度加速和负载能力的提高,这个软件我在许多大站上作过试验
    效果非常显著!其效果可询问若干长期由我维护的大论坛站长。

    安装eaccelerator非常简单,
    首先,下载eaccelerator.rar
    解压缩后,一个是安装说明,一个是所需要的dll文件。
    将eaccelerator_win_4.4.1.dll 复制到  c:/php/extensions/

     
    打开c:/php/php.ini
    找到

    [Zend]
    zend_extension_manager.optimizer_ts="C:\Program Files\Zend\Optimizer\lib\Optimizer-2.6.0"
    zend_extension_ts="C:\Program Files\Zend\Optimizer\lib\ZendExtensionManager.dll"
    zend_optimizer.optimization_level=15

    替换为

    [Zend]
    zend_extension_ts="C:\php\extensions\eaccelerator_win_4.4.1.dll"
    eaccelerator.shm_size="16"
    eaccelerator.cache_dir="c:\temp"
    eaccelerator.enable="1"
    eaccelerator.optimizer="1"
    eaccelerator.check_mtime="1"
    eaccelerator.debug="0"
    eaccelerator.filter=""
    eaccelerator.shm_max="0"
    eaccelerator.shm_ttl="0"
    eaccelerator.shm_prune_period="0"
    eaccelerator.shm_only="0"
    eaccelerator.compress="1"
    eaccelerator.compress_level="9"
    zend_extension_manager.optimizer_ts="C:\Program Files\Zend\Optimizer\lib\Optimizer-2.6.0"
    zend_extension_ts="C:\Program Files\Zend\Optimizer\lib\ZendExtensionManager.dll"
    zend_optimizer.optimization_level=15

    在C盘根目录建立一个文件夹, c:/temp  将这个目录授予 everyone 所有权限(实际上只要有写入,修改,读取即可)
    重新启动IIS
    在phpmyadmin中,察看php信息,看看是否如图所示


    如果有加载eaccelerator的信息,说明安装成功。

    至此,对于php的第一步优化完成。

    下面我们要修改php.ini的其它项

    二,对php.ini进行最基本的设置和优化
    对于php.ini的优化和设置,非常多样化,根据不同的程序需要和服务器配置,各人都有不同的方案
    这里我不会说的太过详细,仅提供一些基本的。
    大家可以阅读 php.ini 基本 中文说明   http://club.muzone.cn/viewthread.php?tid=27800

    首先,由于discuz的验证码需要,我们需要打开GD库的支持
    第一节中,我们已经设置好了扩展库的目录,即extension_dir = "c:/php/extensions/"
    下面我们只需要找到

    ;extension=php_gd2.dll

    将前面的冒号去掉,即

    extension=php_gd2.dll

    然后保存php.ini,即可

    然后,我们可以先做一项对于页面处理效果比较明显的设置

     
    output_buffering = Off
      输出缓存允许你甚至在输出正文内容之后发送 header(标头,包括cookies)行 其代价是输出层减慢一点点速度。你可以使用输出缓存在运行时打开输出缓存, 或者在这里将指示设为 On 而使得所有文件的输出缓存打开。
      output_handler = ; 你可以重定向你的脚本的所有输出到一个函数,
      那样做可能对处理或以日志记录它有用。
      例如若你将这个output_handler 设为ob_gzhandler, 则输出会被透明地为支持gzip或deflate编码的浏览器压缩。
      设一个输出处理器自动地打开输出缓冲。

    找到这个

    output_buffering = Off
    修改为
    output_buffering = On

    注意,不要设置数值,只需要设置为On即可。

    相应的,你还可以在你的discuz后台,打开gzip支持,也是优化的一项内容。

    有些朋友为了安全,还启用了php的安全模式,这个也是一办法,但是比较麻烦
    大家可以到网上搜索一项相关的内容,我这里就不说了,毕竟对于效率没什么显著的意义。

    另外有些朋友需要使用全局变量和MAGIC,这是一些php程序的必备条件,discuz2.0也需要
    可以打开,不过安全性能将降低,方法很简单。
    找到

    register_globals = Off ;

    magic_quotes_gpc = Off ;

    将其修改为On即可

    还有,一些朋友经常反映无法上传较大的文件或者后台备份数据经常超时,那么可以找到

    max_execution_time = 30     ; 这个是每个脚本运行的最长时间,可以自己修改加长,单位秒
    max_input_time = 60        ; 这是每个脚本可以消耗的时间,单位也是秒
    memory_limit = 8M      ; 这个是脚本运行最大消耗的内存,也可以自己加大
    upload_max_filesize = 2M ; 上载文件的最大许可大小 ,自己改吧,一些图片论坛需要这个更大的值

    关于效率,还有一个,就是,php.ini的zend配置,在php.ini中,底部
    有一行

    zend_optimizer.optimization_level=15

    如果您的机器配置足够好,可以优化这里

    QUOTE:
    这里最为重点的部分,仔细看!Zend Opt总共有10个优化过程,从理论上说开的越多性能越好。当然,理论和实际永远都存在着差距。优化过程开启的越多对性能消耗也相对也越大,Zend Opt的10个优化过程并不相同也就是说效果不是平均的。Zend公司定义的最高值(High模式)为15,这里15指的是开启1-4号优化过程。当然,很多朋友并不满足于此,毕竟最高也只开启4个优化过程连总数的一半都没有。各个优化过程的对应的数字代码(值)如下:

           不使用      0  <= 如果这样不如不装,还能节约点内存说!
    优化过程1(PASS1) 1
    优化过程2(PASS2) 2
    优化过程3(PASS3) 4
    优化过程4(PASS4) 8
    优化过程5(PASS5) 16
    优化过程6(PASS6) 32
    优化过程7(PASS7) 64
    优化过程8(PASS8) 128
    优化过程9(PASS9) 256
    优化过程10(PASS10) 512

    所以15只是开了前四个,如果您的内存足够多,也可以开更高,如设置为1023,即打开所有加速过程

    12月21日补充,一些朋友反映,php经常报错,显示PHP has encountered an Access Violation at XXXXXX
    很多人说,是php版本的问题,其实不然,可以从四个地方来看这个问题
    1,是否zend所需的dll文件所在目录给的权限不够,必须有读取和运行的权限
    2,是否使用的2003,设置过应用池,比如池中限制了什么什么,调整一下再试试看,是否好了,呵呵
    3,php.ini有两个地方没有设置,而且一些程序必须用到的

    A

    将;upload_tmp_dir该行的注释符,即前面的分号“;”去掉,使该行在php.ini文档中起作用。upload_tmp_dir是用来定义上传文件存放的临时路径,在这里你还可以给其定义一个绝对路径,例如:upload_tmp_dir = d:upload  当然,此时你的d:upload目录必须有读写权限。
    这里我设置为
    upload_tmp_dir = c:\temp  (因为前面建立了这个文件夹,我图省事,呵呵)

    B
    出现这样的错误语句一般是因为你的php.ini中关于session.save_path一项没有设置好,解决的方法是将session.save_path和session.cookie_path 设置置为
       session_save_path = c:\temp
       session.cookie_path = c:\temp
       然后在c:\目录下建立一个temp目录,即可(前面我们的eaccelerarot正好用到,建立过这么一个文件夹)

    最后
    还有一些关于邮件的设置,大家如果装了mail server 还有需要在win下使用邮件发送的,可能需要设置
    大家根据我的中文说明自己调整

    进阶设置及优化

    第三节中,暂时没有想到有什么可以给大家说得,只有大家比较关心的
    mysql优化了

    所以先说说这个,其实这个,很复杂,对于不同的网站,其在线,访问量,帖子数量,网络情况,以及机器配置
    都有关系,优化不是一次可以完成的,需要不断的观察和调试,以取得最佳效果
    下面我引用 Asiwish和老高的两篇优化措施,给大家看看

    这些设置,只要通过修改 win2000的c:/winnt/my.ini 或者 win2003的 c:/windows/my.ini 来实现

    首先,我们打开这个文件,先将最底部的密码项改成其它的,这个对数据库本身没影响,主要是防止一些有心人获取这个密码,对我们不利

    然后大家看看两个例子,其中一些设置,略懂的英文的,即明白是什么意思,
    不懂得可以去 http://cb.kingsoft.com  查单词,我懒得一个个对照写说明了
    一个是 千人在线,1G内存的

    #This File was made using the WinMySQLAdmin 1.4 Tool
    #
    2004-2-23 16:28:14

    #Uncomment or Add only the keys that you know how works.
    #
    Read the MySQL Manual for instructions

    [mysqld]
    basedir
    =D:/mysql
    #bind-address=210.5.*.*
    datadir=D:/mysql/data
    #language=D:/mysql/share/your language directory
    #
    slow query log#=
    #
    tmpdir#=
    #
    port=3306
    set-variable    = max_connections=1500
    skip
    -locking
    #skip-networking
    set-variable        = key_buffer=384M
    set
    -variable        = max_allowed_packet=1M
    set
    -variable        = table_cache=512
    set
    -variable        = sort_buffer=2M
    set
    -variable        = record_buffer=2M
    set
    -variable        = thread_cache=8
    # Try number of CPU's*2 for thread_concurrency
    set-variable        = thread_concurrency=8
    set
    -variable        = myisam_sort_buffer_size=64M
    #set-variable        = connect_timeout=5
    #
    set-variable        = wait_timeout=5
    server-id        = 1
    [isamchk]
    set
    -variable        = key_buffer=128M
    set
    -variable        = sort_buffer=128M
    set
    -variable        = read_buffer=2M
    set
    -variable        = write_buffer=2M

    [myisamchk]
    set
    -variable        = key_buffer=128M
    set
    -variable        = sort_buffer=128M
    set
    -variable        = read_buffer=2M
    set
    -variable        = write_buffer=2M
    [WinMySQLadmin]
    Server
    =D:/mysql/bin/mysqld-nt.exe

    这个方案,整体够用了,但是在pconnect和最大连接数上,需要研究
    max_connections没必要那么大,我个人认为几百就够,否则给服务器加大了不少负担,经常会当机
    连接超时的设置也要根据实际情况调整,大家可以自由调整,然后观察效果如何。



    下面是老高两年前的一些建议,大家参考一下

      7、MYSQL 的优化(/etc/my.cnf)
            1)确认在“[mysqld]”部分加入了“skip-innodb”和“skip-bdb”参数;
            2)确认在“[mysqld]”部分加入了“skip-name-resolve”和“skip-locking”参数;
            3)如果不需要的话,可以将二进制日志(binlog)停掉,方法是将“log-bin”注释掉;
            4)在内存允许的情况下,对一些参数进行重新配置,目标在于将大部分操作集中于内存中,尽量不进行磁盘操作,对于我的 MYSQL 服务器我是如下修改的,基于 2G 内存情况:

            
    [mysqld]
            set
    -variable    = key_buffer=512M
            set
    -variable    = max_allowed_packet=4M
            set
    -variable    = table_cache=1024
            set
    -variable    = thread_cache=64
            set
    -variable    = join_buffer_size=32M
            set
    -variable    = sort_buffer=32M
            set
    -variable    = record_buffer=32M
            set
    -variable    = max_connections=512
            set
    -variable    = wait_timeout=120
            set
    -variable    = interactive_timeout=120
            set
    -variable    = max_connect_errors=30000
            set
    -variable    = long_query_time=1
            set
    -variable    = max_heap_table_size=256M
            set
    -variable    = tmp_table_size=128M
            set
    -variable    = thread_concurrency=8
            set
    -variable    = myisam_sort_buffer_size=128M

            你可以根据“show status”命令返回的状态进行微调。我主要注意以下变量的数值,越小越好,最好为零:)
            Created_tmp_disk_tables
            Created_tmp_tables
            Created_tmp_files
            Slow_queries

    另外 mysql wait_timeout 那个值设置大了没用 做10左右就可了 (大C说得)

    wait_timeout是使用长久连线时 空闲进程的控制 只要数据库在连接状态 他是不进行干预的 不管是否有查询或更新操作 把这个设置小一点 再使用pconnect就比较理想了 ;)

    timeout的時間﹐我的經驗值是5-20﹐看你的SERVER的訪問量了~~ (梦飞说的)

    访问量越大 这个值就应该越小 否则留出的空闲进程太多 会占用不必要的内存
    在一个15分钟在线3000人的论坛上 设置为3比较合适 同时打开pconnect

    另外,我再引用一篇文章

    数据库连接过多的错误,可能的原因分析及解决办法

    分析

    系统不能连接数据库,关键要看两个数据:
    1、数据库系统允许的最大可连接数max_connections。这个参数是可以设置的。如果不设置,默认是100。最大是16384。
    2、数据库当前的连接线程数threads_connected。这是动态变化的。
    查看max_connections、max_connections的办法见后。

    如果 threads_connected == max_connections 时,数据库系统就不能提供更多的连接数了,这时,如果程序还想新建连接线程,数据库系统就会拒绝,如果程序没做太多的错误处理,就会出现类似强坛的报错信息。

    因为创建和销毁数据库的连接,都会消耗系统的资源。而且为了避免在同一时间同时打开过多的连接线程,现在编程一般都使用所谓数据库连接池技术。

    但数据库连接池技术,并不能避免程序错误导致连接资源消耗殆尽。

    这种情况通常发生在程序未能及时释放数据库连接资源或其他原因造成数据库连接资源不能释放,但强坛系统估计不会发生这种低级的编程错误。
    该错误的简便的检查办法是,在刷新强坛页面时,不断监视threads_connected的变化。如果max_connections足够大,而threads_connected值不断增加以至达到max_connections,那么,就应该检查程序了。当然,如果采用数据库连接池技术,threads_connected增长到数据库连接池的最大连接线程数时,就不再增长了。

    从强坛出错的情况看,更大的可能性是数据库系统没能进行适当地配置。下面提出一点建议。供参考

    让你们的工程师把MySQL的最大允许连接数从默认的100调成32000。这就不会老出现连接过多的问题了。


    查看max_connections

    进入MySQL,用命令:show variables
    查看数据库最大可连接数的变量值:max_connections



    查看threads_connected

    进入MySQL,用命令:show status
    查看当前活动的连接线程变量值:threads_connected


    设置max_connections

    设置办法是在my.cnf文件中,添加下面的最后红色的一行:

    --------------------------------------------------------------------------------

    [mysqld]
    port=3306
    #socket=MySQL
    skip-locking
    set-variable = key_buffer=16K
    set-variable = max_allowed_packet=1M
    set-variable = thread_stack=64K
    set-variable = table_cache=4
    set-variable = sort_buffer=64K
    set-variable = net_buffer_length=2K
    set-variable = max_connections=32000


    --------------------------------------------------------------------------------

    修改完毕后,重启MySQL即可。当然,为了确保设置正确,应该查看一下max_connections。

    注意:
    1、虽然这里写的32000。但实际MySQL服务器允许的最大连接数16384;
    2、除max_connections外,上述其他配置应该根据你们系统自身需要进行配置,不必拘泥;
    3、添加了最大允许连接数,对系统消耗增加不大。
    4、如果你的mysql用的是my.ini作配置文件,设置类似,但设置的格式要稍作变通。

    可见,mysql的优化,是多样化,且根据环境不同,必须灵活调整的,大家不可生搬硬套,自己慢慢体会吧
  • 相关阅读:
    利用Javascript制作网页特效(其他常见特效)
    利用Javascript制作网页特效(窗口特效)
    利用Javascript制作网页特效(图像特效)
    利用Javascript制作网页特效(时间特效)
    Javascript的事件
    js部分知识整理,google浏览器的代码调试
    前端之页面布局
    使用 html5 svg 绘制图形
    写了placement new也要写placement delete
    CxAudit 提升安全分析
  • 原文地址:https://www.cnblogs.com/bo8888/p/591827.html
Copyright © 2020-2023  润新知