lovecn / lovecn.github.io

个人记录
5 stars 5 forks source link

php 优化 #49

Open lovecn opened 6 years ago

lovecn commented 6 years ago

开启 php status 监控 看看 php 被请求次数 看是否被攻击 php-fpm 和 mysql 混在一台... 繁忙时,两者都在抢同一块资源,那必然是不行,

502 多,web 和 mysql 很可能那时都资源耗尽,既然已经分开了,新 mysql 这块,看来已经没啥问题,

php-fpm 负载高?最好开下 php 的 slow log,之后分析下日志,看看是哪些 php 慢。

再者,确认下你 php 足够新 (php7 or 更老)? php 的 opcache 加速有没有开? 遇到过 php 太老,且没有开任何加速功能,让 php-fpm 处理请求很慢, 被稍微密集访问时,php-fpm 就忙不过来,持续高 CPU 占用。

根据 slow log 针对性重写优化比较慢的一些 php 程序,也是个好办法。 php 5.6 已经内建了加速器 opcache 只需要开启即可 PHP 5.5 以后内建了 OpCache , OpCache 的加速原理是把编译后的 bytecode 存储在内存里面, 避免重复编译 PHP 所造成的资源浪费. 查看 phpinfo() 确保 php 本身编译时已开启 --enable-opcache 这类东西都是拿内存换速度的,默认记得都是给它 16M 内存的,一般也够了。 https://laravel-china.org/topics/301/using-opcache-to-enhance-the-performance-of-the-php-55-program 开启后运行几天先看看,若服务器资源充足,可以适当多给它点内存。 https://www.v2ex.com/t/465773#reply17 写一个 artisan command, 在 envoy 里, 更新代码后调用 Reset Cache opcache_reset(); 不用等10分钟再看效果了 直接放入口文件,跑一次下就清理了

PHP采集工具 https://github.com/jae-jae/QueryList/blob/master/src/QueryList.php

//$arr->传入数组   $key->判断的key值 二维数组根据某个元素去重
 function array_unset_tt($arr,$key){   
        //建立一个目标数组
        $res = array();      
        foreach ($arr as $value) {         
           //查看有没有重复项

           if(isset($res[$value[$key]])){
                 //有:销毁

                 unset($value[$key]);

           }
           else{

                $res[$value[$key]] = $value;
           }  
        }
sort($res); //sort函数对数组进行排序
        return $res;
    }

<?php
function array_unique_fb($array2D){
 foreach ($array2D as $k=>$v){
  $v=join(',',$v); //降维,也可以用implode,将一维数组转换为用逗号连接的字符串
  $temp[$k]=$v;
 }
 $temp=array_unique($temp); //去掉重复的字符串,也就是重复的一维数组 
 foreach ($temp as $k => $v){
  $array=explode(',',$v); //再将拆开的数组重新组装
  //下面的索引根据自己的情况进行修改即可
  $temp2[$k]['id'] =$array[0];
  $temp2[$k]['title'] =$array[1];
  $temp2[$k]['keywords'] =$array[2];
  $temp2[$k]['content'] =$array[3];
 }
 return $temp2;
}
function assoc_unique($arr, $key,$k2) { 
    $tmp_arr = array();
    foreach ($arr as $k => $v) {
        if (in_array($v[$key].$v[$k2], $tmp_arr)) {//搜索$v[$key]是否在$tmp_arr数组中存在,若存在返回true
            unset($arr[$k]);
        } else {
            $tmp_arr[] = $v[$key].$v[$k2];
        }
    } 
    sort($arr); //sort函数对数组进行排序
    return $arr;
}
echo '<pre>';print_r(assoc_unique($result,'a','b'));
function BinaryQuery(array $container, $search)
{
    $top = count($container);
    $low = 0;
    while ($low <= $top) {
        $mid = intval(floor(($low + $top) / 2));
        if (!isset($container[$mid])) {
            return '没找着哦';
        }
        if ($container[$mid] == $search) {
            return $mid;
        }
        $container[$mid] < $search && $low = $mid + 1;
        $container[$mid] > $search && $top = $mid - 1;
    }
}
/**
 * 递归版 二分查找
 * 数组一定记得要先排序  取中位值的时候,需要注意整数加法是否会溢出的问题  如果出现待查找元素有重复的元素,需要确定返回的是哪一个元素的下标。 溢出的问题用(right-left)/2+left 就解决 mid = (low + high) >>> 1;
 * @param array  $container
 * @param        $search
 * @param int    $low
 * @param string $top
 * @return int|string
 */
