PHP
- 表单提交中的Get和Post的异同点
get 请求一般用于向服务端获取数据,post 一般向服务端提交数据 get 传输的参数在 url 中,传递参数大小有限制,post 没有大小限制, get 不安全,post 安全性比get高 get请求在服务端用Request.queryString 接受 ,post 请求在服务端用Requset.form 接受 - echo(),print(),print_r()的区别
echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用) print() 只能打印出简单类型变量的值(如int,string) print_r() 可以打印出复杂类型变量的值(如数组,对象) echo 输出一个或者多个字符串 - 写一个方法获取文件的扩展名
function get_extension($file){
//方法一
return substr(strrchr($file,'.'), 1);
//方法二
return end(explode('.', $file));
}echo get_extension('fangzhigang.png'); //png
- 数组内置的排序方法有哪些
sort($array) //数组升序排序
rsort($array) //数组降序排序
asort($array) //根据值,以升序对关联数组进行排序
ksort($array) //根据建,以升序对关联数组进行排序
arsort($array) //根据值,以降序对关联数组进行排序
krsort($array) // 根据键,以降序对关联数组进行排序
- 语句include和require的区别是什么?为避免多次包含同一文件,可用(?)语句代替它们?
require是无条件包含也就是如果一个流程里加入require,无论条件成立与否都会先执行require
include有返回值,而require没有(可能因为如此require的速度比include快)
包含文件不存在或者语法错误的时候require是致命的错误终止执行,include不是
可以用include_once,require_once代替。 - session与cookie的区别
session:储存用户访问的全局唯一变量,存储在服务器上的php指定的目录中的(session_dir)的位置进行的存放 cookie:用来存储连续訪問一个頁面时所使用,是存储在客户端,对于Cookie来说是存储在用户WIN的Temp目录中的。 两者都可通过时间来设置时间长短 - Laravel 请求的完整生命周期
composer自动加载需要的类,文件载入composer生成的自动加载设置,包括所有你composer require的依赖。
生成容器Container,Application实例,并向容器注册核心组件(HttpKernel,ConsoleKernel ,ExceptionHandler)
处理请求,生成并发送响应(大多代码都运行在handle
方法里面)。
请求结束,进行回调 - php快的原因
1、存储变量的结构体变小,尽量使结构体里成员共用内存空间,减少引用,这样内存占用降低,变量的操作速度得到提升。
2、字符串结构体的改变,字符串信息和数据本身原来是分成两个独立内存块存放,php7尽量将它们存入同一块内存,提升了cpu缓存命中率。
3、数组结构的改变,数组元素和hash映射表在php5中会存入多个内存块,php7尽量将它们分配在同一块内存里,降低了内存占用、提升了cpu缓存命中率。
4、改进了函数的调用机制,通过对参数传递环节的优化,减少一些指令操作,提高了执行效率。 - Curl函数库的使用流程:
使用curl_init初始化请求会话
使用curl_setopt设置请求一些选项
使用curl_exec执行,发送请求
使用curl_close关闭请求会话 - PHP 如何接口调用?
public function authenticationApi($data,$url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
//输出格式可以转为数组形式的json格式
$tmpInfo = curl_exec($ch);
curl_close($ch);
return $tmpInfo;
}
- 用PHP header()函数实现页面404错误提示功能
Header(“HTTP/1.1 404 Not Found”); - 在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在预定义变量(?)中;而链接到当前页面的URL记录在预定义变量(?)中。
echo $_SERVER[‘PHP_SELF’];
echo $_SERVER[“HTTP_REFERER”]; - Composer是什么?Composer和PHP有什么关系?
Composer是PHP的一个依赖(dependency)管理工具,在我们的项目中声明所依赖的外部工具库(libraries),Composer 可以帮助我们安装这些依赖的库文件。Composer可以全局安装也可以局部安装,默认不是全局安装的,是基于指定项目的某个目录进行安装的。 - 请说明 PHP 中传值与传引用的区别。什么时候传值什么时候传引用?
按值传递:函数范围内对值的任何改变在函数外部都会被忽略
按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。 - 在PHP中error_reporting这个函数有什么作用?
设置 PHP的报错级别并返回当前级别。 - 你所知道的PHP的一些技术(smarty等)?
Smarty,jquery,ajax,memcache,p+css,js,mysqli,pdo,svn,thinkphp,brophp,yii - 你所知道的设计模式有哪些?
工厂模式、策略模式、单元素模式、观察者模式、命令链模式 - PHP的运行原理
当用户访问静态文件时
服务区接收到指令后直接返回,因为静态页不需要后端语言处理,直接由浏览器本身解析
当用户访问动态脚本时
服务器接收到指令后传递给php解释器,然后经过程序处理后,在返回给apache,apache将处理后的页面返回个i客户端,从而完成整个响应过程
当用户访问动态脚本时
此时这个脚本的数据来源与数据库时,服务器接收到指令后传递给php解释器,经过程序梳理,到达数据库,读取数据,然后层层返回,最终到达客户端,从而完成整个响应过程 - PHP的魔术方法有哪些
__contruct 构建对象时被调用
__destruct 明确销毁对象或脚本结束时被调用
__set 给补课访问或不存在属性赋值时被调用
__get 读取补课访问或不存在属性时被调用
__isset 对不可访问或不存在的属性调用isset()或empty()时被调用
__unset 对不可访问或不存在的属性进行unset时被调用
__call 调用不可访问或不存在的方法时被调用
__callStatic 调用不可访问或不存在的静态方法时被调用
__sleep 使用serialize时被调用,当不需保存大对象的所有数据时很有用
__wakeup 使用unserialize时被调用,可用于做些对象的初始化操作
__clone 进行对象clone时被调用,用来调整对象的克隆行为
__toString 当一个类被转换成字符串时被调用
__invoke 当以函数方式调用对象时被调用
__set_state 调用var_export()导出类时,此静态方法被调用。
返回值做var_export的返回值
__debuginfo 调用var_dump()打印对象时被调用 适用于PHP5.6版本
- PHP多线程实现方式有哪些
1、curl_multi方法
当需要多线程的时候,可用curl_multi一次性请求多个操作来完成,但curl走的是网络通信,效率与可靠性比较差。
function main(){
$sql = "select waybill_id,order_id from waybill where status>40 order by update_time desc limit 10 ";
$data = Yii::app()->db->createCommand($sql)->queryAll();
//yii 框架格式
foreach ($data as $k => $v) {
if ($k % 2 == 0) {
//偶数发一个网址
$send_data[$k]['url'] = '';
$send_data[$k]['body'] = $v['waybill_id']; }
else {
//奇数发送另外一个网址
$send_data[$k]['url'] = 'http://www.abc.com';
$send_data[$k]['body']=array($v['order_id'] => array('extra' => 16)); } } }
2、通过stream_socket_client 方式
function sendStream() {
$english_format_number = number_format($number, 4, '.', '');
echo $english_format_number;
exit();
$timeout = 10;
$result = array();
$sockets = array();
$convenient_read_block = 8192;
$host = "test.local.com";
$sql = "select waybill_id,order_id from xm_waybill where status>40 order by update_time desc limit 1 ";
$data = Yii::app()->db->createCommand($sql)->queryAll();
$id = 0;
foreach ($data as $k => $v) {
if ($k % 2 == 0) {
$send_data[$k]['body'] = NoticeOrder::getSendData($v['waybill_id']);
} else {
$send_data[$k]['body'] = array($v['order_id'] => array('extra' => 16)); }
$data = json_encode($send_data[$k]['body']);
$s = stream_socket_client($host . ":80
- 变量赋值方式有哪几种?
1)直接赋值
2)变量间赋值
3)引用赋值 - 引用和拷贝有什么区别?
拷贝是将原来的变量内容复制下来,拷贝后的变量与原来的变量使用各自的内存,互不干扰。
引用相当于是变量的别名,其实就是用不同的名字访问同一个变量内容。当改变其中一个变量的值时,另一个也跟着发生变化。 - php中变量有哪些基本数据类型?
php支持8种原始数据类型。
包括:
四种标量类型(布尔型boolean,整型interger,浮点型float/double , 字符串string)
两种复合类型(数组array , 对象object)
两种特殊类型(资源resource,NULL) - 服务提供者是什么?
服务提供者是所有 Laravel 应用程序引导启动的中心, Laravel 的核心服务器、注册服务容器绑定、事件监听、中间件、路由注册以及我们的应用程序都是由服务提供者引导启动的。 - IoC 容器是什么?
IoC(Inversion of Control)译为 「控制反转」,也被叫做「依赖注入」(DI)。什么是「控制反转」?对象 A 功能依赖于对象 B,但是控制权由对象 A 来控制,控制权被颠倒,所以叫做「控制反转」,而「依赖注入」是实现 IoC 的方法,就是由 IoC 容器在运行期间,动态地将某种依赖关系注入到对象之中。
其作用简单来讲就是利用依赖关系注入的方式,把复杂的应用程序分解为互相合作的对象,从而降低解决问题的复杂度,实现应用程序代码的低耦合、高扩展。
Laravel 中的服务容器是用于管理类的依赖和执行依赖注入的工具。 - Facades 是什么?
Facades(一种设计模式,通常翻译为外观模式)提供了一个”static”(静态)接口去访问注册到 IoC 容器中的类。提供了简单、易记的语法,而无需记住必须手动注入或配置的长长的类名。此外,由于对 PHP 动态方法的独特用法,也使测试起来非常容易。 - Contract 是什么?
Contract(契约)是 laravel 定义框架提供的核心服务的接口。Contract 和 Facades 并没有本质意义上的区别,其作用就是使接口低耦合、更简单。
1.预加载
当通过属性访问 Eloquent 关联时,该关联数据会被「延迟加载」。意味着该关联数据只有在使用属性访问它时才会被加载。不过,Eloquent 可以在查找上层模型时「预加载」关联数据。预加载避免了 N + 1 查找的问题
如:Topics::with(‘user’,’category’)->pagenation(15);
2.中间件 middleware
Laravel 中间件提供了一种方便的机制来过滤进入应用的 HTTP 请求
Laravel 自带了一些中间件,包括身份验证、CSRF 保护等。所有这些中间件都位于app/Http/Middleware目录
运行Artisan 命令make:middleware创建新的中间件:
php artisan make:middleware 中间件名称
3.运行 laravel mix
Laravel Mix 一款前端任务自动化管理工具,使用了工作流的模式对制定好的任务依次执行。Mix 提供了简洁流畅的 API,能够为Laravel 应用定义 Webpack 编译任务。Mix 支持许多常见的 CSS 与 JavaScript 预处理器,通过简单的调用,可以轻松地管理前端资源。
使用 Mix 很简单,首先需要使用以下命令安装 npm 依赖即可。将使用 Yarn 来安装依赖,在这之前,因为国内的网络原因,我们还需为 Yarn 配置安装加速:
$ yarn config set registry
https://registry.npm.taobao.org
使用 Yarn 安装依赖:
$ yarn install
安装成功后,运行以下命令即可:
$ npm run watch-poll
watch-poll 会在你的终端里持续运行,监控 resources 文件夹下的资源文件是否有发生改变。在 watch-poll 命令运行的情况下,一旦资源文件发生变化,Webpack 会自动重新编译。
4.辅助函数
Laravel 提供了很多 辅助函数,有时候我们也需要创建自己的辅助函数。
我们把所有的『自定义辅助函数』存放于 bootstrap/helpers.php文件中,这里需要新建一个空文件:
$ touch bootstrap/helpers.php
Linux 的 touch touch命令有两个功能:一是用于把已存在文件的时间标签更新为系统当前的时间(默认方式),它们的数据将原封不动地保留下来;二是用来创建新的空文件。
在 bootstrap/app.php 文件的最顶部进行加载:
bootstrap/app.php
<?php
require __DIR__ . '/helpers.php';
<?php
require __DIR__ . '/helpers.php';
- 字符串怎么转成整数,有几种方法?怎么实现?
强制类型转换: (整型)字符串变量名;
直接转换:settype(字符串变量,整型);
intval(字符串变量); - 标量数据和数组的最大区别是什么?
一个标量只能存放一个数据,而数组可以存放多个数据。
缓存
- 说说你对缓存技术的了解?
1、缓存技术是将动态内容缓存到文件中,在一定时间内访问动态页面直接调用缓存文件,而不必重新访问数据库。
2、使用memcache可以做缓存。 - Redis构建的类型系统
Redis构建了自己的类型系统,主要包括
redisObject对象
基于redisObject对象的类型检查
基于redisObject对象的显示多态函数
对redisObject进行分配、共享和销毁的机制 - Redis命令的分类
一种是只能用于对应数据类型的命令,例如LPUSH和LLEN只能用于列表键, SADD 和 SRANDMEMBER只能用于集合键。
另一种是可以用于任何类型键的命令。比如TTL。
当执行一个处理数据类型的命令时,Redis执行以下步骤:
根据给定 key ,在数据库字典中查找和它相对应的 redisObject ,如果没找到,就返回 NULL 。
检查 redisObject 的 type 属性和执行命令所需的类型是否相符,如果不相符,返回类型错误。
根据 redisObject 的 encoding 属性所指定的编码,选择合适的操作函数来处理底层的数据结构。
返回数据结构的操作结果作为命令的返回值。 - 什么是内收回存
c语言不具备自动内存回收功能,当将redisObject对象作为数据库的键或值而不是作为参数存储时其生命周期是非常长的,为了解决这个问题,Redis自己构建了一个内存回收机制,通过redisobject结构中的refcount实现.这个属性会随着对象的使用状态而不断变化。
创建一个新对象,属性初始化为1
对象被一个新程序使用,属性refcount加1
对象不再被一个程序使用,属性refcount减1
当对象的引用计数值变为0时,对象所占用的内存就会被释放 - 什么是Redis持久化?Redis有哪几种持久化方式?优缺点是什么?
持久化:把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。
Redis 提供了两种持久化方式:RDB(默认) 和AOF
RDB:
rdb是Redis DataBase缩写
功能核心函数rdbSave(生成RDB文件)和rdbLoad(从文件加载内存)两个函数
AOF:
Aof是Append-only file缩写
每当执行服务器(定时)任务或者函数时flushAppendOnlyFile 函数都会被调用, 这个函数执行以下两个工作
aof写入保存:
WRITE:根据条件,将 aof_buf 中的缓存写入到 AOF 文件
SAVE:根据条件,调用 fsync 或 fdatasync 函数,将 AOF 文件保存到磁盘中。
存储结构:
内容是redis通讯协议(RESP )格式的命令文本存储。
比较:
1、aof文件比rdb更新频率高,优先使用aof还原数据。
2、aof比rdb更安全也更大
3、rdb性能比aof好
4、如果两个都配了优先加载AOF - 解释下什么是RESP?有什么特点?
RESP 是redis客户端和服务端之前使用的一种通讯协议;
RESP 的特点:实现简单、快速解析、可读性好
For Simple Strings the first byte of the reply is “+” 回复
For Errors the first byte of the reply is “-” 错误
For Integers the first byte of the reply is “:” 整数
For Bulk Strings the first byte of the reply is “$” 字符串
For Arrays the first byte of the reply is “*” 数组 - Redis 有哪些架构模式?讲讲各自的特点
(1)单机版:
特点:简单
缺点:
1、内存容量有限
2、处理能力有限
3、无法高可用。
(2)主从复制:
Redis 的复制(replication)功能允许用户根据一个 Redis 服务器来创建任意多个该服务器的复制品,其中被复制的服务器为主服务器(master),而通过复制创建出来的服务器复制品则为从服务器(slave)。 只要主从服务器之间的网络连接正常,主从服务器两者会具有相同的数据,主服务器就会一直将发生在自己身上的数据更新同步 给从服务器,从而一直保证主从服务器的数据相同。
特点:
1、master/slave 角色
2、master/slave 数据相同
3、降低 master 读压力在转交从库
缺点:
1、无法保证高可用
2、没有解决 master 写的压力
(3)哨兵:
Redis sentinel 是一个分布式系统中监控 redis 主从服务器,并在主服务器下线时自动进行故障转移。其中三个特性:
监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作。
特点:
1、保证高可用
2、监控各个节点
3、自动故障迁移
缺点:
1、主从模式,切换需要时间丢数据
2、没有解决 master 写的压力
(4)集群(proxy型):
Twemproxy 是一个 Twitter 开源的一个 redis 和 memcache 快速/轻量级代理服务器; Twemproxy 是一个快速的单线程代理程序,支持 Memcached ASCII 协议和 redis 协议。
特点:
1、多种 hash 算法:MD5、CRC16、CRC32、CRC32a、hsieh、murmur、Jenkins
2、支持失败节点自动删除
3、后端 Sharding 分片逻辑对业务透明,业务方的读写方式和操作单个 Redis 一致
缺点:
增加了新的 proxy,需要维护其高可用。
(5)集群(直连型):
从redis 3.0之后版本支持redis-cluster集群,Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。
特点:
1、无中心架构(不存在哪个节点影响性能瓶颈),少了 proxy 层。
2、数据按照 slot 存储分布在多个节点,节点间数据共享,可动态调整数据分布。
3、可扩展性,可线性扩展到 1000 个节点,节点可动态添加或删除。
4、高可用性,部分节点不可用时,集群仍可用。通过增加 Slave 做备份数据副本
5、实现故障自动 failover,节点之间通过 gossip 协议交换状态信息,用投票机制完成 Slave到 Master 的角色提升。
缺点:
1、资源隔离性较差,容易出现相互影响的情况。
2、数据通过异步复制,不保证数据的强一致性
解决方案
- 对于大流量的网站,你会采用什么方法来解决访问量
(1)首先确认服务器硬件是否满足支持当前的流量;
(2)优化数据库的访问;
(3)禁止外部盗链;
(4)控制大文件下载;
(5)使用不同的主机分流;
(6)使用流量分析统计; - 对于大流量的网站,你会采用什么方法来解决访问量
(1)首先确认服务器硬件是否满足支持当前的流量;
(2)优化数据库的访问;
(3)禁止外部盗链;
(4)控制大文件下载;
(5)使用不同的主机分流;
(6)使用流量分析统计; - 说说你对代码管理的了解?常使用那些代码版本控制软件?
通常一个项目是由一个团队去开发,每个人将自己写好的代码提交到版本服务器,由项目负责人按照版本进行管理,方便版本的控制,提高开发效率,保证需要时可以回到旧版本。
常用的版本控制器:SVN
说说你对SVN的了解?优缺点?
SVN是一种版本控制器,程序员开发的代码递交到版本服务器进行集中管理。
SVN的优点:代码进行集中管理,版本控制容易,操作比较简单,权限控制方便。
缺点:不能随意修改服务器项目文件夹。
MySQL
- 什么是索引?
索引是一种数据结构,可以帮助我们快速的进行数据的查找. - 索引是个什么样的数据结构呢?
索引的数据结构和具体存储引擎的实现有关, 在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引. - MySQL支持哪些存储引擎?
MySQL支持多种存储引擎,比如InnoDB,MyISAM,Memory,Archive…
在大多数的情况下,直接选择使用InnoDB引擎都是最合适的,InnoDB也是MySQL的默认存储引擎. - InnoDB和MyISAM有什么区别?
InnoDB支持事务,而MyISAM不支持事物,崩溃后无法安全恢复,表锁非常影响性能
InnoDB支持行级锁,而MyISAM支持表级锁
InnoDB支持MVCC,实现了四个标准的隔离级别 而MyISAM不支持
InnoDB 表是基于聚族索引建立的,聚族索引对主键查询有很高的性能
InnoDB支持外键,而MyISAM不支持
InnoDB不支持全文索引,而MyISAM支持,可以支持复杂的查询 - 配置mysql服务器的时候,配置了auto_increment_increment=3,请问这里的3意味着什么?
auto_increment是用于主键自动增长的,从3开始增长,3表示自增的起始值 - 简述你们公司使用的MySQL版本,并说明具体小版本及GA时间?
5.7.20
5.6.38
2017.9.13 - 请介绍你熟悉的数据库关系系统的种类和代表产品名称?
NoSQL:Redis Mongodb memecache
RDBMS:Oracle MySQL MSSQL PG - 请简述MySQL二进制安装重点步骤?
1.下载,上传,解压
2.创建用户
3.创建相关目录并授权
4.设置环境变量
5.初始化数据
6.配置文件
7.配置启动脚本 - 怎么确认数据库启动成功了?
netstar -lnp | grep 3306
ps -ef | grep mysqld
ss -lnp|grep 3306
直接登录数据库 - 简述你了解的MySQL分支版本情况?
Oracle MySQL
MariaDB
Percona - 请简述mysqld的程序结构(1条SQL语句的执行过程)
连接层:提供连接协议,验证用户,建立专属连接线程
SQL层:语义、语法、权限,解析,优化,执行,查询缓存,日志记录
存储引擎层:相当于Linux文件系统,例如:InnoDB提供了事务,CSR,热备,MVCC,行级锁等 - 请简述你了解的MySQL的启动方式
systemd
mysqld - 简述MySQL配置文件默认读取顺序
mysqld --help–verbose|grep “my.cnf” - mysqld_safe --default-files=/opt/my.cnf &是什么作用?
指定数据库配置文件,并后台运行 - 忘记管理员root的密码处理过程,请对参数详细说明
–skip-grant-tables 关闭连接层的验证功能
–skip-netwoking 关闭TCPIP协议 - 请列举SQL语句的常用种类
DDL、DCL、DQL、DML - 请说明聚集索引和辅助索引的区别
辅助索引的叶子节点只存储有序的某个列的=值;
聚集索引存储的是整行数据
辅助索引一般配合聚集索引使用,通过辅助索引 找到主键值,然后通过聚集索引找到数据行
减少了回表查询所带来的随机IO - 请简述以下语句执行计划可能存在的问题
阐述以下语句可能存在的问题,并提出合理解决方案
explain select * from city where countrycode=‘CHN’ order by population;
1.countrycode没有走索引,有可能是没建立索引,或者是索引失效
2.出现了filesort文件排序,orderby条件也没走索引
建议:
1.如果没有索引导致,建立联合索引(countrycode,population)
2.如果是索引失效,删除索引重建 - 简述出现以下结果的可能原因
怀疑是 telnum列是字符串类型,可能出现了隐式转换,需要进一步判断数据类型 - 请简述,影响索引树高度的因素?
数据量级:分表分库分布式
索引键值太长:前缀索引
数据类型:char varchar选择,enum,选择合理的数据类型 - 请说明数据库启动失败的处理思路?
如果有日志看日志,如果没有日志mysqld直接启动 - MySQL索引的种类都有哪些?
R树
B树
hash - 你了解的MySQL存储引擎种类有哪些?
InnoDB MyiAM CSV - InnoDB存储引擎核心特性
事物、CSR、MVCC、热备、外键、行级锁 - 创建管理员用户:oldboy能通过10.0.0.0/24网段任意地址登录管理MySQL
grant all on . to oldboy@10.0.0.0/24 identified by ‘123’; - 创建应用用户:wordpress能通过172.16.1.0/24网段任意地址登录操作wordpress库下的所有表
grant select,update,delete,insert on wordpress.* to wordpress@172.16.1.0/24 identified by ‘123’; - 请写出/etc/my.cnf的基础配置信息
[mysqld]
user=mysql
basedir=/application/mysql/
datadir=/data/mysql/data/
socket=/tmp/my.sock
server_id=1
[mysql]
socket=/tmp/my.sock
- 请写出使用oldboy用户远程登录MySQL的具体语句
mysql -uroot -p -h 10.0.0.51 -P3306 - 创建GBK字符集的数据库oldboy,并查看已建库完整语句
create database oldboy charsetgbk; (创建用户)
show create database oldboy; (查询建库语句) - 创建用户oldboy,使之可以管理数据库oldboy
grant all on oldboy.* to oldboy@10.0.0.0/24 identified by ‘123’; - 字段为什么要求定义为not null?
null值会占用更多的字节,且会在程序中造成很多与预期不符的情况. - 如果要存储用户的密码散列,应该使用什么字段进行存储?
密码散列,盐,用户身份证号等固定长度的字符串应该使用char而不是varchar来存储,这样可以节省空间且提高检索效率. - MySQL中的varchar和char有什么区别
char是一个定长字段,假如申请了char(10)的空间,那么无论实际存储多少内容.该字段都占用10个字符,而varchar是变长的,也就是说申请的只是最大长度,占用的空间为实际字符长度+1,最后一个字符存储使用了多长的空间.
在检索效率上来讲,char > varchar,因此在使用中,如果确定某个字段的值的长度,可以使用char,否则应该尽量使用varchar.例如存储用户MD5加密后的密码,则应该使用char. - MySQL的binlog有有几种录入格式?分别有什么区别?
有三种格式,statement,row和mixed.
statement模式下,记录单元为语句.即每一个sql造成的影响会记录.由于sql的执行是有上下文的,因此在保存的时候需要保存相关的信息,同时还有一些使用了函数之类的语句无法被记录复制.
row级别下,记录单元为每一行的改动,基本是可以全部记下来但是由于很多操作,会导致大量行的改动(比如alter table),因此这种模式的文件保存的信息太多,日志量太大.
mixed. 一种折中的方案,普通操作使用statement记录,当无法使用statement的时候使用row.
新版的MySQL中对row级别也做了一些优化,当表结构发生变化的时候,会记录语句而不是逐行记录. - 关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?
在业务系统中,除了使用主键进行的查询,其他的我都会在测试库上测试其耗时,慢查询的统计主要由运维在做,会定期将业务中的慢查询反馈给我们.
慢查询的优化首先要搞明白慢的原因是什么? 是查询条件没有命中索引?是load了不需要的数据列?还是数据量太大?
所以优化也是针对这三个方向来的,
首先分析语句,看看是否load了额外的数据,可能是查询了多余的行并且抛弃掉了,可能是加载了许多结果中并不需要的列,对语句进行分析以及重写.
分析语句的执行计划,然后获得其使用索引的情况,之后修改语句或者修改索引,使得语句可以尽可能的命中索引.
如果对语句的优化已经无法进行,可以考虑表中的数据量是否太大,如果是的话可以进行横向或者纵向的分表.
Linux
- Linux开机启动过程?
1)主机加电自检,加载BOLS硬件信息
2)读取MBR的引导文件(grub,lilo)
3)引导linux内核
4)运行第一个进程init(进程号永远为1)
5)进入相应的运行级别
6)运行终端,输入用户名和密码 - Linux系统缺省的运行级别
0.关机
1.单机用户模式
2.字符界面的多用户模式(不支持网络)
3.字符界面的多用户模式
4.未分配使用
5.图形界面的多用户模式
6.重启 - Linux系统是由那些部分组成?
Linux系统内核,shell,文件系统和应用程序四部分组成 - 如何规划一台Linux主机,步骤是怎样?
1、确定机器是做什么用的,比如是做web、db、还是游戏服务器
2、确定好之后,就要定系统需要怎么安装,默认安装哪些系统、分区怎么做
3、需要优化系统的哪些参数,需要创建哪些用户等等的 - 什么叫CC攻击?什么叫DDOS攻击?怎么预防CC攻击和DDOS攻击?
- CC攻击主要是用来攻击页面的,模拟多个用户不停的对你的页面进行访问,从而使你的系统资源消耗殆尽
- DDOS攻击中文名叫分布式拒绝服务攻击,指借助服务器技术将多个计算机联合起来作为攻击平台,来对一个或多个目标发动DDOS攻击,
攻击即是通过大量合法的请求占用大量网络资源,以达到瘫痪网络的目的
预防: - 防CC/DDOS攻击这些只能是用硬件防火墙做流量清洗,将攻击流量引入黑洞
流量清洗这一块,主要是买ISP服务商的防攻击的服务就可以,机房一般有空余流量,
我们一般是买服务,毕竟攻击不会是持续长时间
-
Linux 中进程有哪几种状态?在 ps 显示出来的信息中,分别用什么符号表示的?
(1)不可中断状态:进程处于睡眠状态,但是此刻进程是不可中断的。不可中断, 指进程不响应异步信号。
(2)暂停状态/跟踪状态:向进程发送一个 SIGSTOP 信号,它就会因响应该信号 而进入 TASK_STOPPED 状态;当进程正在被跟踪时,它处于 TASK_TRACED 这个特殊的状态。
“正在被跟踪”指的是进程暂停下来,等待跟踪它的进程对它进行操作。
(3)就绪状态:在 run_queue 队列里的状态
(4)运行状态:在 run_queue 队列里的状态
(5)可中断睡眠状态:处于这个状态的进程因为等待某某事件的发生(比如等待 socket 连接、等待信号量),而被挂起
(6)zombie 状态(僵尸):父亲没有通过 wait 系列的系统调用会顺便将子进程的尸体(task_struct)也释放掉
(7)退出状态
D 不可中断 Uninterruptible(usually IO)
R 正在运行,或在队列中的进程
S 处于休眠状态
T 停止或被追踪
Z 僵尸进程
W 进入内存交换(从内核 2.6 开始无效)
X 死掉的进程
3.简述dns解析流程?访问www.pythonav.cn的解析流程
自上而下的顺序
1.优先查找本地dns缓存
2.查找本地/etc/hosts文件,是否有强制解析
3.如果没有去/etc/resolv.conf指定的dns服务器中查找记录(需联网
4.在dns服务器中找到解析记录后,在本地dns中添加缓存
5.完成一次dns解析 -
硬链接和软链接有什么区别?
1.是否为同一个文件
硬链接:是同一个文件,首先在自己的工作目录下创建一个文件,然后进行链接的创建。然后用ls -li查看文件的属性,可以看到inode节点编号和链接数一模一样,文件的 inode 值,你可以简单把它想成 C 语言中的指针。它指向了物理硬盘的一个区块,事实上文件系统会维护一个引用计数,只要有文件指向这个区块,它就不会从硬盘上消失。 软连接:不是同一个文件,首先创建一个文件,然后做软链接,用ls -li查看属性,你会发现,这个软链接的 inode 竟然不一样啊,并且它的文件属性上链接数也不一样,这就说明它与之前我们创建的两个文件根本不是一个类型。
2.是否可以跨分区做链接?
硬链接不可以跨分区 软连接可以跨分区
3.链次数的增加
硬链接增加链接数 软连接不增加
4.inode节点编号
硬链接增加 软链接不增加
5.原始文件删除链接书否删除
硬链接不删除 软连接不删除
6.链接文件大小
硬链接一样大 软链接不一样大
7.是否支持目录
硬链接不支持目录 软连接支持目录
8.链接相对路径写法不一样
硬链接写绝对相对路径 软链接写相对路径根据生成链接文件的路径 -
如何规划一台Linux主机,步骤是怎样?
1、确定机器是做什么用的,比如是做web、db、还是游戏服务器
2、确定好之后,就要定系统需要怎么安装,默认安装哪些系统、分区怎么做
3、需要优化系统的哪些参数,需要创建哪些用户等等的 -
一台Linux系统初始化环境后需要做一些什么安全工作?
1、添加普通用户登陆,禁止root用户登陆,更改SSH端口号
2、服务器使用密钥登陆,禁止密码登陆
3、开启防火墙,关闭SElinux,根据业务需求设置相应的防火墙规则
4、装fail2ban这种防止SSH暴力破击的软件
5、设置只允许公司办公网出口IP能登陆服务器(看公司实际需要)
6、设置nginx_waf模块防止SQL注入
7、把Web服务使用www用户启动,更改网站目录的所有者和所属组为www
8、修改历史命令记录的条数为10条 -
查看系统当前进程连接数?
netstat -an | grep ESTABLISHED | wc -l -
如何在/usr目录下找出大小超过10MB的文件?
find /usr -type f -size +10240k -
详细说明keepalived的故障切换工作原理
这种故障切换是通过VRRP协议来实现的,主节点会按一定的时间间隔发送心跳信息的广播包,告诉备节点自己的存活状态信息,当主节点发生故障时,备节点在一段时间内就收到广播包,从而判断主节点出现故障,因此会调用自身的接管程序来接管主节点的IP资源及服务,当主节点恢复时,备节点会主动释放资源,恢复到接管前的状态,从而来实现主备故障切换