lamp review (add)

来源:互联网 发布:大数据特征 5v 编辑:程序博客网 时间:2024/06/08 19:14

大纲: 
高级( 架构|代理 缓存 版本 同步 测试 队列 |  运维 数据)

架构(mvc yii  web)
linux (运维监控+ab测试+sphinx搜索+(数据+文件+代码)同步+负载均衡+异步) 命令+config+shell+api
mysql(知识 配置项 调试项)  库表列索引和分区的curd + pdo 防注入                 
php(算法 语法 配置  代码重构+优化  安全  设计模式  框架)   排序+小代码段
服务端(apache nginx  varnish)
缓存(redis memcache http) 
前端(html javascript jquery ) 
http    

mysql sum
1.概述 334;
2.性能 因果关系;
3.数据类型  4种;
4.索引 结构 类型  三星评价;
5.优化 3个方面+5个流程+8个配置项;高级:分区+缓存+字符集+存储过程
6.复制:方法-方式-方案-线程-结构-原则 | 流程-问题(库-日志-复制-数据)-文件-配置;
7.扩展:原因 方式 演变 | 分片-规则 方式 工具 | 负载-方法 优化;
8.可用性:提高实效+缩短恢复+转移
9.应用+缓存
10.硬件:cpu 内存 硬盘(固态)
11备份+恢复

config:tool explain show 4 log 4 mysiam 6 innodb 5 skip 3 cache size 6  比率:8
 【终结小结】
连接-- max_connections + connection
索引-- Key_readskey + buffer_size
临时-- Created_tmp_disk_tables + tmp_table_size
查询-- 碎片率-bock/利用率-cache/命中率-hit+ query_cache
扫描-- Handler_read_rnd_nextread + read_buffer_size打开-- Open_tables + table_cache
缓冲-- Threads_created + thread_cache_size
表--innodb

缓存 summemcache  redis  http
=========================================================
php sumnet  stream  url  http  dir  file  math  preg  hash   session date  variable array  string
php.ini sum--常用--错误日志  --文件上传--session--长时间运行脚本--安全
PHP安全 sum  session  html  form mysql password  过滤输入和避免输出 
code review sum1.代码质量 phploc phpcpd phpmd      PHPCpd  代码复制    PHPmd  代码建议 2.代码标准 phpcs3.代码文档 phpdoc4.代码效率xhprof

重构方法
目的:可读即可写
方法:提取-抽取(统一) 合并-内联(同一)  
种类:函数 对象 数据 表达式  方法  继承
--重新组织函数:
--对象间迁移:
--重新组织数据:
--简化条件表达式:
--重构方法:
--继承
class sum对象就是数据 | 类关键字 | 设计模式类型
算法 sum
复杂度          
—>区别 数组/链表(单双向)          
—>递归(种类)                       
—>堆/栈+队列(顺序)/集合(唯一)/哈希表(分布)                       
—>二叉树(遍历+平衡+旋转)/图(顶点和边+遍历)数据结构-->复杂度
遍历:排序  图   压缩
php:排序冒泡 插入 快排 选择 |  变量与引用  垃圾回收
====================================================

