原文: https://typecodes.com/web/centos7compilephp7.html?utm_source=tuicool&utm_medium=referral
PHP官方:http://php.net/
Github源:https://github.com/php/php-src/releases
1 创建php用户和用户组,并在github下载php7源码
  1. #######新建php用户和php组
  2. [root@typecodes ~]# groupadd -r www && useradd -r -g www -s /bin/false -d /usr/local/php7 -M php
  3.  
  4. #####安装编译php7时需要的依赖包
  5. [root@typecodes ~]# yum -y install libxml2 libxml2-devel curl-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel sqlite-devel oniguruma-devel
  6.  
  7. ###wget下载必备软件
    cd /mnt/wget
    wget https://www.php.net/distributions/php-7.4.5.tar.bz2
    wget https://github.com/phpredis/phpredis/archive/5.2.2.tar.gz -O phpredis-5.2.2.tar.gz
    wget https://github.com/swoole/swoole-src/archive/v4.5.0.tar.gz -O swoole-src-4.5.0.tar.gz
    wget http://pecl.php.net/get/mcrypt-1.0.3.tgz
  8.  
  9. wget https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz
    wget https://github.com/Kitware/CMake/releases/download/v3.16.0/cmake-3.17.2.tar.gz
    wget https://libzip.org/download/libzip-1.5.2.tar.xz
  1. ###编译安装 libiconv1.16 和 CMAKE 3.17.2 和 libzip 1.5.2 ###
  1. cd /mnt/wget && tar zxvf libiconv-1.16.tar.gz && cd libiconv-1.16 && ./configure --prefix=/usr/local/libiconv && make && make install
    ln -s /usr/local/libiconv/lib/libiconv.so.2 /usr/lib64/libiconv.so.2
  2. ===========升级CMakeCMAKE官网:https://cmake.org/download/)===========================
    cd /mnt/wget && tar -zxvf cmake-3.17.2.tar.gz && cd cmake-3.17.2
  3.  
  4. ./bootstrap
    gmake
    gmake install
  5.  
  6. cmake -version
  1. ===========升级curl && libcurlhttps://curl.haxx.se/download.html)===========================
    cd /mnt/wget && tar xf curl-7.70.0.tar.gz && cd curl-7.70.0
  2.  
  3. ./configure --prefix=/usr/local/curl/ --without-nss --with-ssl=/usr/local/openssl && make && make install
  4.  
  5. mv /usr/bin/curl /usr/bin/curl.bak
    mv /usr/bin/curl-config /usr/bin/curl-config.bak
    ln -s /usr/local/curl/bin/curl /usr/bin/curl
    cp /usr/local/curl/bin/curl-config /usr/bin/curl-config
  6.  
  7. source /etc/profile && ldconfig
    curl -V
  8.  
  9. ===========升级libziphttps://libzip.org/download/)===========================
    cd /mnt/wget && tar xvJf libzip-1.5.2.tar.xz && cd libzip-1.5.2
    mkdir build && cd build/
    cmake -DCMAKE_INSTALL_PREFIX=/usr/local/libzip ..
    make && make install
2 PHP7编译参数的配置

准备工作做好后,就开始正式配置php7的安装明细了。注意,操作时一定要先把下面反斜杠“\”后面添加的注释文字去掉!!!

  1. cd /mnt/wget && tar -xjvf php-7.4.5.tar.bz2 && cd php-7.4.5
  2. ######开始配置
  3. # ./configure \
  4. --prefix=/usr/local/php7 --exec-prefix=/usr/local/php7 --bindir=/usr/local/php7/bin --sbindir=/usr/local/php7/sbin \
    --includedir=/usr/local/php7/include --libdir=/usr/local/php7/lib/php --mandir=/usr/local/php7/php/man \
    --with-config-file-path=/usr/local/php7/etc \
    --with-mysql-sock=/var/lib/mysql/mysql.sock --with-mysqli=shared,mysqlnd --with-mhash \
    --with-openssl=/usr/local/openssl --with-curl=/usr/local/curl \
    --with-pdo-mysql=shared,mysqlnd --with-iconv --with-zlib \
    --enable-inline-optimization \
    --disable-debug --disable-rpath --enable-shared \
    --enable-xml --enable-bcmath --enable-shmop --enable-sysvsem --enable-mbregex --enable-mbstring --enable-ftp \
    --enable-pcntl --enable-sockets --with-xmlrpc --enable-soap --without-pear --with-gettext --enable-session \
    --enable-opcache --enable-fpm --without-gdbm --disable-fileinfo --with-fpm-user=www --with-fpm-group=www