function BinaryQueryRecursive(array $container, $search, $low = 0, $top = 'default')
{
    $top == 'default' && $top = count($container);
    if ($low <= $top) {
        $mid = intval(floor($low + $top) / 2);
        if (!isset($container[$mid])) {
            return '没找着哦';
        }
        if ($container[$mid] == $search) {
            return $mid;
        }
        if ($container[$mid] < $search) {
            return BinaryQueryRecursive($container, $search, $mid + 1, $top);
        } else {
            return BinaryQueryRecursive($container, $search, $low, $mid - 1);
        }
    }
} //https://github.com/PuShaoWei/arithmetic-php/blob/master/package/Query/BinaryQuery.php

PHP 探测任意网站密码明文/加密手段办法: md5('240610708') == md5('QNKCDZO') https://www.v2ex.com/t/188364 把你的密码设成 0x1234Ab,然后退出登录再登录,换密码 1193131 登录,如果登录成功,那么密码绝对是明文保存的没跑。 php > var_dump('0e1' == '0e2'); bool(true)

“数字 e 数字”格式的字符串有时被作为数字,有时被作为字符串

php > echo intval('1e10'); 1 php > echo '1e10' + 0; 10000000000

但是混蛋就混蛋在 (string) == (string) 时也会做这个转换,这就没法搞了(更何况都是字符串还要这么转换,也会降低性能)

