CentOS8搭建Web服务器笔记2 Swoole4+Laravel8+LaravelS3

本文详细记录了在CentOS8系统上搭建基于Swoole4的Laravel8应用,并配置Nginx进行转发的全过程。涵盖了Swoole的安装、配置,Laravel的安装与环境配置,以及Nginx的配置,包括负载均衡和与Swoole的通信。此外,还介绍了如何解决在搭建过程中遇到的问题,如php_json_exception_ce的加载问题。

CentOS8搭建Web服务器笔记2 Swoole4+Laravel8+LaravelS3

1. Swoole PHP 协程框架

Swoole 使 PHP 开发人员可以编写高性能高并发的 TCP、UDP、Unix Socket、HTTP、 WebSocket 等服务,让 PHP 不再局限于 Web 领域。

1.1 查询最新发布版本

https://github.com/swoole/swoole-src/releases
在这里插入图片描述

1.2 下载源码包

https://github.com/swoole/swoole-src/archive/v4.6.3.tar.gz

[root@VM-0-16-centos downloads]# wget -O swoole4.6.3.tar.gz https://github.com/swoole/swoole-src/archive/v4.6.3.tar.gz 
[root@VM-0-16-centos downloads]# ls
php-8.0.2  php-8.0.2.tar.gz  nginx-1.19.7  nginx-1.19.7.tar.gz  swoole4.6.3.tar.gz
  • 解压安装文件到downloads目录
    tar -zxvf /usr/local/downloads/swoole4.6.3.tar.gz -C /usr/local/downloads
[root@VM-0-16-centos downloads]# tar -zxvf /usr/local/downloads/swoole4.6.3.tar.gz -C /usr/local/downloads

1.3 安装依赖

yum install libcurl-devel glibc-headers gcc-c++ pcre-devel
yum install automake autoconf bison

1.4 编译安装

  • 用phpize生成configure
[root@VM-0-16-centos downloads]# cd /usr/local/downloads/swoole-src-4.6.3
[root@VM-0-16-centos swoole-src-4.6.3]# ls
clear.sh        CODE-STYLE.md  examples          include        mascot.png    src           tools
CMakeLists.txt  config.m4      ext-src           LICENSE        package.xml   SUPPORTED.md  travis
code_format.sh  CPPLINT.cfg    gdbinit           Makefile.frag  README-CN.md  tests
code_stats.sh   CREDITS        google-style.xml  make.sh        README.md     thirdparty

存在configure文件就跳过,没有就用phpize生成configure

  • 未安装php-devel运行phpize时报错
[root@VM-0-16-centos swoole-src-4.6.3] phpize
Can't find PHP headers in /usr/include/php
The php-devel package is required for use of this command.
  • 查询php版本并安装相应的php-devel
    yum -y install php-devel
[root@VM-0-16-centos swoole-src-4.6.3]# php -v
PHP 7.4.19 (cli) (built: May  4 2021 11:06:37) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.19, Copyright (c), by Zend Technologies
[root@VM-0-16-centos swoole-src-4.6.3]# yum -y install php-devel
Last metadata expiration check: 11:46:59 ago on Sun 20 Feb 2022 03:24:28 AM CST.
Dependencies resolved.
====================================================================================================
 Package               Arch        Version                                     Repository      Size
====================================================================================================
Installing:
 php-devel             x86_64      7.4.19-1.module_el8.5.0+815+1c4fd2e5        appstream      728 k
Installing dependencies:
 cmake-filesystem      x86_64      3.20.2-4.el8                                appstream       44 k
 libtool               x86_64      2.4.6-25.el8                                appstream      709 k
 libxml2-devel         x86_64      2.9.7-9.el8_4.2                             appstream      1.0 M
 xz-devel              x86_64      5.2.4-3.el8                                 baseos          62 k

Transaction Summary
====================================================================================================
Install  5 Packages

Total download size: 2.5 M
Installed size: 17 M
Downloading Packages:
(1/5): cmake-filesystem-3.20.2-4.el8.x86_64.rpm                     1.2 MB/s |  44 kB     00:00    
(2/5): libtool-2.4.6-25.el8.x86_64.rpm                              5.1 MB/s | 709 kB     00:00    
(3/5): libxml2-devel-2.9.7-9.el8_4.2.x86_64.rpm                     7.0 MB/s | 1.0 MB     00:00    
(4/5): php-devel-7.4.19-1.module_el8.5.0+815+1c4fd2e5.x86_64.rpm    6.2 MB/s | 728 kB     00:00    
(5/5): xz-devel-5.2.4-3.el8.x86_64.rpm                              3.6 MB/s |  62 kB     00:00    
----------------------------------------------------------------------------------------------------
Total                                                                16 MB/s | 2.5 MB     00:00     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                            1/1 
  Installing       : xz-devel-5.2.4-3.el8.x86_64                                                1/5 
  Installing       : libtool-2.4.6-25.el8.x86_64                                                2/5 
  Running scriptlet: libtool-2.4.6-25.el8.x86_64                                                2/5 
  Installing       : cmake-filesystem-3.20.2-4.el8.x86_64                                       3/5 
  Installing       : libxml2-devel-2.9.7-9.el8_4.2.x86_64                                       4/5 
  Installing       : php-devel-7.4.19-1.module_el8.5.0+815+1c4fd2e5.x86_64                      5/5 
  Running scriptlet: php-devel-7.4.19-1.module_el8.5.0+815+1c4fd2e5.x86_64                      5/5 
  Verifying        : cmake-filesystem-3.20.2-4.el8.x86_64                                       1/5 
  Verifying        : libtool-2.4.6-25.el8.x86_64                                                2/5 
  Verifying        : libxml2-devel-2.9.7-9.el8_4.2.x86_64                                       3/5 
  Verifying        : php-devel-7.4.19-1.module_el8.5.0+815+1c4fd2e5.x86_64                      4/5 
  Verifying        : xz-devel-5.2.4-3.el8.x86_64                                                5/5 

Installed:
  cmake-filesystem-3.20.2-4.el8.x86_64     libtool-2.4.6-25.el8.x86_64                              
  libxml2-devel-2.9.7-9.el8_4.2.x86_64     php-devel-7.4.19-1.module_el8.5.0+815+1c4fd2e5.x86_64    
  xz-devel-5.2.4-3.el8.x86_64             

Complete!

成功安装与php7.4.19匹配的php-devel 7.4.19

  • 运行phpize命令生成configure文件
    phpize
[root@VM-0-16-centos swoole-src-4.6.3]# phpize
Configuring for:
PHP Api Version:         20200930
Zend Module Api No:      20200930
Zend Extension Api No:   420200930
[root@VM-0-16-centos swoole-src-4.6.3]# ls
autom4te.cache  code_stats.sh  configure.ac  gdbinit           make.sh       run-tests.php  tools
build           CODE-STYLE.md  CPPLINT.cfg   google-style.xml  mascot.png    src            travis
clear.sh        config.h.in    CREDITS       include           package.xml   SUPPORTED.md
CMakeLists.txt  config.m4      examples      LICENSE           README-CN.md  tests
code_format.sh  configure      ext-src       Makefile.frag     README.md     thirdparty

成功生成configure文件

  • 配置参数

[root@VM-0-16-centos swoole-src-4.6.3]# ./configure  \
 --enable-openssl  \
--enable-swoole-json  \
--enable-swoole-curl

参数详情参考官方说明
https://wiki.swoole.com/#/environment?id=%e7%bc%96%e8%af%91%e9%80%89%e9%a1%b9

  • 编译安装
    make && make install
----------------------------------------------------------------------
Libraries have been installed in:
   /usr/local/downloads/swoole-src-4.6.3/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,--rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------

Build complete.
Don't forget to run 'make test'.

Installing shared extensions:     /usr/local/php8/lib/php/extensions/no-debug-non-zts-20200930/
Installing header files:          /usr/local/php8/include/php/

查看安装的扩展文件

[root@VM-0-16-centos swoole-src-4.6.3]# cd /usr/local/php8/lib/php/extensions/no-debug-non-zts-20200930/
[root@VM-0-16-centos no-debug-non-zts-20200930]# ls
mysqli.so  opcache.so  pdo_mysql.so  swoole.so

1.5 配置php启用swoole扩展

1.5.1 查看 php.ini 位置

php -i | grep php.ini

[root@VM-0-16-centos ~]# php -i | grep php.ini
Configuration File (php.ini) Path => /usr/local/php8/etc
Loaded Configuration File => /usr/local/php8/etc/php.ini

1.5.1 配置php扩展

vi /usr/local/php8/etc/php.ini

Dynamic Extensions 配置项中加入extension=swoole.so

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;

