面试汇总

MySQL mysql隔离级别、如何避免脏读和幻读 https://blog.csdn.net/johnstrive/article/details/46724315 Read Uncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。 Read Committed(读取提交内容) 这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。 Repeatable Read(可重读) 这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。 Serializable(可串行化) 这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。 这四种隔离级别采取不同的锁类型来实现,若读取的是同一个数据的话,就容易发生问题。例如: **脏读(Drity Read):**某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。 **不可重复读(Non-repeatable read):**在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。 **幻读(Phantom Read):**在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。 隔离级别 脏读 不可重复读 幻读 Read Uncommitted √ √ √ Read Committed × √ √ Repeatable Read × × √ Serializable × × × mysql主从同步原理和过程 slave(从服务器) master(主服务器) mysql主从是异步复制过程 master开启bin-log功能,日志文件用于记录数据库的读写增删 需要开启3个线程,master IO线程,slave开启 IO线程 SQL线程, Slave 通过IO线程连接master,并且请求某个bin-log,position之后的内容。 MASTER服务器收到slave IO线程发来的日志请求信息,io线程去将bin-log内容,position返回给slave IO线程。 slave服务器收到bin-log日志内容,将bin-log日志内容写入relay-log中继日志,创建一个master.info的文件,该文件记录了master ip 用户名 密码 master bin-log名称,bin-log position。 slave端开启SQL线程,实时监控relay-log日志内容是否有更新,解析文件中的SQL语句,在slave数据库中去执行。 ...

2018-12-24 · 3 分钟 · 492 字 · 王站站

面试题目

1.什么是引用变量?在PHP中,用什么符号定义引用变量? 在PHP中引用意味着用不同的名字访问同一个变量内容。使用&符号。 <?php // 定义一个变量 $a = range(0, 1000); var_dump(memory_get_usage()); // 定义变量b,将a变量的值赋值给b // COW Copy On Write $b = $a; var_dump(memory_get_usage()); // 对a进行修改 $a = range(0, 1000); var_dump(memory_get_usage()); <?php // zval变量容器(需要安装xdebug扩展) $a = range(0, 3); xdebug_debug_zval('a'); // 定义变量b,把a的值赋值给b $b = $a; xdebug_debug_zval('a'); // 修改a $a = range(0, 3); xdebug_debug_zval('a'); 2.PHP中字符串可以使用那三种定义方法以及各自的区别是什么? 定义方式:单引号,双引号,heredoc和newdoc. 单引号:不能解析变量,不能解析转义字符,只能解义单引号和反斜线本身,变量和变量,变量和字符串,字符串和字符串之间可以用.连接 双引号:可以解析变量,变量可以使用特殊字符和{}包含,可以解义所有的转义字符,可以使用.连接 单引号效率高 heredoc类似于双引号,newdoc类似于单引号,两者都是用来处理大文本 八大数据类型:标量(浮点,整型,字符串,布尔),复合(数组,对象),特殊(null,资源) 布尔中与false七种:0,0.0,’’,‘0’,false,array(),NULL 超全局数组:$GLOBALS,$_GET,$_POST,$_REQUEST,$_SESSION,$_COOKIE,$_SERVER,$_FILES,$_ENV $_SERVER[’…’]在下面⬇ // HTTP_HOST 主机名 // HTTP_USER_AGENT 获取终端设备, 浏览器版本 // // SERVER_SOFTWARE 获取服务器环境 // SERVER_NAME 服务器名 // SERVER_ADDR 服务器地址 (IP) // REMOTE_ADDR 客户端IP地址 // // SCRIPT_FILENAME 脚本地址(盘符) // SCRIPT_NAME 脚本地址(网址) // // REQUEST_URI 传输地址(带参数) // REQUEST_METHOD 传输方式 // QUERY_STRING 传输参数 // // HTTP_REFERER 获取上一级的来源地址 null:直接赋值为NULL,未定义变量,unset销毁的变量 ...

2018-12-17 · 3 分钟 · 579 字 · 王站站

云之梦面试题