比方说 switch((string)$s) { 的时候就完全没法规避这个问题 s

lovecn commented 6 years ago

Linux下Shell的for循环语句 https://www.cnblogs.com/EasonJim/p/8315939.html

#!/bin/bash  

for((i=1;i<=10;i++));  
do   
echo $(expr $i \* 3 + 1);  
done  
for i in {1..10}  
do  
echo $(expr $i \* 3 + 1);  
done  
for file in $(ls *.sh)  
do  
echo $file is file path \! ;  
done  

Nginx配置负载均衡
http{
    upstream cluster{
        server srv1;
        server srv2;
        server srv3;
    }
    server{
        listen 80;
        location / {
            proxy_pass http://cluster;
        }
    }
}

https://segmentfault.com/a/1190000009745139 shell在手分析服务器日志不愁

lovecn commented 6 years ago

高质量代码三要素:可读性,可维护性,可变更性 代码质量评价:低耦合,高内聚(功能,元素除了职责任务,没有其他工作) https://segmentfault.com/a/1190000004355331 curl_multi_exec有一个好处是非阻塞,你可以先发出请求,然后先处理别的事情,再回来处理curl后续工作,一定程度上可以提高cpu利用率 如果你的接口本身格式比较简单,推荐用fsockopen做一个简单封装,这样可以直接做成nonblock的,而不需要引入curl_multi 用xdebug/xhprof看看瓶颈到底在哪儿……一般来说,瓶颈都在IO上,包括接口的网络IO和数据库IO 使用group by和order by取每个分组中日期最大一行数据

SELECT t.*
FROM (select * from `monitor_company_event` order by `create_time` desc limit 10000000000) t
GROUP BY t.company_name,t.row_key,t.event_subType 
取每条记录中,时间最大的一条记录
select a.* from test a,
(select aid, max(day) max_day from test group by aid) b
where a.aid = b.aid and a.day = b.max_day
order by a.install desc
SELECT * FROM (SELECT * FROM posts ORDER BY dateline DESC) GROUP BY  tid ORDER BY dateline DESC LIMIT 10
select a.* from tb a inner join (select name , max(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by

#select * from t_assistant_article as a, (select max(base_id) as base_id, max(create_time) as create_time from t_assistant_article as b group by base_id ) as b where a.base_id=b.base_id and a.create_time = b.create_time
#select base_id,max(create_time), max(article_id) as article_id from t_assistant_article as b group by base_id 
select * from (select * from t_assistant_article order by create_time desc) as a group by base_id

https://segmentfault.com/a/1190000011871119 PHP面试之四:逻辑与算法 http://www.manongjc.com/article/1082.html
PHP常见算法-面试篇 http://www.cnblogs.com/zswordsman/p/5824599.html https://www.zhihu.com/question/25002833 程序员简历应该怎么写?https://segmentfault.com/a/1190000012971148 https://segmentfault.com/a/1190000010600318 SegmentFault 技术周刊 Vol.31 - 码农也要学算法 https://segmentfault.com/a/1190000006950447 SegmentFault 技术周刊 Vol.6 - 面试那些事儿 https://segmentfault.com/a/1190000012770931 笔试面试 https://segmentfault.com/a/1190000005032279 10个值得深思的PHP面试问题

lovecn commented 6 years ago

Redis 支持 pipeline 管道技术,一次 请求/响应 服务器能实现处理并响应多个请求。这样就可以将多个命令同时发送到服务器,不等待回复,直接在最后获取多个结果。 php代码的执行是单线程的 当有多个客户端同时发送请求时(并发),web server就会为每个请求开启一个php-fpm进程去执行php代码。请求执行过后,对应的php-fpm进程被销毁,内存得以释放。 每次访问php,就建立一个PHP进程,当然也会建立至少一个PHP线程。 PHP使用pcntl来进行多进程编程PHP中使用pthreads来进行多线程编程 php-fpm使用多进程模型,每个进程只有一个线程,每个线程只能处理一个客户端访问。在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能 当数据库执行select for update时会获取被select中的数据行的行锁,因此其他并发执行的select for update如果试图选中同一行则会发生排斥(需要等待行锁被释放),因此达到锁的效果https://www.cnblogs.com/phpper/p/6716248.html select for update获取的行锁会在当前事务结束时自动释放,因此必须在事务中使用。在数据库内部update同一行的时候是不允许并发的,即数据库每次执行一条update语句时会获取被update行的写锁,直到这一行被成功更新后才释放。 product_lock_key 为票锁key 当product_key存在于redis中时,所有用户都可以进入下单流程。 当进入支付流程时,首先往redis存放sadd(product_lock_key, “1″),如果返回成功,进入支付流程。如果不成,则说明已经有人进入支付流程,则线程等待N秒,递归执行sadd操作。 https://www.cnblogs.com/walblog/articles/8476579.html redis能用的的加锁命令分表是INCR、SETNX、SET https://www.cnblogs.com/huanongying/p/7021555.html MySQL的四种事务隔离级别

MyISAM锁的粒度是表级,而InnoDB支持行级锁定 MyISAM支持全文类型索引,而InnoDB不支持全文索引。yISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦   InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行 MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快 Redis使用的是单进程,所以在配置时,一个实例只会用到一个CPU https://www.cnblogs.com/yjf512/archive/2017/03/22/6597814.html redis lua Redis::eval($script, "my:lock", $token) 数组常被当作堆栈(后进先出:LIFO)与队列(先进先出:FIFO)结构来使用。PHP提供了一组函数可以用于push与pop(堆栈)还有shift与unshift(队列)来操作数组元素。堆栈与列队在实践中应用非常广泛。 https://www.cnblogs.com/glory-jzx/archive/2012/04/25/2469163.html

使用多线程主要是因为它在执行效率上有很大优势。由于线程是操作系统能够进行调度的最小单位 代码中 I/O 多的情况下,使用多线程时可以将代码并行。例如多次读整块的文件,或请求多个网络资源。 多线程能充分利用 CPU,所以有多处大计算量代码时,也可以使用多线程使他们并行执行 PHP需要安装 pthread 扩展线程安全是编程中的术语,指某个函数、函数库在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成。https://www.cnblogs.com/zhenbianshu/p/7978835.html 同步的请求拆分为多个线程异步调用,以提升程序的运行效率。 https://www.cnblogs.com/kluan/p/5934228.html 常见的对称加密算法有:des/aes/3des. 常见的非对称加密算法有RSA/DSA: openssl扩展使用openssl加密扩展包,封装了多个用于加密解密相关的PHP函数,极大地方便了对数据的加密解密 require是加载进来就执行,而include是加载进来在需要的时候执行,而它们的_once结构都是表示在写多次的时候只执行一次。 执行命令如下 nohup command >/dev/null 2>&1 & 这样,就可以放心的等待进程运行结果了。 PHP的多进程,我们需要两个扩展 pcntl和 posix

设置最大的允许客户端请求主体大小,在请求头域有“Content-Length”,如果超过了此配置值,客户端会收到413错误,意思是请求的条目过大,有可能浏览器不能正确的显示这个错误,设置为0表示禁止检查客户端请求主体大小,此参数对服务端的安全有一定的作用。 http { client_max_body_size 1m; #默认值是1m }单个进程允许的客户端最大链接数worker_connections 20480; worker进程数 worker_processes 4; cpu核数*2的进程数gzip on; #开启gzip压缩功能 限制禁止解析指定目录下的指定程序deny all; 禁止访问上传资源目录下的PHP、shell、perl、Python程序文件 location /admin/ { return 404; } 限制网站来源IP访问 location ~ ^/docker/ { allow 202.111.12.211; deny all; } https://youngperson.github.io/blog/#/posts/17 浏览器输入URL->Nginx(从配置文件中加载nginx的fast-cgi模块)->php-fpm(fastcgi的进程管理器) 先到php-fpm的master进程(负责监听端口,接收Nginx的请求,据子进程的状态将请求分配给子进程去处理)->worker进程负责处理请求 worker 进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。

master 进程做的事情是 PHP环境初始化、事件监听(重启/重载、关闭、分发请求)、子进程状态 接logstash把日志数据给到es、或者是logstash把日志数据给Redis,Redis在给到es,最终再由kinbana展示出来。 Kibana 是为 Elasticsearch 设计的开源分析和可视化平台 netstat -antp | grep 80 lsof -i:80

lovecn commented 6 years ago

nginx PHP前端优化 MySQL 并发 扣费 redis锁 离职原因,挑战性点,优势 缺点 PHP扩展 redis更新缓存 swoole 高兵发 PHP异步 多进程 架构师所需技能,职业方向,文档,数据量,代码精简, 边界考虑 微服务 带队 0bug 原型 设计 redis同时使用了惰性删除与定期删除  HTTP 协议有一个缺陷:通信只能由客户端发起 WebSocket 服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息#!/bin/bash for ((COUNT = 1; COUNT <= 10; COUNT++)); do echo $COUNT sleep 1 done Websocket是一个持久化的协议,相对于HTTP这种非持久的协议来说 $this->master = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) PHP爬取并解析页面元素 https://github.com/samacs/simple_html_dom Mysql 数据类型隐式转换规则 select from convert_test where areacode=0001 and period>='20170511' and period<='20170511';areacode字段是字符串类型的,查询的时候传入的是0001,这里0001被Mysql当做了整数处理为1,Mysql检测到areacode这个字段的查询类型是整型,就会全表扫描,将所有行的areacode转换成整型,然后在做查询处理。主从复制就是将主库中的数据复制到从库中。从库可以有多个, 在主库上把数据的变更记录到Binary Log中 从库将主库的日志复制到自己的Relay Log中 从库读取Relay Log中的事件,将其重现在数据库中 悲观锁的特点是先获取锁,再进行业务操作,即“悲观”的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作。 通过常用的select … for update操作来实现悲观锁。乐观锁在数据库上的实现完全是逻辑的,不需要数据库提供特殊的支持。一般的做法是在需要锁的数据上增加一个版本号,或者时间戳UPDATE SET data = new_data, version = new_version WHERE version = old_versionif (updated row > 0) { // 乐观锁获取成功,操作完成 } else { // 乐观锁获取失败,回滚并重试 }在数据库内部update同一行的时候是不允许并发的,即数据库每次执行一条update语句时会获取被update行的写锁,直到这一行被成功更新后才释放。 数据中提供的锁机制(行锁、表锁、排他锁、共享锁) 防止更新丢失,并不能单靠数据库事务控制器来解决,需要应用程序对要更新的数据加必要的锁来解决 在修改数据前检测最新版本号是否等于先前取出的版本号,如果是,则修改,同时把版本号+1;否则要么回滚,要么重新执行事务。http://www.hollischuang.com/archives/934 哈希函数的基本思想是对数据进行运算得到一个摘要 CAS(check and set)方式 一言以蔽之,就是“版本号”,在数据库领域也叫乐观锁  const、eq_reg、ref、range、index和ALL。 使用long-slow-queries记录较慢查询,分析优化.不支持事务,提供高速存储,检索以及全文搜索能力.基于表的锁,并发更新数据会出现严重性能问题.MyISAM 工厂模式,工厂方法或者类生成对象,而不是在代码中直接new。 观察者模式(Observer),当一个对象状态发生变化时,依赖它的对象全部会收到通知,并自动更新。  适配器模式将各种截然不同的函数接口封装成统一的API。已经创建好的对象,挂在到某个全局可以使用的数组上 get set 工厂模式,工厂方法或者类生成对象,而不是在代码中直接new。 如果某个类在很多的文件中都new ClassName(),那么万一这个类的名字 发生变更或者参数发生变化,如果不使用工厂模式,就需要修改每一个PHP * 代码,使用了工厂模式之后,只需要修改工厂类或者方法就可以了。PHP中的数据库操作有MySQL,MySQLi,PDO三种,可以用适配器模式统一成一致,使不同的数据库操作 如果新增加一种用户类型,只需要增加一种策略就可以。其他所有的地方只需要使用不同的策略就可以。 function setStrategy(UserStrategy $strategy){ $this->strategy=$strategy; }实现依赖倒置和控制反转 如果要替换某个类,只需要提供一个实现了该接口的实现类,通过修改一行代码即可完成替换。

myisam innodb 区别 事物 keys * 100万数据 将查询的SQL语句md5()得到它的 hash值作为key,结果数组作为值写入memcached在内存存储 count 库存量, 秒杀 1000 台每人抢单主要在内存操作,速度非常快,抢到 count < =1000 的号人,得一个订单号,这时再去另一个页面慢慢支付。 如果要说内存使用效率,使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。当然,这和你的应用场景和数据特性有关。

trait就是解决多继承的问题 在一个类中使用Trait,就相当于这个类也有了Trait中定义的属性和方法。Traits的使用场景是如果多个类都要用到同样的属性或者方法,这个时候使用Traits可以方便的给类增加这些属性或方法,而不用每个类都去继承一个类,如果说继承类是竖向扩展一个类,那么Traits是横向扩展一个类,从而实现代码复用。 trait的出现就是一种解决需要多继承场景的方式。多继承的好处就是让一个类继承多个父类的功能,虽然这违反了类单一职责原则 trait 里面定义了实现 interface 只是声明 trait Dog{} Trait中的方法或属性会覆盖 基类中的同名的方法或属性,而本类会覆盖Trait中同名的属性或方法 trait看上去更像是为了代码的复用而写的一个小插件,它类似于include,可以用use放在类中间,让trait里面定义的方法作为class的一部分,本身不能直接实例化。 interface简单来讲类似一个协议,是老板下达的任务。你要继承的话,必须满足这个协议,也就是完成老板下达的任务。当前类>Trait>父类 把重复的方法拆分到一个文件,通过 use 引入以达到代码复用的目的。memcache cas fpm master 如何管理worker 数据库锁 如果需要缓存的数据只是key-value 这样简单的结构时,采用Memcache,足够稳定可靠。如果有持久化需求、存储、排序等一系列复制操作时,或者对数据结构和处理有高级要求的应用,选择Redis。hash 加密 md5

峰值每秒请求数(QPS)QPS是每秒HTTP请求数量,并发连接数是系统同时处理的请求数量 数据库缓存层,数据库的负载均衡 读写分离 分库分表,分区nginx反向代理实现负载均衡 CDN加速,负载均衡 做业务分离,分布式存储 防盗链处理 php-fpm程序也如同nginx一样,需要监听端口,并且有master和worker进程。worker进程直接管理每一个php进程 处理php请求时,nginx的worker进程会将请求移交给php-fpm的worker进程进行处理,也就是最开头所说的nginx调用了php,其实严格得讲是nginx间接调用php。 建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。 三次握手耳熟能详,四次挥手 三次握手流程 客户端发个请求“开门呐,我要进来”给服务器 服务器发个“进来吧,我去给你开门”给客户端 客户端有很客气的发个“谢谢,我要进来了”给服务器 四次挥手流程 客户端发个“时间不早了,我要走了”给服务器,等服务器起身送他 服务器听到了,发个“我知道了,那我送你出门吧”给客户端,等客户端走 服务器把门关上后,发个“我关门了”给客户端,然后等客户端走(尼玛~矫情啊) 客户端发个“我知道了,我走了”,之后自己就走了 PHP的异步、并行、高性能网络通信引擎 编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务内存使用情况:info memory HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。 HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。 PHPNG代码合并到PHP7中,速度是PHP 5的两倍 使用DateTime类。。。 使用64位操作系统 $str_time = '2100-10-02'; function newStrToTime($str_time) { $result = strtotime($str_time); if(empty($result)) { $date = new DateTime($str_time); $result = $date->format('U'); } return $result; }

lovecn commented 6 years ago

function quick_sort($arr){ $len = count($arr); if($len <= 1) return $arr;

$base = current($arr);
$left_arr = array();
$right_arr = array();

for($i=1; $i<$len; $i++){
    if($arr[$i] <= $base) $left_arr[] = $arr[$i];    
    if($arr[$i] > $base) $right_arr[] = $arr[$i];    
}

$left_arr = quick_sort($left_arr);
$right_arr = quick_sort($right_arr);
return array_merge($left_arr, array($base), $right_arr);

} function binSearch($arr,$search){ $height=count($arr)-1; $low=0; while($low<=$height){ $mid=floor(($low+$height)/2);//获取中间数 if($arr[$mid]==$search){ return $mid;//返回 }elseif($arr[$mid]<$search){//当中间值小于所查值时,则$mid左边的值都小于$search,此时要将$mid赋值给$low $low=$mid+1; }elseif($arr[$mid]>$search){//中间值大于所查值,则$mid右边的所有值都大于$search,此时要将$mid赋值给$height $height=$mid-1; } } return "查找失败"; } //二分查找递归实现 function binSearch2($arr,$low,$height,$k){ if($low<=$height){ $mid=floor(($low+$height)/2);//获取中间数 if($arr[$mid]==$k){ return $mid; }elseif($arr[$mid]<$k){ return binSearch2($arr,$mid+1,$height,$k); }elseif($arr[$mid]>$k){ return binSearch2($arr,$low,$mid-1,$k); } } return -1; } //顺序查找 function seqSearch($arr,$k){ foreach($arr as $key=>$val){ if($val==$k){ return $key; } } return -1; } 在一次请求响应中,无论函数调用多少次,静态变量的初始化只会执行一次 使用PHP官方提供的工具phpize来添加  self非动态的,在哪个类中存在,self就代表哪个类 static是动态的,根据具体哪个类调用,static指向那个类 spl_autoload_register(function ($class) { include 'classes/' . $class . '.class.php'; }); 先spl_autoload_register()起效果,如果没有这个函数的话,那么再找__autoload()函数 class Car { public static function model(){ self::getModel(); }

protected static function getModel(){ echo "This is a car model"; } }调用某 facade 方法时,你得找到其 provider ,再找到真实 instance 才能看到提供了哪些方法,都有什么参数等等。你得写一个 facade 模板文件,在 getFacadeAccessor 里返回一个唯一标识(取名),然后在某 provider 里注册一下,然后再加到配置文件的 aliases 中 其目的就是为了隐藏模块的复杂性 unset($Person);  call(),在对象中调用一个不可访问方法时调用 sleep(),执行serialize()时,先会调用这个函数serialize($person); wakeup(),执行unserialize()时 invoke(),调用函数的方式调用一个对象时的回应方法__autoload(),尝试加载未定义的类 Middleware

解压:tar -zxvf FileName.tar.gz 压缩:tar -zcvf FileName.tar.gz DirName pkill 进程名 :批量删除指定进程名 export PATH=$PATH:/root/demo 查看gzip压缩文件,而不需要gunzip它gzcat filename awk -F':' '{ print $1 }' /etc/passwd wc file 告诉你一个文件中有多少行,多少单词和多少字符 sort example.txt | uniq -c killall processname 用括号来表示数组,数组元素用"空格"符号分割开 array_name=(value0 value1 value2 value3) ${array_name[n]} for i in "$*"; do echo $i done val=expr 2 + 2 if [ $a == $b ] 1、3年以上PHP语言为主的大规模线上研发经验、所负责模块可以提供1000QPS以上的服务能力; 2、精通一个存储系统、如Mysql、Redis、Mongo等; 3、对于服务化、RPC、配置管理等有深刻的理解; 4、熟悉Go、Node.js等语言一种或多种的优先。 电商超卖 redis 计数 队列 之前做个电商的,可以问下他一个订单从下单到评价完成要经过几个状态管理;如果客户在中间某一步取消订单,应该怎么回退;秒杀程序,商品数量怎么控制;优惠券,满减券,以及其他优惠叠加的时候怎么去算价格,多个商品怎么拆单;这些问题才是最考验人的https://laravel-china.org/articles/9983/over-the-past-few-days-i-have-interviewed-100-topics-for-more-than-20-companies#reply77 面试 https://github.com/OMGZui/noteBook mysql的四个特性,原子性、一致性、隔离性、持久性,事务可以理解成一次操作要不完成要不失败。 master作为主分支,dev作为开发分支,bug_fix分支作为bug分支 get是从服务器取资源、post是新建资源、put是 更新完整资源、patch更新部分资源、delete是删除资源 select max(t_id) from test where type_id=1 and plat_id=1max函数会导致全表扫描,效率会很低可以使用order by加limit进行优化 给t_id加索引,还有(type_id/plat_id)联合索引,order by 并不能避免全表扫描。进程可以有多个线程,在php中yield可以实现协程 php7速度有很大提升,也有很多新特性,比如标量类型声明、返回类型声明 命名空间、Trait、自动加载都是现代php所需要的 深入php、扩展技术栈 《Modern PHP》《PHP核心技术和最佳实践》《PHP the right way》 user用户表、role角色表、perm权限表、role-user用户角色关联表、role-perm角色权限关联表这边技术团队是怎样的+有没有技术分享+我加入公司将做什么$client_ip = sprintf('%u', ip2long($client_ip)); //64位系统无压力 $ext = array_pop(explode('.',parse_url($url)['path'])); $near = array_reduce($data, function($a, $b){ return abs((time() - strtotime($a))) < abs((time() - strtotime($b))) ? $a : $b; });离当前时间最近的那个时间 function callBack($parameter, $fn) { return $fn($parameter); }

var_dump(callBack(5, function ($n){ return $n * $n; }));

lovecn commented 6 years ago

存储的值必须使用逗号分隔,如“2,15,694”,“14,54,112”,“544,145,354” 现在如果需要查找出type中含有54的记录时,请使用find_in_set(str,strlist)函数,仅MySQL才有,一种精确匹配,只能使用逗号分隔 SELECT  FROM user WHERE FIND_IN_SET('54',type); select  from product order by id in (4,2,8) desc,user_total desc 商品按销量排序,并要把指定几个商品顶置最前面 select a. from pro_sale as a inner join (select pro_class,max(sale_date) as sale_date from pro_sale group by pro_class) as b on a.pro_class = b.pro_class AND a.sale_date = b.sale_date order by pro_class 获取最新日期的商品销售情况 insert into news(new_title, new_abstr, new_code, update_time, create_time) values('你是好','我是谁',MD5(CONCAT('你是好','我是谁'))) on DUPLICATE key Update update_time=now(), create_time=now() https://segmentfault.com/a/1190000013328525 https://segmentfault.com/a/1190000010467213 update product as a, product as b set a.original_price=b.price, a.price=b.original_price where a.id=b.id; 2个字段的值交换 ##如果你想把某些数据放在最开头或最后尾,可以这样写:## select from tb order by id in(4,2,6) desc,age desc //开头 select * from tb order by id in(4,2,6),age desc //结尾 DELETE a,b FROM ta AS a JOIN tb AS b ON a.id = b.id WHERE a.id>5;

在事务的并发操作中可能会出现脏读,不可重复读,幻读。 脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。 比如A转账给B100元,然后还没有提交成功,这个时候,你用B用手机付款,这个事务读取到这个100了。然后就行了扣款,B读到的这个数据就是脏数据。因为A没有提交,可能会撤销。主键索引、唯一索引、普通索引、全文索引、组合索引 var_dump("0x123" == "291"); 使 PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务sprintf('%u',ip2long(ip()); https://xianyunyh.gitbooks.io/php-interview/%E9%9D%A2%E8%AF%95/%E7%AC%94%E8%AF%95%E9%A2%98.html 优化MYSQL的方法 ​ 数据库字段冗余,增添索引、优化sql、分库分表

information_schema.tables 查出科目id为10的,所有平均分排名前十的学生 select avg(score) as avg_number from score group by uid subject_id having (subject_id =10 ) limit 10 跳槽的目的,正常来说应该是加薪、晋级、换行 “追求更好的职业发展 是贵司通过猎头联系到我,我正好觉得这个职位更适合我 贵公司这个职位是新增还是接手离职员工的任务 贵公司一般的团队是多大,几个人负责一个产品或者业务?了解公司的技术栈 你觉得我有哪些需要提高的地方 ?可以给我点建议吗?

 rm log (等价: $find ./ -name “log” -exec rm {} ;)删除非空目录:rm -rf file目录 cp (复制目录:cp -r )递归子目录修改: chown -R tuxapp source/ find . -type d -print //只列出所有目录wc -l file // 统计行数 sort unsort.txt | uniq sort -nrk 1 data.txt 指定按第N列排序 #统计日志中访问最多的10个IP 数据流处理awk awk '{a[$1]++}END{for(i in a)print a[i],i|"sort -k1 -nr|head -n10"}' access.log grep "class" . -R -n # 在多级目录中对文本递归搜索 sed 's/text/replace_text/g' file 替换 awk '$3 >0 { print $1, $2 * $3 }' emp.data 超过零小时的员工的姓名和工资(薪资乘以时间) $0 表示整行, 查看访问前十个ip地址 awk '{print $1}' |sort|uniq -c|sort -nr |head -10 access_log cat access.log |grep '04/May/2012'| awk '{print $11}'|sort|uniq -c|sort -nr|head -20 redis是一个开源的支持多种数据类型的key=>value的存储数据库。支持字符串、列表、集合、有序集合、哈希五种类型 netstat -a netstat -l cat /etc/passwd | awk -F ":" '{print $3,$4}' cat /etc/passwd | awk -F ":" '{if($3 > 100) {print $0}}' 不支持事务、也不支持外键,优势是访问速度快 MyISAM的表存储成3个文件。文件的名字与表名相同。拓展名为frm、MYD、MYI。其实,frm文件存储表的结构;MYD文件存储数据,是MYData的缩写;MYI文件存储索引