【trycatch是手工抛出,这个比较尴尬,需要通过php5需要通过set_error_handler,set_expction_handler,register_shutdown_function()配合使用】
try
{
    require_once("123");
    echo "123";  
}
catch(Exception $e)
{
    throw new Exception('Uncaught Exception occurred');
}
 
//引用
$a = 'aaaa';
$b = &$a;
unset($a);
echo $a;
 
//setcookie 实现原理
 
//状态码
200 204 206 499
204 请求没有内容
206 部分请求成功
499 nginx自定义的状态码,499对应的是 “client has closed connection”。这很有可能是因为服务器端处理的时间过长,客户端“不耐烦”了。要解决此问题,就需要在程序上面做些优化了。
 
//服务器timewait
目前处理time_wait开启了系统服务
编辑内核文件/etc/sysctl.conf
 net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout 修改系默认的 TIMEOUT 时间
net.ipv4.tcp_keepalive_time = 1200 
#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 1024 65000 
#表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192 
#表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets = 5000 
#表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。
默认为180000,改为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于 Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。


//设计个lru算法,要求高效,可以采用双端链表+hash表实现
 
//海量数据进行统计-比如说要删除redis里的500万key。要怎么样查找
 
//redis 过期策略和淘汰机制。自己设计如何实现。
 
//数据结构-中序排序、深度、广度搜索,可以采用链表,left,right方式把数据存储起来
 
//mysql 索引优化、B+树、 b+数的叶节点最优数。

 
 
//手写排序算法-自己实现一个如通过value进行排序,value相同,再进行key排序
 
//linux的查看端口方式,查看端口是否被占用。
lsof -i :80或者netstat -anp|grep 80
是否用过strace 跟踪系统调用信息
 
//php7与php5的不同。详细描述
redis方面:

redis的string类型是怎么实现的。

redis是单线程为什么这么快

redis集群是怎么搭建的

redis主从如何保证数据一致

多路复用讲讲 select poll epoll,大概知道,没有细节
epoll的具体实现

mysql 的b+树 原理 直说了它的特征。并没有说出原理细节

php 的生命周期。说了5个。但需要详细的说。

php-fpm 、cgi、php-cgi、php-fastcgi之间关系。

消息网关的架构图、qps、使用的swoole的进程数、设置的依据
swoole配置
$config = [
                    'reactor_num'=>4, //默认设置为CPU核数,调节poll线程的数量,以充分利用多核,reactor_num必须小于或等于worker_num
                    'daemonize'=>true,//转入后台作为守护进程运行
                    'worker_num'=>8, //设置启动的worker进程数量,类似于php-fpm的个数,每个进程占用40M内存
                    'max_request'=>50000, //单个线程最大请求数
                    'dispatch_mode'=>3, //worker进程数据包分配模式1平均分配,2按FD取模固定分配,3抢占式分配,默认为取模(dispatch=2)
                 ];

多路 I/O 复用模型:
这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。
多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。

查看php-fpm的内存占用

1、查看php-fpm的进程个数

ps -ef |grep “php-fpm”|grep “pool”|wc -l

2、查看每个php-fpm占用的内存大小[17m]

ps -ylC php-fpm --sort:rss

3.查看PHP-FPM在你的机器上的平均内存占用

ps --no-headers -o “rss,cmd” -C php-fpm | awk ‘{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,“M”) }’

4.查看单个php-fpm进程消耗内存的明细

pmap $(pgrep php-fpm) | less

 

知识点二

//知识点二
curl:原理、参数、实现方式
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,"http://www.baidu.com");
curl_setopt($ch,CURLOPT_POST,1);
$rs = curl_exec($ch);
curl_getinfo($rs);

//header的方法
hearder
header("Location:http://sina.com.cn");
header("Content-type:text/html;charset=utf8");
//mysql pdo
prepar 1、方便不同类型数据库切换 2可以预先检查参数,防止注入 3据说效率比 mysql_connect要高7%左右。

//composer 
composer 相当于go中对go get ,它是通过通过在composer.json或者直接 require ~php7.1这种形式发出命令先去镜像网站上拉取,如果没有则到github上,下载成功后,通过之前注册方法spl_autoload_register->loadClass->findFile-> findFileWithExtension来实现最终的加载

//命名空间

//mywql打开binlog
1、先查看Mysql是否已经打开bin log ;   show variables like '%log_bin%' 看value是on还是off
2、找到my.cnf 设置如下
    log-bin = /www/mysql/logs/mysql-bin.log
    server-id = 27(ip的最后一个位数)
    binlog_format = ROW
    expire_logs_days = 30

//mysql主从复制
//为什么tcp需要三次握手四次挥手,而不是2次握手,2次挥手
因为tcp是有状态的连接,假如第一次A发出了sync,因为网络原因导致包没有到达B,于是又重新发了一个sync ,这时候B收到了,并且回复了ack,A又发出了ack进行确认,如果是两次握手,此时B收到了之前走迷路的sync重新创建连接,此时A是不会理B,B因此会一直处于等待状态。资源消耗