html sum1.元信息标签 2.表单 3.显示 4.选择器 5.框架 
javascript sum优化  加载 语法   方法 
jquery sum元素  | 单个值  结果集 |移动|复制、删除和创建 |工具 |事件|效果  |$.ajax:url  type:  timeout  async  cache  data  dataType  beforeSend  complete  success error  contentType  dataFilter global  ifModified  jsonp
js 跨脚本小结:1、json数据格式 2、js跨脚本执行特性 3、json与jsonp的分别 4、$.getJSON vs $.ajax 5、数据安全与优化搜索等
=========================================================================
apache sum全局 容器 认证 日志 cgi 负载
nginx_conf sum并发配置   工作模式   Http请求  服务器    特点
=========================================================
http sum报文组成3,连接过程3,加密4, 状态码5, robot3,cookie3,encode3,dns3,日志2,代理作用2,缓存与新鲜度(客户端+服务端,命中和设置)检测,
========================================================
web架构 sum:演化|模式|要素|网站性能|数据可用|集群伸缩|功能扩展|网络安全|网站架构|架构师| 
运维工具汇总
操作系统:Centos※,Ubuntu,Redhat※,suse,Freebsd
网站服务:nginx※,apache※,lighttpd,php※,tomcat※,resin
※数据   库:MySQL※,Mysql-proxy,MariaDB,PostgreSQL
代理相关:lvs,keepalived,haproxy,nginx,apache,heartbeat(此行都是※)
网站缓存:squid※,nginx※,varnishNOSQL库:memcached※,memcachedb,TokyoTyrant※,MongoDB※,Cassandra※,redis※,CouchDB
存储相关:Nfs※,Moosefs(mfs)※,Hadoop※,glusterfs※,lustre,FastDFS版本管理:svn※,git※
监控报警:nagios※,cacti※,zabbix※,munin,hyperic,mrtg
域名解析:bind※,powerdns,dnsmasq※
同步软件:rsync※,inotify※,sersync※,drbd※,csync2,union,lsyncd,scp※批量管理:ssh+rsync+sersync※,Saltstack※,expect※,puppet※,cfengine虚拟   化:kvm※,xen※
云计   算:openstack※,cloudstack
内网软件:iptables※,zebra※,iftraf,ntop※,tc※,iftop
邮件软件:qmail※,posfix※,sendmail远程拨号:openvpn※,pptp,openswan※,ipip※
统一认证:openldap(可结合微软活动目录)※
队列工具:ActiveMQ,RabbitMQ※,Metaq,MemcacheQ,Zeromq
打包发布:mvn※,ants※,jenkins※
测试软件:apacheab,smokeping,siege,JMeter,Webbench,LoadRunner(此行都是※)
日志相关:syslog,rsyslog,Awstats,flume logstash scribe kafka
DB代理:mysql-proxy,amoeba(更多还是程序实现读写分离)
搜索软件:Sphinx,Xapian(大公司会自己开发类似百度的小规模内部搜索引擎)

数据+产品
数据:数据收集-->数据处理—>数据分析 ->数据展现-> 报告编写
统计:主要包括广告统计和网站统计(停留时间 跳出率 退出率 转化率参与度),生成相应图表
产品:
信息架构:组织+标签+导航+搜索+受控词表
设计文件:网页+组件+群组+链接
工具:visio+dreaweaver


+new :


http+url解析
linux+shell脚本
data+mysql_dba思想+nosql_key设计
php+profile性能 +web secure 安全
ec+module功能要点


1.http协议 :请求+响应+url解析
请求:GET  POST  HEAD PUT  DELETE  OPTIONS TRACE CONNECT
请求头: cookie from host if-modified-since refer user-agent charset encoding  language connection authorization content-lenght
响应:100 200 301 302 304 401 403 403 502 054
响应头:allow encoding length type date expires last modified location refresh
实体头:allow encoding language length location md5 range type expires last-modified

url:解析|跨域
二级域名:泛解析(rewrite preg)+共享(session)

取得对象实例:实例化-->类-->方法-->参数
call_user_func_array

func_get_args()     这个函数返回的是包含当前函数所有参数的一个数组
func_get_arg()       函数返回的是指定位置的参数的值
func_num_args()  这个函数返回的是当前函数的参数数量 返回的是数字
 
结果:http://localhost/aaa/index.php?p=222&q=333
$_SERVER['QUERY_STRING'] = "p=222&q=333";
$_SERVER['REQUEST_URI']  = "/aaa/index.php?p=222&q=333";
$_SERVER['SCRIPT_NAME']  = "/aaa/index.php";
$_SERVER['PHP_SELF']     = "/aaa/index.php";
$_SERVER['argv'][0] = "p=222&q=333"

seo爬虫:url 待抓取列表 按优先级抓取  抓取的无限空间
黑网站:挂链接 useragent  跳转 增加页面 偷数据
P3P:; b域下访问a,b设置了a的cookie



2.PHP:原理 算法 语法 tool 框架 +性能
原理:结构体的结构,决定了引用产生的相关问题,写时拷贝和引用计数和引用传值
算法:排序 二分查找 哈希 trie树 反转数组  数据压缩  左右值无限分类 任务调度
 
语法:
empty() ,”"、0、”0″、NULL、FALSE、array()、var $var ==>true ,非空非零的值为false ;
isset() 没有变量 或有变量但为null ==>false ,有变量不为null==>true
global:global 改变外部会改变内部  改变内部不会改变外部
$_GLOBALS 外部就是内部,所以改变外部就是改变内部,改变内部也改变外部
define:__FUNCTION__ __FILE __  __LINE__  __CLASS__  __METHOD__  DIRECTORY_SEPARATOR
sprintf  curl  $_SERVER
preg_match("/^[w-.]+@[w-]+(.w+)+$/", $email);
preg_match("/^(((d{3}))|(d{3}-))?13d{9}$/", $mobile);
preg_match("/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/", $ip)

tool:excel+mail + upload + validate + cache  +filter + codetrans + (date  page chart  secede   ftp log)