第一课总结(最新PHP面试教程http://www.php.cn/course/876.html) 1.自己充满正能量,心态好,多吃苦,提升技能. 2.团队要正能量,融入团队,积极乐观. 3.人品第一,技能其次. 第二课 Use du. 当前目录的空间(Linux) crontab -e 分时日月周(Linux) cp f1.txt f2.txt 复制 看Linux启动信息:dmesg 第三课 加号(+)可以进行数组合并 月:m和n 日:d和j(带不带前导零) preg_split(/-|_/,$arr) 正则分割 str_split($arr,3) 按长度分割 str_replace('1','2',$str) 字符串替换(把1换成2) preg_replace(/linux|php/,'js',$arr) 字符串正则替换 类:protect,public,private interface 接口 abstract 抽象类或抽象方法 final 最终版本的类或方法 static 静态属性或方法 5.从表login中选出name字段包含admin的前10条结果所有信息的sql语句 select * from login where name like "%admin%" limit 10; 6.解释:左连接,右链接,内连接,索引 左连接:left ... join ... on 以左表为主导,先输出左边表的所有数据,右边匹配的输出,不匹配的值为null. 内连接:inner ... join ... on 相当于普通多表查询 索引:主键,唯一,普通 7.简述论坛中无限分类等等实现原理 表字段至少4列: id,name,pid(父类id),path(分类地图) 10.描述一下大流量高并发量网站的解决方案 1.服务器负载均衡 2.web服务器用nginx(3万)替换apache(3千) (最大并发数) 6.调高apache的默认并发数调大 7.减少客户在服务器上的连接断开时间 4.数据缓存(memcache,redis,tp文件缓存) 5.表索引 11.如何设计或配置MySQL,才能达到高效的使用目的? 1.mysql服务器主从复制 2.表分区 3.表引擎 数据小量尽量选择myisam 4.索引优化 用desc解析sql语句看字段 是否需要优化 5.服务器优化 max_connections=1500 并发连接数 wait_timeout=120 链接关闭时间 12.如何防sql注入? 1.表单尽量使用post提交 2.使用HTTP_REFERER检查源文件 3.开启addslashes 在特殊符号前加\ 4.使用htmlspecialchars对字符串实体 5.提高并发连接数 6.减小链接关闭时间 7.用户授权登录 8.定期给mysql打补丁 23.isset()和empty()的区别? isset()为假(false),只有未定义变量 empty()为空(true):未定义,0,false,'','0',array(),null 24.如何在页面之间传递变量? get,post,ajax,curl,cookie,session 25.冒泡排序? function mysort($arr){ for($i=0;$i<count($arr)-1;$i++){ for($j=0;$j<count($arr)-$i-1;$j++){ if($arr[$j]>$arr[$j+1]){ $x = $arr[$j]; $arr[$j] = $arr[$j+1]; $arr[$j+1] = $x; } } } } mysql中二次排序 第一次排完,第二次排序在第一次排序之后, 不影响第一次排序的基础上进行排序 ...

2018-12-10 · 1 分钟 · 167 字 · 王站站

Laravel框架学习笔记

001需求和安装 需求 PHP >= 7.3 BCMath PHP 拓展 Ctype PHP 拓展 Fileinfo PHP 拓展 JSON PHP 拓展 Mbstring PHP 拓展 OpenSSL PHP 拓展 PDO PHP 拓展 Tokenizer PHP 拓展 XML PHP 拓展 安装 composer create-project --prefer-dist laravel/laravel blog 运行 php artisan serve 注: 需要给storage文件夹写权限 002文件夹结构的详细 根目录 app 目录 bootstrap 目录 config 目录 database 目录 public 目录 resources 目录 routes 目录 storage 目录 tests 目录 vendor 目录 APP目录 Broadcasting 目录 Console 目录 用于控制台注册 Events 目录 Exceptions 目录 注册处理异常方法 Http 目录 Jobs 目录 Listeners 目录 Mail 目录 Models 目录 Notifications 目录 Policies 目录 Providers 目录 Rules 目录 M:app/Models V:resource/views C:app/Controllers ...

2018-07-30 · 9 分钟 · 1798 字 · 王站站

workerman学习笔记

序言 Workerman, 高性能socket框架. Workerman是一款纯PHP开发的开源高性能的PHP socket 服务框架。 Workerman每个进程能维持上万并发连接。 同时支持TCP、UDP、UNIXSOCKET,支持长连接,支持Websocket、HTTP、WSS、HTTPS等通讯协议以及各种自定义协议。拥有定时器、异步socket客户端、异步Mysql、异步Redis、异步Http、异步消息队列等众多高性能组件。 应用方向 1、即时通讯类 2、物联网类 3、游戏服务器类 4、HTTP服务 5、SOA服务化 6、其它服务器软件 7、中间件 原理 Worker是WorkerMan中最基本容器, 采用Epoll(需要装event扩展)+非阻塞IO,每个Worker进程都能上万的客户端连接,并处理这些连接上发来的数据。 主进程与worker子进程关系[https://wenda.workerman.net/uploads/answer/20140815/5670ea17653a1a6e6811ed5148f77c96.png] 开发必读 1、windows环境限制 2、workerman不依赖apache或者nginx 3、workerman是命令行启动的 4、长连接必须加心跳 5、客户端和服务端协议一定要对应才能通讯 6、连接失败可能的原因 7、不要使用exit die sleep语句 8、不要使用pcntl_fork函数 9、业务代码里不要有死循环 10、改代码要重启 11、长连接应用建议用GatewayWorker框架 12、支持更高并发 入门指引 特性 1、纯PHP开发 2、支持PHP多进程 3、支持TCP、UDP 4、支持长连接 5、支持各种应用层协议 6、支持高并发 7、支持服务平滑重启 8、支持文件更新检测及自动加载 9、支持以指定用户运行子进程 10、支持对象或者资源永久保持 11、高性能 12、支持HHVM 13、支持分布式部署 14、支持守护进程化 15、支持多端口监听 16、支持标准输入输出重定向 简单的开发示例 创建http_test.php文件 <?php use Workerman\Worker; require_once __DIR__ . '/Workerman/Autoloader.php'; // 创建一个Worker监听2345端口,使用http协议通讯 $http_worker = new Worker("http://0.0.0.0:2345"); // 启动4个进程对外提供服务 $http_worker->count = 4; // 接收到浏览器发送的数据时回复hello world给浏览器 $http_worker->onMessage = function($connection, $data) { // 向浏览器发送hello world $connection->send('hello world'); }; // 运行worker Worker::runAll(); php http_test.php start … ...

2018-05-28 · 3 分钟 · 435 字 · 王站站