无题

  • laravel-后台API token管理、用户管理、权限管理、操作日志、文章管理、分类管理
  • vue后台模板(使用已开源的)
  • socket、swoole、easyswoole
  • phpmywind改造成自适应的(html-php混编)
  • mysql-数据优化、索引优化、事务、锁机制
  • redis 队列等场景使用
  • python 爬数据
  • go

todo-list

  • mac多php、mysql、nginx、apache版本安装
  • thinkpad共享文件夹-mac映射共享文件夹
  • vscode远程编辑配置
  • laravel-admin 参考 部署 moell-peng/mojito
  • easyswoole-长连接认证-laravel的各种认证对比

es-docker

FROM php:7.2

# Version
ENV PHPREDIS_VERSION 4.0.1
ENV SWOOLE_VERSION 4.4.4
ENV EASYSWOOLE_VERSION 3.x-dev

# Timezone
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo 'Asia/Shanghai' > /etc/timezone

# Libs
RUN apt-get update \
    && apt-get install -y \
    curl \
    wget \
    git \
    zip \
    libz-dev \
    libssl-dev \
    libnghttp2-dev \
    libpcre3-dev \
    && apt-get clean \
    && apt-get autoremove -y

# Composer
RUN curl -sS https://getcomposer.org/installer | php \
    && mv composer.phar /usr/local/bin/composer \
    && composer self-update --clean-backups

# PDO extension
RUN docker-php-ext-install pdo_mysql

# Bcmath extension
RUN docker-php-ext-install bcmath

# Redis extension
RUN wget http://pecl.php.net/get/redis-${PHPREDIS_VERSION}.tgz -O /tmp/redis.tar.tgz \
    && pecl install /tmp/redis.tar.tgz \
    && rm -rf /tmp/redis.tar.tgz \
    && docker-php-ext-enable redis

# Swoole extension
RUN wget https://github.com/swoole/swoole-src/archive/v${SWOOLE_VERSION}.tar.gz -O swoole.tar.gz \
    && mkdir -p swoole \
    && tar -xf swoole.tar.gz -C swoole --strip-components=1 \
    && rm swoole.tar.gz \
    && ( \
    cd swoole \
    && phpize \
    && ./configure --enable-async-redis --enable-mysqlnd --enable-openssl --enable-http2 \
    && make -j$(nproc) \
    && make install \
    ) \
    && rm -r swoole \
    && docker-php-ext-enable swoole


# 部署node-agent
ADD swoole-tracker-vx.y.z.tar.gz /tmp/
RUN cp /tmp/86d89a960330704760/swoole_tracker72.so /usr/local/lib/php/extensions/no-debug-non-zts-20170718/ && \
    cd /tmp/86d89a960330704760 && \
    ./deploy_env.sh 192.168.56.102 && \
    rm -rf /tmp/86d89a960330704760

# 添加entrypoint脚本
RUN printf '#!/bin/sh\n/opt/swoole/script/php/swoole_php /opt/swoole/node-agent/src/node.php &\nphp $@' > /opt/swoole/entrypoint.sh && \
    chmod 755 /opt/swoole/entrypoint.sh

# 启用entrypoint脚本(-x方便调试, 可以去掉)
# ENTRYPOINT [ "sh", "-x", "/opt/swoole/entrypoint.sh" ]

RUN printf 'extension=/usr/local/lib/php/extensions/no-debug-non-zts-20170718/swoole_tracker72.so\n' > /usr/local/etc/php/conf.d/swoole-tracker.ini


WORKDIR /var/www/code



# Install easyswoole
RUN cd /var/www/code \
    && composer require easyswoole/easyswoole=${EASYSWOOLE_VERSION} \
    && php vendor/bin/easyswoole install

EXPOSE 9501

ENTRYPOINT ["php", "/var/www/code/easyswoole", "start"]
FROM centos:centos7

#version defined
ENV SWOOLE_VERSION 4.4.4
ENV EASYSWOOLE_VERSION 3.x-dev

#update core
RUN yum update -y

#install libs
RUN yum install -y curl zip unzip  wget openssl-devel gcc-c++ make autoconf

#install php
RUN yum install -y epel-release
RUN rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
RUN yum clean all
RUN yum update -y
RUN yum install -y php71w-devel php71w-openssl php71w-gd php71w-mbstring php71w-mysqli

# composer
RUN curl -sS https://getcomposer.org/installer | php \
    && mv composer.phar /usr/bin/composer \
    && composer self-update --clean-backups

# use aliyun composer
RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