MVC:
model : model业务层(商品 用户  订单...)==>数据操作逻辑层(curd)==>数据操作实现层(mysql mysqi pdo)
control : mod_rewrite开启 => rewrite规则  => .htaccess使用   => url静态化   => route路由解析  => control分发   
view : 加载变量值 $_output[]=$values  加载显示页 include_once($templates)   跟踪信息(trace 系统函数显示)   
框架:shopnc: route(路由) core(公共方法) base(基类) goods(业务类) ,如果不存在就是__call


性能优化:
【1】在循环中判断时,数值判断使用恒等要比等于高效。
【2】在数组中,数组下标是字母时一定要加上单引号或双引号。因为$row['id']的效率是$row[id]的7倍。
【3】不要使用“@”去屏蔽错误输出。用@屏蔽错误消息的做法非常低效。
若你真的想抑制报错,可以通过设置error_reporting来控制,好比栗子中的,行前设置,行后取消即可。
【4】尽量不要在for循环中使用函数,比如for ($x=0; $x < count($array); $x)每循环一次都会调用count()函数。
【5】注销那些不必的变量尤其是大数组,以即开释内存。
【6】数据库连接该使用完毕时当闭掉。
【7】使用挑选分支语句(switch case)佳于使用少个if,else if语句。
【8】尽量使用include/require, 而不是include_once/require_once.
【9】不要重复造车。很多人在重复写着已有的内置function.
【10】假如在代码中具有大批耗时的函数,最好能f够斟酌用C扩大的方法完成它们。
【11】str_replace函数比preg_replace函数快,但strtr函数的效力是str_replace函数的四倍。
【12】合理运用字符串比较函数:strncmp / strncasecmp 要比 substr 什么的好很多,不管怎样,都比preg_*系列的字符串匹配方法好。
【13】使用echo的多重参数取代字符串衔接。即使用逗号而不是点连接字符串。
【14】不要引入不需要的文件。每个php脚本文件的引入,都会造成zend编译与执行环节。编译耗时远大于执行的时间。
【15】获取时间的方式:请不要一遍遍的调用 time()直接使用 $_SERVER['REQUEST_TIME']即可得到秒级别的时间戳,不必调用函数
【16】 Session 存储。PHP默认是把SESSION存储在一个文件中。把存储session分落在一个目录中,减轻单位间的读写频度。
【17】 Session不采用文件存储。文件存储不是一个优秀的方案
【18】系统调用时昂贵的。请手动释放你的资源(Please release resources manually)
【19】代码约简单,跑得越快。为啥,因为简单。


同源:不同域 的客户端脚本 没授权 情况下,不能 读写对方 资源 | iframe http cookie(内存变本地)

区别:CSRF:借用,XSS盗用| CSRF蠕虫在攻击网站,XSS蠕虫在目标网站
xss:突破同源策略, 跨域(document.domain = ‘com’) 字符集(encodeURI) 注入点(html css js url) referer 屏幕劫持
csrf:获取唯一值(通过refe得到uid)  跨域获取数据(服务端代理 jsonhijack)

安全防御:浏览器  服务器 用户
+browser:HTTP:X-Frame-Options  X-XSS-Protection  X-Content-Security-Policy

+server:
server:域分离 https传cooie 验证码  小心第三方(<script> <iframe> <object>)
xss:OWASP(html标签 属性 javascript  css url)
csrf:http refer是否同域  session cookie生命周期  验证码  一次性token  +临时cookie(客户端生成,javascript生成  网络连接失败需要再提交一回)
界面劫持:X-Frame-Option Frame-Busting token


+user:noscript插件 最小信任(邪恶双胞胎) 忠告:不要泄露个人信息 




3.linux:

shell脚本:linux系统下,用函数通过amp管理文件 Linux==>函数-->amp-->文件

1)管理:文本 文件  系统
文本:工具和筛选  
文件:curd 权限 压缩
系统:进程管理  优先级  定时作业    | 磁盘(分区 加载 空间) 内存 cpu |用户 群组

2)应用:函数 参数  输出  | lamp
lamp:mysql+  apachectl  curl  
输入输出:stdin  stdout stderr lsof  /dev/null mktemp  tee  
参数选项:$#  $*  $@    getopt getopts  read
函数结构:#! expr bc  if-then-else  elif  else if    if-then case  case
for while  test util continue break  shift

4.data:logic arr table nfs+rsync searchEngine bbsWater php.ini(time space |upload | session cookie)
差异数据:正常 非正常 有差异 无差异 | 对照分析 (适配器)
计算数据:初始化 抓取 匹配(FIFO)  计算 修复
核对数据:提取(pcntl) 加工 生成  通知  检查