执行上面的配置命令的结果:

configure: WARNING: unrecognized options: --with-mysql, --enable-fastcgi

若报错:configure: error: off_t undefined; check your library configuration,需执行以下命令:

echo '/usr/local/lib64
/usr/local/lib
/usr/lib
/usr/lib64
/usr/local/mysql/lib' >> /etc/ld.so.conf && ldconfig -v

3 开始编译和安装PHP7
  1. # make && make install

部分编译出错的环境请使用

make ZEND_EXTRA_LIBS='-L/usr/local/libiconv/lib/ -liconv -L/usr/local/openssl/lib/ -L/usr/local/curl/lib/ -lssl -lcrypto' && make install

编译安装完成PHP7!

5 查看编译成功后的PHP7安装目录

由于需要和MySQL进行通信,所以需要特别查看PHP7安装后的lib扩展库目录(/usr/local/php7/lib/php/extensions/no-debug-non-zts-20190902/),需要确保至少存在mysqli.sopdo_mysql.so这两个动态库文件。

6 开始设置PHP7的配置文件php.ini、php-fpm.conf、www.conf和php-fpm脚本

可以用编译后的配置文件复制到PHP7的配置目录(/usr/local/php7/etc/),推荐使用《PHP7中php.ini、php-fpm和www.conf的配置》文中整理的3个PHP7配置文件和php-fpm服务控制脚本。

find /usr -name *php.ini*

  1. #######直接使用编译后未经优化处理的配置
    cp /mnt/wget/php-7.4.5/php.ini-production /usr/local/php7/etc/php.ini
    cp /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.conf
    cp /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf
    cp /mnt/wget/php-7.4.5/sapi/fpm/php-fpm.service /lib/systemd/system/php-fpm.service
  1. #######安装redis(https://github.com/phpredis/phpredis/releases)#用phpize生成configure配置文件
    cd /mnt/wget && tar zxvf phpredis-5.2.2.tar.gz && cd phpredis-5.2.2
    /usr/local/php7/bin/phpize && ./configure --with-php-config=/usr/local/php7/bin/php-config && make && make install
  1. #######选择安装swoole(https://github.com/swoole/swoole-src/releases)
    cd /mnt/wget && tar zxvf swoole-src-4.5.0.tar.gz && cd swoole-src-4.5.0
    /usr/local/php7/bin/phpize && ./configure --with-php-config=/usr/local/php7/bin/php-config && make && make install
  1. #######安装mcrypt(http://pecl.php.net/package/mcrypt)7.2移除mcrypt导致兼容性问题
    cd /mnt/wget && tar zxvf mcrypt-1.0.3.tgz && cd mcrypt-1.0.3
    /usr/local/php7/bin/phpize && ./configure --with-php-config=/usr/local/php7/bin/php-config && make && make install
  2.  
  3. ==========安装fileinfo扩展=====================
    cd /mnt/wget/php-7.4.5/ext/fileinfo && /usr/local/php7/bin/phpize && ./configure --with-php-config=/usr/local/php7/bin/php-config && make && make install
  1. #######去掉文件中的注释、空行
    vi /usr/local/php7/etc/php-fpm.conf
    vi /usr/local/php7/etc/php-fpm.d/www.conf
    vi /usr/local/php7/etc/php.ini
  2.  
  3. :g/^;/d
    :g/^$/d
1. 配置php-fpm.conf

