面试问题总结二(技术能力-PHP)----Ⅳ
57、Linux 的基本命令(重点,现在多数服务器都是Linux 系统)
答:arch 显示机器的处理器架构
uname -m 显示机器的处理器架构
uname -r 显示正在使用的内核版本
dmidecode -q 显示硬件系统部件
- (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性
hdparm -tT /dev/sda 在磁盘上执行测试性读取操作
cat /porc/cpuinfo 显示 CPU info 的信息
cat /porc/interrupts 显示中断
cat /porc/meminfo 校验内存使用
cat /porc/swaps 显示哪些 swap 被使用
cat /porc/verion 显示内核的版本
cat /porc/net/dev 显示网络适配器及统计
cat /porc/mounts 显示已加载的文件系统
date 显示系统日期
cal 2007 显示 2007 年的日历表
date 061212352018.00 设置日期和时间 -月日时分年.秒
clock -w 将时间修改保存到 BIOS
文件搜索:
find / -name file1 从 '/'开始进入根文件系统搜索文件和目录
locate *.ps 寻找以 '.ps'结尾的文件-先运行'updatedb'命令
whereis halt 显示一个二进制文件、源码或 man 的位置
which halt 显示一个二进制文件或可执行文件的完整路径
挂载一个文件系统:
mount /dev/hda2 /mnt/hda2 挂载一个叫做 hda2 的盘- 确定目录'/ mnt/hda2' 已经存在
umount /dev/hda2 卸载一个叫做 hda2 的盘- 先从挂载点'/ mnt/hda2' 退出
追加命令:
1、sudo cat /etc/aaa >>/usr/bbb 把文件/etc/aaa 中的内容追加到/usr/bbb 中的内容的后面
2、sudo chmod apache:apache /etc/index.html 更改/etc/index.html 的文件所有者为 apache,文件群组为 apache
3、sudo chmod 744 /etc/index.html4 更改/etc/index.html 的所有者权限为读取、写入、执行。群组权限为读取。其他权限为读取
sudo rm /etc/index.html 删除/etc 下名为 hello 的文件
当然,如果你是以 orot 用户执行以上操作,可以去掉前边的 sudo
df -hl 查看磁盘剩余空间
df -h 查看每个根路径的分区大小
du -sh [目录名] 返回该目录的大小
du -sm [文件夹] 返回该文件夹总 M 数
shutdown -h now 关机 (系统的关机、重启以及登出)
关闭系统
init 0 关闭系统
telinit 0 关闭系统
shutdown -h hour:minutes & 按预定时间关闭系统
shutdown -c 取消按预定时间关闭系统
shutdown -r now 重启
reboot 重启
logout 注销文件和目录
pwd 显示工作路径
ls 查看目录中的文件
ls -F 查看目录中的文件
ls -l 显示文件和目录的详细资料
ls -a 显示隐藏文件
ls *[0-9]* 显示包含数字的文件名和目录名
tree [文件夹] 显示文件和目录由根目录开始的树形结构
lstree [文件夹] 显示文件和目录由根目录开始的树形结构
mkdir dir1 创建一个叫做 'dir1'的目录' 磁盘空间
df -h 显示已经挂载的分区列表
ls -lSr |more 以尺寸大小排列文件和目录
du -sh dir1 估算目录 'dir1'已经使用的磁盘空间'
下载、解压
1、对于.tar 结尾的文件 tar -xf all.tar
2、对于.gz 结尾的文件 gzip -d all.gz
gunzip all.gz
# zip all.zip *.jpg 这条命令是将所有.jpg 的文件压缩成一个 zip 包
# unzip all.zip 这条命令是将 all.zip 中的所有文件解压出来下载命令
wget + 空格 +要下载文件的 url 路径=====================================
Shell 脚本:必须以 #!/bin/sh 开头简单例子:判断这个目录下有没有文件(File)
#!/bin/bash
Num=`ls -al /opt |grep "^-"|wc -l `
if [ $Num != 0 ]
then echo "/opt has $Num files"
else echo "/opt has none file"
fils -al /opt |grep "^-"|wc -l 这个命令能够统计文件个数 为 0 就是没有文件 非零就是有文件
58、memache 一般用来缓存什么数据?
答:1、经常被读取并且实时性要求不强可以等到自动过期的数据。例如网站首页最新文章列表、某某排行等数据。
2、经常被读取并且实时性要求不强的数据。比如用户的好友列表,用户文章列表,用户阅读记录等。
3、统计类缓存,比如文章浏览数、网站 PV 等。
4、活跃用户的基本信息或者某篇热门文章。
5、session 数据
59、魔术方法和魔术常量
答:魔术方法:
1、__construct() 实例化对象时被调用,当 __construct 和以类名为函数名的函数同时存在时,__construct 将被调用,另一个不被调用。
2、__destruct() 当删除一个对象或对象操作终止时被调用。
3、__call() 对象调用某个方法,若方法存在,则直接调用;若不存在,则会去调用 __call 函数。
4、__get() 读取一个对象的属性时,若属性存在,则直接返回属性值;若不存在,则会调用 __get 函数。__get()方法有一个参数,表示要调用的变量名
5、__set() 设置一个对象的属性时,若属性存在,则直接赋值;若不存在,则会调用 __set 函数。__set()方法包含两个参数,分别表示变量名称和变量值,两个参数都不可省略
6、__toString() 打印一个对象的时被调用。如 echo obj;或 printobj;
7、__clone() 克隆对象时被调用。如:t=newTest();t1=clone $t;
8、__sleep() serialize 之前被调用。若对象比较大,想删减一点东东再序列化,可考虑一下此函数。
9、__wakeup() unserialize 时被调用,做些对象的初始化工作。
10、__isset() 检测一个对象的属性是否存在时被调用。如:isset($c->name)。11、__unset() unset销毁指定的变量时被调用。如:unset($c->name)。
12、__set_state() 调用 var_export 时,被调用。用 __set_state 的返回值做为 var_export 的返回值。
var_export ( mixed $expression
[,bool $return
] )此函数返回关于传递给该函数的变量的结构信息,它和 var_dump() 类似,不同的是其返回的表示是合法的 PHP 代码。第二个参数设置为 TRUE
,从而返回变量的表示。
13、__autoload()实例化一个对象时,如果对应的类不存在,则该方法被调用。
魔术常量:
1、__LINE__ 返回文件中的当前行号。
2、__FILE__ 返回文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径。
3、__FUNCTION__ 返回函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
4、__CLASS__ 返回类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
5、__METHOD__ 返回类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
6、__DIR__ 当前文件的目录
60、接口 interface 和抽象类 abstract class 的区别?
答:抽象类是一种不能被实例化的类,只能作为其他类的父类来使用。抽象类是通过关键字 abstract 来声明的。抽象类与普通类相似,都包含成员变量和成员方法,两者的区别在于,抽象类中至少要包含一个抽象方法,抽象方法没有方法体,该方法天生就是要被子类重写的。抽象方法的格式为:abstract function abstractMethod();
接口是通过 interface 关键字来声明的,接口中的成员常量和方法都是 public 的,方法可以不写关键字 public,接口中的方法也是没有方法体。接口中的方法也天生就是要被子类实现的。抽象类和接口实现的功能十分相似,最大的不同是接口能实现多继承。在应用中选择抽象类还是接口要看具体实现。子类继承抽象类使用 extends,子类实现接口使用 implements。
接口是一种特殊化的抽象类
61、什么是队列?排它锁,Myisam 死锁如何解决?
答:在默认情况下 MyIsam 是表级锁,所以同时操作单张表的多个动作只能以队列的方式进行。
排它锁又名写锁,在 SQL 执行过程中为排除其它请求而写锁,在执行完毕后会自动释放。
死锁解决:先找到死锁的线程号(从数据字典里面分析,mysql>
SELECT
*
FROM
information_schema.INNODB_TRX\G
),然后杀掉线程 ID(kill 线程ID)。
62、Myisam 与 Innodb 的区别?
Innodb引擎
Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别。 该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQL后台的完整数据库系统,MySQL运行时Innodb会在内存中建立缓冲池,用于缓冲数据和索引。 但是该引擎不支持FULLTEXT类型的索引(全文索引),而且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表。 当需要使用数据库事务时,该引擎当然是首选。由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率。 但是使用行级锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表。
MyIASM引擎
MyIASM是MySQL默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键,因此当INSERT(插入)或UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低一些。 不过和Innodb不同,MyIASM中存储了表的行数,于是SELECT COUNT(*) FROM TABLE 时只需要直接读取已经保存好的值而不需要进行全表扫描。 如果表的读操作远远多于写操作且不需要数据库事务的支持,那么MyIASM也是很好的选择
主要区别:
1、MyIASM是非事务安全的,而InnoDB是事务安全的
2、MyIASM锁的粒度是表级的,而InnoDB支持行级锁
3、MyIASM支持全文类型索引,而InnoDB不支持全文索引(5.6.24以后支持)、
4、MyIASM相对简单,效率上要优于InnoDB,小型应用可以考虑使用MyIASM
5、MyIASM表保存成文件形式,跨平台使用更加方便
6、MyIASM不支持外键约束,而InnoDB 支持外键约束(可实现表的联动操作,一删多删)
应用场景:
1、MyIASM管理非事务表,提供高速存储和检索以及全文搜索能力,如果再应用中执行大量select操作,应该选择MyIASM
2、InnoDB用于事务处理,具有ACID事务支持等特性,如果在应用中执行大量insert和update操作,应该选择InnoDB
63、bootstrap 框架有哪些优点?
答:bootstrap 是一款 web 开发框架,它由 CSS,JavaScript,Html,三部分构成,它简洁灵活,使得 web 开发更加的快捷
优点:
①节省时间: 使用 bootstrap 框架,可以大大的节省项目开发时间,它包含了很多现成的代码,如果需要使用,只需要找到合适的代码,插入合适的位置即可,此外,CSS 是使用 LESS 编写,很多样式和设计都已经设计完成了
②定制化: bootstrap 可以根据自己的项目,留取框架中自己需要的部分
③设计合理:
- 栅格系统: bootstrap 定义 12 格栅系统,在页面已经完成时,你可以根据合适的网格,以自己的需求改变行数和布局大小,样式已经开发完成了,只需要把代码放入合适的 HTML 代码位置即可
- LESS: LESS 是基于 CSS 之上的高级语言,其目的是使得 CSS 开发更加灵活,更加强大
- JavaScript:bootstrap 提供 JavaScript 库,该库超越了基本的架构和样式,开发者可以轻松的操作窗口警告框,工具提示框等,可避免了我们费神费力的写脚本
- 一致性: bootstrap 可以保证界面在不同平台的统一性,无论实在 IE,Chrome 等
- 持续更新: bootstrap 在不断的改进,更具规律性和持续性
- 响应式: 无论是在 PC 端还是移动端,都可以保持界面的一致性
- 文档多: bootstrap 的非常多
64、简述下node.js的认识?
中文文档参考:http://nodejs.cn/api/
简单的说 Node.js 就是运行在服务端的 JavaScript。一个新兴的前端框架,后台语言。
Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。 用于方便地搭建响应速度快、易于扩展的网络应用。
Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。非常适合在分布式设备上运行数据密集型的实时应用。
优点:
64、简述下vue.js的认识?
答:
Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的渐进式框架。
Vue 核心库只关注视图层, 采用自底向上增量开发的设计。
Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。
Vue 学习起来非常简单。
Vue.js的特性如下:
1.轻量级的框架
2.双向数据绑定
3.指令
4.插件化
65、Mysql 高并发解决方案?
答:参考:https://blog.csdn.net/qiuweihong/article/details/78751466
正常的优化方案如下:
1、代码中sql语句优化
2、数据库字段优化,索引优化
3、加缓存,redis/memcache等
4、主从,读写分离
5、分区表
6、垂直拆分,解耦模块
7、水平切分
66、InnoDB和MyIsam分别使用的什么索引,如何实现的?
参考:https://blog.csdn.net/z702143700/article/details/46049101
MyISAM索引实现:
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。
MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分。
InnoDB索引实现:
InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。
区别:
1、InnoDB的数据文件本身就是索引文件。MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
2、叶节点包含了完整的数据记录,这种索引叫做聚集索引。
3、因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。
4、InnoDB的所有辅助索引都引用主键作为data域。
5、聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。
总结:
1、InnoDB不建议使用过长的字段作为主键。因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。
2、非单调(不是自增或自减的均为非单调)的字段作为主键在InnoDB中不是个好做法,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。
参考资料:
https://blog.csdn.net/Px01Ih8/article/details/80823381