array 数组的curd和sort全是操作数组本身,指针也是。curd(array,value)而search是(value,array)
 
table
表单状态关系(一个状态变多个):预存款+退货退款
表单父子关系(一条对多条数据):商品+配送
表单关联关系(一张表对多个表):购物+订单

nfs+rsync
cat /etc/exports  =>/home/  10.0.2.0/24(rw,sync,all_squash,anonuid=501,anongid=501)
showmount -e 127.0.0.1 (用在client上)
mount -t nfs 10.0.2.69:/home /mnt (client上)
showmount -a (nfs服务器上)
df -h

+rsync :rsync -avz --progress --rsh=ssh root@ip:/rsync/dir  /nfs_server/upload/

ini_set para 脚本执行 上传 session or cookie
@ini_set('memory_limit','64M'); //脚本最大占用内存大小
@ini_set('max_execution_time', '15');   //脚本最大执行时间

@ini_set('post_max_size', '12M');   //表单最大上传大小
@ini_set('upload_max_filesize', '2M');    //单个文件最大上传大小
@ini_set('file_uploads', '1');        //是否启用上传文件
@ini_set('upload_tmp_dir', 'F:\\tmp\\');   //上传文件缓存目录
 
@ini_set('session.name', 'anhuizhaopin_sessionid');  //SESSIONID的名称
@ini_set('session.cookie_httponly', '1');   //sessionid是否添加HTTPONLY属性
@ini_set('session.use_trans_sid', '0');   //不尝试从其他地方获得sessionid
@ini_set('session.use_cookies', '1');   //使用cookies传递sessionid
@ini_set('session.auto_start',  '0');   //不自动开始session处理
@ini_set('session.cookie_lifetime', '3600'); //session的生命周期
@ini_set('session.gc_maxlifetime', '3600');  // gc时间
@ini_set('session.cache_expire',  '180');     //客户端缓存时间

other
Discuz x2.5防灌水设置涉及的地方:注册登录 user/group 内容过滤 防水插件和设置和防水墙
defined('InShopNC') or exit('Access Invalid!');//用来辨别是否包含了必须的文件
search engine;Sphinx、mysqlcft和迅搜


5.mysql:优化 高级 索引 语句  
mysql优化:缓存—>sql语句—>machine
mysql高级:事件调用存储过程进行轮询,触发器依照curd动作进行操作,别的就是试图 函数 授权  事务

mysql索引:mysiam 多个索引指向行,innodb二级索引依赖主键,其他数据在主键上
+独立索引,只能使用一个
+ 多列索引,><和like之后的and
+ 场景索引:复合索引 (cate_id,price)
+覆盖索引(using index,走索引,不用回行查找)
+聚族 or  非聚族:既存储了主键值,又存储了行数据,这种结构称为”聚簇索引”

myisam 依赖行号  innodb 数据行放入主键,不连续会产生索引页的分裂
+理想索引:区分度 和 长度
select count(distinct left(word,6))/count(*) from dict;
+延迟关联:select a.* from it_area as a inner join (select id from it_area where name like '%东山%') as t on a.id=t.id
+排序:覆盖索引取出来就是有序的 or  取出来后形成临时表再通过filesort排序 =>争取取出来就是有序的

比如: goods商品表, (cat_id,shop_price)组成联合索引,
where cat_id=N order by shop_price ,可以利用索引来排序,
select goods_id,cat_id,shop_price from goods order by shop_price;
// using where,按照shop_price索引取出的结果,本身就是有序的.
select goods_id,cat_id,shop_price from goods order by click_count;
// using filesort 用到了文件排序,即取出的结果再次排序

+重复索引, 去掉.
+冗余索引: x m xm mx
+索引碎片与维护 alter table xxx engine innodb   optimize table 表名 ,也可以修复.


sql 语句:
思想:分治法,类似于主从句
实现:把握表之间的连接关系  表关系:学生+ sid +分数+ cid +课程 + tid/id +老师
注意:效率和安全

统计查询 连表查询 子查询
多表 curd
语法
其他


6.DBA
 *
核心:架构的本质思想是不让请求到达数据库
目标:运维就是保护数据和提供7x24小时服务
经验:问题  报错  解决记录
思想:预防 补救  实战模拟


