===链家=================================
算法
从十亿个数字中选出最大的1000个数字,应该怎么办?
答这是一个典型的堆排序问题,首先十亿个数字无法一次性读入内存,因此需要建立并维护一个大小为1000的堆。这样遍历一遍后就可以获得前1000大的数字。
socket
1:tcp和udp的区别https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/78507826
2:流量控制和拥塞控制的实现机制 https://www.cnblogs.com/newwy/p/3254029.html
3:滑动窗口的实现机制https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/79664485
4:多线程如何同步。
5:进程间通讯的方式有哪些,各有什么优缺点https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/78655352
6:tcp连接建立的时候3次握手的具体过程,以及其中的每一步是为什么
7:tcp断开连接的具体过程,其中每一步是为什么那么做
https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/78772276
8:tcp建立连接和断开连接的各种过程中的状态转换细节
9:epool与select的区别https://www.cnblogs.com/Anker/p/3265058.html
10:epool中et和lt的区别与实现原理https://blog.csdn.net/wangxmin2005/article/details/7587525
11:写一个server程序需要注意哪些问题
https://zhidao.baidu.com/question/557305198.html
12:项目中遇到的难题,你是如何解决的
说对PHP7是否有研究,然后问的都是细点
===一下科技=================================
redis常用场景,索引优化和sql注入原理
redis和memcache的优缺点以及使用场景。
答memcache的优点就是内存占用小,做缓存,减少数据库负载提高性能;redis具有持久化,可以做分布式集群管理,当需要除key/value之外的更多数据类型支持时,使用Redis更合适,当存储的数据不能被剔除时,使用Redis更合适。
===新浪============
先笔试后面,一轮是关于基础和项目,还有考题内容,计算机网络比较多,数据结构
二轮全部是计算机网络和Linux原理,数据结构hash
笔试题总共分为3部分:php、Linux、MySQL。
php部分:1、用if语句写出判断变量是否为空, 变量是否存在,变量是否为null, 销毁一个变量;2、常用的数组操作函数;3、post get区别;4、字符串判断前3个字符是否为ABC;5、某段代码访问服务器的压力较大,优化方法;
MySQL部分:1、给了3个常用查询,让写出如何建立索引;2、数据库建表语句;
Linux部分:1、杀掉包含java关键字的所有进程;2、删除/tmp目录下的3天前的所有文件;3、找出当前目录下含有hehe的所有文件; 4、对一个具有固定格式的日志进行统计排序
PHP部分:1、用if语句写出判断变量是否为空, 变量是否存在,变量是否为null, 销毁一个变量;
当变量是未定义,NULL时=====>if(!isset)和if(empty)效果相同,都是false
当变量是"",0,"0",array(),flase时====>if(!isset)和if(empty)效果相反,变量存在但是为空
综上:(1)判断变量是够存在,用isset
(2)判断一个存在的变量是否为空,用empty
(3)判断变量是否存在,是否为空,先isset,再empty
2、常用的数组操作函数
https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/78184763
3、post get区别;https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/63252447
4、字符串判断前3个字符是否为ABC;
if( substr($str,0,3)=='ABC')
5、某段代码访问服务器的压力较大,优化方法;https://www.cnblogs.com/phper12580/p/8036143.html
1、HTML静态化
其实大家都知道,效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。
2、图片服务器分离
大家知道,对于Web服务器来说,不管是Apache、IIS还是其他容器,图片是最消耗资源的,于是我们有必要将图片与页面进行分离,这是基本上大型网站都会采用的策略,他们都有独立的、甚至很多台的图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力,并且可以保证系统不会因为图片问题而崩溃。
在应用服务器和图片服务器上,可以进行不同的配置优化,比如apache在配置ContentType的时候可以尽量少支持、尽可能少的LoadModule,保证更高的系统消耗和执行效率。
3、数据库集群、库表散列
大型网站都有复杂的应用,这些应用必须使用数据库,那么在面对大量访问的时候,数据库的瓶颈很快就能显现出来,这时一台数据库将很快无法满足应用,于是我们需要使用数据库集群或者库表散列。
在数据库集群方面,很多数据库都有自己的解决方案,常用的MySQL提供的Master/Slave也是类似的方案。
集群通常会使用CDN与GSBL与DNS负载均衡技术,每个地区一组前台服务器群,例如:网易,百度使用了DNS负载均衡技术,每个频道一组前台服务器,一搜使用了DNS负载技术,所有频道共用一组前台服务器集群。
库表散列是常用并且最有效的解决方案。
我们在应用程序中安装业务和应用或者功能模块将数据库进行分离,不同的模块对应不同的数据库或者表,再按照一定的策略对某个页面或者功能进行更小的数据库散列,比如用户表,按照用户ID进行表散列,这样就能够低成本的提升系统的性能并且有很好的扩展性。
sohu的论坛就是采用了这样的架构,将论坛的用户、设置、帖子等信息进行数据库分离,然后对帖子、用户按照板块和ID进行散列数据库和表,最终可以在配置文件中进行简单的配置便能让系统随时增加一台低成本的数据库进来补充系统性能。
4、缓存
缓存一词搞技术的都接触过,很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。
架构方面的缓存,对Apache比较熟悉的人都能知道Apache提供了自己的缓存模块,也可以使用外加的Squid模块进行缓存,这两种方式均可以有效的提高Apache的访问响应能力。
网站程序开发方面的缓存,Linux上提供的Memory Cache是常用的缓存接口,可以在web开发中使用,比如用Java开发的时候就可以调用MemoryCache对一些数据进行缓存和通讯共享,一些大型社区使用了这样的架构。另外,在使用web语言开发的时候,各种语言基本都有自己的缓存模块和方法,PHP有Pear的Cache模块,Java就更多了,.net不是很熟悉,相信也肯定有。
5、镜像
镜像是大型网站常采用的提高性能和数据安全性的方式,镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异,比如ChinaNet和EduNet之间的差异就促使了很多网站在教育网内搭建镜像站点,数据进行定时更新或者实时更新。
6、负载均衡
负载均衡将是大型网站解决高负荷访问和大量并发请求采用的高端解决办法。
MySQL部分:1、给了3个常用查询,让写出如何建立索引;
https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/78412679
2、数据库建表语句;
建表
create table article(
id int unsigned primary key auto_increment,
title varchar(155) not null default '',
time int unsigned not null default 0,
content text,
)
desc ht_article //查看表结构
decribe ht_article //查看更详细的表结构
Linux部分
1、批量杀掉包含java关键字的所有进程;
ps -ef |grep java|grep -v grep|awk '{print $2}'|xargs kill -9 (法1)
ps -ef|grep java|grep -v grep|cut -c 9-15|xargs kill -9 (法2)
解释:
ps -ef 查看所有进程
grep java 筛出关键字为java的进程
grep -v grep 删除关键词为grep的进程
awk ‘{print $2}’ 取出第二个字段,即进程号
cut -c 9-15 截取第9到15位,即进程号
xargs kill -9 xargs命令是用来把前面命令的输出结果(PID)作为“kill -s 9”命令的参数,“kill -s 9”会强行杀掉指定进程。
2、删除/tmp目录下的3天前的所有文件;
step1:查看3天前修改的文件:find /tmp/* -type f -mtime +3 -exec ls -l {} \;
step2:删除这些文件:find /tmp/* -type f -mtime +3 -exec rm {} \;
说明:
-a被访问,-c被改变状态,-m被修改
min分钟 time天
+n 大于 n, -n小于 n, n相等于 n
find / -amin -30 -ls # 查找在系统中最后30分钟内被访问的文件
find / -atime -2 -ls # 查找在系统中最后2天内被访问的文件
find / -cmin -10 -ls # 查找在系统中最后10分钟内被改变状态的文件
find / -ctime -1 -ls # 查找在系统中最后2天内被改变状态的文件
find / -mmin -10 -ls # 查找在系统中最后10分钟内被修改过的文件
find / -mtime -1 -ls # 查找在系统中最后2天内被修改过的文件
3、找出当前目录下含有hehe的所有文件
find . -name 'hehe'
4、对一个具有固定格式的日志进行统计排序
https://blog.csdn.net/tanga842428/article/details/52856413
(1)查看日志中访问次数最多的前10个IP
cat access.log |cut -d ' ' -f 1 | sort | uniq -c | sort -rn | awk '{print $0 }' | head -n 10 | less
(2)查看日志中出现100次以上的IP
cat access.log |cut -d ' ' -f 1 | sort |uniq -c | sort -rn | awk '{ if($1>1) print $0 }' | less
(1)结果大概如下:
217 192.114.71.13
116 124.90.132.65
108 192.114.71.13
102 194.19.140.96
101 217.70.34.173
100 219.235.240.36
解释
cut -d ' ' -d后面接分隔字符,此处是以-来分隔开
-f 1 打印第1部分,就是ip
uniq -c uniq 是将重复行去掉, -c表示前面前面加上数目
sort -rn 按照数字从大到小排序
head -20 取前面20行
$0表示整行,$1表示第一个字段
================================================
127.0.0.1 - - [05/Jan/2018:10:21:03 +0800] "GET /favicon.ico HTTP/1.1" 404 169 "http://localhost/" "Mozilla/5.0(Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/604.3.5(KHTML, like Gecko) Version/11.0.1 Safari/604.3.5"
按照空格分割
$1 | 127.0.0.1 | ip |
$7 | /favicon.ico | 请求资源 |
$8 | HTTP/1.1" | http协议1.0或者1.1 |
$9 | 404 | 状态码 |
$11 | "http://localhost/" | 来源url |
其它解释详见:https://blog.csdn.net/zyf_balance/article/details/77679122
awk '{a[$1] += 1;} END {for(i in a) printf("%d %s\n", a[i], i);}' access.log | sort -n | tail -10
首先用awk统计出来一个列表,然后用sort进行排序,最后用tail取最后的10个。
以上参数可以略作修改显示更多的数据,比如将tail加上-n参数等,另外日志格式不同命令也可能需要稍作修改。
查看日志中访问次数最多的前10个IP
cat access_log |cut -d ' ' -f 1 | sort |uniq -c | awk '{print $0 }' | sort -rn | head -n 10 | less
查看日志中出现100次以上的IP
cat access_log |cut -d ' ' -f 1 | sort |uniq -c | awk '{if ($1 > 100) print $0}'|sort -rn | less
查看日志中访问超过100次的页面
cat access_log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less
查看最近访问量最高的文件
cat access_log | tail -10000 | awk '{print $7}' | sort | uniq -c | sort -rn | less
统计某url,一天的访问次数
cat access_log | grep '12/Aug/2009' | grep '/images/index/e1.gif' | wc | awk '{print $1}'
前五天的访问次数最多的网页
cat access_log | awk '{print $7}' | uniq -c | sort -n -r | head -20
从日志里查看该ip在干嘛
cat access_log | grep 218.66.36.119 | awk '{print $1"\t"$7}' | sort | uniq -c | sort -rn | less
列出传输时间超过 30 秒的文件
cat access_log | awk '($NF > 30){print $7}' | sort -n | uniq -c | sort -rn | head -20
列出最最耗时的页面(超过60秒的)
cat access_log | awk '($NF > 60 && $7~/\.php/){print $7}' | sort -n | uniq -c | sort -rn | head -100
当前WEB服务器中联接次数最多的ip地址
netstat -ntu |awk '{print $5}' |sort | uniq -c| sort -rn
======================================================
(3)统计各个状态码
https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/79667251
大访问量服务器架构;
缓存数据类型。
主要问php很底层的东西,还有就是问golang和微服务等;3:手写shell;4:写算法。
1. echo count("abc");输出什么?
输出1,虽然count可以传入字符串作为参数,但是它返回的是相当于count((array)字符串) 也就是 1 的效果。同理,就算是count(‘’)也是输出1
$str=“abcde”;$str[0]=? $str[0]=‘gh’;$str=?
注意一点:php里面,用“”或者‘’表示字符串是没区别的,这点和c不同(‘’表示字符,“”表示字符串)
第一个答案=‘a’ 第二个答案是‘gbcde’,因为php底层是单字节存储
2.用PHP写出显示客户端IP与服务器IP的代码
客户端:echo $_SERVER['REMOTE_ADDR'];
服务端:echo $_SERVER["SERVER_ADDR"];
3. error_reporting(2047)什么作用?
error_reporting 设定错误讯息回报的等级,2047是E_ALL。
php.ini文件中有许多配置设置。您应当已经设置好自己的 php.ini文件并把它放在合适的目录中,就像在 Linux上安装 PHP和 Apache 2的文档说明中所示的那样(请参阅参考资料)。在调试 PHP应用程序时,应当知道两个配置变量。下面是这两个变量及其默认值:
display_errors = Off
error_reporting = E_ALL
E_ALL能从不良编码实践到无害提示到出错的所有信息。E_ALL对于开发过程来说有点太细,因为它在屏幕上为一些小事(例如变量未初始化)也显示提示,会搞糟浏览器的输出
所以不建议使用2047,最好把默认值改为:error_reporting = E_ALL & ~E_NOTICE
4. echo,print()和print_r()有什么区别?
http://www.jb51.net/article/38858.htm
echo是命令,不能返回值。echo后面可以跟很多个参数,之间用分号隔开。
print是命令,但可以有返回值,返回值是1。比echo速度稍快。
printf是函数。返回一个格式化后的字符串。
sprintf是函数。和printf一样,唯一不同的就是该函数把格式化的字符串写写入一个变量中,而不是输出来。
print_r是函数。如果变量是string, integer or float, 将会直接输出其值,如果变量是一个数组,则会输出一个格式化后的数组。通常用来输出数组。
//echo举例
echo "Hello", "World";
//print举例
$a = print("55nav"); // 这个是允许的
echo $a; // $a的值是1
//printf举例
printf("My name is %s %s。","55nav", "com"); // My name is 55nav com。
//sprintf举例
sprintf("My name is %1\$s %1\$s","55nav", "com"); //你会发现没有任何东西输出的。
$out = sprintf("My name is %1\$s %2\$s","55nav", "com");
echo $out; //输出 My name is 55nav com
5. 打开php.ini中的Safe_mode,会影响哪些参数?至少说出6个。
6.写个函数来解决多线程同时读写一个文件的问题。
=======fopen flock write fclose====
$handle=fopen($file,’w+’);
if(flock($handle,’LOCK_EX’)){
fwrite($handle,’write something…’);
}else{
return ‘error’;
}
fclose($handle);
7.请写一个函数验证电子邮件的格式是否正确(要求使用正则)
$p=‘^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$’;
if(preg_match($p,$str)){echo‘匹配得上’;}else{echo‘匹配不上’;}
8.考SQL语句的题,题太长了,实在不好回忆了。
9. MySQL数据库,一天一万条以上的增量,怎么优化?
法1:按月进行分表,因为是日志表,主要操作是insert操作,所以每月初自动生成新的数据表,数据插入到对应月份的那张数据表。[比如表明前缀是cdb_smslog后面加200910及时cdb_smslog_200910]
法2:读写分离,表结构换成非关系MyISM
10.写出一种排序算法(要写出代码),并说出优化它的方法。
11.写个函数用来对二维数组排序。
function mysort($arr,$col,$tyep='asc'){
$temp=[];
foreach($arr as $val){
$temp[$val[$col]]=$val;
}
if($type='asc'){
ksort($temp);
}else if($type='desc'){
krsort($temp);
}else{
return 'err!';
}
return $temp;
}
//调用实例
$user=array(
array('id'=>2,'name'=>'zs','age'=>29),
array('id'=>8,'name'=>'ls','age'=>36),
array('id'=>5,'name'=>'wm','age'=>21)
);
$user=mysort($user,'name');
print_r($user);
//Array ( [ls] => Array([id] => 8[name] => ls[age] => 36)[wm] => Array([id] => 5[name] => wm[age] => 21)[zs] => Array([id] => 2[name] => zs[age] => 29))
12.写5个不同的自己的函数,来截取一个全路径的文件的扩展名,允许封装php库中已有的函数。
方法1: strrchr 方法2: substr+strrpos 方法3: pathinfo 方法4: explode 方法5:正则
// 方法一
function ext_name1($path){
$path_info = strrchr($path, '.');//.php
return ltrim($path_info,'.');
}
// 方法二
function ext_name2($path){
$path_info = substr($path,strrpos($path, '.'));
return ltrim($path_info,'.');
}
// 方法三
function ext_name3($path){
$path_info = pathinfo($path);
//pathinfo返回dirname,basename,filename,extension,其中basename=filename+'.'+$extension
return $path_info['extension'];
}
// 方法四
function ext_name4($path){
$arr = explode('.', $path);
return $arr[count($arr)-1];//取数组最后1个元素
}
// 方法五
function ext_name5($path){
$pattern = '/^[^\.]+\.([\w]+)$/';
//[^\.]不能换成(^\.),因为^只有在[]才表示不匹配,但是可以写成[^.],因为.只有在[]才不需要转义也能表示点号本身
return preg_replace($pattern, '${1}', basename($path));
}
// 实例 假如当前文件全路径__FILE__='D:\\zhangsan\web/test.xf.com/test10.php'
$path = str_replace('\\', '/', __FILE__);
echo "$path<br />";
echo ext_name1($path);echo "<br>";
echo ext_name2($path);echo "<br>";
echo ext_name3($path);echo "<br>";
echo ext_name4($path);echo "<br>";
echo ext_name5($path);echo "<br>”;
============================================================
13.一群猴子排成一圈,按1,2,...,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去...,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n,输出最后那个大王的编号。
PHP:
1.$_GET,$_POST,$_REQUEST都是做什么用的
(1) $_GET变量接受所有以get方式发送的请求,及浏览器地址栏中的?之后的内容
(2) $_POST变量接受所有以post方式发送的请求,例如,一个form以method=post提交,提交后php会处理post过来的全部变量
(2) $_REQUEST支持两种方式发送过来的请求,即post和get它都可以接受,显示不显示要看传递方法,get会显示在url中(有字符数限制),post不会在url中显示,可以传递任意多的数据(只要服务器支持)
2.
if(strpos($str, 'a') == false) {}
这个语句有什么bug?
当$str的第一个字母是a的时候,strpos($str, 'a')的结果是0而0 == false是真,应该使用全等 ===,0 === false是假
3.isset($foo),!empty($foo),($foo)
作用分别是什么?
4.根据数组:
$a = array(
'a'=>'apple',
'b'=>'banan'
);
输出一个下拉框
<select>
<?php foreach($a as $val): ?>
<option><?php echo $val; ?></option>
<?php endforeach; ?>
</select>
5.优化下列函数
function text($str) {
preg_replace('/a/', 'z', $str);
preg_replace('/b/', 'z', $str);
preg_replace('/c/', 'z', $str);
return $str;
}
===> 3个改成preg_replace(‘/[a-c]+/‘, 'z', $str);
6.如何处理SQL注入
MySQL
7.如何读取一个表的表类型,以及读取一个表中字段的类型.
describe tablename //该mysql系统函数可以列出该表的列名类型 isnull键类型默认值其它
8.如果这三个字段(a,b,c)都有索引,下列SQL语句那个更快
select ... from ... where c=...
select ... from ... where a=... and c=...
select ... from ... where b=... and c=...
(SQL语句应该没记错,这道和网上流传的英文版面试题差不多)
组合索引有“最左前缀”原则。简单的理解就是只从最左面的开始组合。
9.MySQL的MyISAM有什么优点?
优点:速度快,磁盘空间占用少;
某个库或表的磁盘占用情况既可以通过操作系统查相应的文件(夹)的大小得知,也可以通过SQL语句SHOW TABLE STATUS查的
缺点:没有数据完整性机制,即不支持事务和外键
10.记得不太清楚,大致是根据字段,取出记录中的第一个月,最后一天?
11.多台MySQL服务器,如何同步数据
mysql主从同步和读写分离
http://zhengdl126.iteye.com/blog/419970 php实用汇总