liziyu 发布的文章

协程调度

决定到底让 CPU 执行哪个协程的代码决断过程就是协程调度,调度的策略是什么?

首先,在执行某个协程代码的过程中发现这行代码遇到了 Co::sleep() 或者产生了网络 IO,例如 MySQL->query(),这肯定是一个耗时的过程,Swoole 就会把这个 Mysql 连接的 Fd 放到 EventLoop 中。

  • 然后让出这个协程的 CPU 给其他协程使用:即 yield(挂起)
  • 等待 MySQL 数据返回后就继续执行这个协程:即 resume(恢复)

其次,如果协程的代码有 CPU 密集型代码,可以开启 enable_preemptive_schedulerSwoole 会强行让这个协程让出 CPU

摘自:https://wiki.swoole.com/#/coroutine?id=协程调度

应用场景

在使用php的过程中,我们常常需要去添加一些PHP扩展库。但是重新对php进行编译是比较蛮烦的,所以这时候我们可以使用phpizephp进行添加扩展。并且phpize编译的扩展库可以随时启用或停用,比较灵活。

使用方法

extention为要挂载的扩展包

1.wget extension.tar.gz下载相应的扩展包并解压。
2.cd extension/切换到扩展extension的目录中
3./php/bin/phpize 运行php安装目录下的phpize文件,这时候会在extension目录下生成相应的configure文件。
4./configure --with-php-config=/php/bin/php-config 运行配置,如果你的服务器上只是装了一个版本的php则不需要添加--with-php-config
。后面的参数只是为了告诉phpize要建立基于哪个版本的扩展。
5.make && make install 编译模块编译好模块之后,需要让php启用它。在php.ini文件中加入把extension.so开启即可。重启php服务。

作用

其实phpize是一个运行脚本,主要作用是检测php的环境还有就是在特定的目录生成相应的configure文件,这样make install之后,生成的.so文件才会自动加载到php扩展目录下面。

转自:https://www.cnblogs.com/houss/p/11341280.html

//...
const onLoad = async () => {
  try {
      //1.异步调用接口取服务端数据
      const params = {
      id: props.category.id,
      pageNumber: state.pageNumber || 1,
      };
      const { data } = await getArticle(params);
      const results = data.list; //list为后端返回数组
      //2.将取回的数据push到本实例数组内
      state.list.push(...results);
      //3.数据加载完成的标记
      state.loading = false;
      //当全部数据加载完成后,将finished为true
      if(results.length > 0) {
        state.pageNumber = data.p_num;
      } else {
        state.finished = true;
      }
  } catch (err) {
    state.error = true;
    state.loading = false;
  }
}
//...

spl_autoload_register() 函数可以指定一个函数来替代 __autoload() 函数的功能。语法格式如下:

spl_autoload_register([$autoload_function [, $throw = true [, $prepend = false ]]])

参数说明如下:

  • $autoload_function:要替代 __autoload() 函数的函数名称,也可以是一个匿名函数。如果没有提供任何参数,则自动注册 autoload 的默认实现函数 spl_autoload()
  • $throw:用来设置 $autoload_function 无法成功注册时,spl_autoload_register() 函数是否抛出异常;
  • $prepend:如果是 true,则 spl_autoload_register() 函数会添加 $autoload_function 函数到队列之首,否则添加到队列尾部。
注意:与 __autoload() 函数不同,spl_autoload_register() 可以多次定义。
<?php
    spl_autoload_register('loadClass');
    function loadClass($class){
        $file = './'.$class.'.php';
        include_once($file);
    }

    $obj = new Demo();
?>
运行上面的代码同样需要上面示例中用到的 Demo.php 文件。

反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,是一种动态获取的信息以及动态调用对象的方法的功能。

理解go语言的接口。很多跟我一样的初学者被go语言接口搞得云里雾里,也会定义,也使用了,就是不能完全理解接口有什么用,有什么意义。
刚看到一句话,我觉得非常好:“接口的意义就是描述数据类型的行为,以及数据类型的共性特征。”我们拿到一个数据,知道它实现了哪个接口,就知道用什么方法操作它了。
也就是通过数据所实现的接口,我们就知道了数据得类型,进而就知道如果去操作了。我们不能对石头执行吃的操作,但是可以对米饭执行吃的方法。

  1. INT等整型不要采用无符号的,计算增加会减少时候如果是负数会报错。
  2. 自增用8个字节的BIG INT,而不要用四个字节INT,自增在MySQL 8.0前都会有回溯问题。
  3. 字符集用UTF8MB4字符编码。
  4. 日期类型用DATETIME,精确到毫秒用DATETIME(6),不建议使用INTTIMESTAMP
  5. JSON存储非频繁更新的结构化数据,比如用户标签等。
  6. 每张表一定要有一个主键,核心表要有全局唯一字段(比如雪花算法生成id或有序UUID)作为主键。
  7. 对日志,监控类的表,可以使用压缩设计,提升存储效率。推荐使用透明页压缩。
  8. 敏感字段要加密,动态盐+非固定加密算法( AES256等)+多轮加密。
  9. Mysql中通过KV方式访问表中数据,若只是简单的SETGET,可以转成MemcachedKV方式,减少开销,提升50%左右性

module.exports = {
    // 基本路径 baseURL已经过时
    publicPath: './',
    // 输出文件目录
    outputDir: 'dist',
    // eslint-loader 是否在保存的时候检查
    lintOnSave: true,
    // use the full build with in-browser compiler?
    // https://vuejs.org/v2/guide/installation.html#Runtime-Compiler-vs-Runtime-only
    // compiler: false,
    // webpack配置
    // see https://github.com/vuejs/vue-cli/blob/dev/docs/webpack.md
    chainWebpack: () => {},
    configureWebpack: () => {},
    // vue-loader 配置项
    // https://vue-loader.vuejs.org/en/options.html
    // vueLoader: {},
    // 生产环境是否生成 sourceMap 文件
    productionSourceMap: true,
    // css相关配置
    css: {
        // 是否使用css分离插件 ExtractTextPlugin
        extract: true,
        // 开启 CSS source maps?
        sourceMap: false,
        // css预设器配置项
        loaderOptions: {},
        // 启用 CSS modules for all css / pre-processor files.
        modules: false
    },
    // use thread-loader for babel & TS in production build
    // enabled by default if the machine has more than 1 cores
    parallel: require('os').cpus().length > 1,
    // 是否启用dll
    // See https://github.com/vuejs/vue-cli/blob/dev/docs/cli-service.md#dll-mode
    // dll: false,
    // PWA 插件相关配置
    // see https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-pwa
    pwa: {},
    // webpack-dev-server 相关配置
    devServer: {
        open: process.platform === 'darwin',
        disableHostCheck: true,
        host: 'xfcms-search.local',//如果是真机测试,就使用这个IP
        port: 80,
        https: false,
        hotOnly: false,
        before: app => {}
    },
    // 第三方插件配置
    pluginOptions: {
        // ...
    }
}