; If you wish to have an extension loaded automatically, use the following
; syntax:
;
;   extension=modulename
;
; For example:
;
;   extension=mysqli
;
; When the extension library to load is not located in the default extension
; directory, You may specify an absolute path to the library file:
;
;   extension=/path/to/extension/mysqli.so
;
; Note : The syntax used in previous PHP versions ('extension=<ext>.so' and
; 'extension='php_<ext>.dll') is supported for legacy reasons and may be
; deprecated in a future PHP major version. So, when it is possible, please
; move to the new ('extension=<ext>) syntax.
;
; Notes for Windows environments :
;
; - Many DLL files are located in the extensions/ (PHP 4) or ext/ (PHP 5+)
;   extension folders as well as the separate PECL DLL download (PHP 5+).
;   Be sure to appropriately set the extension_dir directive.
extension=swoole.so

1.5.3 查看php加载swoole扩展情况

  • 重启fpm
    systemctl restart php-fpm
  • 命令行查看swoole加载情况
    php -m | grep swoole
[root@VM-0-16-centos ~]# php -m | grep swoole
swoole

php已经成功加载swoole扩展

  • phpinfo页面查看swoole加载情况
    在这里插入图片描述

1.5.4 加载报错处理

1.5.4.1 undefined symbol: php_json_exception_ce
[root@VM-0-16-centos ~]# php -m | grep swoole
PHP Warning:  PHP Startup: Unable to load dynamic library 'swoole.so' (tried: /usr/lib64/php/modules/swoole.so (/usr/lib64/php/modules/swoole.so: undefined symbol: php_json_exception_ce), /usr/lib64/php/modules/swoole.so.so (/usr/lib64/php/modules/swoole.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0

报错是由swoole.so模块发出,说明swoole已经加载中,需要先加载php_json

  • 查看/etc/php.d目录的ini文件
[root@VM-0-16-centos ~]# ls /etc/php.d
10-opcache.ini   20-exif.ini      20-json.ini       20-sockets.ini    30-mysqli.ini
20-bz2.ini       20-fileinfo.ini  20-mbstring.ini   20-sqlite3.ini    30-pdo_mysql.ini
20-calendar.ini  20-ftp.ini       20-mysqlnd.ini    20-tokenizer.ini  30-pdo_sqlite.ini
20-ctype.ini     20-gd.ini        20-pdo.ini        20-xml.ini        30-xmlreader.ini
20-curl.ini      20-gettext.ini   20-phar.ini       20-xmlwriter.ini  opcache-default.blacklist
20-dom.ini       20-iconv.ini     20-simplexml.ini  20-xsl.ini
[root@VM-0-16-centos ~]# cat 20-json.ini
; Enable json extension module
extension=json

PHP默认加载的扩展配置不是在 /etc/php.ini 中,而是在 /etc/php.d/ 这个目录,当中的 .ini 文件是在 /etc/php.ini 加载完成后再加载的,所以extension=swoole.so 写在 /etc/php.ini 的Dynamic Extensions中,就是先加载了 swoole.so 再加载 json,导致了 swoole 找不到 php_json_exception_ce情况发生 。

  • 去掉/etc/php.ini的extension=swoole.so
    vim /etc/php.ini

#extension=swoole.so

  • 在/etc/php.d/目录创建40-swoole.ini
    vim 40-swoole.ini
extension=swoole

这里文件swoole.ini加入40-前缀,是为了让它最后加载,让数字小的先加载。

[root@VM-0-16-centos ~]# cd   /etc/php.d/
[root@VM-0-16-centos ~]# ll
10-opcache.ini   20-exif.ini      20-json.ini       20-sockets.ini    30-mysqli.ini
20-bz2.ini       20-fileinfo.ini  20-mbstring.ini   20-sqlite3.ini    30-pdo_mysql.ini
20-calendar.ini  20-ftp.ini       20-mysqlnd.ini    20-tokenizer.ini  30-pdo_sqlite.ini
20-ctype.ini     20-gd.ini        20-pdo.ini        20-xml.ini        30-xmlreader.ini
20-curl.ini      20-gettext.ini   20-phar.ini       20-xmlwriter.ini  opcache-default.blacklist
20-dom.ini       20-iconv.ini     20-simplexml.ini  20-xsl.ini        
[root@VM-0-16-centos ~]# vim 40-swoole.ini
extension=swoole

:wq保存退出

[root@VM-0-16-centos ~]# ll
10-opcache.ini   20-exif.ini      20-json.ini       20-sockets.ini    30-mysqli.ini
20-bz2.ini       20-fileinfo.ini  20-mbstring.ini   20-sqlite3.ini    30-pdo_mysql.ini
20-calendar.ini  20-ftp.ini       20-mysqlnd.ini    20-tokenizer.ini  30-pdo_sqlite.ini
20-ctype.ini     20-gd.ini        20-pdo.ini        20-xml.ini        30-xmlreader.ini
20-curl.ini      20-gettext.ini   20-phar.ini       20-xmlwriter.ini  40-swoole.ini
20-dom.ini       20-iconv.ini     20-simplexml.ini  20-xsl.ini        opcache-default.blacklist
  • 重启fpm,查看swoole加载情况
    systemctl restart php-fpm
  • 命令行查看swoole加载情况
    php -m | grep swoole
[root@VM-0-16-centos ~]# systemctl restart php-fpm
[root@VM-0-16-centos ~]# php -m | grep swoole
swoole

1.6 配置Nginx转发Swoole

1.6.1 Nginx与Swoole通信模式

[root@VM-0-16-centos ~]# find /etc/nginx/conf.d -name *.conf
/etc/nginx/conf.d/default.conf
/etc/nginx/conf.d/php-fpm.conf
  • default.conf
    默认站点配置文件
  • php-fpm.conf
    php-fpm的负载分发upstream模块配置文件
[root@VM-0-16-centos ~]# vi /etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}
    location ~ \.php$ {
        root           /usr/share/nginx/html;
        fastcgi_pass   unix:/dev/shm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

nginx遇到需要php处理的请求都会转发给php-fpm处理

  • IP通信+网关代理
    fastcgi_pass 127.0.0.1:9000;
  • unix sock通信+网关代理
    fastcgi_pass unix:/run/php-fpm/www.sock
    推荐把sock放在内存提高访问效率
    fastcgi_pass unix:/dev/shm/www.sock
  • upstream负载均衡+反向代理
    upstream_name :自定义upstream名称
    proxy_pass http://upstream_name;

1.6.2 Nginx负载均衡模块 upstream

upstream模块,使nginx跨越单机的运算限制,分发给不同主机处理php业务,实现网络数据的接收、处理和转发。

1.6.2.1 FPM upstream模块配置

FPM是php系统自带的处理模块,我们看下它的upstream默认配置。
cat /etc/nginx/conf.d/php-fpm.conf

# PHP-FPM FastCGI server
# network or unix domain socket configuration
# sock
upstream php-fpm {
        server unix:/run/php-fpm/www.sock;
}
# TCPIP
upstream php-fpm-tcp {
        server  127.0.0.1:9000 weight=3 max_conns=2000;
		server  127.0.0.2:9000 weight=2 max_conns=2000 down;
		#server  127.0.0.3:9000 backup max_conns=1000;
}
1.6.2.2 swoole upstream模块配置

新建conf配置swoole的upstream,让nginx把php请求发送给swoole处理。
vim /etc/nginx/conf.d/swoole_http.conf

# 这是swoole的负载分发配置
upstream swoole_http{
	#ip_hash;
	server  127.0.0.1:9501 weight=3 max_conns=2000;
	server  127.0.0.2:9501 weight=2 max_conns=2000 down;
	#server  127.0.0.3:9501 backup max_conns=1000;
}
1.6.2.3 upstream 模块参数解析
  • 负载均衡分配方式
  • 轮询 默认
    每个请求按顺序分配到不同后端服务器
  • ip_hash
    哈希表分配负载,根据散列算法分配不同用户固定访问一个后端服务器,相同的客户端ip请求相同的服务器,解决session一致问题
    有条件架构独立Redis服务器,缓存所有后端服务器的session,也能解决session一致问题
  • weight
    权重数值越大,负载分配几率越大
    不设权重,默认把请求轮循负载到各个服务器

轮询,ip_hash,权重三种分配方式不能同时生效,三选一

  • 参数解析
  • max_conns
    最大连接数
    限制服务器允许的最大连接数量,超过的连接不会分配,轮询分配到其他服务器。默认为0为不限制。
  • backup
    后备服务器
    只有其他所有swoole服务器都负载饱和或当机才被启用加与负载
  • down
    当机标记
    有服务器当机,nginx自动标记服务器,排除down服务器的负载分配
  • max_fails 单位时间内重试连接次数
  • fail_timeout 允许重试连接的单位时间和请求失败等待轮询的单位时间
    在单位周期fail_timeout内,重试连接达到max_fails次数,nginx把此服务器节点标记为宕机不可用(down),将连接转到其他服务器节点;
    有新的连接符合下一个周期(单位时间为fail_timeout)再一次去请求,判断是否连接是否成功,恢复此节点。

1.6.3 Nginx 转发 PHP请求

1.6.3.1 FMP 的php请求转发
    # php-fpm 管理模式处理php请求配置
	location ~ \.php$ {
        #网关代理转发请求到unix sock
        #fastcgi_pass   unix:/dev/shm/php-fpm.sock;
        #网关代理转发请求到TCPIP
        fastcgi_pass   127.0.0.1:9000;
        #网关代理转发请求到upstream
        #fastcgi_pass	php-fpm
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

正则匹配所有对.php文件的请求,由fastcgi管理程序转发给fpm-php进程处理

正则表达式匹配

  • = 精确匹配;
  • ^~ 提高前缀字符串的匹配优先级;
  • ~ 区分大小写的正则表达式匹配;
  • ~* 不区分大小写的正则表达式匹配;
  • / 通用匹配(因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求),如果没有其它匹配,任何请求都会匹配到。

匹配优先级
( = ) >( ^~ ) > ( ~) > ( ~* ) > ( / ) > ( 长字符串 ) > ( 短字符串 )

1.6.3.2 Swoole 的php请求转发配置
  • 只转发php请求给Swoole
    # swoole 框架处理php请求配置
    location ~ \.php$ {
        proxy_http_version 1.1;
        proxy_set_header Connection "keep-alive";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        # 反向代理转发请求到upstream节点
        proxy_pass http://swoole_http; 
        # 反向代理转发请求到TCPIP
		#proxy_pass http://127.0.0.1:9501;
    }
  • 转发所有请求给Swoole

配置1

	# swoole 框架处理所有请求配置
	location / {
    	proxy_http_version 1.1;
        proxy_set_header Connection "keep-alive";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        if (!-e $request_filename) {
        	# 反向代理转发请求到upstream节点
        	proxy_pass http://swoole_http;
        	# 反向代理转发请求到TCPIP
			#proxy_pass http://127.0.0.1:9501;
        }
    }

配置2

	location / {
        # $uri文件存在,Nginx处理,否则交给Swoole处理
        try_files $uri @swoole;
    }
    location @swoole {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;
        proxy_set_header Connection "keep-alive";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
    }

1.6.3 测试Swoole http服务

[root@VM-0-16-centos ~]# mkdir /opt/swoole
[root@VM-0-16-centos ~]# cd /opt/swoole
[root@VM-0-16-centos swoole]# vi http_test.php
  • 创建swoole http服务器测试脚本
<?php
$http = new Swoole\Http\Server('0.0.0.0', 9501);
$http->on('Request', function ($request, $response) {
    $response->header('Content-Type', 'text/html; charset=utf-8');
    $response->end('<h1>这是由Swoole处理的php服务:<br>' . rand(1000, 9999) . '</h1>');
});
$http->start();
?>
  • 启动http服务器测试脚本
[root@VM-0-16-centos swoole]# php http_test.php
  • 浏览器访问
    在这里插入图片描述

1.6.4 Swoole http简单php请求处理功能

[root@VM-0-16-centos swoole]# vi http_server.php
  • 创建php请求处理服务器脚本
<?php
// 创建监听
$http = new swoole_http_server('0.0.0.0', 9501);
// 收到HTTP 请求,回调此函数
$http->on('request', function($request, $response) {
	// 时区设置
	date_default_timezone_set('PRC');
	// 命令行输出请求时间和IP
    echo "\n".date('Y-m-d H:i:s',time())." Receive from ".$request->server['remote_addr'];
    // 请求路径
    $pathInfo = $request->server['path_info'];
    // 运行当前http服务器脚本目录下的php
    //$file = __DIR__ . $pathInfo;
    //指定站点根目录
    $file = "/usr/share/nginx/html" . $pathInfo;
    echo "  page :".$pathInfo;
    //判断是否文件
    if(is_file($file)) {
        //判断文件后缀名
        if(pathinfo($pathInfo)['extension'] == 'php') {
        	// 处理php文件
            ob_start();
            	include $file;
            	$content = ob_get_contents();
            ob_end_clean();
            //输出到浏览器
            $response->end($content);
        } else {
            //处理其他文件
        }
    } else {
        $response->status(404);
        $response->end('php not found');
    }
});
echo 'start http server at '.date('Y-m-d H:i:s',time());
$http->start();
?>
  • 启动http服务器脚本
[root@VM-0-16-centos swoole]# php http_server.php
start http server at 2021-02-22 18:51:27
2021-02-23 02:51:33 Receive from 127.0.0.1  page :/info.php
  • 浏览器访问info.php返回的phpinfo()数据
    在这里插入图片描述

2. Laravel PHP Web开发框架

Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。

2.1 安装laravel

2.1.1 安装 / 更新 Composer依赖管理器

Composer 是 PHP 的一个依赖管理工具。它允许你申明项目所依赖的代码库,基于每个项目的基础上进行管理,在你项目目录中(例如 vendor)进行安装。默认情况下它不会在全局安装任何东西。

  • 全局安装 Composer

下载并移动到CentOS程序目录,重命名去扩展名方便调用

[root@VM-0-16-centos downloads]# curl -sS https://getcomposer.org/installer | php
All settings correct for using Composer
Downloading...

Composer (version 2.0.9) successfully installed to: /usr/local/downloads/composer.phar
Use it: php composer.phar

[root@VM-0-16-centos downloads]# ls -sl
composer.phar  php-8.0.2  php-8.0.2.tar.gz  swoole4.6.3.tar.gz  swoole-src-4.6.3
[root@VM-0-16-centos downloads]# mv composer.phar /usr/local/bin/composer
  • Composer 版本更新

更新到最新版本
composer self-update
-更新到稳定版本
composer self-update --stable
-回滚上一版本
composer self-update --rollback

2.1.2 安装Laravel框架安装器

2.1.2.1 全局安装laravel安装器

composer global require "laravel/installer"

[root@VM-0-16-centos downloads]# composer global require "laravel/installer"
Changed current directory to /root/.config/composer
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Continue as root/super user [yes]? y
Using version ^4.1 for laravel/installer
./composer.json has been created
Running composer update laravel/installer
Loading composer repositories with package information
Updating dependencies
Lock file operations: 12 installs, 0 updates, 0 removals
  - Locking laravel/installer (v4.1.1)
  - Locking psr/container (1.0.0)
  - Locking symfony/console (v5.2.3)
  - Locking symfony/polyfill-ctype (v1.22.1)
  - Locking symfony/polyfill-intl-grapheme (v1.22.1)
  - Locking symfony/polyfill-intl-normalizer (v1.22.1)
  - Locking symfony/polyfill-mbstring (v1.22.1)
  - Locking symfony/polyfill-php73 (v1.22.1)
  - Locking symfony/polyfill-php80 (v1.22.1)
  - Locking symfony/process (v5.2.3)
  - Locking symfony/service-contracts (v2.2.0)
  - Locking symfony/string (v5.2.3)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 12 installs, 0 updates, 0 removals
  - Downloading symfony/polyfill-php80 (v1.22.1)
  - Downloading symfony/process (v5.2.3)
  - Downloading symfony/polyfill-mbstring (v1.22.1)
  - Downloading symfony/polyfill-intl-normalizer (v1.22.1)
  - Downloading symfony/polyfill-intl-grapheme (v1.22.1)
  - Downloading symfony/polyfill-ctype (v1.22.1)
  - Downloading symfony/string (v5.2.3)
  - Downloading psr/container (1.0.0)
  - Downloading symfony/service-contracts (v2.2.0)
  - Downloading symfony/polyfill-php73 (v1.22.1)
  - Downloading symfony/console (v5.2.3)
  - Downloading laravel/installer (v4.1.1)
  - Installing symfony/polyfill-php80 (v1.22.1): Extracting archive
  - Installing symfony/process (v5.2.3): Extracting archive
  - Installing symfony/polyfill-mbstring (v1.22.1): Extracting archive
  - Installing symfony/polyfill-intl-normalizer (v1.22.1): Extracting archive
  - Installing symfony/polyfill-intl-grapheme (v1.22.1): Extracting archive
  - Installing symfony/polyfill-ctype (v1.22.1): Extracting archive
  - Installing symfony/string (v5.2.3): Extracting archive
  - Installing psr/container (1.0.0): Extracting archive
  - Installing symfony/service-contracts (v2.2.0): Extracting archive
  - Installing symfony/polyfill-php73 (v1.22.1): Extracting archive
  - Installing symfony/console (v5.2.3): Extracting archive
  - Installing laravel/installer (v4.1.1): Extracting archive
6 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
10 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
2.1.2.2 配置运行环境变量

vim /etc/profile.d/laravel.sh

export PATH="$PATH:~/.config/composer/vendor/bin"

立即生效配置
source /etc/profile

2.2 安装Node.js环境(Laravel扩展包所需)

Node.js 是一个开源和跨平台的 JavaScript 运行时环境。 它几乎是任何类型项目的流行工具!Laravel8 的扩展需要Node.js环境支持。

  • Node Package Manager管理器

npm 以其简单的结构帮助 Node.js 生态系统蓬勃发展,现在 npm 仓库托管了超过 1,000,000 个开源包,你可以自由使用。

  • 官方下载地址
    http://nodejs.cn/download/
  • 查询Node与Npm对应版本号
    https://nodejs.org/zh-cn/download/releases/
  • 查看Node.js版本
    dnf module list nodejs
[root@VM-0-16-centos downloads]# dnf module list nodejs
Repository epel is listed more than once in the configuration
Last metadata expiration check: 2:03:39 ago on Wed 09 Mar 2022 10:42:56 PM CST.
CentOS Linux 8 - AppStream
Name              Stream            Profiles                                        Summary                     
nodejs            10 [d]            common [d], development, minimal, s2i           Javascript runtime          
nodejs            12                common [d], development, minimal, s2i           Javascript runtime          
nodejs            14                common [d], development, minimal, s2i           Javascript runtime          
nodejs            16                common [d], development, minimal, s2i           Javascript runtime          

Extra Packages for Enterprise Linux Modular 8 - x86_64
Name              Stream            Profiles                                        Summary                     
nodejs            13                default, development, minimal                   Javascript runtime          
nodejs            16-epel           default, development, minimal                   Javascript runtime          

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled
  • 安装Nodejs
    dnf module install nodejs:<stream>

< stream > 版本号

[root@VM-0-16-centos downloads]# dnf module install nodejs:16
Repository epel is listed more than once in the configuration
Last metadata expiration check: 2:22:08 ago on Wed 09 Mar 2022 10:42:56 PM CST.
Dependencies resolved.
================================================================================================================
 Package               Arch        Version                                                 Repository      Size
================================================================================================================
Installing group/module packages:
 nodejs                x86_64      1:16.13.1-3.module_el8.5.0+1059+1852da12                appstream       12 M
 npm                   x86_64      1:8.1.2-1.16.13.1.3.module_el8.5.0+1059+1852da12        appstream      1.9 M
Installing weak dependencies:
 nodejs-docs           noarch      1:16.13.1-3.module_el8.5.0+1059+1852da12                appstream      8.7 M
 nodejs-full-i18n      x86_64      1:16.13.1-3.module_el8.5.0+1059+1852da12                appstream      7.6 M
Installing module profiles:
 nodejs/common                                                                                                 
Enabling module streams:
 nodejs                            16                                                                          

Transaction Summary
================================================================================================================
Install  4 Packages

Total download size: 30 M
Installed size: 144 M
Is this ok [y/N]: y
Downloading Packages:
(1/4): nodejs-full-i18n-16.13.1-3.module_el8.5.0+1059+1852da12.x86_64.rpm        20 MB/s | 7.6 MB     00:00    
(2/4): npm-8.1.2-1.16.13.1.3.module_el8.5.0+1059+1852da12.x86_64.rpm             16 MB/s | 1.9 MB     00:00    
(3/4): nodejs-16.13.1-3.module_el8.5.0+1059+1852da12.x86_64.rpm                  22 MB/s |  12 MB     00:00    
(4/4): nodejs-docs-16.13.1-3.module_el8.5.0+1059+1852da12.noarch.rpm             14 MB/s | 8.7 MB     00:00    
----------------------------------------------------------------------------------------------------------------
Total                                                                            50 MB/s |  30 MB     00:00     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Running scriptlet: npm-1:8.1.2-1.16.13.1.3.module_el8.5.0+1059+1852da12.x86_64                            1/1 
  Preparing        :                                                                                        1/1 
  Installing       : nodejs-docs-1:16.13.1-3.module_el8.5.0+1059+1852da12.noarch                            1/4 
  Installing       : nodejs-full-i18n-1:16.13.1-3.module_el8.5.0+1059+1852da12.x86_64                       2/4 
  Installing       : npm-1:8.1.2-1.16.13.1.3.module_el8.5.0+1059+1852da12.x86_64                            3/4 
  Installing       : nodejs-1:16.13.1-3.module_el8.5.0+1059+1852da12.x86_64                                 4/4 
  Running scriptlet: nodejs-1:16.13.1-3.module_el8.5.0+1059+1852da12.x86_64                                 4/4 
  Verifying        : nodejs-1:16.13.1-3.module_el8.5.0+1059+1852da12.x86_64                                 1/4 
  Verifying        : nodejs-docs-1:16.13.1-3.module_el8.5.0+1059+1852da12.noarch                            2/4 
  Verifying        : nodejs-full-i18n-1:16.13.1-3.module_el8.5.0+1059+1852da12.x86_64                       3/4 
  Verifying        : npm-1:8.1.2-1.16.13.1.3.module_el8.5.0+1059+1852da12.x86_64                            4/4 

Installed:
  nodejs-1:16.13.1-3.module_el8.5.0+1059+1852da12.x86_64                                                        
  nodejs-docs-1:16.13.1-3.module_el8.5.0+1059+1852da12.noarch                                                   
  nodejs-full-i18n-1:16.13.1-3.module_el8.5.0+1059+1852da12.x86_64                                              
  npm-1:8.1.2-1.16.13.1.3.module_el8.5.0+1059+1852da12.x86_64                                                   

Complete!
[root@VM-0-16-centos downloads]# npm
npm <command>

Usage:

npm install        install all the dependencies in your project
npm install <foo>  add the <foo> dependency to your project
npm test           run this project's tests
npm run <foo>      run the script named <foo>
npm <command> -h   quick help on <command>
npm -l             display usage info for all commands
npm help <term>    search for help on <term>
npm help npm       more involved overview

All commands:

    access, adduser, audit, bin, bugs, cache, ci, completion,
    config, dedupe, deprecate, diff, dist-tag, docs, doctor,
    edit, exec, explain, explore, find-dupes, fund, get, help,
    hook, init, install, install-ci-test, install-test, link,
    ll, login, logout, ls, org, outdated, owner, pack, ping,
    pkg, prefix, profile, prune, publish, rebuild, repo,
    restart, root, run-script, search, set, set-script,
    shrinkwrap, star, stars, start, stop, team, test, token,
    uninstall, unpublish, unstar, update, version, view, whoami

Specify configs in the ini-formatted file:
    /root/.npmrc
or on the command line via: npm <command> --key=value

More configuration info: npm help config
Configuration fields: npm help 7 config

npm@8.1.2 /usr/lib/node_modules/npm

2.3 创建Laravel项目

Laravel 版本发行时间和维护更新周期
https://laravelversions.com/en

2.3.1 设置项目父目录

设置/home为项目父目录

[root@VM-0-16-centos downloads]# cd /home

2.3.2 使用Laravel安装器创建项目

在当前目录下创建myapp项目
laravel new myapp

[root@VM-0-16-centos home]# laravel new myapp

2.3.3 使用Composer管理器创建项目

2.3.3.1 当前目录下创建myweb项目
  • 当前目录下创建myweb项目
    composer create-project laravel/laravel myweb
  • 指定目录下创建myweb项目
    composer create-project laravel/laravel --prefer-dist /home/web/myweb

composer create-project laravel/laravel[=版本号] --prefer-dist [路径]

  • 版本号
    创建指定版本的laravel项目
  • 路径
    未指定路径时,在当前命令行所在目录下,创建名为laravel项目目录
    指定路径时,路径目录应是空目录,不能有其他文件存在,laravel项目文件会生成到路径目录里

指定安装包来源

  • 国外来源
    composer config -g repo.packagist composer https://packagist.org
  • 国内镜像
    composer config -g repo.packagist composer https://packagist.phpcomposer.com
[root@VM-0-16-centos downloads]# cd /home
[root@VM-0-16-centos home]# composer create-project laravel/laravel myweb --prefer-dist
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Continue as root/super user [yes]? y
Creating a "laravel/laravel" project at "./myweb"
Installing laravel/laravel (v8.5.10)
  - Downloading laravel/laravel (v8.5.10)
  - Installing laravel/laravel (v8.5.10): Extracting archive
Created project in /home/myweb
> @php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies
Lock file operations: 105 installs, 0 updates, 0 removals
  - Locking asm89/stack-cors (v2.0.2)
  - Locking brick/math (0.9.2)
  - Locking dnoegel/php-xdg-base-dir (v0.1.1)
  - Locking doctrine/inflector (2.0.3)
  - Locking doctrine/instantiator (1.4.0)
  - Locking doctrine/lexer (1.2.1)
  - Locking dragonmantank/cron-expression (v3.1.0)
  - Locking egulias/email-validator (2.1.25)
  - Locking facade/flare-client-php (1.4.0)
  - Locking facade/ignition (2.5.13)
  - Locking facade/ignition-contracts (1.0.2)
  - Locking fakerphp/faker (v1.13.0)
  - Locking fideloper/proxy (4.4.1)
  - Locking filp/whoops (2.9.2)
  - Locking fruitcake/laravel-cors (v2.0.3)
  - Locking graham-campbell/result-type (v1.0.1)
  - Locking guzzlehttp/guzzle (7.2.0)
  - Locking guzzlehttp/promises (1.4.0)
  - Locking guzzlehttp/psr7 (1.7.0)
  - Locking hamcrest/hamcrest-php (v2.0.1)
  - Locking laravel/framework (v8.29.0)
  - Locking laravel/sail (v1.3.1)
  - Locking laravel/tinker (v2.6.0)
  - Locking league/commonmark (1.5.7)
  - Locking league/flysystem (1.1.3)
  - Locking league/mime-type-detection (1.7.0)
  - Locking mockery/mockery (1.4.2)
  - Locking monolog/monolog (2.2.0)
  - Locking myclabs/deep-copy (1.10.2)
  - Locking nesbot/carbon (2.45.1)
  - Locking nikic/php-parser (v4.10.4)
  - Locking nunomaduro/collision (v5.3.0)
  - Locking opis/closure (3.6.1)
  - Locking phar-io/manifest (2.0.1)
  - Locking phar-io/version (3.1.0)
  - Locking phpdocumentor/reflection-common (2.2.0)
  - Locking phpdocumentor/reflection-docblock (5.2.2)
  - Locking phpdocumentor/type-resolver (1.4.0)
  - Locking phpoption/phpoption (1.7.5)
  - Locking phpspec/prophecy (1.12.2)
  - Locking phpunit/php-code-coverage (9.2.5)
  - Locking phpunit/php-file-iterator (3.0.5)
  - Locking phpunit/php-invoker (3.1.1)
  - Locking phpunit/php-text-template (2.0.4)
  - Locking phpunit/php-timer (5.0.3)
  - Locking phpunit/phpunit (9.5.2)
  - Locking psr/container (1.0.0)
  - Locking psr/event-dispatcher (1.0.0)
  - Locking psr/http-client (1.0.1)
  - Locking psr/http-message (1.0.1)
  - Locking psr/log (1.1.3)
  - Locking psr/simple-cache (1.0.1)
  - Locking psy/psysh (v0.10.6)
  - Locking ralouphie/getallheaders (3.0.3)
  - Locking ramsey/collection (1.1.3)
  - Locking ramsey/uuid (4.1.1)
  - Locking sebastian/cli-parser (1.0.1)
  - Locking sebastian/code-unit (1.0.8)
  - Locking sebastian/code-unit-reverse-lookup (2.0.3)
  - Locking sebastian/comparator (4.0.6)
  - Locking sebastian/complexity (2.0.2)
  - Locking sebastian/diff (4.0.4)
  - Locking sebastian/environment (5.1.3)
  - Locking sebastian/exporter (4.0.3)
  - Locking sebastian/global-state (5.0.2)
  - Locking sebastian/lines-of-code (1.0.3)
  - Locking sebastian/object-enumerator (4.0.4)
  - Locking sebastian/object-reflector (2.0.4)
  - Locking sebastian/recursion-context (4.0.4)
  - Locking sebastian/resource-operations (3.0.3)
  - Locking sebastian/type (2.3.1)
  - Locking sebastian/version (3.0.2)
  - Locking swiftmailer/swiftmailer (v6.2.5)
  - Locking symfony/console (v5.2.3)
  - Locking symfony/css-selector (v5.2.3)
  - Locking symfony/deprecation-contracts (v2.2.0)
  - Locking symfony/error-handler (v5.2.3)
  - Locking symfony/event-dispatcher (v5.2.3)
  - Locking symfony/event-dispatcher-contracts (v2.2.0)
  - Locking symfony/finder (v5.2.3)
  - Locking symfony/http-client-contracts (v2.3.1)
  - Locking symfony/http-foundation (v5.2.3)
  - Locking symfony/http-kernel (v5.2.3)
  - Locking symfony/mime (v5.2.3)
  - Locking symfony/polyfill-ctype (v1.22.1)
  - Locking symfony/polyfill-iconv (v1.22.1)
  - Locking symfony/polyfill-intl-grapheme (v1.22.1)
  - Locking symfony/polyfill-intl-idn (v1.22.1)
  - Locking symfony/polyfill-intl-normalizer (v1.22.1)
  - Locking symfony/polyfill-mbstring (v1.22.1)
  - Locking symfony/polyfill-php72 (v1.22.1)
  - Locking symfony/polyfill-php73 (v1.22.1)
  - Locking symfony/polyfill-php80 (v1.22.1)
  - Locking symfony/process (v5.2.3)
  - Locking symfony/routing (v5.2.3)
  - Locking symfony/service-contracts (v2.2.0)
  - Locking symfony/string (v5.2.3)
  - Locking symfony/translation (v5.2.3)
  - Locking symfony/translation-contracts (v2.3.0)
  - Locking symfony/var-dumper (v5.2.3)
  - Locking theseer/tokenizer (1.2.0)
  - Locking tijsverkoyen/css-to-inline-styles (2.2.3)
  - Locking vlucas/phpdotenv (v5.3.0)
  - Locking voku/portable-ascii (1.5.6)
  - Locking webmozart/assert (1.9.1)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 105 installs, 0 updates, 0 removals
  - Downloading doctrine/inflector (2.0.3)
  - Downloading doctrine/lexer (1.2.1)
  - Downloading symfony/polyfill-ctype (v1.22.1)
  - Downloading webmozart/assert (1.9.1)
  - Downloading dragonmantank/cron-expression (v3.1.0)
  - Downloading symfony/polyfill-php80 (v1.22.1)
  - Downloading symfony/polyfill-mbstring (v1.22.1)
  - Downloading symfony/var-dumper (v5.2.3)
  - Downloading symfony/polyfill-intl-normalizer (v1.22.1)
  - Downloading symfony/polyfill-intl-grapheme (v1.22.1)
  - Downloading symfony/string (v5.2.3)
  - Downloading psr/container (1.0.0)
  - Downloading symfony/service-contracts (v2.2.0)
  - Downloading symfony/polyfill-php73 (v1.22.1)
  - Downloading symfony/console (v5.2.3)
  - Downloading psr/log (1.1.3)
  - Downloading monolog/monolog (2.2.0)
  - Downloading voku/portable-ascii (1.5.6)
  - Downloading phpoption/phpoption (1.7.5)
  - Downloading graham-campbell/result-type (v1.0.1)
  - Downloading vlucas/phpdotenv (v5.3.0)
  - Downloading symfony/css-selector (v5.2.3)
  - Downloading tijsverkoyen/css-to-inline-styles (2.2.3)
  - Downloading symfony/deprecation-contracts (v2.2.0)
  - Downloading symfony/routing (v5.2.3)
  - Downloading symfony/process (v5.2.3)
  - Downloading symfony/polyfill-php72 (v1.22.1)
  - Downloading symfony/polyfill-intl-idn (v1.22.1)
  - Downloading symfony/mime (v5.2.3)
  - Downloading symfony/http-foundation (v5.2.3)
  - Downloading symfony/http-client-contracts (v2.3.1)
  - Downloading psr/event-dispatcher (1.0.0)
  - Downloading symfony/event-dispatcher-contracts (v2.2.0)
  - Downloading symfony/event-dispatcher (v5.2.3)
  - Downloading symfony/error-handler (v5.2.3)
  - Downloading symfony/http-kernel (v5.2.3)
  - Downloading symfony/finder (v5.2.3)
  - Downloading symfony/polyfill-iconv (v1.22.1)
  - Downloading egulias/email-validator (2.1.25)
  - Downloading swiftmailer/swiftmailer (v6.2.5)
  - Downloading ramsey/collection (1.1.3)
  - Downloading brick/math (0.9.2)
  - Downloading ramsey/uuid (4.1.1)
  - Downloading psr/simple-cache (1.0.1)
  - Downloading opis/closure (3.6.1)
  - Downloading symfony/translation-contracts (v2.3.0)
  - Downloading symfony/translation (v5.2.3)
  - Downloading nesbot/carbon (2.45.1)
  - Downloading league/mime-type-detection (1.7.0)
  - Downloading league/flysystem (1.1.3)
  - Downloading league/commonmark (1.5.7)
  - Downloading laravel/framework (v8.29.0)
  - Downloading filp/whoops (2.9.2)
  - Downloading facade/ignition-contracts (1.0.2)
  - Downloading facade/flare-client-php (1.4.0)
  - Downloading facade/ignition (2.5.13)
  - Downloading fakerphp/faker (v1.13.0)
  - Downloading fideloper/proxy (4.4.1)
  - Downloading asm89/stack-cors (v2.0.2)
  - Downloading fruitcake/laravel-cors (v2.0.3)
  - Downloading psr/http-message (1.0.1)
  - Downloading psr/http-client (1.0.1)
  - Downloading ralouphie/getallheaders (3.0.3)
  - Downloading guzzlehttp/psr7 (1.7.0)
  - Downloading guzzlehttp/promises (1.4.0)
  - Downloading guzzlehttp/guzzle (7.2.0)
  - Downloading laravel/sail (v1.3.1)
  - Downloading nikic/php-parser (v4.10.4)
  - Downloading dnoegel/php-xdg-base-dir (v0.1.1)
  - Downloading psy/psysh (v0.10.6)
  - Downloading laravel/tinker (v2.6.0)
  - Downloading hamcrest/hamcrest-php (v2.0.1)
  - Downloading mockery/mockery (1.4.2)
  - Downloading nunomaduro/collision (v5.3.0)
  - Downloading phpdocumentor/reflection-common (2.2.0)
  - Downloading phpdocumentor/type-resolver (1.4.0)
  - Downloading phpdocumentor/reflection-docblock (5.2.2)
  - Downloading sebastian/version (3.0.2)
  - Downloading sebastian/type (2.3.1)
  - Downloading sebastian/resource-operations (3.0.3)
  - Downloading sebastian/recursion-context (4.0.4)
  - Downloading sebastian/object-reflector (2.0.4)
  - Downloading sebastian/object-enumerator (4.0.4)
  - Downloading sebastian/global-state (5.0.2)
  - Downloading sebastian/exporter (4.0.3)
  - Downloading sebastian/environment (5.1.3)
  - Downloading sebastian/diff (4.0.4)
  - Downloading sebastian/comparator (4.0.6)
  - Downloading sebastian/code-unit (1.0.8)
  - Downloading sebastian/cli-parser (1.0.1)
  - Downloading phpunit/php-timer (5.0.3)
  - Downloading phpunit/php-text-template (2.0.4)
  - Downloading phpunit/php-invoker (3.1.1)
  - Downloading phpunit/php-file-iterator (3.0.5)
  - Downloading theseer/tokenizer (1.2.0)
  - Downloading sebastian/lines-of-code (1.0.3)
  - Downloading sebastian/complexity (2.0.2)
  - Downloading sebastian/code-unit-reverse-lookup (2.0.3)
  - Downloading phpunit/php-code-coverage (9.2.5)
  - Downloading doctrine/instantiator (1.4.0)
  - Downloading phpspec/prophecy (1.12.2)
  - Downloading phar-io/version (3.1.0)
  - Downloading phar-io/manifest (2.0.1)
  - Downloading myclabs/deep-copy (1.10.2)
  - Downloading phpunit/phpunit (9.5.2)
  - Installing doctrine/inflector (2.0.3): Extracting archive
  - Installing doctrine/lexer (1.2.1): Extracting archive
  - Installing symfony/polyfill-ctype (v1.22.1): Extracting archive
  - Installing webmozart/assert (1.9.1): Extracting archive
  - Installing dragonmantank/cron-expression (v3.1.0): Extracting archive
  - Installing symfony/polyfill-php80 (v1.22.1): Extracting archive
  - Installing symfony/polyfill-mbstring (v1.22.1): Extracting archive
  - Installing symfony/var-dumper (v5.2.3): Extracting archive
  - Installing symfony/polyfill-intl-normalizer (v1.22.1): Extracting archive
  - Installing symfony/polyfill-intl-grapheme (v1.22.1): Extracting archive
  - Installing symfony/string (v5.2.3): Extracting archive
  - Installing psr/container (1.0.0): Extracting archive
  - Installing symfony/service-contracts (v2.2.0): Extracting archive
  - Installing symfony/polyfill-php73 (v1.22.1): Extracting archive
  - Installing symfony/console (v5.2.3): Extracting archive
  - Installing psr/log (1.1.3): Extracting archive
  - Installing monolog/monolog (2.2.0): Extracting archive
  - Installing voku/portable-ascii (1.5.6): Extracting archive
  - Installing phpoption/phpoption (1.7.5): Extracting archive
  - Installing graham-campbell/result-type (v1.0.1): Extracting archive
  - Installing vlucas/phpdotenv (v5.3.0): Extracting archive
  - Installing symfony/css-selector (v5.2.3): Extracting archive
  - Installing tijsverkoyen/css-to-inline-styles (2.2.3): Extracting archive
  - Installing symfony/deprecation-contracts (v2.2.0): Extracting archive
  - Installing symfony/routing (v5.2.3): Extracting archive
  - Installing symfony/process (v5.2.3): Extracting archive
  - Installing symfony/polyfill-php72 (v1.22.1): Extracting archive
  - Installing symfony/polyfill-intl-idn (v1.22.1): Extracting archive
  - Installing symfony/mime (v5.2.3): Extracting archive
  - Installing symfony/http-foundation (v5.2.3): Extracting archive
  - Installing symfony/http-client-contracts (v2.3.1): Extracting archive
  - Installing psr/event-dispatcher (1.0.0): Extracting archive
  - Installing symfony/event-dispatcher-contracts (v2.2.0): Extracting archive
  - Installing symfony/event-dispatcher (v5.2.3): Extracting archive
  - Installing symfony/error-handler (v5.2.3): Extracting archive
  - Installing symfony/http-kernel (v5.2.3): Extracting archive
  - Installing symfony/finder (v5.2.3): Extracting archive
  - Installing symfony/polyfill-iconv (v1.22.1): Extracting archive
  - Installing egulias/email-validator (2.1.25): Extracting archive
  - Installing swiftmailer/swiftmailer (v6.2.5): Extracting archive
  - Installing ramsey/collection (1.1.3): Extracting archive
  - Installing brick/math (0.9.2): Extracting archive
  - Installing ramsey/uuid (4.1.1): Extracting archive
  - Installing psr/simple-cache (1.0.1): Extracting archive
  - Installing opis/closure (3.6.1): Extracting archive
  - Installing symfony/translation-contracts (v2.3.0): Extracting archive
  - Installing symfony/translation (v5.2.3): Extracting archive
  - Installing nesbot/carbon (2.45.1): Extracting archive
  - Installing league/mime-type-detection (1.7.0): Extracting archive
  - Installing league/flysystem (1.1.3): Extracting archive
  - Installing league/commonmark (1.5.7): Extracting archive
  - Installing laravel/framework (v8.29.0): Extracting archive
  - Installing filp/whoops (2.9.2): Extracting archive
  - Installing facade/ignition-contracts (1.0.2): Extracting archive
  - Installing facade/flare-client-php (1.4.0): Extracting archive
  - Installing facade/ignition (2.5.13): Extracting archive
  - Installing fakerphp/faker (v1.13.0): Extracting archive
  - Installing fideloper/proxy (4.4.1): Extracting archive
  - Installing asm89/stack-cors (v2.0.2): Extracting archive
  - Installing fruitcake/laravel-cors (v2.0.3): Extracting archive
  - Installing psr/http-message (1.0.1): Extracting archive
  - Installing psr/http-client (1.0.1): Extracting archive
  - Installing ralouphie/getallheaders (3.0.3): Extracting archive
  - Installing guzzlehttp/psr7 (1.7.0): Extracting archive
  - Installing guzzlehttp/promises (1.4.0): Extracting archive
  - Installing guzzlehttp/guzzle (7.2.0): Extracting archive
  - Installing laravel/sail (v1.3.1): Extracting archive
  - Installing nikic/php-parser (v4.10.4): Extracting archive
  - Installing dnoegel/php-xdg-base-dir (v0.1.1): Extracting archive
  - Installing psy/psysh (v0.10.6): Extracting archive
  - Installing laravel/tinker (v2.6.0): Extracting archive
  - Installing hamcrest/hamcrest-php (v2.0.1): Extracting archive
  - Installing mockery/mockery (1.4.2): Extracting archive
  - Installing nunomaduro/collision (v5.3.0): Extracting archive
  - Installing phpdocumentor/reflection-common (2.2.0): Extracting archive
  - Installing phpdocumentor/type-resolver (1.4.0): Extracting archive
  - Installing phpdocumentor/reflection-docblock (5.2.2): Extracting archive
  - Installing sebastian/version (3.0.2): Extracting archive
  - Installing sebastian/type (2.3.1): Extracting archive
  - Installing sebastian/resource-operations (3.0.3): Extracting archive
  - Installing sebastian/recursion-context (4.0.4): Extracting archive
  - Installing sebastian/object-reflector (2.0.4): Extracting archive
  - Installing sebastian/object-enumerator (4.0.4): Extracting archive
  - Installing sebastian/global-state (5.0.2): Extracting archive
  - Installing sebastian/exporter (4.0.3): Extracting archive
  - Installing sebastian/environment (5.1.3): Extracting archive
  - Installing sebastian/diff (4.0.4): Extracting archive
  - Installing sebastian/comparator (4.0.6): Extracting archive
  - Installing sebastian/code-unit (1.0.8): Extracting archive
  - Installing sebastian/cli-parser (1.0.1): Extracting archive
  - Installing phpunit/php-timer (5.0.3): Extracting archive
  - Installing phpunit/php-text-template (2.0.4): Extracting archive
  - Installing phpunit/php-invoker (3.1.1): Extracting archive
  - Installing phpunit/php-file-iterator (3.0.5): Extracting archive
  - Installing theseer/tokenizer (1.2.0): Extracting archive
  - Installing sebastian/lines-of-code (1.0.3): Extracting archive
  - Installing sebastian/complexity (2.0.2): Extracting archive
  - Installing sebastian/code-unit-reverse-lookup (2.0.3): Extracting archive
  - Installing phpunit/php-code-coverage (9.2.5): Extracting archive
  - Installing doctrine/instantiator (1.4.0): Extracting archive
  - Installing phpspec/prophecy (1.12.2): Extracting archive
  - Installing phar-io/version (3.1.0): Extracting archive
  - Installing phar-io/manifest (2.0.1): Extracting archive
  - Installing myclabs/deep-copy (1.10.2): Extracting archive
  - Installing phpunit/phpunit (9.5.2): Extracting archive
74 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: fruitcake/laravel-cors
Discovered Package: laravel/sail
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
74 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
> @php artisan key:generate --ansi
Application key set successfully.
[root@VM-0-16-centos home]# ls
myweb

myweb项目创建完成!

2.3.3.2 启动本地开发服务器模式

php artisan serve

[root@VM-0-16-centos home]# cd /home/myweb
[root@VM-0-16-centos myweb]# php artisan serve
Starting Laravel development server: http://127.0.0.1:8000
[Wed Mar  9 18:18:24 2022] PHP 8.0.16 Development Server (http://127.0.0.1:8000) started

Laravel 开发服务器模式运行在本地环境,适用于本地开发测试,只需要PHP环境支持,无需nginx、apache服务器支持
适用于windows系统开发,浏览器输入http://127.0.0.1:8000,打开Laravel项目首页
控制台实时输出页面连接及加载资源信息
在这里插入图片描述

2.3.3.3 设置storage目录权限

此步骤是必要条件!storage目录没有写权限会报错

chmod -R 777 /home/myweb/storage

2.3.4 解决问题

2.3.4.1 问题 require ext-fileinfo *
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - laravel/framework[v8.12.0, ..., 8.x-dev] require league/flysystem ^1.1 -> satisfiable by league/flysystem[1.1.0, ..., 1.x-dev].
    - league/flysystem[1.1.0, ..., 1.x-dev] require ext-fileinfo * -> it is missing from your system. Install or enable PHP's fileinfo extension.
    - Root composer.json requires laravel/framework ^8.12 -> satisfiable by laravel/framework[v8.12.0, ..., 8.x-dev].

To enable extensions, verify that they are enabled in your .ini files:
    - /usr/local/php8/etc/php.ini
You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.
  • 编译安装fileinfo扩展
[root@VM-0-16-centos home]# find / -name fileinfo
/usr/local/downloads/php-8.0.2/ext/fileinfo
[root@VM-0-16-centos home]# cd /usr/local/downloads/php-8.0.2/ext/fileinfo
[root@VM-0-16-centos fileinfo]# ls
config.m4             CREDITS             fileinfo.c         libmagic         Makefile.frag
config.w32            data_file.c         fileinfo.stub.php  libmagic.patch   php_fileinfo.h
create_data_file.php  fileinfo_arginfo.h  generate_patch.sh  magicdata.patch  tests
[root@VM-0-16-centos fileinfo]# phpize && ./configure --with-php-config=/usr/local/php8/bin/php-config
[root@VM-0-16-centos fileinfo]# make && make install
  • 编辑php.ini启用fileinfo扩展
    vim /usr/local/php8/etc/php.ini
extension=fileinfo
2.3.4.2 问题 to retrieve a token. Token (hidden):
  • GitHub注册获取Token
  • https://github.com/settings/tokens
  • 登录或注册GitHub帐号
  • Personal Access Tokens页面点击Generate new token
  • Note 里面填写自定义令牌名称
  • 点击Generate token生成token
  • 复制token码
  • 设置composer全局token
    composer config --global github-oauth.github.com <token>
[root@VM-0-16-centos home]# composer config --global github-oauth.github.com abcdefghijk1234567

在这里插入图片描述

2.3.4.3 问题 Install of fakerphp/faker failed
Failed to clone https://github.com/FakerPHP/Faker.git, git was not found, check that it is ins  
  talled and in your PATH env. 
  • 延长处理超时时间
[root@VM-0-16-centos home]# composer config -g process-timeout 600
  • 配置国内镜像下载源
[root@VM-0-16-centos home]# composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
  • 重新创建项目
[root@VM-0-16-centos home]# rm -rf myweb
[root@VM-0-16-centos home]# composer create-project laravel/laravel myweb --prefer-dist

2.4 配置nginx启用laravel框架

2.4.1 核心配置

	# laravel部署必要URL规则,解决除了根目录都报404 
	location / {
		try_files $uri $uri/ /index.php?$query_string;
	}

2.4.2 配置详细注释

vim /etc/nginx/conf.d/laravel.conf

server
{
	# 监听端口
	listen       80; 
	# 服务器域名
	server_name localhost; 
	# 指定首页文件
	index index.html index.htm index.php; 
	# 指定字符集
	charset utf-8; 
	
	# laravel部署项目入口目录public
	root /home/myweb/public; 
	# laravel部署必要URL规则,解决除了根目录都报404 
	location / {
		try_files $uri $uri/ /index.php?$query_string;
	}
	# laravel部署重写url规则
	if (!-e $request_filename)
	{
		rewrite ^/(.*)$ /index.php?/$1 last;
		break;
	}
	# 去除url末尾的斜杠,便于SEO
	if (!-d $request_filename)
	{
		rewrite ^/(.+)/$ /$1 permanent;
	}
	# 去除index action
	if ($request_uri ~* index/?$)
	{
		rewrite ^/(.*)/index/?$ /$1 permanent;
	}
	# 网关代理处理php请求
	location ~ \.php$ {
		fastcgi_pass	unix:/dev/shm/php-fpm.sock; 
		fastcgi_index  	index.php;
		fastcgi_param  	SCRIPT_FILENAME  $document_root$fastcgi_script_name;
		include			fastcgi_params;
	}
	# 禁用favicon.ico和robots.txt报错日志
	location = /favicon.ico { access_log off; log_not_found off; }
	location = /robots.txt { access_log off; log_not_found off; }
	# 错误转静态页
	error_page   500 502 503 504  /50x.html;
	location = /50x.html {
		root   /usr/share/nginx/html;
	}
	# 图片缓存有效期
	location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp3|wma)$
	{
		expires      7d;
	}
	# JS和CSS缓存有效期
	location ~ .*\.(js|css)$
	{
		expires      1h;
	}
	# 字体缓存有效期
	location ~ .*\.(eot|ttf|otf|woff|svg)$ {
	    expires 30d;
	    access_log off;
	}
}
  • 浏览器成功访问
    在这里插入图片描述

2.5 Laravel访问数据库配置

2.5.1 数据库访问配置

2.5.1.1 Mysql连接配置

Laravel提供了自定义连接配置,可以给不同的多个用户,分别连接访问不同的数据库,也可以让多用户拥有不同权限访问同一数据库。

  • mysql 数据库连接配置
    Laravel项目根目录/config/database.php
[root@VM-0-16-centos home]# cd /home/website/bi
[root@VM-0-16-centos bi]# ls
app      bootstrap      config        phpunit.xml  resources   storage  webpack.mix.js
artisan  composer.json  database      public       routes      tests
bin      composer.lock  package.json  README.md    server.php  vendor
[root@VM-0-16-centos bi]# cd config
[root@VM-0-16-centos config]# ls
app.php           cache.php     filesystems.php  logging.php  sanctum.php   view.php
auth.php          cors.php      hashing.php      mail.php     services.php
broadcasting.php  database.php  laravels.php     queue.php    session.php
[root@VM-0-16-centos config]# vim /home/website/bi/config/database.php
        'mysql' => [//数据库连接配置名称
            'driver' => 'mysql',//数据库类型
            'url' => env('DATABASE_URL'),//URL地址
            'host' => env('DB_HOST', '127.0.0.1'),//主机地址
            'port' => env('DB_PORT', '3306'),//连接端口
            'database' => env('DB_DATABASE', ''),//数据库名
            'username' => env('DB_USERNAME', ''),//用户名
            'password' => env('DB_PASSWORD', ''),//密码
            'unix_socket' => env('DB_SOCKET', ''),//socket链接
            'charset' => 'utf8mb4',//字符集
            'collation' => 'utf8mb4_unicode_ci',//排序规则
            'prefix' => env('DB_PREFIX', 'prefix_'),//数据表前缀
            'prefix_indexes' => true,//前缀索引
            'strict' => true,//严格模式
            'engine' => null,//引擎
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],
  • ‘mysql’ => [ 数据库连接配置名称
    连接配置名称可以自定义
  • env(‘DB_HOST’, ‘127.0.0.1’) 环境变量取值
    env(‘变量名’,‘预设值’)
    从.env文件中取回相应变量DB_HOST的值,如果.env没有定义由预设值127.0.0.1代替,其他以此类推。
  • strict 严格模式
    MySQL在处理数据更改命令时,严格检测语句中的无效值或缺失值。
    如insert或update操作时,错误的列类型,或超出范围的数据值。
  • mysql 数据库环境配置
    Laravel项目根目录/.env文件,是个隐藏文件。
[root@VM-0-16-centos home]# cd /home/website/bi
[root@VM-32-7-centos bi]# ls -a
.        bootstrap      .editorconfig   package.json  routes        vendor
..       composer.json  .env            phpunit.xml   server.php    webpack.mix.js
app      composer.lock  .env.example    public        storage
artisan  config         .gitattributes  README.md     .styleci.yml
bin      database       .gitignore      resources     tests
[root@VM-0-16-centos config]# vim /home/website/bi/.env
APP_NAME=Laravel
APP_ENV=local

...省略

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=bi
DB_USERNAME=root
DB_PASSWORD=123456
DB_PREFIX=mydb_

...省略

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=123456
REDIS_PORT=6379

DB_ 前缀的是关系数据库环境参数
REDIS_ 前缀的是Redis数据库环境参数
DB_CONNECTION=mysql,指定默认的数据库连接,使用mysql连接配置连接数据库

2.5.1.2 Mysql多库连接配置
  • mysql 多库连接配置
        'mysql' => [
	        ...省略
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', ''),
            'username' => env('DB_USERNAME', ''),
            'password' => env('DB_PASSWORD', ''),
            ...省略
            'prefix' => env('DB_PREFIX', 'prefix_'),
            ...省略
        ],
        'mysql_client2' => [
            ...省略
            'host' => env('DB_HOST_C2', '127.0.0.1'),
            'port' => env('DB_PORT_C2', '3306'),
            'database' => env('DB_DATABASE_C2', ''),
            'username' => env('DB_USERNAME_C2', ''),
            'password' => env('DB_PASSWORD_C2', ''),
            ...省略
            'prefix' => env('DB_PREFIX_C2', 'client2_'),
            ...省略
        ],
        'mysql_client3' => [
            ...省略
            'host' => env('DB_HOST_C3', '127.0.0.1'),
            'port' => env('DB_PORT_C3', '3306'),
            'database' => env('DB_DATABASE_C3', ''),
            'username' => env('DB_USERNAME_C3', ''),
            'password' => env('DB_PASSWORD_C3', ''),
            ...省略
            'prefix' => env('DB_PREFIX_C3', 'client3_'),
            ...省略
        ],
  • mysql 多库环境配置
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=bi
DB_USERNAME=root
DB_PASSWORD=123456
DB_PREFIX=mydb_

DB_HOST_C2=127.0.0.1
DB_PORT_C2=3306
DB_DATABASE_C2=web
DB_USERNAME_C2=client2
DB_PASSWORD_C2=123456
DB_PREFIX_C2=c2db_

DB_HOST_C3=127.0.0.1
DB_PORT_C3=3306
DB_DATABASE_C3=h5app
DB_USERNAME_C3=client2
DB_PASSWORD_C3=123456
DB_PREFIX_C3=c3db_

上面三组环境变量如果host分别指向不同的地址,结果对应访问三台不同的mysql数据服务器的mydb_bi,c2db_web,c3db_h5app三个数据库;
如果host指向同一地址,结果是访问同一mysql数据服务器的mydb_bi,c2db_web,c3db_h5app三个数据库;

2.5.1.3 Redis多库连接配置
  • redis 数据库连接配置
    'redis' => [
        'client' => env('REDIS_CLIENT', 'phpredis'),
        'options' => [
            'cluster' => env('REDIS_CLUSTER', 'redis'),
            'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
        ],
        'default' => [//Redis连接配置名称
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', '6379'),
            'database' => env('REDIS_DB', 0),
        ],
        'cache' => [//Redis连接配置名称
            'url' => env('REDIS_URL_CACHE'),
            'host' => env('REDIS_HOST_CACHE', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD_CACHE', null),
            'port' => env('REDIS_PORT_CACHE', '6379'),
            'database' => env('REDIS_DB_CACHE', 1),
        ],
        'h5app' => [//Redis连接配置名称
            'url' => env('REDIS_URL_H5'),
            'host' => env('REDIS_HOST_H5', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD_H5', null),
            'port' => env('REDIS_PORT_H5', 6379),
            'database' => env('REDIS_DB_H5', 10),
        ],
    ],
  • 分别设置了三组连接配置
    default 站点访问的公共数据
    cache 用户个人信息临时缓存
    h5 独立站点使用的redis数据缓存
  • 连接配置名称和环境变量的名称,都可以根据功能需求自定义的,只要连接配置和环境变量能对应上就行,如h5app配置里的host变量就自定义REDIS_HOST_H5
  • ‘database’ => env(‘REDIS_DB’, 0)
    默认redis服务器会创建16个数据库,数据库是由一个整数索引标识0-15,而不是由一个数据库名称。默认情况下,一个客户端连接到数据库0,env(‘REDIS_DB’, 0)中的预设值就不要加引号了。
  • redis 多库环境配置
REDIS_HOST=localhost
REDIS_DB=0
REDIS_PASSWORD=123456
REDIS_PORT=6379
REDIS_PREFIX=prj_

REDIS_HOST_CACHE=localhost
REDIS_DB_CACHE=1
REDIS_PASSWORD_CACHE=123456
REDIS_PORT_CACHE=6379

REDIS_HOST_H5=localhost
REDIS_DB_CACHE=2
REDIS_PASSWORD_H5=123456
REDIS_PORT_H5=6379

上面三组环境变量如果host分别指向不同的地址,结果对应访问三台不同的redis数据服务器的0,1,2三个数据库;
如果host指向同一地址,结果是访问同一redis数据服务器的0,1,2三个数据库;

2.5.2 Mysql多数据库读写分离

2.5.2.1 读写分离连接配置
  • mysql 读写分离连接配置
        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', ''),
            'username' => env('DB_USERNAME', ''),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => env('DB_PREFIX', ''),
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],

            //读写分离配置
            'write' => [
                'host' => env('DB_HOST_WRITE1', '193.168.1.1'),
                'password' => env('DB_PASSWORD_WRITE', ''),
            ],
            'read' => [
                //一主一从
                'host' => env('DB_HOST_READ1', '193.168.1.2'),
                'password' => env('DB_PASSWORD_READ', ''),
                //一主多从
                /*[
                    'host' => env('DB_HOST_READ1', '193.168.1.2'),
                    'password' => env('DB_PASSWORD_READ', '')
                ],
                [
                    'host' => env('DB_HOST_READ2', '193.168.1.3'),
                    'password' => env('DB_PASSWORD_READ', '')
                ],*/
            ],
        ],
  • redis 读写分离连接配置
    'redis' => [

        'client' => env('REDIS_CLIENT', 'phpredis'),

        'options' => [
            'cluster' => env('REDIS_CLUSTER', 'redis'),
            'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
        ],

        ...省略其他连接配置

        //配置集群
        'clusters' => [
            'default' => [
                [
                    'host' => env('REDIS_HOST_CLUSTERS1', 'localhost'),
                    'password' => env('REDIS_PASSWORD_CLUSTERS', null),
                    'port' => env('REDIS_PORT', 6379),
                    'database' => 0,
                ],
                [
                    'host' => env('REDIS_HOST_CLUSTERS2', 'localhost'),
                    'password' => env('REDIS_PASSWORD_CLUSTERS', null),
                    'port' => env('REDIS_PORT', 6379),
                    'database' => 0,
                ],
            ],
        ],

    ],
2.5.2.2 读写分离环境配置
  • mysql 读写分离环境配置
DB_CONNECTION=mysql
DB_HOST=null
DB_HOST_WRITE1=null
DB_HOST_READ1=null
DB_HOST_READ2=null
DB_PORT=3306
DB_PREFIX=17t_
DB_DATABASE=book
DB_USERNAME=book
DB_PASSWORD=123456
DB_PASSWORD_READ=11111
DB_PASSWORD_WRITE=22222
  • redis 读写分离环境配置
REDIS_HOST=127.0.0.1
REDIS_HOST_CLUSTERS1=null
REDIS_HOST_CLUSTERS2=null
REDIS_PASSWORD=null
REDIS_PORT=6379
REDIS_PREFIX=17tvb_

3. LaravelS集成

LaravelS是laravel的第三方swoole扩展包,快速集成 Swoole到 Laravel,减轻Swoole需要自行编写服务器脚本的工作,既用上Swoole异步高性能处理并发功能,又发挥出Laravel框架处理PHP业务便捷能力。

3.1 查看LaravelS最新版本

https://packagist.org/packages/hhxsv5/laravel-s
在这里插入图片描述

3.2 Composer 安装

  • 必须确保进入Laravel项目根目录,安装器将读取项目composer.json文件
[root@VM-0-16-centos ~]# cd /home/myweb
[root@VM-0-16-centos myweb]# ls -sl
total 360
  4 drwxr-xr-x  7 root root   4096 Feb 17 00:58 app
  4 -rwxr-xr-x  1 root root   1686 Feb 17 00:58 artisan
  4 drwxr-xr-x  3 root root   4096 Feb 17 00:58 bootstrap
  4 -rw-r--r--  1 root root   1685 Feb 24 03:47 composer.json
292 -rw-r--r--  1 root root 298884 Feb 24 03:47 composer.lock
  4 drwxr-xr-x  2 root root   4096 Feb 17 00:58 config
  4 drwxr-xr-x  5 root root   4096 Feb 17 00:58 database
  4 -rw-r--r--  1 root root    473 Feb 17 00:58 package.json
  4 -rw-r--r--  1 root root   1202 Feb 17 00:58 phpunit.xml
  4 drwxr-xr-x  2 root root   4096 Feb 17 00:58 public
  4 -rw-r--r--  1 root root   3780 Feb 17 00:58 README.md
  4 drwxr-xr-x  6 root root   4096 Feb 17 00:58 resources
  4 drwxr-xr-x  2 root root   4096 Feb 17 00:58 routes
  4 -rw-r--r--  1 root root    563 Feb 17 00:58 server.php
  4 drwxrwxrwx  5 root root   4096 Feb 17 00:58 storage
  4 drwxr-xr-x  4 root root   4096 Feb 17 00:58 tests
  4 drwxr-xr-x 46 root root   4096 Feb 24 03:47 vendor
  4 -rw-r--r--  1 root root    559 Feb 17 00:58 webpack.mix.js
[root@VM-0-16-centos myweb]# 
  • 安装laravel-s
    composer require "hhxsv5/laravel-s:~3.7.16" -vvv

确保你的composer.lock文件是在版本控制中

[root@VM-0-16-centos myweb]# composer require "hhxsv5/laravel-s:~3.7.16" -vvv
Reading ./composer.json (/home/myweb/composer.json)
Loading config file /root/.config/composer/config.json
Loading config file /root/.config/composer/auth.json
Loading config file ./composer.json (/home/myweb/composer.json)
Checked CA file /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem: valid
Executing command (/home/myweb): git branch -a --no-color --no-abbrev -v
Executing command (/home/myweb): git describe --exact-match --tags
Executing command (CWD): git --version
Executing command (/home/myweb): git log --pretty="%H" -n1 HEAD
Executing command (/home/myweb): hg branch
Executing command (/home/myweb): fossil branch list
Executing command (/home/myweb): fossil tag list
Executing command (/home/myweb): svn info --xml
Reading /root/.config/composer/composer.json
Loading config file /root/.config/composer/config.json
Loading config file /root/.config/composer/auth.json
Loading config file /root/.config/composer/composer.json (/root/.config/composer/composer.json)
Loading config file /root/.config/composer/auth.json
Reading /root/.config/composer/auth.json
Reading /home/myweb/vendor/composer/installed.json
Reading /root/.config/composer/vendor/composer/installed.json
Running 2.0.9 (2021-01-27 16:09:27) with PHP 8.0.2 on Linux / 4.18.0-193.6.3.el8_2.x86_64
... 此处省略过长安装信息
Downloading https://packagist.org/downloads/
[201] https://packagist.org/downloads/
1 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating optimized autoload files
> post-autoload-dump: Illuminate\Foundation\ComposerScripts::postAutoloadDump
> post-autoload-dump: @php artisan package:discover --ansi
Executing command (CWD): '/usr/local/php8/bin/php' -d allow_url_fopen='1' -d disable_functions='' -d memory_limit='1536M' artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: fruitcake/laravel-cors
Discovered Package: hhxsv5/laravel-s
Discovered Package: laravel/sail
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
75 packages you are using are looking for funding.
Use the `composer fund` command to find out more!

3.3 注册服务模块

Laravel 5.5+ 以上版本跳过此步骤,安装器自动寻找项目目录下composer.json注册。

修改Laravel工程根目录下config/app.php文件

'providers' => [
    //...
    Hhxsv5\LaravelS\Illuminate\LaravelSServiceProvider::class,
],

3.4 发布laravelS配置

LaravelS 每次升级,都需重新发布配置到项目中
php artisan laravels publish

配置文件: config/laravels.php
二进制文件: bin/laravels bin/fswatch bin/inotify

[root@VM-0-16-centos myweb]# php artisan laravels publish
Copied file [/home/myweb/vendor/hhxsv5/laravel-s/config/laravels.php] To [/home/myweb/config/laravels.php]
Linked file [/home/myweb/vendor/hhxsv5/laravel-s/bin/laravels] To [/home/myweb/bin/laravels]
Linked file [/home/myweb/vendor/hhxsv5/laravel-s/bin/fswatch] To [/home/myweb/bin/fswatch]
Linked file [/home/myweb/vendor/hhxsv5/laravel-s/bin/inotify] To [/home/myweb/bin/inotify]

3.5 Laravel 和 LaravelS配置项

3.5.1 Laravel 环境变量 ( Laravel框架配置 )

(注意此处是Laravel框架配置,不是LaravelS扩展包配置)

进入Laravel 工程根目录下.env
vim /home/myweb/.env

LARAVELS_LISTEN_IP=localhost
LARAVELS_DAEMONIZE=true
LARAVELS_WORKER_NUM=16
  • LARAVELS_LISTEN_IP
    LaravelS 监听地址
    如果config/laravels.php中socket_type为SWOOLE_UNIX_STREAM
    监听改为socket文件路径,如
    LARAVELS_LISTEN_IP=unix:/dev/shm/laravels.sock
  • LARAVELS_DAEMONIZE
    后台方式运行LaravelS服务
  • LARAVELS_WORKER_NUM
    最大php工作子进程,每个进程大概40M的内存,计算方法可有参考《PHP-FPM进程数与内存调优》

3.5.2 LaravelS 配置文件( LaravelS扩展包配置 )

  • (注意此处是LaravelS扩展包配置)

Laravel工程根目录下config/laravels.php文件
vim /home/myweb/config/laravels.php

  • 监听配置
'listen_ip' => env('LARAVELS_LISTEN_IP', '127.0.0.1'),
'listen_port' => env('LARAVELS_LISTEN_PORT', 5200),
'socket_type' => defined('SWOOLE_SOCK_TCP') ? SWOOLE_SOCK_TCP : 1,

listen_ip 监听地址
设置默认地址127.0.0.1
env(‘LARAVELS_LISTEN_IP’, ‘127.0.0.1’), 优先读取判断Laravel的.env中是否设置了监听地址,如果没有使用这里设置的127.0.0.1地址

  • IPv4:
    “127.0.0.1” 监听本地地址
    “0.0.0.0” 监听所有地址
  • IPv6:
    "::1"监听本地地址
    "::"监听所有地址

listen_port 监听端口
设置默认端口5200
env(‘LARAVELS_LISTEN_PORT’, 5200),优先读取判断Laravel的.env中是否设置了监听地址,如果没有使用这里设置的127.0.0.1地址

socket_type 套接字类型
如果使用SOCK_UNIX_STREAM类型,监听设置为socket文件路径,如
unix:/dev/shm/laravels.sock

  • SWOOLE_SOCK_TCP: TCP
  • SWOOLE_SOCK_TCP6: TCP IPv6
  • SWOOLE_SOCK_UDP: UDP
  • SWOOLE_SOCK_UDP6: UDP IPv6
  • SWOOLE_UNIX_DGRAM: Unix socket dgram
  • SWOOLE_UNIX_STREAM: Unix socket stream
  • Enable SSL: $sock_type | SWOOLE_SSL.
  • swoole 配置
'swoole' => [
        'daemonize'          => env('LARAVELS_DAEMONIZE', false),
        'dispatch_mode'      => 2,
        'reactor_num'        => env('LARAVELS_REACTOR_NUM', function_exists('swoole_cpu_num') ? swoole_cpu_num() : 8),
        'worker_num'         => env('LARAVELS_WORKER_NUM', function_exists('swoole_cpu_num') ? swoole_cpu_num() : 8),
        //'task_worker_num'    => env('LARAVELS_TASK_WORKER_NUM', function_exists('swoole_cpu_num') ? swoole_cpu_num() * 2 : 8),
        'task_ipc_mode'      => 1,
        'task_max_request'   => env('LARAVELS_TASK_MAX_REQUEST', 100000),
        'task_tmpdir'        => @is_writable('/dev/shm/') ? '/dev/shm' : '/tmp',
        'max_request'        => env('LARAVELS_MAX_REQUEST', 100000),
        'open_tcp_nodelay'   => true,
        'pid_file'           => storage_path('laravels.pid'),
        'log_level'          => 4,
        'log_file'           => storage_path(sprintf('logs/swoole-%s.log', date('Y-m'))),
        'document_root'      => base_path('public'),
        'buffer_output_size' => 2 * 1024 * 1024,
        'socket_buffer_size' => 8 * 1024 * 1024,
        'package_max_length' => 4 * 1024 * 1024,
        'reload_async'       => true,
        'max_wait_time'      => 60,
        'enable_reuse_port'  => true,
        'enable_coroutine'   => false,
        'upload_tmp_dir'     => @is_writable('/dev/shm/') ? '/dev/shm' : '/tmp',
        'http_compression'   => false,
    ],
  • daemonize 守护进程
    设置 true 时,程序将转入后台作为守护进程长时间运行。
    如果不启用守护进程,当 ssh 终端退出后,程序将被终止运行。

  • 更多swoole参数设置参考 https://wiki.swoole.com/#/server/setting

3.6 配置nginx启用LaravelS

  • 复制nginx配置
[root@VM-0-16-centos myweb]# cd /etc/nginx/conf.d
[root@VM-0-16-centos conf.d]# cp default.conf www.conf
[root@VM-0-16-centos conf.d]# ls
default.conf  www.conf
  • 配置laravelS的upstream模块
    vim /etc/nginx/conf.d/laravelS.conf
# 这是laravelS的负载均衡分发配置
upstream laravelS{
    server 127.0.0.1:5200 weight=5 max_fails=3 fail_timeout=30s;
    #server localhost:5200 weight=5 max_fails=3 fail_timeout=30s;
    #server unix:/dev/shm/laravels.sock weight=5 max_fails=3 fail_timeout=30s;
    keepalive 16;
}
  • 配置主页服务器
    vi /etc/nginx/conf.d/www.conf
# www服务器
server
{
        # 监听端口
        listen       80;
        # 服务器域名
        server_name localhost;
        # 指定首页文件
        index index.html index.htm index.php;
        # 指定字符集
        charset utf-8;
        # 根目录指向laravel项目入口目录public
        root /home/myweb/public;
        # laravel部署必要URL规则,所有请求不管动态静态都转发给@LaravelS处理
        location / {
                try_files $uri @laravelS;
        }
        # 根据laravel规则进行url重写
        if (!-e $request_filename)
        {
                rewrite ^/(.*)$ /index.php?/$1 last;
                break;
        }
        # 去除url末尾的斜杠,便于SEO
        if (!-d $request_filename)
        {
                rewrite ^/(.+)/$ /$1 permanent;
        }
        # 去除index action
        if ($request_uri ~* index/?$)
        {
                rewrite ^/(.*)/index/?$ /$1 permanent;
        }
		# 对PHP文件请求响应404,防止暴露public目录下文件      
        location ~ \.php$ {
        		return 404;
        }
        # 反向代理处理php请求给laravelS
        location @laravelS {
                proxy_http_version 1.1;
                proxy_set_header Connection "";
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Real-PORT $remote_port;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_set_header Scheme $scheme;
                proxy_set_header Server-Protocol $server_protocol;
                proxy_set_header Server-Name $server_name;
                proxy_set_header Server-Addr $server_addr;
                proxy_set_header Server-Port $server_port;
                proxy_pass http://laravelS; 
        }
        # 禁用favicon.ico和robots.txt报错日志
        location = /favicon.ico { access_log off; log_not_found off; }
        location = /robots.txt { access_log off; log_not_found off; }
        # 错误转静态页
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root   /usr/share/nginx/html;
        }
        # 图片缓存有效期
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp3|wma)$
        {
                expires      7d;
        }
        # JS和CSS缓存有效期
        location ~ .*\.(js|css)$
        {
                expires      1h;
        }
        # 字体缓存有效期
        location ~ .*\.(eot|ttf|otf|woff|svg)$ {
            expires 30d;
            access_log off;
        }
        location ~ /\.ht {
                deny all;
        }
}
  • 重启Nginx
    systemctl restart nginx

3.7 启动LaravelS服务

  • 命令格式
    php bin/laravels {start|stop|restart|reload|info|help}

LaravelS启动时自动执行 php artisan laravels config 并生成相关文件

  • storage/laravels.conf LaravelS 的运行时配置文件
  • storage/laravels.pid Master 进程的 PID 文件
  • storage/laravels-timer-process.pid 定时器 Timer 进程的 PID 文件
  • storage/laravels-custom-processes.pid 所有自定义进程的 PID 文件
  • ssh 在线模式运行,TCP监听模式
[root@VM-0-16-centos myweb]# php bin/laravels start
 _                               _  _____ 
| |                             | |/ ____|
| |     __ _ _ __ __ ___   _____| | (___  
| |    / _` | '__/ _` \ \ / / _ \ |\___ \ 
| |___| (_| | | | (_| |\ V /  __/ |____) |
|______\__,_|_|  \__,_| \_/ \___|_|_____/ 
                                           
Speed up your Laravel/Lumen
>>> Components
+---------------------------+---------+
| Component                 | Version |
+---------------------------+---------+
| PHP                       | 8.0.2   |
| Swoole                    | 4.6.3   |
| LaravelS                  | 3.7.16  |
| Laravel Framework [local] | 8.29.0  |
+---------------------------+---------+
>>> Protocols
+-----------+--------+-------------------+-----------------------+
| Protocol  | Status | Handler           | Listen At             |
+-----------+--------+-------------------+-----------------------+
| Main HTTP | On     | Laravel Framework | http://127.0.0.1:5200 |
+-----------+--------+-------------------+-----------------------+
>>> Feedback: https://github.com/hhxsv5/laravel-s
[2021-02-23 20:38:08] [TRACE] Swoole is running, press Ctrl+C to quit.
  • 驻后台运行,Socket监听模式
[root@VM-0-16-centos myweb]# php bin/laravels start                             
 _                               _  _____ 
| |                             | |/ ____|
| |     __ _ _ __ __ ___   _____| | (___  
| |    / _` | '__/ _` \ \ / / _ \ |\___ \ 
| |___| (_| | | | (_| |\ V /  __/ |____) |
|______\__,_|_|  \__,_| \_/ \___|_|_____/ 
                                           
Speed up your Laravel/Lumen
>>> Components
+---------------------------+---------+
| Component                 | Version |
+---------------------------+---------+
| PHP                       | 8.0.2   |
| Swoole                    | 4.6.3   |
| LaravelS                  | 3.7.16  |
| Laravel Framework [local] | 8.29.0  |
+---------------------------+---------+
>>> Protocols
+-----------+--------+-------------------+------------------------------------+
| Protocol  | Status | Handler           | Listen At                          |
+-----------+--------+-------------------+------------------------------------+
| Main HTTP | On     | Laravel Framework | http://unix:/dev/shm/laravels.sock |
+-----------+--------+-------------------+------------------------------------+
>>> Feedback: https://github.com/hhxsv5/laravel-s
[2021-02-24 17:36:37] [TRACE] Swoole is running in daemon mode, see "ps -ef|grep laravels".

到此,Laravel项目站点myweb,成功启动Swoole异步多线程服务,代替了FPM进程管理服务。
在这里插入图片描述


本章完

CentOS8搭建Web服务器笔记1 Nginx+Php8基础环境
CentOS8搭建Web服务器笔记3 Mysql8+Redis6数据库

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值