-
Notifications
You must be signed in to change notification settings - Fork 5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
php 优化 #49
Comments
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在手分析服务器日志不愁 |
高质量代码三要素:可读性,可维护性,可变更性 代码质量评价:低耦合,高内聚(功能,元素除了职责任务,没有其他工作) https://segmentfault.com/a/1190000004355331 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面试之四:逻辑与算法 |
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 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 多的情况下,使用多线程时可以将代码并行。例如多次读整块的文件,或请求多个网络资源。 设置最大的允许客户端请求主体大小,在请求头域有“Content-Length”,如果超过了此配置值,客户端会收到413错误,意思是请求的条目过大,有可能浏览器不能正确的显示这个错误,设置为0表示禁止检查客户端请求主体大小,此参数对服务端的安全有一定的作用。 master 进程做的事情是 PHP环境初始化、事件监听(重启/重载、关闭、分发请求)、子进程状态 接logstash把日志数据给到es、或者是logstash把日志数据给Redis,Redis在给到es,最终再由kinbana展示出来。 Kibana 是为 Elasticsearch 设计的开源分析和可视化平台 netstat -antp | grep 80 |
nginx PHP前端优化 MySQL 并发 扣费 redis锁 离职原因,挑战性点,优势 缺点 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 里面定义了实现 峰值每秒请求数(QPS)QPS是每秒HTTP请求数量,并发连接数是系统同时处理的请求数量 数据库缓存层,数据库的负载均衡 读写分离 分库分表,分区nginx反向代理实现负载均衡 CDN加速,负载均衡 做业务分离,分布式存储 防盗链处理 php-fpm程序也如同nginx一样,需要监听端口,并且有master和worker进程。worker进程直接管理每一个php进程 处理php请求时,nginx的worker进程会将请求移交给php-fpm的worker进程进行处理,也就是最开头所说的nginx调用了php,其实严格得讲是nginx间接调用php。 建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。 三次握手耳熟能详,四次挥手 三次握手流程 |
function quick_sort($arr){
} protected static function getModel(){ 解压:tar -zxvf FileName.tar.gz var_dump(callBack(5, function ($n){ |
存储的值必须使用逗号分隔,如“2,15,694”,“14,54,112”,“544,145,354” 在事务的并发操作中可能会出现脏读,不可重复读,幻读。 脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。 information_schema.tables 查出科目id为10的,所有平均分排名前十的学生 rm log (等价: $find ./ -name “log” -exec rm {} ;)删除非空目录:rm -rf file目录 |
开启 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
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) { 的时候就完全没法规避这个问题
The text was updated successfully, but these errors were encountered: