面试问题总结二(技术能力-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的速度非常快,性能非常好。非常适合在分布式设备上运行数据密集型的实时应用。

优点:

RESTful API
单线程    Node.js可以在不新增额外线程的情况下,依然可以对任务进行并发处理 —— Node.js是单线程的。它通过事件循环(event loop)来实现并发操作,对此,我们应该要充分利用这一点 —— 尽可能的避免阻塞操作,取而代之,多使用非阻塞操作。
非阻塞IO
V8虚拟机
事件驱动

 

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

 

posted @ 2018-07-17 11:04  纭卿殇  Views(112)  Comments(0Edit  收藏  举报