主从备份:mysqldump+binlog==>日志 + 调优  ==>配置:多实例 字符集 引擎  客户端
1.mysql多实例  mysql_mullti  vs  config
2.mysql乱码:linux  客户端setnames  服务端my.cnf   库  表   程序
3.mysqldump:全备+分库分表备  ( -A -B -F -d -x -t -l single-transaction —master-data)
4备份:全量 mysqldump(定时全量) +binlog (实时增量 ) 从库(迁库 加从库 切主从库 备库 人为语句)
5.mysiam or innodb:缓存对象(key_buffer_sizes  vs innodb_buffer_pool_size)  事务 锁粒度   (外键  全文)  

6.网站效率优化 :工具( firefox mysql+show  linux+ps)硬件 软件 my.cnf sql语句 架构(自动扩容) 流程制度

7.客户端:端口 不对外 host访问  限制web连接  phpadmin独立于其他站点根目录

8.mysqlbinlog :binlog_format | start-datetime   stopdatetime  start-position  stop-position  -d database (binlog拆分出来)

9.mysql日志  error query(+slow)  binary (+ binlog_format + sql_log_bin )|mysqladmin flush log

10. 主从:从库=全备+log
线程:reading  readall  waitingforslave   second behind master
级联:log-slave-update
双主:auto_increment + auto_increment_offset |binlog-do-db=test replicate-do-db=test |  do=>ignore  test=>mysql
切换:show process list ==>masterinfo比较binlog==>切换成主库实施:从库read-only | 同步单个库  |主从两套密码     程序读写|mysql-proxy
实施:从库read-only | 同步单个库  |主从两套密码     程序读写|mysql-proxy

案例:drop database    延迟同步并主从切换,根本思想是数据库授权管理思想。
         刷新 flush-log(后序的数据)
         binlog转成sql mysqlbinlog -d database mysql-bin.000014>bin.sql , 删掉drop语句(增量备份)
         全备灌数据


7.nosql:front|back

1)memcache:
原理:分布 场景 调优 | 缓存故障(雪崩 无底洞 数据踢除)
分布:一致性哈希+虚拟节点对缓存命中率的影响  & memcache lru lazy_delete
应用:memached确认主从延迟+秒杀
调优:memcached在启动时可以通过­f选项指定 Growth Factor 因子,并在某种程度上控制 slab 之 间的差异.默认值为1.25. 但是,在该选项出现之前,这个因子曾经固定为2,称为”powers of 2”策略。

2)redis:
array(php)-->cache(mem)-->nosql(主从 事务 持久化)
使用:返回值  场景  字段
设计:字段  mysql冷数据 写入  测试
weibo:推拉  关注/被关注  用户注册登录
主从(含义、迁移和切换) +  运维(命令和参数) + Redis-sentinel(集群管理工具) |  语法+配置+区别
主(-rdb +aof)--从(+rdb slaveof passwd  slave-read-only)备份—>读写分离—>任务分离(分担备份、计算)
返回:个数|是否修改|存在性|类型|秒数 -1(已过期) -2(不存在);空字符串|旧值|头尾元素或中间元素|返回随机值

key的设计
Redis key 设计技巧
1: 把表名转换为key前缀 如, tag:
2: 第2段放置用于区分区key的字段--对应mysql中的主键的列名,如userid
3: 第3段放置主键值,如2,3,4...., a , b ,c
4: 第4段,写要存储的列名

用户表 user  , 转换为key-value存储
userid
username
passworde
email
9
Lisi
1111111
lisi@163.com

set  user:userid:9:username lisi
set  user:userid:9:password 111111
set  user:userid:9:email   lisi@163.com
 *
keys user:userid:9*


冷数据:
平均每秒发布700条微博,4000次redis写入.
后台定时任务,回归冷数据入mysql

+front:
session 串号(相同的session_id) 共享(db nfs cache redis cookie + other) 集群(客户端 + 集中共享 + 复制)
cookie:k v ex  path domain secure

+back:
redis(setex or ttl)+master/slave   |  mem(expire_time)  ==>key to type of funcs
写入缓存(只适用于内存缓存) key(+prefix) val(+serialize)  ttl   
读/写缓存方法:额外的存储了键名key 到static静态变量$cache中去,全局就能使用了



电商:通用|电商
页面呈现:首页  导航   推荐位  广告  | 商城  购物车  订单
通用模块:防灌水  第三方登录和分享  上传  SEO  通知  |  权限  分类   状态   审核   |cms+sns+im
电商核心:异步支付  订单生成 购物车添加  配送信息  退款退货流程 |  团购  促销种类  会员黏性 商品分类 商户 团购优惠券 统计转化  |  结算 预存款金额  
框架:功能==>表单==>流程

0 0
原创粉丝点击