php-fpm.conf是php-fpm进程服务的配置文件:

  1. ######Pid file的默认前缀是/usr/local/php7/var
    pid = /usr/local/php7/var/run/php-fpm.pid
    error_log = /var/log/php/fpm-error.log
    include=/usr/local/php7/etc/php-fpm.d/*.conf
2. 配置www.conf(在php-fpm.d目录下)

www.conf这是php-fpm进程服务的扩展配置文件:[php-fpm配置详解]

  1. ######设置用户和用户组
    user = www
    group = www
  2.  
  3. ######根据nginx.conf中的配置fastcgi_pass unix:/dev/shm/php-fpm.sock;设置PHP监听
    ; listen = 127.0.0.1:9000   #####不建议使用
    listen = /dev/shm/php-fpm.sock
    listen.owner = www
    listen.group = www
    listen.mode = 0777
    listen.allowed_clients = /dev/shm/php-fpm.sock
  4.  
  5. ######使用静态进程数max_children=内存/512
    pm = static
    pm.max_children = 200
    pm.max_requests = 0
  6.  
  7. pm.status_path = /FpmStatus
  8.  
  9. ######开启慢日志
    slowlog = /var/log/php/fpm-$pool-slow.log
    request_slowlog_timeout = 30s
    request_slowlog_trace_depth = 20
    request_terminate_timeout = 0
3. 配置php.ini

php.ini是php运行核心配置文件:

  1. ######避免PHP信息暴露在http头中
  2. expose_php = Off
  3.  
  4. ######常用配置
    error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
    display_errors = Off
    log_errors = On
    html_errors = Off
    error_log = /var/log/php/cli-error.log
    ignore_repeated_errors = On
    ignore_repeated_source = On
  5.  
  6. memory_limit = 512M
    max_execution_time = 600
    max_input_time = -1
    post_max_size = 128M
    max_input_vars = 1000000
    file_uploads = On
    upload_tmp_dir = /tmp/www
    upload_max_filesize = 100M
    session.gc_maxlifetime = 14400
    default_socket_timeout = 600
  1. ######设置PHP的扩展
  2. extension_dir = "/usr/local/php7/lib/php/extensions/no-debug-non-zts-20190902"
    zend_extension=opcache.so
    extension=mcrypt.so
    extension=mysqli.so
    extension=pdo_mysql.so
    extension=redis.so
    extension=swoole.so
  3.  
  4. ######设置PHP的时区
  5. date.timezone = "Asia/Shanghai"
  6.  
  7. ######开启opcache
  8. [opcache]
  9. opcache.enable=1
    opcache.enable_cli=1
    opcache.huge_code_pages=1
    opcache.file_cache=/tmp
  1. ######设置PHP脚本允许访问的目录(需要根据实际情况配置)
  2. ;open_basedir = /usr/share/nginx/html;
  3.  
  4. session.save_handler = redis
    session.save_path = "tcp://*****.aliyuncs.com:6379?auth=******"
  5.  
  6. [MySQLi]
    mysqli.reconnect = On
4 在配置文件中使用到的路径或文件,配置权限
  1. mkdir -p /var/log/php/
    mkdir -p /var/log/php-fpm/
    mkdir -p /run/php-fpm/
    mkdir -p /var/lib/php/session
  2.  
  3. touch /dev/shm/php-fpm.sock
    chown www:www /dev/shm/php-fpm.sock
    chmod 777 /dev/shm/php-fpm.sock
    chown -R www:www /var/lib/php
  4.  
  5. ######配置PHP连接MySQL的端口监听文件
    mkdir -p /var/lib/mysql/
    touch /var/lib/mysql/mysql.sock
    touch /usr/local/php7/var/run/php-fpm.pid
    chmod 777 /var/lib/mysql/mysql.sock
    ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
5 测试php-fpm配置,设置开机自启动
  1. ######测试配置
    /usr/local/php7/sbin/php-fpm -t
  2.  
  3. ######修改文件权限
    chmod 745 /lib/systemd/system/php-fpm.service
  4.  
  5. ######设置为开机启动
    systemctl enable php-fpm.service
  6.  
  7. ######启动php-fpm
    systemctl start php-fpm.service
  8.  
  9. ######强制php-fpm用root启动
    /usr/local/php7/sbin/php-fpm -R
    fpm因权限问题不能启动,需以root身份强制启动:
    在/etc/rc.d/rc.local尾部增加 /usr/local/php7/sbin/php-fpm -R --fpm-config /usr/local/php7/etc/php-fpm.conf
    为文件增加执行权限:chmod +x /etc/rc.d/rc.local

通过命令 ps -ef | grep php 查看是否成功(图中的php-fpm进程数和进程用户www都是由www.conf中pm.start_servers和user的值分别决定的):

11 查看PHP7版本信息

最后,可以通过命令php -v查看当前PHP版本信息,图中可以看到当前PHP7还使用了Zend OPcache缓存,是因为在php.ini文件中添加了zend_extension=opcache.so配置。

  1. systemctl restart php-fpm
    systemctl restart nginx
  2.  
  3. kill -USR2 `cat /usr/local/php7/var/run/php-fpm.pid`
    /usr/local/nginx/sbin/nginx -s reload
  4.  
  5. ==============================================================
  1. 分配512个预留的大页内存,优化PHP-opcache
    sysctl vm.nr_hugepages=512

vi /etc/profile  底部加入

export PATH=$PATH:/usr/local/php7/bin

特别优化:

1、修改/usr/local/nginx/conf/nginx.conf 文件
worker_processes  设置为cpu个数或cpu的核数
查看CPU核数:cat /proc/cpuinfo | grep "cpu cores" | uniq

worker_connections  设置为进程打开文件句柄数量
ulimit -n进行查看, 默认1024,建议修改为65535 【修改/etc/security/limits.conf,最后增加一行记录 * - nofile 65535】

http中
client_max_body_size 100m;
client_body_buffer_size 2048k;

=====================================================================================================

对于进程的管理存在两种风格——static和dynamic。

如果设置成static,php-fpm进程数自始至终都是pm.max_children指定的数量,不再增加或减少。

如果设置成dynamic,则php-fpm进程数是动态的,最开始是pm.start_servers指定的数量,如果请求较多,则会自动增加,保证空闲的进程数不小于pm.min_spare_servers,如果进程数较多,也会进行相应清理,保证多余的进程数不多于pm.max_spare_servers。

这两种不同的进程管理方式,可以根据服务器的实际需求来进行调整。

这里先说一下涉及到这个的几个参数,他们分别是pmpm.max_childrenpm.start_serverspm.min_spare_serverspm.max_spare_servers

pm表示使用那种方式,有两个值可以选择,就是static(静态)或者dynamic(动态)。

下面4个参数的意思分别为:

pm.max_children:static模式下创建的子进程数或dynamic模式下同一时刻允许最大的php-fpm子进程数量。 
pm.max_requests:php-fpm子进程能处理的最大请求数。 
pm.start_servers:动态方式下的起始php-fpm进程数量。 
pm.min_spare_servers:动态方式下服务器空闲时最小php-fpm进程数量。 
pm.max_spare_servers:动态方式下服务器空闲时最大php-fpm进程数量。

如果dm设置为static,那么其实只有pm.max_children这个参数生效。系统会开启设置数量的php-fpm进程(专用服务器推荐使用)。

如果dm设置为dynamic,那么pm.max_children参数失效,后面3个参数生效。系统会在php-fpm运行开始的时候启动pm.start_servers个php-fpm进程,然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之间调整php-fpm进程数。

那么,对于我们的服务器,选择哪种执行方式比较好呢?事实上,跟Apache一样,运行的PHP程序在执行完成后,或多或少会有内存泄露的问题。这也是为什么开始的时候一个php-fpm进程只占用3M左右内存,运行一段时间后就会上升到20-30M的原因了。

对于内存大的服务器(比如8G以上)来说,指定静态的max_children实际上更为妥当,因为这样不需要进行额外的进程数目控制,会提高效率。因为频繁开关php-fpm进程也会有时滞,所以内存够大的情况下开静态效果会更好。数量也可以根据 内存/30M 得到,比如8GB内存可以设置为100,那么php-fpm耗费的内存就能控制在 2G-3G的样子。如果内存稍微小点,比如1G,那么指定静态的进程数量更加有利于服务器的稳定。这样可以保证php-fpm只获取够用的内存,将不多的内存分配给其他应用去使用,会使系统的运行更加畅通。

那么对于一般的服务器,怎么设置这些值呢,也是有值可参考的。
一般一个php-cgi进程占用20~30m左右的内存,php-fpm稍多一点,就按30m算吧。你的物理mem大小/30m差不多就是可以设置的php-fpm进程数了,当然实际肯定要比这个少点。比如我8G的内存,大概设置100~200之间,也就是pm.max_children=100 是一个比较合适的值。

这里面还有一个问题,php-fpm因为一些第三方库可能会引起内存泄漏,时间长了,占用的内存会比较多,像我们的服务器现在就是50m左右,还好,有pm.max_requests这个参数,这个参数指定了一个php-fpm子进程执行多少次之后重启该进程。这个可能就要根据你的实际情况调整了

php-fpm有一个参数 max_requests,该参数指明了,每个children最多处理多少个请求后便会被关闭,默认的设置是500。因为php是把请求轮询给每个children,在大流量下,每个childre到达max_requests所用的时间都差不多,这样就造成所有的children基本上在同一时间被关闭,这样会导致此时nginx发给php的请求无法得到相应,会出现短时间的502.解决方法:

增加children的数量,并且将 max_requests 设置未 0 或者一个比较大的值

单php-fpm占用内存 = 内存占用总量 / php-fpm进程数

查看内存使用量: free -m

static :表示在 `php-fpm` 运行时直接 `fork` 出 `pm.max_chindren` 个子进程,
dynamic:表示,运行时 `fork` 出 `start_servers` 个进程,随着负载的情况,动态的调整,最多不超过 `max_children` 个进程。

一般推荐用 static。
    优点是不用动态的判断负载情况,提升性能;
    缺点是多占用些系统内存资源。

PHP-FPM 子进程数量,是不是越多越好?
 当然不是,pm.max_chindren,进程多了,增加进程管理的开销以及上下文切换的开销。
 更核心的是,能并发执行的 php-fpm 进程不会超过 cpu 个数。
 如何设置,取决于你的代码
    如果代码是 CPU 计算密集型的,pm.max_chindren 不能超过 CPU 的内核数。
    如果不是,那么将 pm.max_chindren 的值大于 CPU 的内核数,是非常明智的。

国外技术大拿给出这么个公式:
 在 N + 20% 和 M / m 之间。
    N 是 CPU 内核数量。
    M 是 PHP 能利用的内存数量。
    m 是每个 PHP 进程平均使用的内存数量。

适用于 dynamic 方式。
 static方式:M / (m * 1.2)

当然,还有一种保险的方式,来配置 max_children。适用于 static 方式。
    先把 max_childnren 设置成一个比较大的值。
    稳定运行一段时间后,观察 php-fpm 的 status 里的 max active processes 是多少
    然后把 max_children 配置比它大一些就可以了。

pm.max_requests:指的是每个子进程在处理了多少个请求数量之后就重启。
 这个参数,理论上可以随便设置,但是为了预防内存泄漏的风险,还是设置一个合理的数比较好。

=====================================================================================================

php-fpm管理,master进程可以理解以下信号:
INT,TERM 立刻终止
QUIT 平滑终止
USR1 重新打开日志文件
USR2 平滑重载所有worker进程并重新载入配置和二进制模块

示例:
php-fpm 关闭:
kill -INT `cat /usr/local/php/var/run/php-fpm.pid`

php-fpm 重启:
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`

查看php-fpm进程数:
ps -ef | grep -c php-fpm

php-fpm status详解

pool – fpm池子名称,大多数为www
process manager – 进程管理方式,值:static, dynamic or ondemand. dynamic
start time – 启动日期,如果reload了php-fpm,时间会更新
start since – 运行时长
accepted conn – 当前池子接受的请求数
listen queue – 请求等待队列,如果这个值不为0,那么要增加FPM的进程数量
max listen queue – 请求等待队列最高的数量
listen queue len – socket等待队列长度
idle processes – 空闲进程数量
active processes – 活跃进程数量
total processes – 总进程数量
max active processes – 最大的活跃进程数量(FPM启动开始算)
max children reached - 大道进程最大数量限制的次数,如果这个数量不为0,那说明你的最大进程数量太小了,请改大一点。
slow requests – 启用了php-fpm slow-log,缓慢请求的数量

姊妹篇:

编译安装Redis: https://www.cnblogs.com/doseoer/p/9975022.html

CentOS 7.2编译安装PHP7的更多相关文章

  1. CentOS 7.1编译安装PHP7

    原文: https://typecodes.com/web/centos7compilephp7.html?utm_source=tuicool&utm_medium=referral 1 创 ...

  2. CentOS 6.7编译安装PHP7

    1.首先配置好编译环境 yum update && yum upgrade yum groupinstall "Development Tools" yum ins ...

  3. Centos 7下编译安装PHP7.2(与Nginx搭配的安装方式)

    一.下载源码包 百度云网盘下载地址:https://pan.baidu.com/s/1li4oD3qjvFyIaEZQt2NVRg 提取码:4yde 二.安装php依赖组件 yum -y instal ...

  4. 2015博客升级记(五):CentOS 7.1编译安装PHP7

    https://typecodes.com/web/centos7compilephp7.html

  5. nginx php-fpm安装配置 CentOS编译安装php7.2

    CentOS编译安装php7.2 介绍: 久闻php7的速度以及性能那可是比php5系列的任何一版本都要快,具体性能有多好,建议还是先尝试下再说.如果你是升级或新安装,那你首先需要考虑php7和程序是 ...

  6. Centos 7源码编译安装 php7.1 之生产篇

    Centos 7源码编译安装 php7.1 之生产篇 Published 2017年4月30日 by Node Cloud 介绍: 久闻php7的速度以及性能那可是比php5系列的任何一版本都要快,具 ...

  7. CentOS编译安装php7.2

    介绍: 久闻php7的速度以及性能那可是比php5系列的任何一版本都要快,具体性能有多好,建议还是先尝试下再说.如果你是升级或新安装,那你首先需要考虑php7和程序是否存在兼容性,如果程序是基于php ...

  8. centos 7.0 编译安装php 7.0.3

    php下载页面 http://cn2.php.net/downloads.php 7.0.3多地区下载页面 http://cn2.php.net/get/php-7.0.3.tar.gz/from/a ...

  9. Centos 6.8编译安装LNMP环境

    Centos 6.8编译安装LNMP环境 参考资料: http://www.jb51.net/article/107429.htm https://phperzh.com/articles/1360 ...

随机推荐

  1. POJ 3090 Visible Lattice Points 【欧拉函数】

    <题目链接> 题目大意: 给出范围为(0, 0)到(n, n)的整点,你站在(0,0)处,问能够看见几个点. 解题分析:很明显,因为 N (1 ≤ N ≤ 1000) ,所以无论 N 为多 ...

  2. HDU6397

    HDU6397用小于n的m个数组成k,求方案数mod 998244353如果没有n的限制,直接用隔板法求就可以因为m个数中可以为0,所以不妨先都放上一个1,转化成不能为0的m个数来凑k+m,即C(k+ ...

  3. shell 日前 之check 年月日

    twoDayAgoTime=`date -d \`date -d "-2 day" +%Y%m%d\` +%s` sevenDayAgoTime=`date -d \`date - ...

  4. 2017-9-24-Linux移植:ubuntu server 16.04无法联网&无法apt-get update解决

    无法上网!!!不能忍.. 现象:ifconfig 毛都没有,想找一下ip都找不到. ifconfig –a 可以列出所有网卡设备,确认VM VirtualBox网卡开对了,已经给到了虚拟机. 编辑/e ...

  5. Shell脚本笔记(七)控制Shell脚本

    控制Shell脚本 一.处理信号 1) SIGHUP本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联. ...

  6. 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第4章编程练习2

    #include <iostream>#include <string>int main(){ using namespace std; string name; string ...

  7. fast-fail事件的产生及其解决办法

    1.fail-fast事件出现的情景 import java.util.*; import java.util.concurrent.*; /* * * * fail-fast事件产生的条件:当多个线 ...

  8. 学习Struts--Chap03:struts.xml常用配置(基础)

    1.package属性 name:包名 用来唯一的指定一个package.package可以扩展,当一个package扩展自 另一个package时该package会在本身配置的基础上加入扩展的pac ...

  9. visual studio 设计第一个WinForm小程序

    WinForm小程序之消息框 首先打开visual studio 软件,然后[文件]-[新建]-[项目]-[Visual C#]-[Windows],选择Windows窗体应用程序,根据自己的需要修改 ...

  10. windows service卸载

    .使用组合键win+r 调出服务页面 2.查看想要删除的服务的名称:如: 3.执行删除操作