勾股定理,矩形是对角线相等的四边形。只要任意三点不在一条直线上,任选一点,求这一点到另外三点的长度的平方,两个短的之和若是等于最长的,那么这就是矩形。javascript
/* *单链表的结点类 */ class LNode{ //为了简化访问单链表,结点中的数据项的访问权限都设为public public int data; public LNode next; } class LinkListUtli { //当单链表中没有环时返回null,有环时返回环的入口结点 public static LNode searchEntranceNode(LNode L) { LNode slow=L;//p表示从头结点开始每次日后走一步的指针 LNode fast=L;//q表示从头结点开始每次日后走两步的指针 while(fast !=null && fast.next !=null) { if(slow==fast) break;//p与q相等,单链表有环 slow=slow.next; fast=fast.next.next; } if(fast==null || fast.next==null) return null; // 从新遍历,寻找环的入口点 slow=L; while(slow!=fast) { slow=slow.next; fast=fast.next; } return slow; } }
function download_images($article_url = '', $image_path = 'tmp'){ // 获取文章类容 $content = file_get_contents($article_url); // 利用正则表达式获得图片连接 $reg_tag = '/<img.*?\"([^\"]*(jpg|bmp|jpeg|gif|png)).*?>/'; $ret = preg_match_all($reg_tag, $content, $match_result); $pic_url_array = array_unique($match_result1[1]); // 建立路径 $dir = getcwd() . DIRECTORY_SEPARATOR .$image_path; mkdir(iconv("UTF-8", "GBK", $dir), 0777, true); foreach($pic_url_array as $pic_url){ // 获取文件信息 $ch = curl_init($pic_url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_NOBODY, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE ); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE ); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $fileInfo = curl_exec($ch); $httpinfo = curl_getinfo($ch); curl_close($ch); // 获取图片文件后缀 $ext = strrchr($pic_url, '.'); $filename = $dir . '/' . uniqid() . $ext; // 保存图片信息到文件 $local_file = fopen($filename, 'w'); if(false !== $local_file){ if( false !== fwrite($local_file, $filecontent) ){ fclose($local_file); } } } }
若是没有使用代理服务器:php
$ip = $_SERVER['REMOTE_ADDR'];html
使用透明代理java
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];mysql
参考文章linux
log_format main ‘remoteaddr−remote_user [timelocal]"request”’ ‘statusbody_bytes_sent “httpreferer"″"http_user_agent” “upstreamresponsetime""request_time” “http_x_forwarded_for"';
从今天的nginx log文件 access.log中:laravel
CSRF:跨站请求伪造,能够经过经过判断来源和加 Token 的方式来防范。面试
XSS:跨站脚本攻击,能够经过对内容转义和过滤来防范,还有CSP正则表达式
参考文章:
http://www.javashuo.com/article/p-elbjbxve-cd.html
http://www.jb51.net/article/48801.htm
这个问题有个关键点,扑克牌,1-13 不能再多了。这就很简单了。用PHP来作,定义一个数组分别存着1到13,拿出一个,置空一个,最后看下 这五个置空的 是否是连续的。这种状况不考虑抽出的顺序。
思想:
若是两个单向链表有公共的结点,也就是说两个链表从某一结点开始,它们的m_pNext都指向同一个结点。但因为是单向链表的结点,每一个结点只有一个m_pNext,所以从第一个公共结点开始,以后它们全部结点都是重合的,不可能再出现分叉。因此,两个有公共结点而部分重合的链表,拓扑形状看起来像一个Y,而不可能像X。
参考文献:
https://blog.csdn.net/wcyoot/article/details/6426436
https://blog.csdn.net/Lieacui/article/details/52046548
主键:绝对不能有空值。惟一索引:能够有空值
参考:http://www.javashuo.com/article/p-wmjflquq-bp.html
关键是S上。简而言之,https创建链接后要先把SSL的证书发下去,有了公钥和私钥,就能够解密了。
参考:http://www.javashuo.com/article/p-gpltrpuq-bg.html
参考:http://tool.oschina.net/commons?type=5
top、htop、free、uptime
原理:第一SQL自己有问题(这个不是主要问题)。第二你写的SQL颇有问题(这是最主要的)
防范:第一,绝对不要相信用户输入的任何东西。第二,预编译。如今的框架通常都会有SQL过滤的。
PHP入门问题,isset和empty的区别
分别是false, true, true, true
第一,数据超过必定数量或者体积,请拆分表,垂直或者水平分(最有效果的优化)
第二,务必有自增主键。经过自增主键来查数据是最快的。
第三,经常使用的查询字段创建联合索引,写SQL必定要尊从最左原则,用到这个索引。
第四,不要把逻辑运算放到sql里。言外之意是,不要写太复杂的SQL,你能写复杂的SQL 你确定也能经过PHP实现。
参考:https://cloud.tencent.com/developer/article/1004367
事务(transaction)是做为一个单元的一组有序的数据库操做。若是组中的全部操做都成功,则认为事务成功,即便只有一个操做失败,事务也不成功。若是全部操做完成,
事务则提交,其修改将做用于全部其余数据库进程。若是一个操做失败,则事务将回滚,该事务全部操做的影响都将取消。
会 写正则最好。我反正不会正则,须要用的时候就百度。
遍历数组,求当前时间差,和第一个进行对比,小于第一个交换位置。最后取第一个便可。
这三个放在一块儿,回答的点在于,print_r是函数,echo、print是结构语言。
至于他们具体的区别参考:http://www.javashuo.com/article/p-olivdlav-bb.html
这个问题,很难。一会半会说不清楚。若是作过PHP restful 接口开发,也踩过这里面的坑,那应该是能够答出来经常使用的几个KEY的。
参考:https://blog.csdn.net/u014175572/article/details/54861813
1.层序遍历
2.先序遍历
3.中序遍历
4.后序遍历
参考:https://blog.csdn.net/wk199351/article/details/65936001
但从PHP来说,考的是PHP数组的实现。能够简单的认为,PHP的数组是hash桶+十字链表(其实是数列Array,列表List,散列表/关联数组/字典Hashtable的聚合体)。优势是查询效率很高,遍历很方便,缺点是,占内存较多。(仍是空间换时间的思路,毕竟如今内存又不值钱)
C语言的数组,就是定长定类型的数列。
跳跃表(skiplist)是一种有序数据结构,它经过在每一个节点中维持多个指向其余节点的指针,从而达到快速访问节点的目的。
参考:http://www.javashuo.com/article/p-utqrzwlq-hn.html
用普通方法,确定很容易的。
考zval的,PHP的八种类型,本质只有一个结构。
参考:https://blog.csdn.net/ohmygirl/article/details/41542445
三次握手和四次挥手,以及他们每步的状态。
这个问题最好能一步到位回答的全面的。通常都是有客户端告诉服务端,我这边东西发完了,能够断链接了么。可是若是客户端发完FIN服务端没有回复,就会重试,直到超过超时时间,就断了。服务端也同样,超过期间,服务端就断了。
典型的二叉搜索树。大学数据结构的基础题。
参考:http://www.javashuo.com/article/p-oqsdooqx-gd.html
将文件拆分红若干个小文件,根据内容计算hash值,分散到不一样文件。
array_map,array_filter, array_walk
核心方法是scandir,核心思想是递归。
echo substr(strrchr($file, '.'), 1); echo substr($file, strrpos($file, '.')+1); $arr=explode('.', $file); echo $arr[count($arr)-1]; $arr=explode('.', $file); echo end($arr); echo strrev(explode('.', strrev($file))[0]); echo pathinfo($file)['extension']; echo pathinfo($file, PATHINFO_EXTENSION);
这个题有点绕。考的仍是COOKIE和SESSION的基础知识。服务端经过set-cookie命令来通知客户端保存cookie。
只要按照domain path 过时时间等规则 用header函数就能够实现。
分布式系统session,集中处理。按咱们公司的架构,为了实现高可用和高容灾,提供一个分布式的验签服务。具体的能够看下redis的分布式服务架构。
区别主要在数据和索引的存储结构和存储方式上,以及对于事务的支持。
参考:http://www.javashuo.com/article/p-stwqezmv-do.html
入门问题。这个问题有一个很大的坑,面试官可能会从这个问题下手问你一大堆问题。
以PHP为例:一般最简单的回答,从用户的电脑找到最近的DNS服务,而后解析到对应的IP 而后双方开始HTTP链接,而后发送请求信息,服务器拿到请求信息就开始准备回应的信息,中间要通过nginx转发到frstCGI(PHP-FPM),而后PHP开始解析框架,解析请求头部,找到对应的API,该查数据库查数据,该组装HTML组装HTML,完事了就从新返回给用户。用户拿到返回数据,浏览器开始渲染页面,JS开始加载。
explain,具体的请百度。(基本不多用性能分析语句。MYSQL的表设计上尽可能冗余一部分字段,避免在MYSQL里处理大量的逻辑运算。咱们是作PHP服务开发的,mysql语句能简单尽可能简单。逻辑运算的地方能够在PHP里作。)
linux:traceroute,windows:tracert
基础问题。本质仍是考PHP数组的结构和特色。
结果是01235。PHP用数字索引和STRING索引差异仍是很大的
参考:http://www.jb51.net/article/38593.htm
122
此处有一坑。foreach 完以后,$index , $value 并不会消失保留最后一次赋值。
这里的第一次foreach以后,数组中最后一个元素变成引用,引用变量 $v 继续存在且指向数组的最后一个元素。第二次遍历,由于遍历变量名是 $v , 因此等于说每次遍历都将这次遍历的值修改为最后元素的值,直至到遍历最后一个元素(引用元素),由于此时数组的最后一个元素已被修改为上一个元素的值,最后一次赋值就是 本身==本身。 故最后一个等于倒数第二个
https://laravel-china.org/articles/7001/php-ray-foreach-and-references-thunder
思路:生产者和消费者模式。这个问题也没有说其余的状态,好比数据库的数据会实时增长么?redis中每一个钱包是否有其余服务在读取或者写入啊。什么的。数据库和REDIS放一块儿,要么考数据一致性,要么考出现锁,致使效率下降。
不知道,没用过,为何这么设计?故意给本身找不愉快?
kill -l 不多用
面试官这么样问你,你就反问他,你要的底层实现是字段的设计?内存分配管理?网络模型?数据同步?仍是分布式的实现?(TIPS:面试就是两我的的博弈。面试官给出一个描述不清晰的问题,咱们不必回答。让他把问题讲清楚再思考怎么回复)
参考:https://cloud.tencent.com/developer/article/1004377
这篇文章 要多读几遍。
问清楚是IO异步模型。仍是AJAX这类的异步请求模型。差异很是大的。
参考:https://cloud.tencent.com/developer/article/1005481
狗东某风控研发必考题。
粗暴一点的方法 ini_set('memory_limit','-1'); 先把当前内存限制解除了 而后直接逐行统计。时间会很是的久。
有更好的方法请留言。
(TIPS)不要中招。不要用经常使用思路来处理,10亿数据 你再怎么优化,全表求和,都是要死人的。
咱们从设计上解决这个问题。只有一千个司机。咱们能够作个简单哈希,分库分表,%求余数。保证这一千个司机分在一千个表里,每一个人有每一个人的单独表。引擎用MYSAIM,求表中数据的总数,效率飞快,遍历一千张表,求最大前二十便可。
没作过。其实题目表达不清楚。若是作过微信公众号开发,知道微信事件模型的XML数据结构,应该会好作一点。
tail -f access.log | awk -F '[' '{print $2}' | awk '{print $1}' | uniq -c
参考:https://blog.csdn.net/dong_007_007/article/details/78330337
不逼逼,直接参考:http://www.laruence.com/php-internal
鸟哥的文章要多读,多读。
递归。array_map传入一个回调函数。
substr_count();
方法太多了,可是实现起来 各有各的问题。
我可能只会用HASH映射作。其余的,不会。
参考:第64题。
> https://blog.csdn.net/v_JULY_v/article/details/6279498
守护进程模型(须要知道php-fpm的各类配置了)
参考:https://www.jianshu.com/p/542935a3bfa8
这个三言两语说不清楚。
参考:https://www.zhihu.com/question/22062795
php-fpm 的配置并很少,经常使用的就更少了。
参考:http://www.4wei.cn/archives/1002061
static - 子进程的数量是固定的(pm.max_children) ondemand - 进程在有需求时才产生(当请求时,与 dynamic 相反,pm.start_servers 在服务启动时即启动 dynamic - 子进程的数量在下面配置的基础上动态设置:pm.max_children,pm.start_servers,pm.min_spare_servers,pm.max_spare_servers
参考:分布式架构设计必备CAP原理。
不是核心业务的话,先停写,把备机拉起来,查看两台机器的日志,进行数据补偿,开写。
若是是核心业务的话,如今全部的写操做都在正常的状态机器上。把好的这台机器的备机拉起来,当主机。
以上全是应急操做。实际上数据库的容灾设计要复杂的多。
面试官要是问你,备机的数据不一致怎么办,你要勇敢怼回去,大家每秒多少写入操做。按照百万级表,每秒1000的写入效率,正常的设计是,分布在2台机器上每台500。这个级别的数据同步,出现差别的几率 能够忽略不计的。有一台出现问题,另外一台也能够抗住。
(正常的操做,仍是先停写,等数据一致,切换,开写。咱们公司搞这些切换都是在凌晨4.00左右,核心业务的每秒写操做,只有十几个。先后耽搁不到20秒)。
这种题 有是很难回答的。太宽泛了,咱们面试早就不问这种问题了。
参考:日本人写的《图解HTTP》
计算机原理学的,生产者消费者模型,银行家模型,均可以解决锁的问题。
我实习的时候遇到这个坑。
说是mt_rand比rand快4倍。
在随机数区间不大的状况下并无很大的效率差距。可是出现重复数的概率,rand要比mt_rand高不少。
经过各类行锁表锁,各类乐观锁悲观锁,排他锁实现的呀。
http://www.javashuo.com/article/p-bgxnekit-u.html
http://www.javashuo.com/article/p-hjtiwlwq-k.html
http://www.javashuo.com/article/p-wnyaiydz-dy.html
对称加密:咱们俩共用一个秘钥,你加密,我解密。
非对称加密:我给你一个公钥,你加密完了,我还能有个人私钥把密文解开。可是你没有个人私钥。
扩展:椭圆加密算法。
四只
二进制问题。薛定谔的老鼠。
一只老鼠有两个状态,死活,对应01。假设老鼠的个数为A,则有2^A>=10; A=4;
思路很简单,十瓶药编号:0,1,10,11....1001;
0不喝。第一只老鼠喝全部个位是1的:13579,第二只喝十位是1的,第三只和百位是1的,第四只喝千位是1的。
24小时后,看下死了的是1,活着的是0。按老鼠的顺序乖乖站好……假如第一只和第三只死了,那就是0101,就是5 有问题。
redis 集群主从同步的简单原理
Redis的复制功能是基于内存快照的持久化策略基础上的,也就是说不管你的持久化策略选择的是什么,只要用到了Redis的复制功能,就必定会有内存快照发生。
当Slave启动并链接到Master以后,它将主动发送一个SYNC命令( 首先Master会启动一个后台进程,将数据快照保存到文件中[rdb文件] Master 会给Slave 发送一个
Ping命令来判断Slave的存活状态 当存活时 Master会将数据文件发送给Slave 并将全部写命令发送到Slave )。
Slave首先会将数据文件保存到本地 以后再将 数据 加载到内存中。
当第一次连接 或者是 故障后 从新链接 都会先判断Slave的存活状态 在作所有数据的同步 , 以后只会同步Master的写操做(将命令发送给Slave)
问题:
当 Master 同步数据时 若数据量较大 而Master自己只会启用一个后台进程 来对多个Slave进行同步 , 这样Master就会压力过大 , 并且Slave 恢复的时间也会很慢!
redis 主从复制的优势:
(1)在一个Redis集群中,master负责写请求,slave负责读请求,这么作一方面经过将读请求分散到其余机器从而大大减小了master服务器的压力,另外一方面slave专一于提供
读服务从而提升了响应和读取速度。
(2)在一个Redis集群中,若是master宕机,slave能够介入并取代master的位置,所以对于整个Redis服务来讲不至于提供不了服务,这样使得整个Redis服务足够安全。
(3)水平增长Slave机器能够提升性能
参考:
(1)可读性方面:基本相同,XML的可读性比较好;
(2)可扩展性方面:都具备良好的扩展性;
(3)编码难度方面:相对而言,JSON的编码比较容易;
(4)解码难度:JSON的解码难度基本为零,XML须要考虑子节点和父节点;
(5)数据体积方面:JSON相对于XML来说,数据体积小,传递的速度比较快;
(6)数据交互方面:JSON与javascript的交互更加方便,更容易解析处理,更好的数据交互;
(7)数据描述方面:XML对数据描述性比较好;
(8)传输速度方面:JSON的速度远远快于XML。
参考:https://blog.csdn.net/java19880223/article/details/20054111
在trait继承中,优先顺序依次是:来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法
id | username | salary | pid |
---|---|---|---|
1 | a | 3000 | null |
2 | b | 8000 | null |
3 | c | 5000 | 1 |
4 | d | 6000 | 3 |
SELECT a.*, b.* FROM `user` as a LEFT JOIN `user` as b ON a.pid = b.id AND a.salary > b.salary WHERE b.id > 0;
http://www.javashuo.com/article/p-tckcljtj-bb.html
http://www.jb51.net/article/128449.htm
检查nginx log,请求是否达到nginx 和是否正常转发给 php-fpm
1)管道
管道分为有名管道和无名管道
无名管道是一种半双工的通讯方式,数据只能单向流动,并且只能在具备亲缘关系的进程间使用.进程的亲缘关系通常指的是父子关系。无明管道通常用于两个不一样进程之间的通讯。当一个进程建立了一个管道,并调用fork建立本身的一个子进程后,父进程关闭读管道端,子进程关闭写管道端,这样提供了两个进程之间数据流动的一种方式。
有名管道也是一种半双工的通讯方式,可是它容许无亲缘关系进程间的通讯。
2)信号量
信号量是一个计数器,能够用来控制多个线程对共享资源的访问.,它不是用于交换大批数据,而用于多线程之间的同步.它常做为一种锁机制,防止某进程在访问资源时其它进程也访问该资源.所以,主要做为进程间以及同一个进程内不一样线程之间的同步手段.
3)信号
信号是一种比较复杂的通讯方式,用于通知接收进程某个事件已经发生.
4)消息队列
消息队列是消息的链表,存放在内核中并由消息队列标识符标识.消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特色.消息队列是UNIX下不一样进程之间可实现共享资源的一种机制,UNIX容许不一样进程将格式化的数据流以消息队列形式发送给任意进程.对消息队列具备操做权限的进程均可以使用msget完成对消息队列的操做控制.经过使用消息类型,进程能够按任何顺序读信息,或为消息安排优先级顺序.
5)共享内存
共享内存就是映射一段能被其余进程所访问的内存,这段共享内存由一个进程建立,但多个进程均可以访问.共享内存是最快的IPC(进程间通讯)方式,它是针对其它进程间通讯方式运行效率低而专门设计的.它每每与其余通讯机制,如信号量,配合使用,来实现进程间的同步与通讯.
6)套接字:可用于不一样及其间的进程通讯
不会;主从数据不一致;正常是不会出现这种情景,具体看状况,是否能够修复,恢复到以前的时间点,而后追回同步。
http://www.javashuo.com/article/p-xisokohk-bp.html
http://www.javashuo.com/article/p-stpfhwhn-km.html
冒泡排序
我当时的答案是用链表来存,缓存命中就将该缓存移到链表头,而后链表尾就都是冷数据了。
我记得以前是在哪里看过这个设计,但我忘记在链接了,请知道朋友的把链接贴上来。
false, true, true
双引号串中的内容能够被解释并且替换,而单引号串中的内容总被认为是普通字符。
在单引号串中甚至反斜杠也失去了他的扩展含义(除了插入反斜杠\和插入单引号\')。因此,当你想在字串中进行变量代换和包 含\n(换行符)等转义序列时,你应该使用双引号。单引号串能够用在其余任何地方,脚本中使用单引号串处理速度会更快些。
static:若是在子类中重写了父类中的static方法、属性,父类就会去访问了子类的static方法
self: 是类内指针,无论子类有没有重写过父类中的方法、属性都指向本类的静态方法、属性
http://www.laruence.com/2015/05/28/3038.html
https://blog.csdn.net/gavin_new/article/details/54603490
https://blog.csdn.net/zhihua_w/article/details/52723402
http://www.jb51.net/article/55853.htm
区别主要在数据和索引的存储结构和存储方式上,以及对于事务的支持。
参考:http://www.javashuo.com/article/p-stwqezmv-do.html
为何创建TCP链接须要三次握手?
缘由:为了应对网络中存在的延迟的重复数组的问题
例子:
假设client发起链接的链接请求报文段在网络中没有丢失,而是在某个网络节点长时间滞留了,致使延迟到达server。原本这是一个已经失效的链接报文,可是server接收到这个链接报文以后,误认为client发起了新的链接,因而向client发送确认报文段。此时由于没有了链接的3次握手,client不会对server的确认报文做出回应,也不会向server发送数据,server就觉得链接已经创建,一直在空等client的数据,这样server的这一部分网络资源就被浪费了。
为何断开TCP链接须要进行四次握手 ?
由于TCP链接是全双工的网络协议,容许同时通讯的双方同时进行数据的收发,一样也容许收发两个方向的链接被独立关闭,以免client数据发送完毕,向server发送FIN关闭链接,而server还有发送到client的数据没有发送完毕的状况。因此关闭TCP链接须要进行四次握手,每次关闭一个方向上的链接须要FIN和ACK两次握手。
TIME_WAIT状态的意义
在TCP链接中,当被动关闭链接的一方(图中client)发送的FIN报文到达时,被动关闭链接的一方会发送ACK确认报文,而且进入TIME_WAIT状态,而且等待2MSL时间段(MSL:maximum segment life)。这么作有下述两个缘由:
被动关闭链接的一方(图中的server)在一段时间内没有收到对方的ACK确认数据包,会从新发送FIN数据包,于是主动关闭链接的一方须要停留在等待状态以处理对方从新发送的FIN数据包。不然他会回应一个RST数据包给被动关闭链接的一方,使得对方莫名其妙。
在TIME_WAIT状态下,不容许应用程序在当前ip和端口上和以前通讯的client(这个client的ip和端口号不变)创建一个新的链接。这样就能避免新的链接收到以前的ip和端口一致的链接残存在网络中的数据包。这也是TIME_WAIT状态的等待时间被设置为2MSL的缘由,以确保网络上当前链接两个方向上还没有接收的TCP报文已经所有消失。
http://www.javashuo.com/article/p-ksclncyj-cd.html
key value
https://www.jianshu.com/p/df89b530db89
http://www.javashuo.com/article/p-wdgyozkp-kx.html
php-fpm能够经过tcp socket和unix socket两种方式实现。
https://blog.csdn.net/koastal/article/details/52303316
--++----++--+++--- -++++----+++++++-- -+++----++++------ -----++------++++- ---++++++-----+++- -----+++------+++-
好比上图在数组中表示成,1表示成陆地,0表示海洋:
[ [0,0,1,1,0,0,0,1,1....], [0,1,1,1.....], ]
写个算法取出全部陆地的坐标,并按块放到一块儿,如地图上左上角第一个陆地的坐标是:
[ [0,2],[0,3], [1,1],[1,2],[1,3],[1,4], [2,1],[2,2],[2,3] ]
curl 设置来源地址来欺骗对方服务器验证
http://www.javashuo.com/article/p-zjbshgnt-mg.html
单例模式又称为职责模式,它用来在程序中建立一个单一功能的访问点,通俗地说就是实例化出来的对象是惟一的。
全部的单例模式至少拥有如下三种公共元素:
抽象的类不能被实例化。任何一个类,若是它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
http://www.javashuo.com/article/p-vfjbzrdt-dc.html
工厂模式
适配器模式
转载:https://laravel-china.org/articles/20714