11.PHP中的读写分离方法例子::
a.https://www.cnblogs.com/we-jack/p/8204457.html
b.【ThinkPHP】ThinkPHP主从读写分离+MySQL底层配置半自动复制同步_tp6 读写分离 数据不同步-CSDN博客
12.PHP版本git版本库的管理::
a.Git:实际项目中如何使用Git做分支管理-CSDN博客
13.熟练使用 composer, 能够使用 phpunit 进行自动化单元测试:
https://www.cnblogs.com/kccdzz/p/6763735.html
14.Photoshop、sketch等切图工具
a.sketc中文网:
15.目前在市场上流行的PHP框架不少50个。
1.国内使用频率最高的除非就是轻量级的中型框架thinkphp;Cl小型
2.基于组件的高性能php框架Yii ;
3.设计思想是很先进的,非常适合应用各种开发模式TDD Laravel框架;
4.一款纯PHP开发的开源高性能的PHPsocket服务器Workerman框架
16.erp是企业管理计划 crm是客户关系管理 oa是办公自动化
ERP管理的是企业的进销存、产供销、财务等
CRM主要是管理企业的客户,可以和erp的销售系统挂钩
OA主要是管理一些内部的文档、公告,行政信息等传递
总的来说都是企业的信息化管理。另外的SAP也是一个ERP系统
17.自如面试题型:
1.<script scr="1.js">alert(1);</script> 输出啥::
网页输出:1
2.<input id="txt" type="text" value="zirooom"> 写代码,当鼠标经过文本框,自动选中文本框中的内容;
<script language="javascript" type="text/javascript">
function showinput() {
}
</script>
3.PHP中可以将GBK编码格式转换成utf-8的函数有哪些?iconv();
4.给定一个具体时间,计算时针与分针之间的角度
在下面解法中,h表示小时,m表示分钟。同时,假定h的范围是0~23。
我们得到以下规则:
1)分针的角度(从12点整开始算起):360*(m/60)
2)时针的角度(从12点整开始算起):360*(h%12)/12+360*(m/60)*(1/12),即为:时针时刻值+分针带来的偏移量
3)时针和分针之间的角度:(时针的角度-分针的角度)%360
简化上述式子,可以得到(30h-5.5m)%360.
18.echo输出::::
所以空字符串(''),false,NULL和0是值相等而类型不一样!
注意:
NULL是一种特殊的类型.
两种情况下为NULL
1. $var = NULL;
2. $var;
3.""、0、"0"、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE。
总结
从上面实例我们可以看得出null,0,false是假,而''是一个空字符串并不是空值。
19.抽象类与接口
抽象类:
1、抽象类使用abstract修饰;
2、抽象类不能实例化,即不能使用new关键字来实例化对象;
3、含有抽象方法(使用abstract关键字修饰的方法)的类是抽象类,必须使用abstract关键字修饰;
4、抽象类可以含有抽象方法,也可以不包含抽象方法,抽象类中可以有具体的方法;
5、如果一个子类实现了父类(抽象类)的所有抽象方法,那么该子类可以不必是抽象类,否则就是抽象类;
6、抽象类中的抽象方法只有方法体,没有具体实现;
接口:
1、接口使用interface修饰;
2、接口不能被实例化;
3、一个类只能继承一个类,但是可以实现多个接口;
4、接口中方法均为抽象方法;
5、接口中不能包含实例域或静态方法(静态方法必须实现,接口中方法是抽象方法,不能实现);
21.JS中setInterval与setTimeout的区别
setInterval
setInterval()方法可按照指定的周期来调用函数或者计算表达式(以毫秒为单位)
语法:
setInterval(函数表达式,毫秒数);
setInterval()会不停的调用函数,直到clearInterval()被调用或者窗口被关闭,由 setInterval()返回的ID值可用作clearInterval()方法的参数。
setTimeout
setTimeout()方法用于在指定毫秒数后再调用函数或者计算表达式(以毫秒为单位)
语法:
setTimeout(函数表达式,毫秒数);
setTimeout()只执行函数一次,如果需要多次调用可以使用setInterval(),或者在函数体内再次调用setTimeout()
区别
通过以上分析可以看出,setTimeout与setInterval的主要区别是:
setTimeout()方法只运行一次,也就是说当达到设定的时间后就触发运行指定的代码,运行完后就结束了,如果还想再次执行同样的函数,可以在函数体内再次调用setTimeout(),可以达到循环调用的效果。
setInterval()是循环执行的,即每达到指定的时间间隔就执行相应的函数或者表达式,是真正的定时器。
22.常用的端口号:
Redis:6379
Memcache:11211
Mysql:3306
Nginx:80
Apache:80
php-fpm:9000
Smtp:465 or 25
Ftp:文件传输协议 21
ssh:安全外壳协议 22
smtp 25
HTTPS 443
telnet 23
DNS 53
23、什么是 CSRF 攻击 ?XSS 攻击?如何防范?
CSRF,跨站请求伪造,攻击方伪装用户身份发送请求从而窃取信息或者破坏系统。
讲述基本原理:用户访问A网站登陆并生成了cookie,再访问B网站,如果A网站存在CSRF漏洞,此时B网站给A网站的请求(此时相当于是用户访问),A网站会认为是用户发的请求,从而B网站就成功伪装了你的身份,因此叫跨站脚本攻击。
CSRF防范:
A、合理规范api请求方式,GET,POST
B、对POST请求加token令牌验证,生成一个随机码并存入session,表单中带上这个随机码,提交的时候服务端进行验证随机码是否相同。
XSS,跨站脚本攻击。
防范:不相信任何输入,过滤输入。
1. PHP7.0 比PHP5.6性能提升了两倍。
2.PHP7.0全面一致支持64位。
3.PHP7.0之前出现的致命错误,都改成了抛出异常。
4.增加了空结合操作符(??)。效果相当于三元运算符。
5.PHP7.0新增了函数的返回类型声明。
6.PHP7.0新增了标量类型声明。
PHP 7 中的函数的形参类型声明可以是标量。在 PHP 5 中只可以是类名、接口、array 或者 callable (PHP 5.4,即可以是函数,包括匿名函数),现在也可以使用 string、int、float和 bool 了。
7.新增加了匿名类。
PHP 5.3 开始有了匿名函数,现在又新增了匿名类;
8.PHP7.0之后溢移除了一些老的不再支持的SAPI(服务器端应用编程端口)和扩展。
9.define 现在可以定义常量数组。
25.PDO数据对象:
26.PHP比较两个json数据结构是否相同:
27.数据库explain使用和慢日志分析:
28.CDN加速:
29.事务的特性
1.原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2.一致性(Consistency):在一个事务中,事务前后数据的完整性必须保持一致,可以想象银行转账、火车购票。
3.隔离性(Isolation):多个事务,事务的隔离性是指多个用户并发访问数据库时, 一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。
4.持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
事务的隔离级别
上面介绍了3种事务并发问题!现在介绍一下数据库提供的解决方案!
1.read uncommitted : 读取尚未提交的数据 :这个最低级,但是效率肯定最高,但是哪一个问题都不能解决。
2.read committed:读取已经提交的数据 :可以解决脏读 。
3.repeatable read:重读读取:可以解决脏读 和 不可重复读 。
4.serializable:串行化:可以解决脏读不可重复读和虚读,效率最差,相当于锁表,开发中一般不用。
上面的“2”是oracle数据库默认设置,“3”是mysql数据库默认的设置。
总结一下
事务隔离级别的性能:
read uncommitted>read committed>repeatable read>serialazable
事务隔离级别的安全性:
read uncommitted<read committed<repeatable read<serialazable
mysql 事务控制:
开启事务:start transaction;
提交:commit;
回滚:rollback;
30.简述高并发网站解决方案。
A、前端优化(CND加速部署、建立独立图片存储服务器)
B、服务端优化(页面静态化、并发优化处理[异步|多线程]、队列处理)
C、数据库优化(数据库缓存[Memcachaed|Redis]、数据库读写分离、分库、分表、分区)
D、Web服务器优化(负载均衡、反向代理)
31.php* 求两个日期之间相差的天数 *
(针对1970年1月1日之后,求之前可以采用泰勒公式) * @param string $day1 * @param string $day2 * @return number */ function diffBetweenTwoDays ($day1, $day2) { $second1 = strtotime($day1); $second2 = strtotime($day2); if ($second1 < $second2) { $tmp = $second2; $second2 = $second1; $second1 = $tmp; } return ($second1 - $second2) / 86400;24*60*60 } $day1 = "2013-07-27"; $day2 = "2013-08-04"; $diff = diffBetweenTwoDays($day1, $day2); echo $diff."\n";
32.PHP读取大型日志文件:
foreach( glob( ngx_log. "/*.log" ) as $file ) {
$log = new SplFileObject($file);
foreach( $log as $line ){
$ipnum = getip($line);
if( $ipnum ) {
$ips[ $ipnum ] = (int)$ips[ $ipnum ] + 1;
}
}
}
在linux命令行下,可以直接使用tail -n 10 access.log很轻易的显示日志文件最后几行
33.shell监测一个PHP程序是否运行正常的用法:
一:命令:ps -ef | grep “HotActivity” | grep -v grep
while [ true ]
do
pro=$(ps -ef | grep "HotActivity" | grep -v grep | wc -l)
#过滤出目标进程信息,如果pro为空串说明目标进程未运行
#反向过滤掉grep进程 和 本进程信息, 因为这两个进程信息中包含目标进程的名字
if [ -z "$pro" ]
then
echo "程序未启动,重新启动程序"
nohup /usr/local/php7/bin/php /data/web/php-script/HotActivity/index.php 2>&1 & #重新启动指定程序
else
echo "程序正在运行..."
fi
sleep 2
done
二:shell:#! /bin/bash
# author caoxin
# time 2012-10-10
# program : 判断进程是否存在,并重新启动:
function check(){
count=`ps -ef |grep $1 |grep -v "grep" |wc -l`
#echo $count
if [ 0 == $count ];then
nohup python /runscript/working/$1 &
fi
}
check behaviors.py
34.6 种方式计算PHP字符串中各个字符出现的次数
<?php
$str = 'AbCdEfGaBcDeFgH0234;,!-AaBbCcDdEeFfGg';
$str = strtoupper($str); // 不区分大小写时,全部转换成大写或者小写
// 方法一
$res = array(); // 定义一个结果集空数组
$arr = str_split($str); // 将字符串转换成数组
$res = array_count_values($arr); // 统计数组中各个值出现的次数
var_dump($res);
// 方法二
$res = array(); // 定义一个结果集空数组
$arr = str_split($str); // 将字符串转换成数组
foreach ($arr as $key => $val) { // 遍历字符串数组
if (!isset($res[$val])) { // 如果结果集不存在以某个字符为 key 的键
$res[$val] = 1; // 将其数量设置为 1
} else {
$res[$val] += 1; // 否则在其基础上数量加 1
}
}
var_dump($res);
// 方法三
$res = array(); // 定义一个结果集空数组
$arr = str_split($str); // 将字符串转换成数组
$unique = array_unique($arr); // 数组字符去重
foreach ($unique as $key => $val) {
$res[$val] = substr_count($str, $val); // 统计某字符在字符串中出现的次数
}
var_dump($res);
// 方法四 ASCII 思路
$res = array(); // 定义一个结果集空数组
$arr = str_split($str); // 将字符串转换成数组
foreach ($arr as $key => $val) {
$ascii = ord($val);
if (!isset($res[$ascii])) {
$res[$ascii] = 1;
} else {
$res[$ascii] += 1;
}
}
foreach ($res as $key => $val) {
$res[chr($key)] = $val;
unset($res[$key]);
}
var_dump($res);
/**
* 在 PHP 中字符串本身是有下标的 举个例子:
* $str = 'AaBbCcDdEeFfGg';
* $str[0] 对应的是字符 A $str[2] 对应的是字符 B
* 所以根据这个特性,以上方法二和方法四可以延伸出另外两种方法
*/
// 方法五
$res = array(); // 定义一个结果集空数组
$strLen = strlen($str); // 计算字符串的长度
for ($i = 0; $i < $strLen; $i++) { // 便利字符串数组
if (!isset($res[$i])) { // 如果结果集不存在以某个字符为 key 的键
$res[$i] = 1; // 将其数量设置为 1
} else {
$res[$i] += 1; // 否则在其基础上数量加 1
}
}
var_dump($res);
// 方法六
$res = array(); // 定义一个结果集空数组
$strLen = strlen($str); // 计算字符串的长度
for ($i = 0; $i < $strLen; $i++) { // for 循环每一个字符
$ascii = ord($str[$i]); // 将字符转换成 ASCII 码
if (!isset($res[$ascii])) {
$res[$ascii] = 1;
} else {
$res[$ascii] += 1;
}
}
foreach ($res as $key => $val) { // 遍历结果集
$res[chr($key)] = $val; // 将 ASCII 码再次转换成普通字符
unset($res[$key]); // 删除原有 ASCII 码的 key
}
var_dump($res);
35.接口的安全性主要围绕Token、Timestamp和Sign三个机制展开设计,保证接口的数据不会被篡改和重复调用,下面具体来看:
(1)Token授权机制:(Token是客户端访问服务端的凭证)--用户使用用户名密码登录后服务器给客户端返回一个Token(通常是UUID),并将Token-UserId以键值对的形式存放在缓存服务器中。服务端接收到请求后进行Token验证,如果Token不存在,说明请求无效。
(2)时间戳超时机制:(签名机制保证了数据不会被篡改)用户每次请求都带上当前时间的时间戳timestamp,服务端接收到timestamp后跟当前时间进行比对,如果时间差大于一定时间(比如5分钟),则认为该请求失效。时间戳超时机制是防御DOS攻击的有效手段。
(3)签名机制:将 Token 和 时间戳 加上其他请求参数再用MD5或SHA-1算法(可根据情况加点盐)加密,加密后的数据就是本次请求的签名sign,服务端接收到请求后以同样的算法得到签名,并跟当前的签名进行比对,如果不一样,说明参数被更改过,直接返回错误标识。
36. 浏览器请求原理:
https://www.cnblogs.com/xiaohuochai/p/9174471.html
37.查询前十条数据记录:
db2:select * from table_name fetch first 10 rows only;
MYSQL:
- select * from tbl limit 10;
ORACLE:
- select * from tbl where rownum<=10;
SQL SERVER:
- select top 10 * from tbl
SYBASE:
- SET ROWCOUNT N GOSELECT * FROM TABLE1
SELECT * FROM user AS u1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(uid) FROM `user`)-(SELECT MIN(uid) FROM user))+(SELECT MIN(uid) FROM user)) AS uid) AS u2 WHERE u1.uid >= u2.uid ORDER BY u1.uid LIMIT 1;
38.高并发技术:
1.代码技术:多线程,线程池,并发库,并发队列
2.缓存技术: redis 集群 一主多从
3.数据库技术: mysql 一主多从 读写分离 数据库单表大于2000万时,使用分库分表方案 Mycat数据库中间件
4.前后端分离:页面静态化
5.消息队列技术: kafka rabbitMQ rocketMQ 异步消息
6.cdn技术高可用实现技术: keepalived 心跳检测,故障自动剔除,服务正常自动恢复。高负载技术:Nginx 动静分离分布式架构技术: 首选 springcloud dubbo
你可以知道处理高并发的业务逻辑是:
- 前端:异步请求+资源静态化+cdn
- 后端:请求队列+轮询分发+负载均衡+共享缓存
- 数据层:redis缓存+数据分表+写队列
- 存储:raid阵列+热备
- 网络:dns轮询+DDOS攻击防护
39.软连接和硬链接的特点:
软链接:
1.软链接是存放另一个文件的路径的形式存在。
2.软链接可以 跨文件系统 ,硬链接不可以。
3.软链接可以对一个不存在的文件名进行链接,硬链接必须要有源文件。
4.软链接可以对目录进行链接。
硬链接:
1. 硬链接,以文件副本的形式存在。但不占用实际空间。
2. 不允许给目录创建硬链接。
3. 硬链接只有在同一个文件系统中才能创建。
4. 删除其中一个硬链接文件并不影响其他有相同 inode 号的文件。
不论是硬链接或软链接都不会将原本的档案复制一份,只会占用非常少量的磁碟空间。
linux系统可以用ln命令来创建链接文件。
ln命令格式:
ln [参数] [源文件或目录] [目标文件或目录]
主要参数:
-i 交互模式,文件存在则提示用户是否覆盖。
-s 软链接(符号链接)。
-d 允许超级用户制作目录的硬链接。
-b 删除,覆盖以前建立的链接
软链接 (符号链接) ln -s source target
硬链接 (实体链接)ln source target
40.了解tcp、socket、websocket
讲解websocket之前我们首先来了解下tcp、socket、websocket之间的关系。
网上有很多相关资料参差不齐 ,
这里因为篇幅问题,进行简单介绍详细介绍参考:HTTP、TCP与UDP、Socket与Websocket之间的联系与区别-CSDN博客
1.tcp是传输层协议,服务端与客户端之间想要用websocket通信需要先建立tcp连接。
2.socket是一套操作tcp的接口,通过各个socket函数和接口 可以对tcp进行操作(比如建立连接,关闭连接,接收数据都是通过语言的socket函数去操作)
3.websocket是tcp连接建立后对传输数据的解析和封装。tcp连接中传递的数据都是二进制数据流,websocket协议会对二进制数据做规定,告诉两端这些二进制按什么格式解析,传输的时候按什么格式进行传输,让我们知道什么样的数据代表什么含义以得到正确的结果,这里举个简单例子,比如传过来的数据为 0010 0001,如果用字符解析会得到‘!’,用整数解析会得到十进制数041。哪个到底是我们想要的结果就需要根据websocket协议的规定来判断。