# swoole ext
RUN wget https://github.com/swoole/swoole-src/archive/v${SWOOLE_VERSION}.tar.gz -O swoole.tar.gz \
    && mkdir -p swoole \
    && tar -xf swoole.tar.gz -C swoole --strip-components=1 \
    && rm swoole.tar.gz \
    && ( \
    cd swoole \
    && phpize \
    && ./configure --enable-openssl \
    && make \
    && make install \
    ) \
    && sed -i "2i extension=swoole.so" /etc/php.ini \
    && rm -r swoole

# Dir
WORKDIR /easyswoole

# install easyswoole

RUN cd /easyswoole \
    && composer require easyswoole/easyswoole=${EASYSWOOLE_VERSION} \
    && php vendor/bin/easyswoole install


# 部署node-agent
ADD swoole-tracker-vx.y.z.tar.gz /tmp/
RUN cp /tmp/86d89a960330704760/swoole_tracker71.so /usr/lib64/php/modules/ && \
    cd /tmp/86d89a960330704760 && \
    ./deploy_env.sh 192.168.56.102 && \
    rm -rf /tmp/86d89a960330704760

# 添加entrypoint脚本
RUN printf '#!/bin/sh\n/opt/swoole/script/php/swoole_php /opt/swoole/node-agent/src/node.php &\nphp-fpm $@' > /opt/swoole/entrypoint.sh && \
    chmod 755 /opt/swoole/entrypoint.sh

# 启用entrypoint脚本(-x方便调试, 可以去掉)
ENTRYPOINT [ "sh", "-x", "/opt/swoole/entrypoint.sh" ]

RUN printf 'extension=/usr/lib64/php/modules/swoole_tracker71.so\n' > /etc/php.d/swoole-tracker.ini


EXPOSE 9501

Loaded plugins: fastestmirror

yum update 报错 Loaded plugins: fastestmirror

  1. vi /etc/yum/pluginconf.d/fastestmirror.conf # 由enabled = 1修改为enabled = 0 意思是禁用它
  2. vi /etc/yum.conf # 修改为plugins=0 不使用插件
  3. vi /etc/sysconfig/network-scripts/ifcfg-ens33 # ifcfg-ens33 可能不是这个名字 找前缀为 ifcfg-ens [将ONBOOT改为yes, wq!保存退出]
  4. service network restart # 重新启动网络

相关资料

安装时出现Loaded plugins: fastestmirror解决办法

easyswoole中的mysqli带条件返回数据及总条数

easyswoole mysqli 分页

正确用法

<?php
$table_name = 'xsk_test';
$page=3;
$page_size=20;
$db->where('status', 1);
$db->withTotalCount();
$data = $db->get($table_name,[($page-1)*$page_size,$page_size],'*');
$count = $db->getTotalCount();

错误用法

<?php
$table_name = 'xsk_test';
$page=3;
$page_size=20;
$db->where('status', 1);
$data = $db->get($table_name,[($page-1)*$page_size,$page_size],'*');
$count = $db->count();// 这儿的count的where条件会消失

mysqli的源码

count是再次调用了get的方法 源码位置

    /**
     * 聚合-计算总数
     * @param string $tableName 表名称
     * @param string|null $filedName 字段名称
     * @return mixed
     * @throws ConnectFail
     * @throws PrepareQueryFail
     */
    public function count($tableName, $filedName = null)
    {
        if (is_null($filedName)) {
            $filedName = '*';
        }
        $isFetch = $this->isFetchSql;
        $retval = $this->get($tableName, null, "COUNT({$filedName}) as retval");
        if ($isFetch || $retval instanceof Mysqli) {
            return $retval;
        }
        return $retval ? $retval[0]['retval'] : false;
    }

相关资料

官方文档

计算机中的存储单位

计算机中的存储单位 单位转换

最小、最大单位是什么

最小单位 位(bit)-8位二进制数称为一个字节(byte)

位(bit)是二进制数的最基本单位, 也是存储器存储信息的最小单位,8位二进制数称为一个字节(byte). 当一个数作为一个整体存入或取出时, 这个数叫做存储字. 存储字可以是一个字节, 也可以是若干个字节. 若干个忆记单元组成一个存储单元, 大量的存储单元的集合组成一个存储体(MemoryBank).

  • 常见最大单位 1TB (Trillionbyte 万亿字节 太字节)
  • 已知最大单位 1BB (Brontobyte 一千亿亿亿字节)= 1024 YB.

高位字节、低位字节

计算机的数值应视为连续若干个二进制位的集合, 所谓高、低字节就是此集合中位地址高/低的二进制位集合

