1.rabbitmq消息队列
消息队列是应用之间的通讯方式,是应用间的异步协作机制,发送者和接受者互不干扰,一方有问题,不会影响另一方运行,达到解耦的目的。生产者只管把消息发布到 MQ 中而不用管谁来取,消费者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。
特点:
可靠性:持久化,传输确认,发布确认;
灵活的路由:在消息进入队列之前,通过 Exchange 来路由消息的;
多语言客户端:几乎支持所有的语言;
管理界面:提供简易的用户界面;
2.微信支付流程:
页面发起支付请求,请求生成支付订单,获取用户授权(获取用户的openid);
调用统一下单API,生成预付单
小程序获取五个参数后,鉴权调起支付
支付回调
3.hello_world 首字符大写,去掉下滑线,重点考察ucfirst:字符串首字母变大写,lcfirst:字符串首字母变小写,ucwords:字符串中每个字符首字母大写
function strings($str){
//方法1
$str0 = str_replace('_',' ',$str);
$str1 = ucfirst($str0);
$str2 = ucwords($str0);
echo $str1;//Hello world
echo $str2;//Hello World
//方法2
$str3 = explode('_',$str);
$str4 = ucfirst($str3[0]).' '.ucfirst($str3[1]);
echo $str4; //Hello World
}
$str = 'hello_world';
strings($str);
4.冒泡排序
function sorts($arr){
for($i = 0;$i < count($arr); $i++){
for ($j = $i+1;$j < count($arr); $j++){
if($arr[$j] > $arr[$i]){
$temp = $arr[$j];
$arr[$j] = $arr[$i];
$arr[$i] = $temp;
}
}
}
print_r($arr);
}
$arr= [2,3,6,8,7];
sorts($arr);
5.获取url后缀,主要考察pathinfo()函数
function strings($str){
//方法1
$str1 = explode('.',$str);
print_r($str1[1]);//pang
echo '<br/>';
//方法2
$index = stripos($str,'.');
$str2 = substr($str,$index+1,(strlen($str)-$index));
echo $str2; //png
echo '<br/>';
//方法3
$str3 = pathinfo($str);
print_r($str3['extension']);
}
$str = 'http://localhost/888.png';
strings($str);
6.设计模式:工厂模式、单例模式
工厂模式:
//工厂模式
interface People{
public function say();
}
class Mans{
public function say(){
echo '我是男人';
}
}
class Womans{
public function say(){
echo '我是女人';
}
}
class SimpleFactory{
static function createMan()
{
return new Mans();
}
static function createWoman()
{
return new Womans();
}
}
$man = SimpleFactory::createMan();
$man->say();
$woman = SimpleFactory::createWoman();
$woman->say();
单例模式:
//单例模式
class Single{
//定义唯一静态实例
static public $instance;
public $name;
//私有化构造方法
private function __construct(){}
//构造唯一实例
static function getInstance(){
if(!self::$instance){
self::$instance = new self();
}
return self::$instance;
}
public function setName($names){
$this->name = $names;
}
public function getName(){
echo $this->name;
}
}
$a = Single::getInstance();
$b = Single::getInstance();
$a->setName('航');
$b->setName('云');
$a->getName(); //云
$b->getName(); //云
7.session和cookie的区别以及使用场景
1.存储位置:session服务器端,安全。cookie浏览器端,不安全。
2.存储大小和数量:cookie不同浏览器有不同的限制,一般存储20个,大小不超过4kb;session在服务器端不做限制,但是数量过大,会加大服务器压力。
3.内容区别:cookie存贮的字符串,session存储的数据是对象。
应用场景:cookies适合做保存用户的个人设置,爱好等,Session适合做客户的身份验证
8.empty 和 isset,判断null场景
empty:是否为空;
isset:是否定义;
$a = 0;
var_dump(isset($a)); //true
echo '<br/>';
var_dump(empty($a)); //true
echo '<br/>';
$b = null;
var_dump(isset($b)); //false
echo '<br/>';
var_dump(empty($b)); //true
echo '<br/>';
$c = false;
var_dump(isset($c)); //true
echo '<br/>';
var_dump(empty($c)); //true
9.include和require的区别:
include在引入不存文件时产生一个警告且脚本还会继续执行,require则会导致一个致命性错误且脚本停止执行;
PHP 程序在执行前,就会先读入 require 所指定引入的文件;PHP 程序网页在读到 include 的文件时,才将它读进来;
include()执行时需要引用的文件每次都要进行读取和评估,require()执行时需要引用的文件只处理一次(实际上执行时需要引用的文件内容替换了require()语句)。可以看出若有包含这些指令之一的代码和可能执行多次的代码,则使用require()效率比较高,若每次执行代码时相读取不同的文件或者有通过一组文件叠代的循环,就使用include()。
10.mysql事务的四种隔离级别
处理并发事务带来的问题:更新丢失、脏读、不可重复读、幻读;相应的为了解决这四个问题,
就产生了事务隔离级别:读未提交(Read uncommitted),读提交(Read committed),可重复读(Repeatable read),串行化(Serializable)。
读未提交:事务未提交时,另一个事务就看到了操作后的结果;
读提交:事务在提交之后,才能看到操作后的结果;
可重复读:一个事物执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。未提交变更对其他事务也是不可见的;
串行化:对于同一行记录,写会加“写锁”,读会加“读锁”,当出现锁冲突时,后访问的事务需要等前一个事务执行完成,才能继续执行;
参考链接:MySQL事务隔离级别详解_成长是一辈子的事-CSDN博客_mysql事务隔离级别
11.mysql死锁产生原因及处理方法
待完善
12.fastcgi和cgi的区别:参考:https://blog.csdn.net/belen_xue/article/details/65950658
13.CSRF和XSS的区别和预防
CSRF:跨站请求伪造。解决方案:每一个表单都带有一个CSRF令牌,后端验证令牌;验证码;
XSS:跨站脚本攻击。解决方案:cookie中session id的定时更换;对用户输入的内容进行处理,过滤任何有执行能力的脚本或影响页面的css。
14mysql问题:参考:
2020PHP面试Mysql面试题以及答案 - 知乎
15.空间复杂度和时间复杂度
16.redis:参考:https://zhuanlan.zhihu.com/p/352349989
17.五秒查询一次阅读量,怎么实现
18.for跟foreach的效率问题
19.linux命令:
vim:文件创建文件并打开,vim可以当作vi的升级版本,他可以用多种颜色的方式来显示一些特殊的信息。
rm -rf:删除
shift+a:vim打开文件,shift+a进入编辑状态,编辑完,esc退出输入,:wq保存并退出,:q 不保存退出。:q! 强制不保存退出。
find:文件属性查找
grep:文件内容查找,grep 查找内容 yun.txt
kill:杀死进程
touch:创建文件
mkdir:创建文件夹
lsof -i:端口号:查看端口占用
系统Log日志位置:
/var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一
/var/log/secure 与安全相关的日志信息
/var/log/maillog 与邮件相关的日志信息
/var/log/cron 与定时任务相关的日志信息
/var/log/spooler 与UUCP和news设备相关的日志信息
/var/log/boot.log 守护进程启动和停止相关的日志消息
vim编辑文件撤回操作:Esc下按u,相当于ctrl+z
cat messages:一次性显示日志全部内容。
20.php垃圾回收机制:
https://www.php.net/manual/zh/features.gc.refcounting-basics.php;
php7 垃圾回收机制_徐小鹏的博客-CSDN博客_php7的垃圾回收机制
21.mvc的理解
22.php 长连接 短链接
23.三次握手,四次挥手
24.写项目中,遇到哪些问题,解决感觉有成就感
巨星小程序在进行报中课的时候,防止高并发,用redis做一个秒杀,把先进来的用户放入redis队列中,当队列中的用户达到500时,后来用户就转到秒杀结束页面。这里用随机数来表示不同的用户。代码如下:
网路使用mongdb存储大批量数据,读写速度比较慢
解决办法:加索引;
发现批量插入比单条插入时间短,比如十万数据,单条需要40s,批量需要2.5秒,插入的时候存到redis,到一定数据量批量插入;
增加补充信息,比如增加一个是否合规字段,标记为true和false,看似冗余,但是可以提高速度。
批量读取:
list_length = len(uid_list)
iter_size = 1000
current = 0
while current < list_length:
end = current + iter_size
uid_segment = uid_list[current: end]
result_cursor = mongo_collection.find({"uid": {"$in": uid_segment}})
for user_info in result_cursor:
# do something
...
current = current + iter_size
25.mongodb :
区分大小写的数据类型;
最小单元是文档。一个文档中是多个键值对的存储。
集合就是一组文档。集合类似于mysql中的表
一个数据库包含多个文档。
26.mysql的索引类型:
普通索引
唯一索引:唯一,可为空
主键索引:唯一不可为空,且只有一个
组合索引:最左前缀原则:innodb组合索引的最左前缀原则_vinter_he-CSDN博客_组合索引的最左前缀原则
全文索引