随笔

随便一点小东西,加深记忆

  1. 对于任意精度的数学运算拓展: BC拓展。

    --enable-bcmath

    GMP拓展

    --with-gmp
  2. 安全的多字节字符串操作拓展:mbstring系列函数

    --enable-mbstring 
  3. 解决典型问题(standard problems)的一组接口与类的集合:SPL拓展 (5.3以上属于内核组件默认开启)

    • 数据结构
    • 迭代器
    • 接口
    • 异常
    • 文件处理
    • 其它一些接口和函数
  4. 最常用的应用程序安全访问数据而无需存储用户名和密码的协议拓展:OAuth拓展

    http://pecl.php.net/package/oauth
  5. Redis管道。部分场景下,需要大批量获取数据,使用管道能极大的降低开销

    $pipe = $redis->multi(Redis::PIPELINE);
    foreach($keyList as $key){
        $pipe->get($key);
    }
    $rankClick = $pipe->exec();

    Redis的HyperLogLog格式
    Redis 在 2.8.9 版本添加了 HyperLogLog 结构。
    HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
    在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
    基数估计就是在误差可接受的范围内,快速计算基数。
    使用场景是需要统计大量 对精度要求不是极高的 去重后的成员数.譬如:当天登陆用户数,当天ip数等

  6. 在高并发的分布式环境下,对数据的修改很容易引发一致性问题,可以采用CAS解决这个问题,实现过程也很简单。CAS是‘Compare And Set’的缩写,说白了,就是在where条件里面,加上修改字段的初始值,如果初始值更改,则不允许修改。

     update table set money = $money where uid = $uid

    修改为

     update table set money = $money where uid = $uid and money = $old_money

    如果在非分布式环境下,也可以采用这个方法解决一般的一致性问题。相较于事务,优点是减少了资源消耗,也不会引发读写锁的冲突;缺点是出现并发冲突时,会有一个请求失败。
    应该算是代码层面的乐观锁吧。

  7. MySQL 的全文索引确实不好用,5.7的版本的也是。还是搭建了 Sphinx 靠谱, 以及更靠谱的 Elasticsearch .

  8. SPL
    PHP 标准库 。SPL 是用于解决典型问题(standard problems)的一组接口与类的集合。
    主要内容包括:1、数据结构 ;2、迭代器 ;3、接口 ;4、异常;5、SPL 函数;6、文件处理;7、其他一些补充行的类及接口

  9. 覆盖索引
    查询的所有列均出现在了索引的叶节点上,不需要回表查询。
    一种通常只出现在书籍和教程上的优化方法。

    extra:use index
  10. 确认php.ini的位置
    cli命令行下

    php -i|grep php.ini
    php-fpm/apache,查看phpinfo页面找到php.ini的绝对路径。

    查看对应php.ini是否有拓展

    cat /etx/php.ini | grep ****.so
  11. mac下运行 php 的 cli 脚本,确实比 win 平台下稳定许多. 被坑了 N 次后得出来的血泪经验-_-

  12. tp3.2的不足
    虽然采用命名空间实现了按需加载, 但是精髓所在的 IoC 和 Di 依然没有实现.
    还有不伦不类的对 Composer 的支持.
    对字段过滤的有严重的不足. 如果疏忽在 where 条件里面写了错了字段名, 那么 tp 的做法仅仅是过滤掉该字段, 当你的语句是 save 或者 delete, 那乐子就大了. 这点应该学习 laravel .
    还是 Java 的框架优秀, 也难怪 php 越来越像 Java 了.

  13. MySQL in

    select * from a where id in (select id from b );

    mysql会把in子查询转换成exists相关子查询,所以它实际等同于这条sql语句:select * from a where exists(select * from b where b.id=a.id );
    而exists相关子查询的执行原理是: 循环取出a表的每一条记录与b表进行比较,比较的条件是a.id=b.id .
    看a表的每条记录的id是否在b表存在,如果存在就行返回a表的这条记录。e
    xists查询有什么弊端?
    由exists执行原理可知,a表(外表)使用不了索引,必须全表扫描,因为是拿a表的数据到b表查。而且必须得使用a表的数据到b表中查(外表到里表中),顺序是固定死的。
    在5.5以上的版本, 是对 in 有优化, 速度会提升不少, 但是这种子查询,还是建议使用 inner join.
    如果是大批量现有的 id, 用 in 查询是比较适合的.

  14. 不定长方法传递未知数量个参数
    经常有这样的业务场景, 需要对一个不定参数的方法传参, 而需要传递多少个参数, 也是不定长的. 此时就可以使用call_user_func_array()
    例如: redis下, 对多个集合求交集 就这可以这样写:

    call_user_func_array([$redis, 'sUnionStore'], $keyList);

    如果 php 版本在 5.6以上, 还有更简单的写法:

    $redis->sUnionStore(...$keyList);
  15. .gitignore一些通配符:
    以斜杠“/”开头表示目录
    以星号“*”通配多个字符
    以问号“?”通配单个字符
    以方括号“[]”包含单个字符的匹配列表
    以叹号“!”表示不忽略(跟踪)匹配到的文件或目录
    例如保留 app 目录下的 index.php 文件, 忽略其它文件:

    /app/*
    !/app/index.php
    

你可能感兴趣的:(php)