为什么 不能2次挥手
A发起FINSH的时候,B收到的时候会回复我收到了,但此时B的报文可能还没发完,等发完后,B发出close, A进行关闭
在面对未知的流量暴增,可以预先怎么处理
如何限流,限流算法,对于ddos攻击怎么处理
PHP数组的底层实现
分布式事务
RPC相对于传统的API调用的优点
服务调度中心的感知与动态上下线
MySQL的索引,为什么是B+而不是平衡二叉树
索引查找在Linux的磁盘上是怎么操作的
聚簇索引相对于B+索引的优点
如何分析SQL执行慢的原因
Redis连接时的connect与pconnect的区别
Redis有哪些结构时间复杂度较高
Redis hash的实现
算法题: 在1个10G大小的文件中,存储的都是int型的数据,如何在内存使用小于8M的情况下进行排序
设计题: 以微博为例,有1个亿的用户,同时用户之间有关注和粉丝,用户的关注和取关操作比较频繁,如何设计架构和API接口

守护进程是什么,怎么实现
PHP是否适合做守护进程,为什么(内存管理这一块)
PHP的垃圾回收机制
进程间通信方式
共享内存是怎么实现的
怎么查看Linux服务器的负载,及判断哪些操作引起的负载过高
MySQL的IO过高怎么优化,分库分表及分区
MySQL的索引结构,myisam的索引结构, innodb的索引结构,innodb为什么必须要有主键索引
添加索引,为什么可以减少io操作(磁盘页)
nginx的负载均衡算法
算法题: 忘了
算法题:查找一个字符串中最长的无重复字串

面试题: 在一个横向和纵向都是递增的有界二维坐标轴中,如何快速判断某个数是否存在于这个二维坐标中
面试题:设计一个定时任务管理器(从我同事那打听到的,我只有上面一个算法题)
一面
mysql 主从同步原理以及可能出现的问题
session和cache的区别
Nginx负载均衡算法
mysql binlog 的实现

手写算法:
1. Z字形遍历数
2. 链表按每k个旋转

二面
分布式事务
PHP底层原理
redis主从复制
redis集群
redis rehash
虚拟内存存储器
Mysql索引结构
项目相关的问题

手写算法:手机解锁九宫格的解法数量


 遇到问高并发处理机制, MySQL索引优化, 分表优化,MySQL锁机制,nginx+fpm原理,链表,redis等缓存各种机制和优化,swoole及工作原理,协程开发,PHP垃圾回收机制,还有比较常见的算法(手写),tcp/udp等协议及原理,常见的攻击手段及防范机制等...还有很多讲不完..

mysql数据库常见问题
https://github.com/zhishutech/zst-ask-ye

//某大公司面试
https://www.jianshu.com/p/8b4658f83ddc

//php的spl

https://www.php.net/manual/zh/book.spl.php

 

PHP 知识点整理【重要】_redis

preg_match("/\bweb\b/i", "PHP is the web scripting language of choice.")

表单验证匹配

验证账号,字母开头,允许 5-16 字节,允许字母数字下划线:^[a-zA-Z][a-zA-Z0-9_]{4,15}$

验证账号,不能为空,不能有空格,只能是英文字母:^\S+[a-z A-Z]$

验证账号,不能有空格,不能非数字:^\d+$

验证用户密码,以字母开头,长度在 6-18 之间:^[a-zA-Z]\w{5,17}$

验证是否含有 ^%&',;=?$\ 等字符:[^%&',;=?$\x22]+

匹配Email地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

匹配腾讯QQ号:[1-9][0-9]{4,}

匹配日期,只能是 2004-10-22 格式:^\d{4}\-\d{1,2}-\d{1,2}$

匹配国内电话号码:^\d{3}-\d{8}|\d{4}-\d{7,8}$
评注:匹配形式如 010-12345678 或 0571-12345678 或 0831-1234567

匹配中国邮政编码:^[1-9]\d{5}(?!\d)$

匹配身份证:\d{14}(\d{4}|(\d{3}[xX])|\d{1})
评注:中国的身份证为 15 位或 18 位

不能为空且二十字节以上:^[\s|\S]{20,}$

字符匹配

匹配由 26 个英文字母组成的字符串:^[A-Za-z]+$

匹配由 26 个大写英文字母组成的字符串:^[A-Z]+$

匹配由 26 个小写英文字母组成的字符串:^[a-z]+$

匹配由数字和 26 个英文字母组成的字符串:^[A-Za-z0-9]+$

匹配由数字、26个英文字母或者下划线组成的字符串:^\w+$

匹配空行:\n[\s| ]*\r

匹配任何内容:[\s\S]*

匹配中文字符:[\x80-\xff]+ 或者 [\xa1-\xff]+

只能输入汉字:^[\x80-\xff],{0,}$

匹配双字节字符(包括汉字在内):[^\x00-\xff]

匹配数字

只能输入数字:^[0-9]*$

只能输入n位的数字:^\d{n}$

只能输入至少n位数字:^\d{n,}$

只能输入m-n位的数字:^\d{m,n}$

匹配正整数:^[1-9]\d*$

匹配负整数:^-[1-9]\d*$

匹配整数:^-?[1-9]\d*$

匹配非负整数(正整数 + 0):^[1-9]\d*|0$

匹配非正整数(负整数 + 0):^-[1-9]\d*|0$

匹配正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$

匹配负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$

匹配浮点数:^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

匹配非负浮点数(正浮点数 + 0):^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$

匹配非正浮点数(负浮点数 + 0):^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$

其他

匹配HTML标记的正则表达式(无法匹配嵌套标签):<(\S*?)[^>]*>.*?</\1>|<.*? />

匹配网址 URL :[a-zA-z]+://[^\s]*

匹配 IP 地址:((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)

匹配完整域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?

面试地址收集:

配置优化收集:

PHP 知识点整理【重要】_redis_02