一般一个16位(双字节)的数据,比如 FF1A (16进制)
那么高位字节就是FF,低位是1A

如果是32位的数据,比如 3F68415B
高位字(不是字节)是3F68
低位字是415B

右边是低位位,左边是高位

单位之间怎么换算

1B(Byte 字节)=8bit,
1KB (Kilobyte 千字节)=1024B,
1MB (Megabyte 兆字节 简称“兆”)=1024KB,
1GB (Gigabyte 吉字节 又称“千兆”)=1024MB,
1TB (Trillionbyte 万亿字节 太字节)=1024GB,其中1024=2^10 ( 2 的10次方),
1PB(Petabyte 千万亿字节 拍字节)=1024TB,
1EB(Exabyte 百亿亿字节 艾字节)=1024PB,
1ZB (Zettabyte 十万亿亿字节 泽字节)= 1024 EB,
1YB (Yottabyte 一亿亿亿字节 尧字节)= 1024 ZB,
1BB (Brontobyte 一千亿亿亿字节)= 1024 YB.

注:“兆”为百万级数量单位。
附:进制单位全称及译音
yotta, [尧]它, Y. 10^21,
zetta, [泽]它, Z. 10^18,
exa, [艾]可萨, E. 10^15,
peta, [拍]它, P. 10^12,
tera, [太]拉, T. 10^9,
giga, [级]咖, G. 10^6,
mega, [兆],M. 10^3

硬盘容量缩水

计算机中采用二进制,这样就造成在操作系统中对容量的计算是以每1024为一进制的
而硬盘厂商在计算容量时,则是以每1000为一进制的,每1000“字节”为1KB

相关资料

存储单位
计算机存储单位
高位字节、低位字节

php-单元测试

easyswoole 单元测试 php单元测试

安装

composer require easyswoole/phpunit Tip: 自3.2.5版本的Easyswoole起,已经默认集成了 easyswoole/phpunit 组件

目录结构

|--App
|--|--|
.....
|--Tests
|--|--Api
|--|--|--IndexTests.php
|--|--Models
|--|--|--UserTests.php

IndexTests.php API接口测试

<?php


namespace Tests\Api;
use PHPUnit\Framework\TestCase;
use App\HttpController\Index;
use EasySwoole\HttpClient\HttpClient;

class IndexTests extends TestCase
{
    protected $baseUrl = 'http://ip地址:9501';

    public function testIndex()
    {
        $url = $this->baseUrl . '/user/login'; 
        $client = new HttpClient($url);


        $username = 'zhangshan';
        $password = 'qwe12345';
        $deviceId = 1;

        $client->setQuery(['username' => $username, 'password' => $password, 'device_type' => $deviceId]);

        $response = $client->get();

        $body = $this->parsingJson($response->getBody());

        if ($response->getBody()) {
            var_dump($body);
        } else {
            echo 'Error: ' . $response->getErrCode() . ': ' . $response->getErrMsg() . "\n";
        }

        $this->assertTrue(true);//断言结果是否为true,如果不为true则报错
        $this->assertEquals('hello world', $response->response);//断言结果是否等于hello world,如果不等于则报错
    }
    /**
     * 解析json数据
     *
     * @param string $jsonStr
     * @return object
     */
    protected function parsingJson($jsonStr)
    {
        // $body = json_decode($jsonStr);
        return json_decode($jsonStr);
    }
}

UserTests.php 数据模型测试

<?php
namespace Tests\Models;
use PHPUnit\Framework\TestCase;
use App\Models\AccountModel;

class UserTests extends TestCase
{
    public function testInfo()
    {
        $uid = 13;
        $accountModel = new AccountModel();
        $data=  $accountModel->info($uid);
        // var_dump($data); 8
        $this->assertEquals(8, $data['robot_id']);//断言返回的id为1
    }
}

相关资料

phpunit-单元测试神器
Easyswoole/Phpunit

负载均衡

Nginx 配置负载均衡

负载均衡处理方案

  • 源地址哈希法:根据获取客户端的IP地址,通过哈希函数计算得到一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。

  • 轮询法:将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。

  • 随机法:通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。

  • 加权轮询法:不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。

  • 加权随机法:与加权轮询法一样,加权随机法也根据后端机器的配置,系统的负载分配不同的权重。不同的是,它是按照权重随机请求后端服务器,而非顺序。

  • 最小连接数法:由于后端服务器的配置不尽相同,对于请求的处理有快有慢,最小连接数法根据后端服务器当前的连接情况,动态地选取其中当前积压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负责合理地分流到每一台服务器。

相关资料

使用Nginx实现负载均衡
Nginx之负载均衡