• 随手记录第十一话 -- PHP + yii2 初体验


    啥也不想说了,项目是半路接过来,帮接入我们服务的。

    1.版本和依赖问题

    多版本,Mac是默认带有php的,但是版本是个问题,可以用如下指令来选择当前的版本

    brew unlink php && brew link php  //默认的版本
    brew unlink php && brew link shivammathur/php/php@7.4
    
    • 1
    • 2

    在项目中,尤其要特别注意PHP的版本和项目实际运行的版本

    ~/apple/java-work/mime/mimo-api main +4 !1 > php -v                                                                                                                                                       node system rb 2.7.6 16:31:11
    PHP 7.4.33 (cli) (built: Jul 13 2023 19:26:04) ( NTS )
    Copyright (c) The PHP Group
    Zend Engine v3.4.0, Copyright (c) Zend Technologies
        with Zend OPcache v7.4.33, Copyright (c), by Zend Technologies
    
    • 1
    • 2
    • 3
    • 4
    • 5

    框架用的是yii2,我找的文档地址是这个。

    搭建一切正常,需要安装php-fmp来搭配nginx来访问到服务。

    如果是纯页面访问,则直接php yii serve来启动服务

    下载依赖

    composer install
    
    • 1

    拿到手怎么都下载不了MongoDB的依赖,只能先排除下载

    composer install --ignore-platform-req=ext-mongodb 
    
    • 1

    2. 一把是通过这种方式请求,fmp和nginx

    在安装php的时候勾选php-fmp即可,也可单独安装。
    首先需要启动php-fmp,它的配置文件的路径(我电脑上)/usr/local/etc/php/8.2/php-fpm.d/www.conf

    ; The address on which to accept FastCGI requests.
    ; Valid syntaxes are:
    ;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific IPv4 address on
    ;                            a specific port;
    ;   '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
    ;                            a specific port;
    ;   'port'                 - to listen on a TCP socket to all addresses
    ;                            (IPv6 and IPv4-mapped) on a specific port;
    ;   '/path/to/unix/socket' - to listen on a unix socket.
    ; Note: This value is mandatory.
    listen = 127.0.0.1:9000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    默认占用9000端口,大概流程就是请求接口到nginx(nginx支持的路径方式),在转发到9000端口也就是fmp服务中,变为适合PHP路由请求的方式。以此来实现接口调用。

    启动服务,先启动php-fmp,在启动nginx

    php-fmp
    
    • 1

    需要注意的是php-fmp找php文件的默认路径为/www,所有需要和nginx下的目录对应上

    docker内nginx配置

    server {
        listen       80;
        server_name  localhost;
        #root   /usr/share/nginx/html;
    
        location / {
            client_max_body_size 10m;
            add_header "Access-Control-Allow-Origin" "*";
            index  index.php index.html index.htm default.htm;
            if (!-e $request_filename){
                #专门处理Yii2 rewrite
                rewrite ^/(.*) /index.php?r=$1 last;
            }
        }
        location ~ \.php$ {
            include fastcgi_params;
            #fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;  # 使用 PHP-FPM 监听的 socket
            fastcgi_pass 192.168.168.199:9000;
            fastcgi_index  index.php;
            #这个目录要指定到fpm下面的对应入口
            fastcgi_param SCRIPT_FILENAME /www/php-apii/web/$fastcgi_script_name;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    3.docker部署

    每次启动php-fmp都需要杀掉在重新启动,找了找也有docker支持的。

    3.1 php-fmp docker部署

    php-fmp服务的yml文件

    version: '3.7'
    services:
      php01:
        image: php:7.4-fpm
        container_name: php01
        restart: always
        ports:
        - "9000:9000"
        environment:
        - TZ=Asia/Shanghai
        volumes:
        - /Users/admin/apple/java-work/php-api:/www/php-api
        - /Users/admin/apple/java-work/php-admin:/www/php-admin
        networks:
        - my-net
    networks:
      my-net:
        external: true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    相当于把php-api、php-admin都部署到了php-fmp服务中了,路径在/www

    3.2 容器内安装插件

    进入到容器内部,或者docker exec php01 /bin/bash -c 加上下面内容
    mysql等直接可以使用封装好的脚本docker-php-ext-install安装的插件

    docker-php-ext-install pdo_mysql
    docker-php-ext-install bcmath
    docker-php-ext-install sockets
    
    • 1
    • 2
    • 3

    redis

    pecl install -o -f redis && rm -rf /tmp/pear && docker-php-ext-enable redis
    
    • 1

    mongodb

    pecl install -o -f mongodb && rm -rf /tmp/pear && docker-php-ext-enable mongodb
    #查看mongodb信息
    php --ri mongodb
    
    • 1
    • 2
    • 3

    这里需要注意,mongodb在使用某些情况调用方法用到MongoDB时会需要打开ssl,还需要安装ssl依赖

    #打开mongodb链接 ssl
    apt-get update && \
        apt-get install -y libcurl4-openssl-dev pkg-config libssl-dev
    
    • 1
    • 2
    • 3

    如果项目中用到了本地缓存apcu,也需要安装查插件

    pecl install -o -f apcu && rm -rf /tmp/pear && docker-php-ext-enable apcu
    
    • 1

    3.3 命令指南

    #配置文件
    php --ini   /usr/local/etc/php/7.4/php.ini
    #扩展目录  /usr/local/lib/php/extensions/no-debug-non-zts-20190902
    php-config --extension-dir
    #万能指令 找不到目录的时候用,只要是在能直接执行的都能找到
    which php
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.4 nginx容器

    配置文件在上面已经贴过了,这里就只贴yml了

    version: '2.11'
    services:
      nginx01:
        image: nginx
        container_name: nginx01
        restart: always
        ports:
        - "80:80"
        environment:
        - TZ=Asia/Shanghai
        volumes:
        - ./nginx.conf:/etc/nginx/nginx.conf
        - ./logs:/var/log/nginx
        networks:
        - my-net #自己配置的网卡
    networks:
      my-net:
        external: true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    关于my-net,自定义的网卡,在nginx中的配置文件转发到php-fmp就可以直接填php01:9000

    关于php中的定时任务,我这里推荐用操作系统的定时任务来实现,例如在liunx上

    #宿主机
    #查看定时任务
    crontab -l
    #编辑定时任务
    crontab -e
    #每分钟一次
    * * * * * docker exec mimo-php /bin/bash -c "cd /www/-api/task && ./php_task.sh"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    部署完了做接口请求就可以变成这样了

    #yii服务或者apache的模式访问
    http://localhost:82/index.php?r=/site/test?name=12345
    #使用了nginx+php-fmp的模式下访问
    http://localhost:82/site/test?name=12345
    
    • 1
    • 2
    • 3
    • 4

    其他里面的语法已经方法和路由的定义,自行百度和看API吧,如果会JAVA这个也不是很难。

    以上就是本文的全部内容了!

    上一篇:随手记录第十话 – 升级SpringBoot3.0 + JDK17的踩坑记录
    下一篇:随手记录第十二话 – xxx

    非学无以广才,非志无以成学。

  • 相关阅读:
    RedHat上部署kubernetes dashboard 2.7
    UnitTest + Selenium 完成在线加法器自动化测试
    通达信下单接口有哪些?如何通过程序语言来实现
    什么是运维自动化巡检?
    数据湖技术之 Hudi 集成 Flink
    基础练习 Huffuman树(贪心算法)
    MySQL数据库中乐观锁和悲观锁【杭州多测师】【杭州多测师_王sir】
    线性代数学习笔记7-4:马尔可夫矩阵、矩阵幂的稳态问题
    程序员凡尔赛,工作三年晒出5月工资条,直言加班太累了
    MySQL索引原理笔记
  • 原文地址:https://blog.csdn.net/qq_35551875/article/details/133908058