jiuwuzhizun
  1. 主从复制的原理是什么?主从复制中断了怎么办?主从复制出现延迟怎么处理?主库崩溃了怎么办?

  原理:从库生成两个线程,一个I/O线程,一个SQL线程;

 

i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;

主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;

 

SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;

主从复制中断:

slave stop;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
slave start;

在使用set  global sql_slave_skip_counter=1; 时要注意以下几点:
1. 检查跳过的event是否在一个事物中。
2. 跳过slave上的event进行后续处理后要检查数据的一致性。
3. 最好能在masterbinglog上查看一下跳过的evnet到底做了写什么。

主从复制出现延迟:最简单的减少slave同步延时的方案就是在架构上做优化,尽量让主库的DDL快速执行。还有就是主库是写,对数据安全性较高,比如 sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之类的设置,而slave则不需要这么高的数据安全,完全可以讲sync_binlog设置为0或者关闭binlog,innodb_flushlog也 可以设置为0来提高sql的执行效率。另外就是使用比主库更好的硬件设备作为slave。

主库奔溃: MySQL从3.23.15版本以后提供数据库复制(replication)功能,利用该功能可以实现两个数据库同步、主从模式、互相备份模式的功能。本文档主要阐述了如何在linux系统中利用mysql的replication进行双机热备的配置。

  1. Redis有哪些数据类型?

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

  1. Redis和memcache的区别是什么?

(1)   redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

(2)Redis支持数据的备份,即master-slave模式的 数据备份。

(3)Redis支持数据的持久化,可以将内存中的 数据保持在磁盘中,重启的时候可以再次加载进行使用。

         Memcache和redis的比较

  Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描述字pipe 传递给worker线程,进行读写IO, 网络层使用libevent封装的事件库,多线程模型可以发挥多核作用,但是引入了cache coherency和锁的问题,比如,Memcached最常用的stats 命令,实际Memcached所有操作都要对这个全局变量加锁,进行计数等工作,带来了性能损耗。

 Redis使用单线程的IO复用模型,自己封装了一个简单的AeEvent事件处理框架,主要实现了epoll、kqueue和select,对于单纯只有IO操作来说,单线程可以将速度优势发挥到最大,但是Redis也提供了一些简单的计算功能,比如排序、聚合等,对于这些操作,单线程模型实际会严重影响整体吞吐量,CPU计算过程中,整个IO调度都是被阻塞住的。

2.内存管理方面

  Memcached使用预分配的内存池的方式,使用slab和大小不同的chunk来管理内存,Item根据大小选择合适的chunk存储,内存池的方式可以省去申请/释放内存的开销,并且能减小内存碎片产生,但这种方式也会带来一定程度上的空间浪费,并且在内存仍然有很大空间时,新的数据也可能会被剔除,原因可以参考Timyang的文章:http://timyang.net/data/Memcached-lru-evictions/

  Redis使用现场申请内存的方式来存储数据,并且很少使用free-list等方式来优化内存分配,会在一定程度上存在内存碎片,Redis跟据存储命令参数,会把带过期时间的数据单独存放在一起,并把它们称为临时数据,非临时数据是永远不会被剔除的,即便物理内存不够,导致swap也不会剔除任何非临时数据(但会尝试剔除部分临时数据),这点上Redis更适合作为存储而不是cache

 3.数据一致性问题

  Memcached提供了cas命令,可以保证多个并发访问操作同一份数据的一致性问题。 Redis没有提供cas 命令,并不能保证这点,不过Redis提供了事务的功能,可以保证一串 命令的原子性,中间不会被任何操作打断。

  4.存储方式及其它方面

  Memcached基本只支持简单的key-value存储,不支持枚举,不支持持久化和复制等功能

  Rediskey/value之外,还支持list,set,sorted set,hash等众多数据结构,提供了KEYS

  进行枚举操作,但不能在线上使用,如果需要枚举线上数据,Redis提供了工具可以直接扫描其dump文件,枚举出所有数据,Redis还同时提供了持久化和复制等功能。

  5.关于不同语言的客户端支持

  在不同语言的客户端方面,MemcachedRedis都有丰富的第三方客户端可供选择,不过因为Memcached发展的时间更久一些,目前看在客户端支持方面,Memcached的很多客户端更加成熟稳定,而Redis由于其协议本身就比Memcached复杂,加上作者不断增加新的功能等,对应第三方客户端跟进速度可能会赶不上,有时可能需要自己在第三方客户端基础上做些修改才能更好的使用。

 总结:

  1.Redis使用最佳方式是全部数据in-memory

  2.Redis更多场景是作为Memcached的替代者来使用。

  3.当需要除key/value之外的更多数据类型支持时,使用Redis更合适。

  4.当存储的数据不能被剔除时,使用Redis更合适。

  1. Redis在项目中怎么用的?

   1会话缓存

最常用的一种使用redis的情景会话缓存。用redis缓存会话比其他存储的优势在于:redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分肯定是不高兴的。

随着redis这些年的改进,很容易找到怎么恰当的使用reids来缓存会话的文档。

2)全页缓存

除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。

3)队列

Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。

4)发布/订阅

最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。

  1. Mysql数据库优化做过哪些工作?

(1)   选取最实用的字段属性:MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。

(2)使用连接(join)来代替子查询: 使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的SQL操作,同时也可以避免事务或者表锁死,并且写起来也很容易。

(3)使用联合(union)来代替手动创建的临时表:MySQL从4.0的版本开始支持union查询,它可以把需要使用临时表的两条或更多的select查询合并的一个查询中。在客户端的查询会话结束的时候,临时表会被自动删除,从而保证数据库整齐、高效。

(4)事务:事务,它的作用是:要么语句块中每条语句都操作成功,要么都失败。换句话说,就是可以保持数据库中数据的一致性和完整性。事物以BEGIN关键字开始,COMMIT关键字结束。在这之间的一条SQL操作失败,那么,ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。

(5)锁定表:事务是维护数据库完整性的一个非常好的方法,但却因为它的独占性,有时会影响数据库的性能,尤其是在很大的应用系统中。由于在事务执行的过程中,数据库将会被锁定,因此其它的用户请求只能暂时等待直到该事务结束。如果一个数据库系统只有少数几个用户来使用,事务造成的影响不会成为一个太大的问题;但假设有成千上万的用户同时访问一个数据库系统,例如访问一个电子商务网站,就会产生比较严重的响应延迟。所以我们用锁定表来优化。

(6)使用外健:锁定表的方法可以维护数据的完整性,但是它却不能保证数据的关联性。这个时候我们就可以使用外键。

(7)使用索引:索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快得多的速度检索特定的行,尤其是在查询语句当中包含有MAX(),MIN()和ORDERBY这些命令的时候,性能提高更为明显。 一般说来,索引应建立在那些将用于JOIN,WHERE判断和ORDERBY排序的字段上。尽量不要对数据库中某个含有大量重复的值的字段建立索引。

优化的查询语句:使用索引可以提高查询的速度,但如果SQL语句使用不恰当的话,索引将无法发挥它应有的作用。

  1. Myisam和innodb的区别是什么?

Myisam查的,但不支持事务

 

Innodb写的快,支持事务以及外键,且不支持FULLTEXT(全文)索引

 

Innodb不保存表的具体行数Myisam保存

 

对于AUTO_INCREMENT(自增)类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引

 

MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小。

  1. 你了解哪些数据结构?

 数组,队列,hash

  1. 你了解哪些算法?

 排序算法:

冒泡排序(稳定排序)

一次比较两个元素,如果他们的顺序错误就把他们交换过来一直重复直到不能交换为止

快速排序(不稳定)

查找算法

      二分查找(折半查找):

用给定值k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。

  1. 负载均衡怎么搭建的?nginx属于第几层负载均衡?nginx对于请求的分配有哪些策略模式?

   负载均衡如何搭建

拥有多台服务器:在给个配置文件中进行修改

https://www.cnblogs.com/oshine/p/3953259.html

Nginx属于第几层负载均衡

第四层(tcp)

Nginx对于请求分配有哪些策略

轮询(默认) 

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除

ip_hash

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题

url_hash

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器

  1. 你们的项目用了几台服务器?怎么分配的?

      2台,搭建了负载均衡和mysql主从复制

  1. 处理过高并发吗?请说明业务场景和解决办法

  在多用户高并发的情况下经常会库存出现问题。排查到,在同一时间内多用户同时下单导致查询和插入不同步了,而查询中跟插入又有时间差而在高并发的情况下导致库存问题(我的项目大概是这样,首先 for update查出商品信息表,放入全局表里数组里,当用户扣款余额成功后,update商品信息表减去该用户下单的数量。数据库用的mysql,查询商品信息表的时候是加锁过的,但商品信息表数据越来越多的时候查询有时间差,导致高并发的时候在查询商品信息表放进变量数组里的时候,在执行后面的时间差里,其他用户也在下单,导致库存有问题)。现在提问,同一时间内同一个商品防止多用户抢购,也就是说同一秒内在高并发的情况下只能被一个用户下单,用的是排队,阻塞队列

  1. 请说一下你所处理过的最复杂的业务逻辑

  如果买家在下单的时候买了多个商品(2个或者以上),我们之前的做法是通过订单明细表来关联订单与商品表的关系。但是又出现问题,当一个订单对应多个商品,且这些商品也属于不同的商家。在商家后台显示这张订单对应的商品,那么买家付款后,商家发货应该怎么处理。如果该订单的商品1已经由商家1发货,但商品2的还未由商家2发货,此时这个订单的状态是什么。当用户需要申请退款时,只需要将商品1退货,而商品2保留不变,该如何处理。

  1. 在之前的开发过程当中你碰到过的最困难的问题是什么?怎么解决的?

   当使用date()或者time()函数的时候报错。

修改PHP.ini这个文件
找到date.timezone这行,去掉前面的分号,改成:

date.timezone = Asia/Shanghai

修改 .htaccess文件
修改.htaccess文件有两种办法,下面的两条语句只要有一条即可

php_value date.timezone Asia/Shanghai
SetEnv TZ Asia/Shanghai

修改PHP代码
也是下面的两条语句只要其中的一句即可

date_default_timezone_set(\'Asia/Shanghai\');
ini_set(\'date.timezone\',\'Asia/Shanghai\');

  1. 网络七层协议有哪些?

 

 

互怼提问  PHP

  1. 请说出10个字符串函数和10个数组函数

数组函数:

array_column() 返回数组中单一列的值

array_combine() 把两个数组合并为一个数组

array_keys() 返回数组中所有的键名

array_megre() 把一个或多个数组合并成一个数组

rand() 生成随机数

count() 求数组的长度、数量

in_array() 检查数组中是否存在指定的值

sort 对数组进行排序

is_array() 判断是不是数组

array_values() 返回数组中所有的值

字符串函数:

substr 字符串截取

strlen 求字符串长度

strpos 获取字符串位置

substr_count 求某个字符在字符串中出现的次数

explode 把字符串分割成数组

trim() 去除字符串两端的空格

md5() 加密

str_ireplace() 替换字符 串

strcmp() 比较字符串的大小

str_split() 把字符串分割到数组中

 

 

 

  1. 你了解哪些设计模式?

   

单例模式

一个类在整个应用中,只有一个对象实例的设计模式,类必须自行创建这个实例,必须自行向整个系统提供这个实例;

三私:

   私有的静态成员变量 ,构造函数,克隆函数

一公:公共的静态方法;

工厂模式

可以根据输入的采纳数或者应用程序的配置不同--创建一种专门用来实例化并返回其他类的实例类;

观察者模式

观察者模式提供了组件之间紧密耦合的另一种方法.该模式:一个对象通过添加一个方法(该方法允许另一个对象,即观察者注册自己)全本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。

命令链模式

以松散耦合主题为基础,发送消息、命令和请求,或通过一组处理程序发送任意内容。每个处理程序都会自行判断自己能否处理请求,如果可以,该请求被处理,进程停止

策略模式

定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化,即封装变化的算法。

 适用场景:

       1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。

       2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。

       3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

       4、客户端必须知道所有的策略类,并自行决定使用哪一个策略类,策略模式只适用于客户端知道所有的算法或行为的情况。

       5、 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。

       有时候可以通过把依赖于环境的状态保存到客户端里面,可以使用享元模式来减少对象的数量。

 

 

  1. 请说一下get和post的区别

   GET后退按钮/刷新无害,POST数据会被重新提交(浏览器应该告知用户数据会被重新提交)。
GET书签可收藏,POST为书签不可收藏。
GET能被缓存,POST不能缓存 。
GET编码类型application/x-www-form-url,POST编码类型encodedapplication/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。
GET历史参数保留在浏览器历史中。POST参数不会保存在浏览器历史中。
GET对数据长度有限制,当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。POST无限制。
GET只允许 ASCII 字符。POST没有限制。也允许二进制数据。
POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感信息时绝不要使用 GET !POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。
GET的数据在 URL 中对所有人都是可见的。POST的数据不会显示在 URL 中。

GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。 GET和POST还有一个重大区别,简单的说:GET产生一个TCP数据包;POST产生两个TCP数据包。
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据); 而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)

  1. 请描述一下session和cookie的区别

   1,session 在服务器端,cookie 在客户端(浏览器)
2,session 默认被存在在服务器的一个文件里(不是内存)
3,session 的运行依赖 session id,而 session id 是存在 cookie 中的, 也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可   以通过其它方式实现,比如在 url 中传递 session_id)
4,session 可以放在 文件、数据库、或内存中都可以。

  1. 请说一下你对mvc的理解

   MVC是Model—View—Controler的简称。即模型—视图—控制器。MVC是一种设计模式,它强制性的把应用程序的输入、处理和输出分开。

MVC中的模型、视图、控制器它们分别担负着不同的任务。

视图: 视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并接受用户的输入。视图不进行任何业务逻辑处理。

模型: 模型表示业务数据和业务处理。相当于JavaBean。一个模型能为多个视图提供数据。这提高了应用程序的重用性

控制器: 当用户单击Web页面中的提交按钮时,控制器接受请求并调用相应的模型去处理请求。

然后根据处理的结果调用相应的视图来显示处理的结果。

MVC的处理过程:首先控制器接受用户的请求,调用相应的模型来进行业务处理,并返回数据给控制器。控制器调用相应的视图来显示处理的结果。并通过视图呈现给用户。

  1. 请描述一下php-fpm的工作原理

进程池管理工具,简单描述,nginx将收到的php相关请求转发到phpfpm,由phpfpm负责生成和管理php进程来执行相应的php脚本,并将结果返回给nginx。php-fpm负责fastcgi的进程调度管理,php-fpm在启动时会生成php-fpm子进程用于处理请求。守护进程本身不处理请求,它根据子进程的状态将请求分配给子进程去处理

PHP的解释器是php-cgi。php-cgi只是个CGI程序,他自己本身只能解析请求,返回结果,不会进程管理(皇上,臣妾真的做不到啊!)所以就出现了一些能够调度php-cgi进程的程序,比如说由lighthttpd分离出来的spawn-fcgi。好了PHP-FPM也是这么个东东,在长时间的发展后,逐渐得到了大家的认可(要知道,前几年大家可是抱怨PHP-FPM稳定性太差的),也越来越流行

  1. nginx 和 apacache 的区别?

1:nginx是轻量级,比apache占用更少的内存以及资源

2:apache比nginx的rewrite强大,模块多,bug少,稳定性强,

3:apache对php支持比较简单,nginx需要配合其他后端用,apache组件比nginx多,现在nginx是web服务器的首选

4:最核心的区别是apache是同步多进程模型,一个连接对应一个进程,多个连接(千万级别)可以对应一个进程

5:nginx:配置文件写的很简洁,正则配置让很多事情变得简单运行效率高,占用资源少,代理功能强大,很适合做前端响应服务器 

6:Apache在处理动态有优势,Nginx并发性比较好,CPU内存占用低,如果rewrite频繁,那还是Apache吧

7:动态请求要apache去做,nginx只适合静态和反向

 

  1. 如何实现session共享?

   第一种:基于NFS(Net FileSystem网络文件系统)实现的,这种方法是实现session共享是最为简单的,不用做过多的二次开发,就是讲共享目录的服务器复制到各个服务器的session目录中,但是因为NFS是依托复杂的安全机制和文件系统,所以并发的效率并不是太高,但是session又是高并发读写的小文件,很有可能服务器的io-wait太高,而影响前端的web执行程序

第二种:基于数据库的session共享实现,最好是还用Heap(堆),手动提升session操作的读写能力,这种方式很实用,缺点在于session的并发读写能力取决于mysql的数据库的性能,同时呢还需要自己实现session淘汰逻辑,这样才能更好的定时从数据表中更新和删除session记录,当并发过高时容易出现表锁,虽然我们可以选择行级锁的表引擎,但是用数据库存储session还有是优点浪费资源。

第三种:基于从cookie的session共享,这种办法一般在大型的网站使用的较多,原理就是将全站的用户的session加密-序列化之后以cookie的方式,统一放在根域名下,因为浏览器访问根域名下所有的二级域名的站点时会传递域名对应德所有cookie内容的特性,然后实现用户的cookie化session在服务器之间的共享访问

第四种:基于缓存(memcache)的session共享,我认为使用memcache管理session共享实际就是将session持久化,memcache的内存hash表所有的到期数据过期淘汰机制,都和session的过期机制一样,减低了过期session数据删除的代码复杂度,相比 在数据库的存储,仅仅就这个相同点就给数据表产生的巨大的查询压力

  1. .redis的运行原

   Redis是一个key-vakue存储系统,它支持存储的value类型相对跟多,包括string(字符串).list(链表).set(集合).zset(有序集合) hash(哈希),这些数据类型都支持push/pop.add/remove及取交集并集和差集以及跟丰富的操作,而且这些操作都是原子性的,在此基础上,redis支持各种不同的方式排序,为了保证效率,数据都是缓存在内存内中,redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了主从同步,当前redis的应用已经非常广泛。(新浪,淘宝,flickr,github)

互怼提问  Mysql

  1. varchar和char的区别

  char是一种固定长度的类型,varchar则是一种可变长度的类型

Varchar占得空间是由实际存入的长短来判读

Char定义了多长就占多少空间

Char因为是规定长度不需要计算长度,所以执行速度要比varchar快,但是对于空间存储,如果存储不大,但在速度上有要求的可以使用char类型,反之

  1. mysql有哪些索引?主键索引和唯一索引有什么区别?

  普度索引  唯一索引 全文索引  单列索引 多列索引  组合索引  

主键是一种约束,唯一索引是一种索引,这两个本质就是不同的

主键创建后一定包含一个唯一索引,唯一索引并不一定是主键

主键可以被其他表引用为外键,而为一索引不能,

主键一个表中就只能创建一个,但是可以创建多个唯一索引,

主键更适合那些不容易更改的唯一表示,如自动递增列.身份证号

  1. Myisam和innodb的区别是什么?为什么innodb比myisam写入快?

Myisam和innodb的区别:

  1. MySQL默认采用的是MyISAM。
  2. MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。
  3. InnoDB支持数据行锁定,MyISAM不支持行锁定,只支持锁定整个表。即 MyISAM同一个表上的读锁和写锁是互斥的,MyISAM并发读写时如果等待队列中既有读请求又有写请求,默认写请求的优先级高,即使读请求先到,所以 MyISAM不适合于有大量查询和修改并存的情况,那样查询进程会长时间阻塞。因为MyISAM是锁表,所以某项读操作比较耗时会使其他写进程饿死。
  4. InnoDB支持外键,MyISAM不支持。
  5. InnoDB的主键范围更大,最大是MyISAM的2倍。
  6. InnoDB不支持全文索引,而MyISAM支持。全文索引是指对char、 varchar和text中的每个词(停用词除外)建立倒排序索引。MyISAM的全文索引其实没啥用,因为它不支持中文分词,必须由使用者分词后加入空 格再写到数据表里,而且少于4个汉字的词会和停用词一样被忽略掉。
  7. MyISAM支持GIS数据,InnoDB不支持。即MyISAM支持以下空间数据对象:Point,Line,Polygon,Surface等。

8. 没有where的count(*)使用MyISAM要比InnoDB快得多。因 为MyISAM内置了一个计数器,count(*)时它直接从计数器中读,而InnoDB必须扫描全表。所以在InnoDB上执行count(*)时一般 要伴随where,且where中要包含主键以外的索引列。为什么这里特别强调“主键以外”?因为InnoDB中primary index是和raw data存放在一起的,而secondary index则是单独存放,然后有个指针指向primary key。所以只是count(*)的话使用secondary index扫描更快,而primary key则主要在扫描索引同时要返回raw data时的作用较大。

 

  1. 请列举出你所了解的会引起索引失效的情况

   1.条件中用or,即使其中有条件带索引,也不会使用索引查询(这就是查询尽量不要用or的原因,用in吧

   2.对于多列索引,不是使用的第一部分,则不会使用索引。

   3.like的模糊查询以%开头,索引失效

   4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不会使用索引

   5.如果MySQL预计使用全表扫描要比使用索引快,则不使用索引

  1. mysql中值为空和值为null有什么区别?

在代码里"零长度字符串"用一对没有间隔的英文引号\'\'表示,它的数据类型是明确的即属于字符型,存储"零长度字符串"是要占用物理磁盘空间的;

null值其数据类型是未知的,它不会占用物理磁盘空间。

在不存在约束限制的情况我们可以将Null值插入任何数据类型的字段里,而零长度字符串\'\'只能插入到字符型数据类型字段中,插入其它类型字段会报错。

  1. left join、right join、inner join的区别是什么?

左外连接:

[TEST1@orcl#16-12-11] SQL>select * from t1 left join t2 on t1.id=t2.id;

 

        ID NAME                         ID        AGE

---------- -------------------- ---------- ----------

         1 aaa                           1         20

         2 bbb

右外连接:

[TEST1@orcl#16-12-11] SQL>select * from t1 right join t2 on t1.id=t2.id;

 

        ID NAME                         ID        AGE

---------- -------------------- ---------- ----------

         1 aaa                           1         20

                                         3         30

左外连接是以左边的表为基准。通俗的讲,先将左边的表全部显示出来,然后右边的表id与左边表id相同的记录就拼接上去,比如说id1的记录。如果没有匹配的id,比如说t1id2t2中就没有。那边就以null显示。右外连接过程正好相反。

内连接

[TEST1@orcl#16-12-11] SQL>select * from t1 inner join t2 on t1.id=t2.id;

 

        ID NAME                         ID        AGE

---------- -------------------- ---------- ----------

         1 aaa                           1         20

内连接就是只取出符合过滤条件的记录 也就是t1.id=t2.id  那么符合t1.id=t2.id的记录只有id=1这一条,所以只显示一条。 不像外连接,是将你作为基准的表(左外连接就是左边表为基准,右外连接就是右边表为基准)的所有行都显示出来。

 

  1. 请描述一下sql语句的执行顺序

所有查询语句都是from开始执行的,在执行过程中每一步都是为下一步骤生成一个虚拟表,这个虚拟表将作为下一个执行不周到额输入。

第一步:首先对from子句的前两个执行一个笛卡尔乘积,此时生成一个虚拟表vt1

第二步:后来是多on筛选器,on中的逻辑表达式将应用到vt1中的各个行,筛选满足on逻辑表达式行,生成虚拟表vt2。

 

 

  1. 请描述一下你对mysql连接池的理解

数据库连接池程序启是建立足够的数据库连接,并将这些连接组成一个连接,由程序动态池中的连接进行申请,使用,释放。

创建数据库一个很耗时的操作,容易对数据库产生安全隐患所以,在程序初始化集中创建多个数据库连接,并且把他们集中管理,程序使用,可以保证数据库读写速度还更安全可靠

连接池运行机制

(1) 程序初始化创建连接池

(2) 使用时向连接池申请可以使用。

(3) 使用完毕,将程序返给连接

(4) 程序退出时,断开所有连接,并释放资源。

 

 

 

  1. 数据库的三范式?

三范

             01:字段不可分;解释(字段不可分割,否则就不是关系型数据库 
02有主键,非主键字段依赖主键解释唯一性,一个只能有一个事务
03非主键字段不能相互依赖;   解释每列都与主键有关系不存在传递依赖)

第二范式是在第一范式的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式。

满足第三范式必须先满足第二范式,第三范式要求一个数据库表中不包含已在其它表中已包含的非主键字段。就是说, 表的信息,如果能够被推导出来,就不应该单独的设计一个字段来存放(能尽量外键join就用外键join)。很多时候,我们为了满足第三范式往往会把一张 表分成多张表。 

反三范式

没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,提高读性能,就必须降低范式标准,适当保留冗余数据。具体做法是: 在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,减少了查询时的关联,提高查询效率,因为在数 据库的操作中查询的比例要远远大于DML的比例。但是反范式化一定要适度,并且在原本已满足三范式的基础上再做调整的。

 

  1. where 和having的区别?

“Where” 是一个约束声明Where是在结果返回之前起作用的,Where中不能使用聚合函数。

 “Having”是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在Having中可以使用聚合函数。

  Where是在sum,count这些聚合函数,还有group by ,order by之前执行,而having是在聚合函数后对记录进行筛选

 

myisam引擎执行count(*)速度非常快,而且执行速度与记录条数无关,而innodb却不是这样,记录越多,速度越慢innodb没有把记录数保存起来,而是做了实时统计,所以导致速度比较慢

 

  1. 在执行一条select  count(*)语句时,使用myisam 和 innodb 那个快?

myisam引擎执行count(*)速度非常快,而且执行速度与记录条数无关,而innodb却不是这样,记录越多,速度越慢innodb没有把记录数保存起来,而是做了实时统计,所以导致速度比较慢

 

互怼提问 – Linux

  1. 如何使nginx和php关联起来?如何使Apache和php关联起来?

 ①找到nginx当中conf文件夹下的nginx.conf中修改localtion ~ \.php{

引用fastcgi-php配置文件

include snippets/fastcgi-php.conf;

fastcgi_pass unix:/var/run/php/php5.6-fpm.sock;  # 配置指定sock文件的位置(/var/run下找到对应的sock文件)

}

   ② 第一步,找到apache当中conf文件夹下的httpd.conf文件,在文件当中加入如下的内容

LoadModule php5_module "C:/Php/php5apache2_4.dll"

PhpIniDir "C:/WebTool/Php"

AddType application/x-httpd-php .php

第二步,将php安装目录下的php.ini.development文件改成php.ini

第三步,  php.ini当中指定扩展模块路径extension_dir="php安装路径"/ext

 

  1. 请描述PHP-FPM的工作原理

php-fpm采用master/worker架构设计

master进程

master进程工作流程分为4个阶段,如下图:

worker进程

worker进程分为 接收客户端请求、处理请求、请求结束三个阶段。

php-fpm采用master/worker架构设计, master进程负责CGI、PHP公共环境的初始化及事件监听操作。worker进程负责请求的处理功能。在worker进程处理请求时,无需再次初始化PHP运行环境

 

  1. 如何安装php扩展?

./configure           #脚本配置工具

./configure --help       #查看脚本配置工具configure的命令行选项

/usr/local/php/bin/phpize  #phpize命令用于在编译好的PHP中扩展模块

下载你要安装的软件包,解压得到目录(如:php)

 

进入软件包目录(cd php)

 

执行phpsize命令(/usr/local/php/bin/phpize)

 

成功后,当前目录将得到configure文件。

 

进行配置(./configure --with-php-config=/usr/local/php/bin/php-config #指定安装在哪个PHP)

注:如果系统缺少phpize命令,且你使用的是预编译的RPM包,那么一定要安装适当的PHP开发版本,因为它们一般都包含phpize命令连同合适的头文件来编译PHP及其扩展。

 

  1. nginx和Apache的区别是什么?

同样起web 服务,nginx比apache 占用更少的内存及资源 ,抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能

apache比nginx的rewrite强大,模块超多,基本想到的都可以找到,少bug ,nginx 的bug 相对较多,一般来说,需要性能的web 服务,用nginx 。如果不需要性能只求稳定,那就apache 吧。后者的各种功能模块实现得比前者

但并不是所有的情况下都是epoll 大获全胜的,如果本身提供静态服务的就只有寥寥几个文件,apache 的select 模型或许比epoll 更高性能。

当然,这只是根据网络IO 模型的原理作的一个假设,真正的应用还是需要实测了再说的。

(2) 作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。在高连接并发的情况下,Nginx是Apache服务器不错的替代品

 

 

(3) 最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程 

 

 

(4) nginx处理静态文件好,耗费内存少.但无疑apache仍然是目前的主流,有很多丰富的特性.所以还需要搭配着来.当然如果能确定nginx就适合需求,那么使用nginx会是更经济的方式 nginx处理动态请求是鸡肋,一般动态请求要apache去做,nginx只适合静态和反向

 

总结

 Nginx优点:负载均衡、反向代理、处理静态文件优势。nginx处理静态请求的速度高于apache;

l Apache优点:相对于Tomcat服务器来说处理静态文件是它的优势,速度快。Apache是静态解析,适合静态HTML、图片等。

更为通用的方案是,前端 nginx 抗并发,后端 apache 集群,配合起来会更好。

 

  1. 请说出常用的10个Linux操作命令(ll ls cd除外)

mv [选项] 源文件或目录 目录或多个源文件 | 移动或重命名文件

-b  覆盖前做备份

-f  如存在不询问而强制覆盖

-i  如存在则询问是否覆盖

-u  较新才覆盖

-t  将多个源文件移动到统一目录下,目录参数在前,文件参数在后

eg:

    mv a /tmp/ 将文件a移动到 /tmp目录下

mv a b 将a命名为b

 

cp [选项] 源文件或目录 目录或多个源文件 | 将源文件复制至目标文件,或将多个源文件复制至目标目录。

 

 

.rm [选项] 文件 | 删除文件

-r 删除文件夹

-f 删除不提示

-i 删除提示

-v 详细显示进行步骤

 

touch [选项] 文件 | 创建空文件或更新文件时间

-a 只修改存取时间

-m 值修改变动时间

-r eg:touch -r a b ,使b的时间和a相同

-t 指定特定的时间 eg:touch -t 201211142234.50 log.log

 

 

pwd 查看当前所在路径

 

 

whereis [-bmsu] [BMS 目录名 -f ] 文件名| 定位可执行文件、源代码文件、帮助文件在文件系统中的位置

 

 

diff [参数] [文件1或目录1] [文件2或目录2] | 比较单个文件或者目录内容

 

top [参数] | 显示当前系统正在执行的进程的相关信息,包括进程ID、内存占用率、CPU占用率等

 

paste 合并文件,需确保合并的两文件行数相同

 

wc 统计指定文件中的字节数、字数、行数, 并将统计结果显示输出

-l filename 报告行数

-c filename 报告字节数

-m filename 报告字符数

-w filename 报告单词数

 

  1. 1G的访问日志文件中,查出访问日志中访问次数前10的IP

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html

这个链接有详细的awk介绍

cat access_log |cut -d \' \' -f 1 | sort |uniq -c | sort -nr | awk \'{print $0 }\' | head -n 10 | less

 

  1. 如何查看一个进程是否在运行

ps  aux | grep 进程名

  1. 如何查看服务器当前CPU使用情况

Linux下快速查看CPU使用情况比较常用的命令是free、top、ps。

  1. 什么是fast_cgi,什么是cgi.什么是php-fpmcgi, php cgi,他们之间的区别

CGI全称Common Gateway Interface即公共网关接口,它遵循cgi规范,定义了与其他服务之间的通信协议,如nginx将请求转给php时,应该携带哪些信息,header、postdata、host等等,php在处理完程序之后返回内容的格式如何等规则。

        php在使用CGI的方式启动时,在一个请求到来时,会加载php.ini文件初始化相关环境,在请求处理完之后又销毁。新请求过来时又进行一次同样的操作,消耗了服务器资源。

        为了解决这个问题,所以有了FAST-CGI的出现。

        FAST-CGI顾名思义是要提高CGI的效率,它主要处理CGI重复初始化的过程。先看下FAST-CGI的原理:

    1、Web Server 启动3rlk,,,,,,,,,,,,,,,,,,,,,,,,,,,,,o58=时加载FAST-CGI的进程管理器,如apache module

    2、FASTCGI进程管理器自身初始化,启动多个php-cgi(CGI解释器进程),并等待来自web server的链接

    3、接收到请求时,FastCgi选择并链接到一个php-cgi,将CGI的环境变量和标准输入发送到FastCgi的php-cgi进程

    4、处理完成后,php-cgi将标准输出和错误信息返回web server,并断开与FastCgi的连接,等待下一次请求接入。如果是CLI模式下,则php-cgi直接退出。

        FastCgi的缺点:

    启动多个进程,占用内存,一个php-cgi程序通常占用7-25M内存,如果在很多请求并发量下,内存消耗严重。

        PHP-CGI是FastCgi的管理进器,它的不足:

    1、修改php.ini文件要重启php-cgi才能生效,不能平滑重启

    2、直接杀死php-cgi,php不能运行

 

        PHP-FPM 即PHP FastCgi Process Manager,FasgCgi的进程管理器,它相对于PHP-CGI的优点:

    1、平滑重载PHP配置

    2、内存和进程控制更有效

      ./configure的时候带 –enable-fpm参数即可开启PHP-FPM。

 

        简单的理解,CGI和FASTCGI是通信协议V1.0和V2.0,而PHP-CGI和PHP-FPM是实现了这种协议的程序。所以处理具体请求的是PHP-CGI或PHP-FPM,它们遵循fastcgi协议。

 

  1. session 于cookie的 原理及token 的作用?

Session 是存放在服务器端的类似于HashTable结构(每一种web开发技术的实现可能不一样,下文直接称之为HashTable)来存放用户数据;

   作用:实现网页之间数据传递,是一个存储在服务器端的对象集合。

   原理:当用户请求一个Asp.net页面时,系统将自动创建一个Session;退出应用程序或关闭服务器时,该Session撤销。系统在创建Session时将为其分配一个长长的字符串标识,以实现对Session进行管理与跟踪。
   

        session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

COOKIE:

Cookie概念

      在浏览某些 网站 时,这些网站会把 一些数据存在 客户端 , 用于使用网站 等跟踪用户,实现用户自定义 功能.

 

    是否设置过期时间:

              如果不设置 过期时间,则表示这个 Cookie生命周期 浏览器会话期间 , 只要关闭浏览器,cookie就消失了.

               这个生命期为浏览会话期的cookie,就是会话Cookie;

 

     存储:    一般保存在 内存,不在硬盘;

             如果设置了过期时间, 浏览器会把cookie保存在硬盘上,关闭再打开浏览器, 这些cookie 依然有效直到 超过的设置过期时间;

 

      存储在硬盘上的Cookie可以在不同的浏览器进程间共享,比如两个IE窗口。

      而对于保存 在内存的Cookie,不同的浏览器有不同的处理方式。


原理:

    如果浏览器使用的是 cookie,那么所有的数据都保存在浏览器端
    比如你登录以后,服务器设置了 cookie用户名(username),那么,当你再次请求服务器的时候,浏览器会将username一块发送给服务器,这些变量有一定的特殊标记。
     务器会解释为 cookie变量。
    所以只要不关闭浏览器,那么 cookie变量便一直是有效的,所以能够保证长时间不掉线。
    如果你能够截获某个用户的 cookie变量,然后伪造一个数据包发送过去,那么服务器还是认为你是合法的。所以,使用 cookie被攻击的可能性比较大。
    如果设置了的有效时间,那么它会将 cookie保存在客户端的硬盘上,下次再访问该网站的时候,浏览器先检查有没有 cookie,如果有的话,就读取该 cookie,然后发送给服务器。
    如果你在机器上面保存了某个论坛 cookie,有效期是一年,如果有人入侵你的机器,将你的 cookie拷走,然后放在他的浏览器的目录下面,那么他登录该网站的时候就是用你的的身份登录的。
    所以 cookie是可以伪造的。
   当然,伪造的时候需要主意,直接copy cookie文件到 cookie目录,浏览器是不认的,
   他有一个index.dat文件,存储了 cookie文件的建立时间,以及是否有修改,所以你必须先要有该网站的 cookie文件,并且要从保证时间上骗过浏览器,
   曾经在学校的vbb论坛上面做过试验,copy别人的 cookie登录,冒用了别人的名义发帖子,完全没有问题。

 

Token 的作用

Token,就是令牌,最大的特点就是随机性,不可预测。一般黑客或软件无法猜测出来。

那么,Token有什么作用?又是什么原理呢?

Token一般用在两个地方:

  • 1)防止表单重复提交、
  • 2)anti csrf攻击(跨站点请求伪造)。

两者在原理上都是通过session token来实现的。当客户端请求页面时,服务器会生成一个随机数Token,并且将Token放置到session当中,然后将Token发给客户端(一般通过构造hidden表单)。下次客户端提交请求时,Token会随着表单一起提交到服务器端。
然后,如果应用于“anti csrf攻击,则服务器端会对Token值进行验证,判断是否和session中的Token值相等,若相等,则可以证明请求有效,不是伪造的。
不过,如果应用于防止表单重复提交,服务器端第一次验证相同过后,会将session中的Token值更新下,若用户重复提交,第二次的验证判断将失败,因为用户提交的表单中的Token没变,但服务器端sessionToken已经改变了。

上面的session应用相对安全,但也叫繁琐,同时当多页面多请求时,必须采用多Token同时生成的方法,这样占用更多资源,执行效率会降低。因此,也可用cookie存储验证信息的方法来代替session Token。比如,应对重复提交时,当第一次提交后便把已经提交的信息写到cookie中,当第二次提交时,由于cookie已经有提交记录,因此第二次提交会失败。
不过,cookie存储有个致命弱点,如果cookie被劫持(xss攻击很容易得到用户cookie),那么又一次gameover。黑客将直接实现csrf攻击。

所以,安全和高效相对的

 

  1. 数据库优化做了哪些 项目优化做了哪些?
  2. 选择最适合的字段属性:数据库中的表越小 运行速度越快 因此建表的时候 为了获得更好的性能 尽量将表字段的宽度设的尽可能小  另一种提高效率的方法是在可能的情况下尽量把字段设置为NOTNULL(非空) 这样在将来执行查询的时候 数据库不用去比较null的值
  3. 使用连接(join)代替子查询(SUB-QUERIES)

子查询:子查询是一种常用计算机语言SELECT-SQL语言中嵌套查询下层的程序模块。 当一个查询是另一个查询的条件时,称之为子查询(sql语句套sql语句  查询sql语句中 条件满足另一个sql语句)

Mysql 4.1 开始支持sql的子查询  使用子查询可以一次性的完成很多逻辑上需要多个步 骤才能完成的sql操作 同时也可以避免失误或者表锁死 并且写起来也很容易 但是有些情况下 子查询可以被join替换

Join连接 之所以更有效率一些 是因为mysql不需要再内存中创建临时表来完成这个逻辑上的需要两个步骤的查询工作

  1. 使用联合(UNION)来代替手动创建的临时表

Mysql从4.0的版本开始 支持union查询 他可以把需要使用的临时表的两条或更多的select查询合并在一个查询中 在客户端的查询会话结束的时候 临时表会被自动删除 从而保证数据库整齐 高效 使用union来创建查询的时候 我们只需要用 union作为关键字把多个 select语句连接起来就可以了 要注意的是所有select 语句中的表字段数目要相同

  1. 事务

尽管我们可以使用子查询(SUB QUERIES)连接(join)和联合(union)来创建各种各样的查询 但不是所有的数据库操作都可以只用一条或少数几条SQL语句就可以完成的 更多的时候是需要用到一系列的语句来完成某种工作 但是在这种情况下 当这个语句块中的某一条语句运行出错的时候整个语句块的操作就会变得不确定起来 设想一下 要把某个数据同时插入两个相关联的表中 可能会出现这样的情况 第一个表中成功更新后 数据库突然发生意外 造成第二个表中的操作 没有完成 这样就会造成数据的不完整 甚至还会破坏数据库中的数据 要避免这种情况 就应该使用事务 他的作用是 要么语句块中每条语句都操作成功 要么都失败 换句话说 就是可以保持数据库中数据的一致性和完整性 事务一BEGIN 关键字额开始 COMMIT 关键字节数 在这之间的一条SQL 操作失败 name ROLLBACK 命令就可以吧数据库回复到begin开始之前的状态

事务的另一个重要的作用就是当多个用户同时使用相同的数据源时 他可以利用锁定数据库的方式来为用户提供一种安全的访问方式 这样可以保证用户的操作不被其他用户所干扰

5 锁定表

尽管事务是维护数据库完整性的一个非常好的方法 但却因为他的独占性  有时会影响数据库的性能 尤其是在很大的应用系统中 由于在事务执行的过程中 数据库将会被锁定 因此其他的用户来使用 事务造成的影响不会成为一个太大的问题  但假设有成千上万的用户同时访问一个数据库 例如访问一个电子商务网站 就会产生比较严重的相应延迟

有些情况下我们可以通过锁定表的方法来获得更好地性能

6.使用外键

锁定表的方法可以维护数据的王整形 但是他却不能保证数据的关联性 这个时候我们就可以使用外键

  1. 使用索引索引是提高数据库性能的常用方法 他可以令 数据库服务器比没有索引快的多的速度检索特定的行 尤其是在查询语句当中包含MAX() MIN()和ORDERBY 这些命令的时候 性能提高更为明显

一般来说索引应该建立在那些将用于join where 判断和orderby排序的字段上 尽量不要对数据库中某个含有大量重复的值得字段建立索引对于一个ENUM(枚举) 类型的字段来说 出现大量重复值是很有可能的情况

  1. 优化的查询语句

绝大多数情况下 使用索引可以提高查询的速度 但如果SQL 语句使用不恰当的话 索引将无法发挥它应有的作用

下面是应该注意的几个方面

首先 最好是在相同类型的字段间进行比较的操作

mysql 3.23版之前  这甚至是一个必须的条件 例如不能将一个兼有索引的INT 字段和BIGINT 字段进行比较 但是作为特殊的情况 在char类型的字段和varchar类型字段的字段大小想通的时候 可以将它们进行比较

其次 在兼有索引的字段上尽量不要使用函数进行操作

例如  在一个DATE类型的字段上 使用YEAE()函数是 将会是索引不能发挥应有的作用 所以 下面的两个查询虽然返回的结果一样 但后者要比前者快的多

第三 在搜索字符型字段是 我们有时会使用LIKE 关键字和通配符 这种做法虽然简单 但却也是一牺牲系统为代价的

例如下面的查询将会比较表中的每一条记录

整理摘自:https://www.cnblogs.com/zhyunfe/p/6209074.html

 

  1. 数组实现队列用哪些函数?

Array_push() 尾入队函数  有返回值,返回新数组元素个数  可以插入多个元素(插入顺序由前至后)

Array_pop()  尾出队函数 有返回值 返回出队的元素  只接受一个参数(一个个出队)

Array_unshift() 头入队函数 有返回值,返回新数组元素个数  可以插入多个元素(插入顺序由后至前)

array_shift()  头出队函数  有返回值,返回出队的元素  只接受一个参数(一个个出)

摘自:https://jingyan.baidu.com/article/49711c619e1a20fa451b7c4c.html

 

  1. redis 实现对列 关键点是什么 用了什么函数?

使用list 作为redis 队列

入队: $redis->Lpush($key,$value);  

出队: $redis->Rpop($key);

这种方式的有点事不会出现数据的丢失 只有定时脚本处理完相关信息之后 才能从队列中取出

缺点是 响应不够及时 因为是定时访问redis的list队形 所以不能实时的处理队列中的消息

发布脚本

$redis->publish($channel,$(params);

订阅脚本

这种方式的优点是可以实时的处理数据 并且是redis主动向PHP 脚本推送消息;缺点是有可能会有数据的丢失 因为消息的发布是实时性的 该发布/订阅通道不保存消息 仅仅作为消息传递的其渠道 如果消息没有被订阅的脚本捕捉到则会导致数据的丢失

摘自:http://blog.csdn.net/koastal/article/details/52813669

 

  1. 二进制日志有哪些 ,这个 日志 默认文件格式 是什么 和文件格式 有哪些?

Mysql5.5 有一下几种日志

错误日志(error log): log_err

查询日志(general query log):log

慢查询日志 -log-slow-queries

二进制日志(binary log) log-bin

中继日志(relay log)

二进制日志格式:

基于段的格式 binlog_format=STATEMENT 

这是mysql5.7之前默认的二进制日志格式

记录的是mysql执行的sql语句

优点: 

日志记录量相对较小,节约磁盘及网络I/O

缺点: 

必须要记录上下文信息,保证在从服务器上执行结果和住服务器上相同

对一些非确定性函数无法进行正确复制,比如UUID(), user()等

可能造成mysql复制的主备服务器数据不一致

基于行的日志格式 binlog_format=ROW 

这是mysql5.7之后默认的二进制日志格式

记录的是增删改查的数据行信息

优点: 

使mysql主从复制更加安全

对每一行数据的修改比基于段的复制高效

由于误操作修改数据库信息,且没有备库可恢复时,可通过对日志文件数据操作反向处理恢复数据

缺点: 

记录日志量较大 

binlog_row_image =[FULL|MINIMAL|NOBLOB]

摘自:http://blog.csdn.net/wll_1017/article/details/44979539

 

  1. 客户端禁掉 cookie session还能用吗?

 不能,Cookie与 Session,一般是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案。但为什么禁用Cookie就不能得到Session呢?因为Session是用Session ID来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的,禁用Cookie相当于失去Session ID,也就得不到Session了。  

  1. ASP   ASP中,Session必须倚赖Cookie才可用,Session是存储在服务器端的,而Cookie是存储在客户端的,相对而言,Session的安全性和可靠程度都比Cookie高。
  2. PHP    在PHP中,通过相关的配置,可以让Session不依赖Cookie而存在。这是因为

Session,储存于服务器端(默认以文件方式存储Session),根据客户端提供的Session ID来得到用户的文件,取得变量的值,Session ID可以使用客户端的Cookie或者Http1.1协议的Query_String(就是访问的URL的“?”后面的部分)来传送给服务器,然后服务器读取Session的目录……。也就是说,Session ID是取得存储在服务上的Session变量的身份证。当代码session_start();运行的时候,就在服务器上产生了一个Session文件,随之也产生了与之唯一对应的一个Session ID,定义Session变量以一定形式存储在刚才产生的Session文件中。通过Session ID,可以取出定义的变量。跨页后,为了使用Session,你必须又执行session_start();将又会产生一个Session文件,与之对应产生相应的Session ID,用这个session id是取不出前面提到的第一个Session文件中的变量的,因为这个Session ID不是打开它的“钥匙”。如果在session_start();之前加代码session_id($session id);将不产生新的Session文件,直接读取与这个id对应的Session文件。

       PHP中的Session在默认情况下是使用客户端的Cookie来保存Session ID的,所以当客户端的cookie出现问题的时候就会影响Session了。必须注意的是:Session不一定必须依赖Cookie,这也是Session相比Cookie的高明之处。当客户端的Cookie被禁用或出现问题时PHP会自动把Session ID附着在URL中,这样再通过Session ID就能跨页使用Session变量了。但这种附着也是有一定条件的,即“php.ini中的session.use_trans_sid = 1“,或者编译时打开打开了“--enable-trans-sid”选项。

       用过论坛的朋友都知道,在进入论坛的时候,往往会提示你检查Cookie是否打开,这是因为大多数论坛都是基于Cookie的,论坛用它来保存用户名、密码等用户信息,方便使用。而且很多朋友都认为Cookie不安全(其实不是这样),往往禁用它。其实在PHP程序中,我们完全可以用Session来代替Cookie,它可以不依赖于客户端是否开启Cookie。

       所以,我们可以抛开Cookie使用Session,即假定用户关闭Cookie的情况下使用Session,其实现途径有以下几种:

       1. 设置php.ini配置文件中的“session.use_trans_sid = 1”,或者编译时打开打开了“--enable-trans-sid”选项,让PHP自动跨页传递Session ID。

       2. 手动通过URL传值、隐藏表单传递Session ID。

       3. 用文件、数据库等形式保存Session ID,在跨页过程中手动调用。

 

  1. 知道的PHP加密有哪些?

1. MD5加密   string md5 ( string $str [, bool $raw_output = false ] )

参数 str  --  原始字符串。 raw_output  --  如果可选的 raw_output 被设置为 TRUE,那么 MD5 报文摘要将以16字节长度的原始二进制格式返回。

这是一种不可逆加密

2.Crype加密   string crypt ( string $str [, string $salt ] ) crypt() 返回一个基于标准 UNIX DES 算法或系统上其他可用的替代算法的散列字符串。

参数 str  --  待散列的字符串。  salt  --  可选的盐值字符串。如果没有提供,算法行为将由不同的算法实现决定,并可能导致不可预料的结束。这是也一种不可逆加密,执行如下的代码

$password = \'123456\';

$salt = "test";// 只取前两个

echo crypt($password, $salt);

得到的结果是teMGKvBPcptKo      想要了解更详细的crype见网址:http://www.jb51.net/article/61263.htm

3. Sha1加密

string sha1 ( string $str [, bool $raw_output = false ] )  参数 str  --  输入字符串。raw_output  --  如果可选的 raw_output 参数被设置为 TRUE,那么 sha1 摘要将以 20 字符长度的原始格式返回,否则返回值是一个 40 字符长度的十六进制数字。这是也一种不可逆加密。以上几种虽然是不可逆加密,但是也可以根据查字典的方式去解密。如下的地址中就提供了可以将上面的加密结果解密出来的功能。http://www.cmd5.com/

那大家是不是加了就算加了密,也没用啊,其实不然,只要你的加密足够复杂,被破解出的可能性就越小,比如用以上三种加密方式混合加密

4. URL加密  string urlencode ( string $str )   此函数便于将字符串编码并将其用于 URL 的请求部分,同时它还便于将变量传递给下一页。

返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样。由于历史原因,此编码在将空格编码为加号(+)方面与 RFC1738 编码不同。

string urldecode ( string $str )

解码给出的已编码字符串中的任何 %##。 加号(\'+\')被解码成一个空格字符。

这是一种可逆加密,urlencode方法用于加密,urldecode方法用于解密

5. Base64信息编码加密    string base64_encode ( string $data )  使用 base64 对 data 进行编码。设计此种编码是为了使二进制数据可以通过非纯 8-bit 的传输层传输,例如电子邮件的主体。Base64-encoded 数据要比原始数据多占用 33% 左右的空间。string base64_decode ( string $data [, bool $strict = false ] )对 base64 编码的 data 进行解码。参数data  --  编码过的数据。

strict  --  如果输入的数据超出了 base64 字母表,则返回 FALSE。

 

  1. 用过的webserver 有哪些?

一、什么是WEBserver

    Webserver能够解析HTTP协议。当Webserver接收到一个HTTP请求,会返回一个HTTP响应,比如送回一个HTML页面。为了处理一个请求Webserver能够响应一个静态页面或图片,进行页面跳转或者把动态响应的产生托付给一些其他的程序比如CGI脚本,JSP脚本,servlets,ASP脚本,server端JavaScript,或者一些其他的server端技术。不管它们(译者注:脚本)的目的怎样,这些server端的程序通常产生一个HTML的响应来让浏览器能够浏览。

二。经常使用的WEBserver有哪些?

     UNIX和LINUX平台下使用最广泛的免费HTTPserver是W3C、NCSA和APACHEserver,而Windows平台NT/2000/2003使用IIS的WEBserver。在选择使用WEBserver应考虑的本身特性因素有:性能、安全性、日志和统计、虚拟主机、代理server、缓冲服务和集成应用程序等,以下介绍几种经常使用的WEBserver。

Microsoft IIS

     Microsoft的Webserver产品为Internet Information Server (IIS), IIS 是同意在公共Intranet或Internet上公布信息的Webserver。IIS是眼下最流行的Webserver产品之中的一个,非常多著名的站点都是建立在IIS的平台上。IIS提供了一个图形界面的管理工具,称为 Internet服务管理器,可用于监视配置和控制Internet服务。

     IIS是一种Web服务组件,当中包含Webserver、FTPserver、NNTPserver和SMTPserver,分别用于网页浏览、文件传输、新闻服务和邮件发送等方面,它使得在网络(包含互联网和局域网)上公布信息成了一件非常easy的事。它提供ISAPI(Intranet Server API)作为扩展Webserver功能的编程接口;同一时候,它还提供一个Internet数据库连接器,能够实现对数据库的查询和更新。

IBM WebSphere

     WebSphere Application Server 是 一 种功能完好、开放的Web应用程序server,是IBM电子商务计划的核心部分,它是基于 Java 的应用环境,用于建立、部署和管理 Internet 和 Intranet Web 应用程序。 这一整套产品进行了扩展,以适应 Web 应用程序server的须要,范围从简单到高级直到企业级。

     WebSphere 针对以 Web 为中心的开发者,他们都是在基本 HTTPserver和 CGI 编程技术上成长起来的。IBM 将提供 WebSphere 产品系列,通过提供综合资源、可反复使用的组件、功能强大并易于使用的工具、以及支持 HTTP 和 IIOP 通信的可伸缩执行时环境,来帮助这些用户从简单的 Web 应用程序转移到电子商务世界。

BEA WebLogic

     BEA WebLogic Server 是一种多功能、基于标准的web应用server,为企业构建自己的应用提供了坚实的基础。各种应用开发、部署全部关键性的任务,不管是集成各种系统和数据库,还是提交服务、跨 Internet 协作,起始点都是 BEA WebLogic Server。因为 它具有全面的功能、对开放标准的遵从性、多层架构、支持基于组件的开发,基于 Internet 的企业都选择它来开发、部署最佳的应用。

     BEA WebLogic Server 在使应用server成为企业应用架构的基础方面继续处于率先地位。BEA WebLogic Server 为构建集成化的企业级应用提供了稳固的基础,它们以 Internet 的容量和速度,在连网的企业之间共享信息、提交服务,实现协作自己主动化。

APACHE

     apache仍然是世界上用的最多的Webserver,市场占有率达60%左右。它源于NCSAhttpdserver,当NCSA WWWserver项目停止后,那些使用NCSA WWWserver的人们開始交换用于此server的补丁,这也是apache名称的由来(pache 补丁)。世界上非常多著名的站点都是Apache的产物,它的成功之处主要在于它的源码开放、有一支开放的开发队伍、支持跨平台的应用(能够执行在差点儿全部的Unix、Windows、Linux系统平台上)以及它的可移植性等方面。

Tomcat

     Tomcat是一个开放源码、执行servlet和JSP Web应用软件的基于Java的Web应用软件容器。Tomcat Server是依据servlet和JSP规范进行执行的,因此我们就能够说Tomcat Server也实行了Apache-Jakarta规范且比绝大多数商业应用软件server要好。

     Tomcat是Java Servlet 2.2和JavaServer Pages 1.1技术的标准实现,是基于Apache许可证下开发的自由软件。Tomcat是全然重写的Servlet API 2.2和JSP 1.1兼容的Servlet/JSP容器。Tomcat使用了JServ的一些代码,特别是Apache服务适配器。随着Catalina Servlet引擎的出现,Tomcat第四版号的性能得到提升,使得它成为一个值得考虑的Servlet/JSP容器,因此眼下很多WEBserver都是採用Tomcat。

眼下,很多大型Web应用一般将Apache和Tomcat结合使用,Apache负责接收用户的HTTP请求,假设请求是Servlet、Jsp,则把请求转发给Tomcat处理,并将处理结果封装响应给用户。

 

  1. 主主复制和主从复制的区别?

 MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。

 

   每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以便从服务器可以对其数据拷贝执行相同的更新。

 

   认识到二进制日志只是一个从启用二进制日志的固定时间点开始的记录非常重要。任何设置的从服务器需要主服务器上的在主服务器上启用二进制日志时的数据库拷贝。如果启动从服务器时,其数据库与主服务器上的启动二进制日志时的状态不相同,从服务器很可能失败。

 

   将主服务器的数据拷贝到从服务器的一个途径是使用LOAD DATA FROM MASTER语句。请注意LOAD DATA FROM MASTER目前只在所有表使用MyISAM存储引擎的主服务器上工作。并且,该语句将获得全局读锁定,因此当表正复制到从服务器上时,不可能在主服务器上进行更新。当我们执行表的无锁热备份时,则不再需要全局读锁定。

 

最大区别是 主从是对主操作数据,从会实时同步数据。反之对从操作,主不会同步数据,还有可能造成数据紊乱,导致主从失效。 主主则是无论对那一台操作,另一个都会同步数据。一般用作高容灾方案

 

  1. redis 持久化了解多少?

RDB(快照)和AOF(文件)。默认redis是会以快照的形式将数据持久化到磁盘redis会fork(分叉)一个子进程;子进程将数据写到磁盘上一个临时RDB文件中;当子进程完成写临时文件后,将原来的RDB替换掉

AOF在redis异常死掉时,最近的数据会丢失。当业务量很大时,丢失的数据是很多的

 

  1. 用户表 分表 hash分表之后 产生重复的数据怎么办

foreach循环然后用主键的键值等于循环重复的值

  1. 了解的设计模式 单例模式怎么实现的?

抽象类的特性 
1、定义为抽象的类不能被实例化。 
2、如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。 
3、被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。 
4、继承一个抽象类的时候,子类必须定义父类中的所有抽象方法(这些方法的访问控制必须和父类中一样(或者更为宽松)。

区别:

1、对接口的使用是通过关键字implements。对抽象类的使用是通过关键字extends。当然接口也可以通过关键字extends继承。

2、接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量。抽象类中可以声明各种类型成员变量,实现数据的封装。(另Java接口中的成员变量都要声明为public static final类型)

 

  1. 抽象类和接口类的区别?

设计模式

单例模式   工厂模式  注册模式   适配器模式   策略模式   观察者模式    原型模式  装饰器模式

http://blog.csdn.net/flitrue/article/details/52614599

单例模式

  1. $_instance必须声明为静态的私有变量
  2. 构造函数和析构函数必须声明为私有,防止外部程序new 类从而失去单例模式的意义
  3. getInstance()方法必须设置为公有的,必须调用此方法 以返回实例的一个引用
  4. ::操作符只能访问静态变量和静态函数
  5. new对象都会消耗内存
  6. 使用场景:最常用的地方是数据库连接。
  7. 使用单例模式生成一个对象后, 该对象可以被其它众多对象所使用。
  8. 私有的__clone()方法防止克隆对象

单例模式,使某个类的对象仅允许创建一个。构造函数private修饰,
申明一个static getInstance方法,在该方法里创建该对象的实例。如果该实例已经存在,则不创建。比如只需要创建一个数据库连接。

 


* 设计模式之单例模式 
* $_instance必须声明为静态的私有变量 
* 构造函数和析构函数必须声明为私有,防止外部程序new 
* 类从而失去单例模式的意义 
* getInstance()方法必须设置为公有的,必须调用此方法 
* 以返回实例的一个引用 
* ::操作符只能访问静态变量和静态函数 
* new对象都会消耗内存 
* 使用场景:最常用的地方是数据库连接。 
* 使用单例模式生成一个对象后, 
* 该对象可以被其它众多对象所使用。 
*/

class Example 

//保存例实例在此属性中 
private static $_instance; 

//构造函数声明为private,防止直接创建对象 
private function __construct() 

echo \'I am Construceted\'; 


//单例方法 
public static function singleton() 

if(!isset(self::$_instance)) 

$c=__CLASS__; 
self::$_instance=new $c; 

return self::$_instance; 


//阻止用户复制对象实例 
public function __clone() 

trigger_error(\'Clone is not allow\' ,E_USER_ERROR); 


function test() 

echo("test"); 




// 这个写法会出错,因为构造方法被声明为private 
$test = new Example; 

// 下面将得到Example类的单例对象 
$test = Example::singleton(); 
$test->test(); 

// 复制对象将导致一个E_USER_ERROR. 
$test_clone = clone $test; 
?>

首先我们要知道明确单例模式这个概念,那么什么是单例模式呢?

单例模式顾名思义,就是只有一个实例。

作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,

这个类我们称之为单例类。

单例模式的要点有三个:

一是某个类只能有一个实例;

二是它必须自行创建这个实例;

三是它必须自行向整个系统提供这个实例。

 

23用过哪些版本控制软件?介绍一下?

 

 git Git是一款免费、开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理,为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件

      优点:-----------------------------------

      适合分布式开发,强调个体。

      公共服务器压力和数据量都不会太大。

      速度快、灵活。

      任意两个开发者之间可以很容易的解决冲突。

      离线工作。

      缺点:------------------------------------

      资料少(起码中文资料很少)。

      学习周期相对而言比较长。

      不符合常规思维。

      代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。

 

 svn:就是用于多个人共同开发同一个项目,共用资源的目的。

      SVN的服务运行模式与访问方式:独立服务器和借助apache运行,本地直接访问

      svn存储版本数据也有两种格式:BDB(一种实物安全型表类型)和FSFS(一种不需要数据库的存储)。BDB在服务器中断时有可能锁住数据,所以FSFS比较安全一些。

      BDB:可以使用的一种经过充分测试的后台数据库实现,不能在通过网络共享的文件系统上使用,是svn 1.2版本之前默认使用的格式

      FSFS:一个专用于svn版本库的文件系统后端,可以使用网络文件系统(例如NFSSMBFS),是1.2版本以后默认使用的格式

 

 

24了解的魔术方法

    _construct()

   (构造函数)是目前为止最经常使用的函数。在创建对象时,可以在构造函数中做一些初始化工作。可以为构造函数定义任意多个参数,只要在实例化时传入对应个数的参数即可。构造                  函数中出现的任何异常都会阻止对象的创建。

     __desctruct()

   (析构函数)通常在对象被销毁时调用,析构函数不接收任何参数。经常在析构函数中执行一些清理工作,比如关闭数据库连接等。

     

     __get()   在我们尝试访问一个不存在的属性时会被调用。它接收一个参数,该参数表示访问属性的名字,并且将该属性的值返回。在上面的Device类里,有一个data属性,该属性                    就在这里就起了作用,

 

     __set()  魔术方法在我们尝试修改一个不可访问的属性时会被调用,它接收两个参数,一个表示属性的名字,一个表示属性的值

 

     __isset()魔术方法在对一个不可访问的属性调用isset()方法时会被调用,它接收一个参数,表示属性的名字。它应该返回一个布尔值,用来表示该属性是否存在

 

     __unset()魔术方法在调用unset()函数销毁一个不能访问的属性时会被调用,它接收一个参数,表述属性的名字。

 

     __toString()在我们将对象当作字符串一样使用时会被调用,它不接收任何参数。该方法允许我们定义对象的表现形式

 

     __clone()魔术方法__clone()可以解决上面的问题。当对一个对象使用clone关键字时,该魔术方法会被调用。在这个魔术方法里,我们可以实现任何子对象的克隆

 

    __sleep()在对一个对象序列化时(调用serialize())会被调用。它不接收任何参数,而且应该返回一个包含所有应该被序列化的属性的数组。在该魔术方法中,也可以执行一些其他操作

             有一点要注意的是,不要再该函数中进行任何的析构操作,因为这可能会影响正在运行的对象。

   

    __call()在调用不存在或不可访问的方法时会被调用。它接收两个参数,一个是调用的方法的名字,一个是包含函数参数的数组。我们可以使用这种方法调用子对象中得同名函数。

 

    __callStatic()__call()的功能一样,唯一不同的是,该方法在尝试访问一个不存在或不可访问的静态方法时会被调用

 

    __autoload()方法并不是一个魔术方法,但是这个方法非常有用。但是,对着PHP版本的更新,该函数已经不建议使用,取而代之的是spl_auto_register()函数。

 

  

25  怎么保证接口的安全,做了哪些操作?

    

      对称加密:就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密。密钥是控制加密及解密过程的指令。算法是一组规则,规定如何进行加密和解密。

 

      非对称加密:需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。

 

 

26  sql注入和xss攻击了解多少,怎么实现的攻击?

    

    sql注入:所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将               (恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行             SQL语句

   

    sql注入(攻击):就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。它是利用现有应用程序,将(恶意)的SQL命令                     注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

 

   xss攻击:全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSSXSS是一种在web应用中的计算机安全漏洞,它允许恶意web            用户将代码植入到提供给其它用户使用的页面中。

 

   xss攻击(攻击)非持久型xss攻击是一次性的,仅对当次的页面访问产生影响。非持久型xss攻击要求用户访问一个被攻击者篡改后的链接,用户访问该链接时,被植入的攻击脚本被用户游览器执行,从而达到攻击目的。

       <?php

$name = $_GET[\'name\'];

echo "Welcome $name<br>";

echo "<a href="http://www.cnblogs.com/bangerlee/">Click to Download</a>";

?>

该页面显示两行信息:

 

    URI获取 \'name\' 参数,并在页面显示

    显示跳转到一条URL的链接

 

这时,当攻击者给出以下URL链接:

index.php?name=guest<script>alert(\'attacked\')</script>

当用户点击该链接时,将产生以下html代码,带\'attacked\'的告警提示框弹出:

 

27 面向过程,面向对象的区别?

 从本质上说,面向过程和面向对象是一个古已有之的认识论的问题。

面向过程

在面向过程的眼中,世界的一切都不是孤立的,它们相互紧密联系在一起,缺一不可,相互影响,相互作用,并形成一个个具有严格因果律的小系统;而更多的小系统组成了更大的系统,所有小系统之间的联系也是紧密和不可分割的。

面向过程方法认为我们的世界是由一个个相互关联的小系统组成的,每个小系统都有着明确的开始和明确的结束,开始和结束之间有着严谨的因果关系。只要我们将这个小系统中的每一个步骤和影响这个小系统走向的所有因素都分析出来,我们就能完全定义这个系统的行为。

通常,面向过程的分析方法是找到过程的起点,然后顺藤摸瓜,分析每一个部分,直至达到过程的终点。这个过程中的每一个部分都是过程链上可不分割的一环。

将世界视为过程的这个方法本身蕴含着一个前提假设,即这个过程是稳定的,这样我们才有分析的基础,所有的工作成果都依赖于这个过程的步步分析。同时,这种步步分析的过程分析方法还导致另一个结果,即过程中的每一步都是预设好的,有着严谨的因果关系。

面向对象

面向对象方法将世界看作一个个相互独立的对象,相互之间并无因果关系,它们之间平时是“鸡犬之声相闻,老死不相往来”的。只有在某个外部力量的驱动下,对象之间才会依据某种规律相互传递信息。这些交互构成了这个生动世界的一个“过程”。在没有外力的情况下,对象则保持着“静止”的状态。

从微观角度说,对象有着坚硬的外壳,从外部看来,除了它用来与外界交互的消息通道之外,对象内部就是一个黑匣子,什么也看不到,这称为封装;对象可以结合在一起形成新的对象,结合后的对象具有前两者特性的总和,这称为聚合;对象可以繁育,产下的孩子将拥有父辈全部的本领,这称为继承;对象都是多面派,它会根据不同的要求展现其中的一个面,这就是接口;多个对象可能长着相同的脸,而这张脸背后却有着不同的行为,这就是多态……

从宏观角度说,对象是“短视”的,它不知道它身处的整个世界时怎么回事,也不知道它的行为是如何贡献给这个世界的。它只知道与它有着联系的身边的一小群伙伴(这称为依赖),并与伙伴间保持着信息交流的关系(这称为耦合)。同时对象也是“自私”的,即便在伙伴之间,每个对象也仍然顽固地保护着自己的领地,只允许其他人通过它打开的小小窗口(这称为方法)进行交流,也不会向对方敞开心扉。

面向对象方法和面向过程过程根本的不同,就是不再把世界看作是一个紧密关联的系统,而是看成一些相互独立的小零件,这些零件依据某种规则组织起来,完成一个特定的功能。原来,过程并不是这个世界的本源,过程是由通过特定规则组织起来的一些对象“表现”出来的。

28 如何修改sessiOn的生存时间?

  php如何修改SESSION的生存时间

 

 如何修改SESSION的生存时间

 

我们来手动设置 Session 的生存期:

 

?php

session_start();

// 保存一天

$lifeTime = 24 * 3600;

setcookie(session_name(), session_id(), time() + $lifeTime, "/");

?

  其实 Session 还提供了一个函数 session_set_cookie_params(); 来设置 Session 的生存期的,该函数必须在 session_start() 函数调用之前调用:

?php

// 保存一天

$lifeTime = 24 * 3600;

session_set_cookie_params($lifeTime);

session_start();

$_SESSION["admin"] = true;

?

  如果客户端使用 IE 6.0 session_set_cookie_params(); 函数设置 Cookie 会有些问题,所以我们还是手动调用 setcookie 函数来创建 cookie

phpsession过期时间设置

网上很多人给出了解答:修改php配置文件中的session.gc_maxlifetime。如果想了解更多session回收机制,继续阅读。(本文环境php5.2

29 php 怎么屏蔽错误?

   方法一:@

         在任何错误语句之前加上@符号,即可屏蔽!

方法二:error_reporting

        PHP文件第一行加上:error_reporting(0); 即可屏蔽!

方法三:display_errors

        打开php.ini文件,搜索display_errors = on,默认的应该是on,改为off 即可屏蔽!

30 memcache 的原理?

MemCache是什么?

 

MemCache是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度。 MemCaChe是一个存储键值对的HashMap,在内存中对任意的数据(比如字符串、对象等)所使用的key-value存储,数据可以来自数据库调用、API调用,或者页面渲染的结果。MemCache设计理念就是小而强大,它简单的设计促进了快速部署、易于开发并解决面对大规模的数据缓存的许多难题,而所开放的API使得MemCache能用于JavaC/C++/C#PerlPythonPHPRuby等大部分流行的程序语言。

 

 

另外,说一下MemCacheMemCached的区别:

 

1MemCache是项目的名称

 

2MemCachedMemCache服务器端可以执行文件的名称

 

MemCache的官方网站为 http://memcached.org/

 

MemCache访问模型

为了加深理解,我模仿着原阿里技术专家李智慧老师《大型网站技术架构 核心原理与案例分析》一书MemCache部分,自己画了一张图:

 

特别澄清一个问题,MemCache虽然被称为”分布式缓存”,但是MemCache本身完全不具备分布式的功能,MemCache集群之间不会相互通信(与之形成对比的,比如JBoss Cache,某台服务器有缓存数据更新时,会通知集群中其他机器更新缓存或清除缓存数据),所谓的”分布式”,完全依赖于客户端程序的实现,就像上面这张图的流程一样。

同时基于这张图,理一下MemCache一次写缓存的流程:

1、应用程序输入需要写缓存的数据

2APIKey输入路由算法模块,路由算法根据KeyMemCache集群服务器列表得到一台服务器编号

3、由服务器编号得到MemCache及其的ip地址和端口号

4API调用通信模块和指定编号的服务器通信,将数据写入该服务器,完成一次分布式缓存的写操作

读缓存和写缓存一样,只要使用相同的路由算法和服务器列表,只要应用程序查询的是相同的KeyMemCache客户端总是访问相同的客户端去读取数据,只要服务器中还缓存着该数据,就能保证缓存命中。

这种MemCache集群的方式也是从分区容错性的方面考虑的,假如Node2宕机了,那么Node2上面存储的数据都不可用了,此时由于集群中Node0Node1还存在,下一次请求Node2中存储的Key值的时候,肯定是没有命中的,这时先从数据库中拿到要缓存的数据,然后路由算法模块根据Key值在Node0Node1中选取一个节点,把对应的数据放进去,这样下一次就又可以走缓存了,这种集群的做法很好,但是缺点是成本比较大。

一致性Hash算法

 

从上面的图中,可以看出一个很重要的问题,就是对服务器集群的管理,路由算法至关重要,就和负载均衡算法一样,路由算法决定着究竟该访问集群中的哪台服务器,先看一个简单的路由算法。

1、余数Hash

比方说,字符串str对应的HashCode50、服务器的数目是3,取余数得到1str对应节点Node1,所以路由算法把str路由到Node1服务器上。由于HashCode随机性比较强,所以使用余数Hash路由算法就可以保证缓存数据在整个MemCache服务器集群中有比较均衡的分布。

如果不考虑服务器集群的伸缩性(什么是伸缩性,请参见大型网站架构学习笔记),那么余数Hash算法几乎可以满足绝大多数的缓存路由需求,但是当分布式缓存集群需要扩容的时候,就难办了。

就假设MemCache服务器集群由3台变为4台吧,更改服务器列表,仍然使用余数Hash504的余数是2,对应Node2,但是str原来是存在Node1上的,这就导致了缓存没有命中。如果这么说不够明白,那么不妨举个例子,原来有HashCode0~1920个数据,那么:

 

 

现在我扩容到4台,加粗标红的表示命中:

 

 

 

如果我扩容到20+的台数,只有前三个HashCode对应的Key是命中的,也就是15%。当然这只是个简单例子,现实情况肯定比这个复杂得多,不过足以说明,使用余数Hash的路由算法,在扩容的时候会造成大量的数据无法正确命中(其实不仅仅是无法命中,那些大量的无法命中的数据还在原缓存中在被移除前占据着内存)。这个结果显然是无法接受的,在网站业务中,大部分的业务数据度操作请求上事实上是通过缓存获取的,只有少量读操作会访问数据库,因此数据库的负载能力是以有缓存为前提而设计的。当大部分被缓存了的数据因为服务器扩容而不能正确读取时,这些数据访问的压力就落在了数据库的身上,这将大大超过数据库的负载能力,严重的可能会导致数据库宕机。

这个问题有解决方案,解决步骤为:

1)在网站访问量低谷,通常是深夜,技术团队加班,扩容、重启服务器

2)通过模拟请求的方式逐渐预热缓存,使缓存服务器中的数据重新分布

2、一致性Hash算法

 

一致性Hash算法通过一个叫做一致性Hash环的数据结构实现Key到缓存服务器的Hash映射,看一下我自己画的一张图:

 

 

具体算法过程为:先构造一个长度为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 232-1])将缓存服务器节点放置在这个Hash环上,然后根据需要缓存的数据的Key值计算得到其Hash值(其分布也为[0, 232-1]),然后在Hash环上顺时针查找距离这个Key值的Hash值最近的服务器节点,完成Key到服务器的映射查找。

就如同图上所示,三个Node点分别位于Hash环上的三个位置,然后Key值根据其HashCode,在Hash环上有一个固定位置,位置固定下之后,Key就会顺时针去寻找离它最近的一个Node,把数据存储在这个NodeMemCache服务器中。使用Hash环如果加了一个节点会怎么样,看一下:

一个节点会怎么样,看一下:

 

  

看到我加了一个Node4节点,只影响到了一个Key值的数据,本来这个Key值应该是在Node1服务器上的,现在要去Node4了。采用一致性Hash算法,的确也会影响到整个集群,但是影响的只是加粗的那一段而已,相比余数Hash算法影响了远超一半的影响率,这种影响要小得多。更重要的是,集群中缓存服务器节点越多,增加节点带来的影响越小,很好理解。换句话说,随着集群规模的增大,继续命中原有缓存数据的概率会越来越大,虽然仍然有小部分数据缓存在服务器中不能被读到,但是这个比例足够小,即使访问数据库,也不会对数据库造成致命的负载压力。

至于具体应用,这个长度为232的一致性Hash环通常使用二叉查找树实现,至于二叉查找树,就是算法的问题了,可以自己去查询相关资料。

MemCache实现原理

首先要说明一点,MemCache的数据存放在内存中,存放在内存中个人认为意味着几点:

1、访问数据的速度比传统的关系型数据库要快,因为OracleMySQL这些传统的关系型数据库为了保持数据的持久性,数据存放在硬盘中,IO操作速度慢

2MemCache的数据存放在内存中同时意味着只要MemCache重启了,数据就会消失

3、既然MemCache的数据存放在内存中,那么势必受到机器位数的限制,这个之前的文章写过很多次了,32位机器最多只能使用2GB的内存空间,64位机器可以认为没有上限

然后我们来看一下MemCache的原理,MemCache最重要的莫不是内存分配的内容了,MemCache采用的内存分配方式是固定空间分配,还是自己画一张图说明:

 

 

 这张图片里面涉及了slab_classslabpagechunk四个概念,它们之间的关系是:

1MemCache将内存空间分为一组slab

2、每个slab下又有若干个page,每个page默认是1M,如果一个slab占用100M内存的话,那么这个slab下应该有100page

3、每个page里面包含一组chunkchunk是真正存放数据的地方,同一个slab里面的chunk的大小是固定的

4、有相同大小chunkslab被组织在一起,称为slab_class

MemCache内存分配的方式称为allocatorslab的数量是有限的,几个、十几个或者几十个,这个和启动参数的配置相关。

MemCache中的value过来存放的地方是由value的大小决定的,value总是会被存放到与chunk大小最接近的一个slab中,比如slab[1]chunk大小为80字节、slab[2]chunk大小为100字节、slab[3]chunk大小为128字节(相邻slab内的chunk基本以1.25为比例进行增长,MemCache启动时可以用-f指定这个比例),那么过来一个88字节的value,这个value将被放到2slab中。放slab的时候,首先slab要申请内存,申请内存是以page为单位的,所以在放入第一个数据的时候,无论大小为多少,都会有1M大小的page被分配给该slab。申请到page后,slab会将这个page的内存按chunk的大小进行切分,这样就变成了一个chunk数组,最后从这个chunk数组中选择一个用于存储数据。

如果这个slab中没有chunk可以分配了怎么办,如果MemCache启动没有追加-M(禁止LRU,这种情况下内存不够会报Out Of Memory错误),那么MemCache会把这个slab中最近最少使用的chunk中的数据清理掉,然后放上最新的数据。针对MemCache的内存分配及回收算法,总结三点:

1MemCache的内存分配chunk里面会有内存浪费,88字节的value分配在128字节(紧接着大的用)的chunk中,就损失了30字节,但是这也避免了管理内存碎片的问题

2MemCacheLRU算法不是针对全局的,是针对slab

3、应该可以理解为什么MemCache存放的value大小是限制的,因为一个新数据过来,slab会先以page为单位申请一块内存,申请的内存最多就只有1M,所以value大小自然不能大于1M

再总结MemCache的特性和限制

 

上面已经对于MemCache做了一个比较详细的解读,这里再次总结MemCache的限制和特性:

1MemCache中可以保存的item数据量是没有限制的,只要内存足够

2MemCache单进程在32位机中最大使用内存为2G,这个之前的文章提了多次了,64位机则没有限制

3Key最大为250个字节,超过该长度无法存储

4、单个item最大数据是1MB,超过1MB的数据不予存储

5MemCache服务端是不安全的,比如已知某个MemCache节点,可以直接telnet过去,并通过flush_all让已经存在的键值对立即失效

6、不能够遍历MemCache中所有的item,因为这个操作的速度相对缓慢且会阻塞其他的操作

7MemCache的高性能源自于两阶段哈希结构:第一阶段在客户端,通过Hash算法根据Key值算出一个节点;第二阶段在服务端,通过一个内部的Hash算法,查找真正的item并返回给客户端。从实现的角度看,MemCache是一个非阻塞的、基于事件的服务器程序

8MemCache设置添加某一个Key值的时候,传入expiry0表示这个Key值永久有效,这个Key值也会在30天之后失效,见memcache.c的源代码:

#define REALTIME_MAXDELTA 60*60*24*30

static rel_time_t realtime(const time_t exptime) {

       if (exptime == 0) return 0;

       if (exptime > REALTIME_MAXDELTA) {

              if (exptime <= process_started)

                     return (rel_time_t)1;

              return (rel_time_t)(exptime - process_started);

       } else {

              return (rel_time_t)(exptime + current_time);

       }

}

这个失效的时间是memcache源码里面写的,开发者没有办法改变MemCacheKey值失效时间为30天这个限制

MemCache指令汇总

上面说过,已知MemCache的某个节点,直接telnet过去,就可以使用各种命令操作MemCache了,下面看下MemCache有哪几种命令:

       

get 返回Key对应的Value

add 添加一个Key值,没有则添加成功并提示STORED,有则失败并提示NOT_STORED

set  无条件地设置一个Key值,没有就增加,有就覆盖,操作成功提示STORED

replace 按照相应的Key值替换数据,如果Key值不存在则会操作失败

stats 返回MemCache通用统计信息(下面有详细解读)

stats items 返回各个slabitem的数目和最老的item的年龄(最后一次访问距离现在的秒数)

stats slabs 返回MemCache运行期间创建的每个slab的信息(下面有详细解读)

version 返回当前MemCache版本号

flush_all 清空所有键值,但不会删除items,所以此时MemCache依旧占用内存

quit 关闭连接

stats指令解读

stats是一个比较重要的指令,用于列出当前MemCache服务器的状态,拿一组数据举个例子:

STAT pid 1023

STAT uptime 21069937

STAT time 1447235954

STAT version 1.4.5

STAT pointer_size 64

STAT rusage_user 1167.020934

STAT rusage_system 3346.933170

STAT curr_connections 29

STAT total_connections 21

STAT connection_structures 49

STAT cmd_get 49

STAT cmd_set 7458

STAT cmd_flush 0

STAT get_hits 7401

STAT get_misses 57

..deleteincrdecrcashitsmisses数,cas还多一个badval

STAT auth_cmds 0

STAT auth_errors 0

STAT bytes_read 22026555

STAT bytes_written 8930466

STAT limit_maxbytes 4134304000

STAT accepting_conns 1

STAT listen_disabled_num 0

STAT threads 4

STAT bytes 151255336

STAT current_items 57146

STAT total_items 580656

STAT evicitions 0

这些参数反映着MemCache服务器的基本信息,它们的意思是:

         

pid MemCache服务器的进程id

uptime 服务器已经运行的秒数

time 服务器当前的UNIX时间戳

version MemCache版本

pointer_size 当前操作系统指针大小,反映了操作系统的位数,64意味着MemCache服务器是64位的

rusage_user 进程的累计用户时间

rusage_system 进程的累计系统时间

curr_connections  当前打开着的连接数

total_connections  当服务器启动以后曾经打开过的连接数

connection_structures 服务器分配的连接构造数

cmd_get get命令总请求次数

cmd_set set命令总请求次数

cmd_flush flush_all命令总请求次数

get_hits 总命中次数,重要,缓存最重要的参数就是缓存命中率,以get_hits / (get_hits + get_misses)表示,比如这个缓存命中率就是99.2%

get_misses 总未命中次数

auth_cmds 认证命令的处理次数

auth_errors 认证失败的处理次数

bytes_read 总读取的字节数

bytes_written 总发送的字节数

 limit_maxbytes 分配给MemCache的内存大小(单位为字节)

accepting_conns 是否已经达到连接的最大值,1表示达到,0表示未达到

listen_disabled_num 统计当前服务器连接数曾经达到最大连接的次数,这个次数应该为0或者接近于0,如果这个数字不断增长, 就要小心我们的服务了

threads 当前MemCache总线程数,由于MemCache的线程是基于事件驱动机制的,因此不会一个线程对应一个用户请求

bytes 当前服务器存储的items总字节数

current_items 当前服务器存储的items总数量

total_items 自服务器启动以后存储的items总数量

stats slab指令解读

如果对上面的MemCache存储机制比较理解了,那么我们来看一下各个slab中的信息,还是拿一组数据举个例子:

 

1 STAT1:chunk_size 96

 2 ...

 3 STAT 2:chunk_size 144

 4 STAT 2:chunks_per_page 7281

 5 STAT 2:total_pages 7

 6 STAT 2:total_chunks 50967

 7 STAT 2:used_chunks 45197

 8 STAT 2:free_chunks 1

 9 STAT 2:free_chunks_end 5769

10 STAT 2:mem_requested 6084638

11 STAT 2:get_hits 48084

12 STAT 2:cmd_set 59588271

13 STAT 2:delete_hits 0

14 STAT 2:incr_hits 0

15 STAT 2:decr_hits 0

16 STAT 2:cas_hits 0

17 STAT 2:cas_badval 0

18 ...

19 STAT 3:chunk_size 216

20 ...

首先看到,第二个slabchunk_size144/第一个slabchunk_size96=1.5,第三个slabchunk_size216/第二个slabchunk_size144=1.5,可以确定这个MemCache的增长因子是1.5chunk_size1.5倍增长。然后解释下字段的含义:

         

chunk_size 当前slab每个chunk的大小,单位为字节

chunks_per_page 每个page可以存放的chunk数目,由于每个page固定为1M1024*1024字节,所以这个值就是(1024*1024/chunk_size

total_pages 分配给当前slabpage总数

total_chunks 当前slab最多能够存放的chunk数,这个值是total_pages*chunks_per_page

used_chunks 已经被分配给存储对象的chunks数目

free_chunks 曾经被使用过但是因为过期而被回收的chunk

free_chunks_end 新分配但还没有被使用的chunk数,这个值不为0则说明当前slab从来没有出现过容量不够的时候

mem_requested 当前slab中被请求用来存储数据的内存空间字节总数,(total_chunks*chunk_size-mem_requested表示有多少内存在当前slab中是被闲置的,这包括未用的slab+使用的slab中浪费的内存

get_hits 当前slab中命中的get请求数

cmd_set 当前slab中接收的所有set命令请求数

delete_hits 当前slab中命中的delete请求数

incr_hits 当前slab中命中的incr请求数

decr_hits 当前slab中命中的decr请求数

cas_hits 当前slab中命中的cas请求数

cas_badval 当前slab中命中但是更新失败的cas请求数

看到这个命令的输出量很大,所有信息都很有作用。举个例子吧,比如第一个slab中使用的chunks很少,第二个slab中使用的chunks很多,这时就可以考虑适当增大MemCache的增长因子了,让一部分数据落到第一个slab中去,适当平衡两个slab中的内存,避免空间浪费。

 

31.mysql数据池的连接了解吗?

https://www.cnblogs.com/aspirant/p/6747238.html

----Mysql数据库连接池专题

mysql数据池是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。

数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。

数据库连接池的运行机制:

(1) 程序初始化的时候创建连接池;

(2) 使用时向连接池申请可用连接;

(3) 使用完毕,将连接返还给连接池;

(4) 程序退出时,断开所有的连接,同时释放资源。

 

 

32.mysql连接池什么时候初始化?

第一次使用数据库的时候就初始化,以后其他人用就不用初始化。

 

33.faster-CGI和CGI的性能?

faster-CGI:从稳定性上看, fastcgi是以独立的进程池运行来cgi,单独一个进程死掉,系统可以很轻易的丢弃,然后重新分配新的进程来运行逻辑.

从安全性上看, fastcgi和宿主的server完全独立, fastcgi怎么down也不会把server搞垮。

从性能上看, fastcgi把动态逻辑的处理从server中分离出来, 大负荷的IO处理还是留给宿主server,这样宿主server可以一心一意作IO,对于一个普通的动态网页来说,逻辑处理可能只有一小部分,大量的图片等静态IO处理,完全不需要逻辑程序的参与;

从扩展性上讲, fastcgi是一个中立的技术标准,完全可以支持任何语言写的处理程序(php,java,python…)

 

CGI:CGI的跨平台性能极佳,几乎可以在任何操作系统上实现,如DOS、WINDOWS、UNIX、OS/2、Macintosh等。实现CGI的编程语言也有很多选择。CGI的应用程序一般都是一个独立的可执行程序,和WWW服务器各自占据着不同的进程,而且一般一个CGI程序只能处理一个用户请求。这样,每有一个用户请求,都会激活一个CGI进程,当用户请求数量非常多时,会大量挤占系统的资源如内存,CPU时间等,造成效能低下。

 

 

33.curl 和 file_get_contents()的区别?

file_get_contents 每次请求都会重新做DNS(域名系统)查询,并不对DNS信息进行缓存。但是CURL会自动对DNS信息进行缓存。对同一域名下的网页或者图片的请求只需要一次DNS查询。这大大减少了DNS查询的次数。这样多次访问同一个网站的时候,curl的速度会更快。所以CURL的性能比file_get_contents 好很多。

file_get_contents会受php.ini文件中配置的影响,关闭之后无法使用,curl不会。

file_get_contents请求HTTP时,使用的是http_fopen_wrapper,不会keeplive。而curl却可以。这样在多次请求多个链接时,curl效率会好一些。

curl可以模拟多种请求,例如:POST数据,表单提交、post,ftp、

tcp等请求,用户可以按照自己的需求来定制请求。而file_get_contents只能使用get方式获取数据。

 

34.curl 和 file_get_contronts()的区别?
:在读取远程内容的时候,file_get_content除了使用比curl便捷以外,其他的功能都没有curl好。curl支持很多协议,有 FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP,也就是说,它能做到很多file_get_content做不 到的事情。curl在php可以实现远程获取和采集内容;实现PHP网页版的FTP上传下载;实现模拟登陆;实现接口对接 (API),数据传输;实现模拟Cookie;下载文件断点续传等等,功能十分强大。

 

  1. php超全局变量有哪些?

参考文档:http://www.w3school.com.cn/php/php_superglobals.asp

http://blog.csdn.net/zyu67/article/details/41285519

①.$GLOBALS:这种全局变量用于在 PHP 脚本中的任意位置访问全局变量(从函数或方法中均可)。PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。变量的名字就是数组的键。

  

②.$_SERVER $_SERVER 这种超全局变量保存关于报头、路径和脚本位置的信息。

 ③.$_REQUEST  $_REQUEST超级全局变量是一个全能选手,它记录了通过各种方法传递给脚本的变量,特别是GET ,POST 和 COOKIE 。 这些变量的顺序不依赖于它们在发送脚本中出现的顺序,而是依赖于 variables_order 配置指令所指定的顺序。建议少用这个超级变量,因为它不够安全。

$_REQUEST 用于收集 HTML 表单提交的数据。我们可以使用超级全局变量 $_REQUEST 来收集 input 字段的值:   ④.$_POST  $_POST 广泛用于收集提交 method="post" 的 HTML 表单后的表单数据。$_POST 也常用于传递变量。   ⑤.$_GET $_GET 也可用于收集提交 HTML 表单 (method="get") 之后的表单数据。$_GET 也可以收集 URL 中的发送的数据。  ⑥.$_FILES $_FILES超级全局变量包含通过POST方法向服务器上传的数据的有关信息。这个超级全局变量与其他的变量有所不同,它是一个二维数组,包含5个元素。第一个下标标示表单的文件上传元素名;第二个下标是五个预定义下标之一,这些下标描述了上传文件的某个属性:  ⑦.$_ENV    $_ENV超级全局变量提供PHP解析所在服务器环境的有关信息。此数组中的变量包括:

            △  $_ENV[ \'HOSTNAME\' ]  服务器的主机名

            △  $_ENV[ \'SHELL\' ]  系统 shell

  ⑧.$_COOKIE  $_COOKIE超级全局变量存储了通过HTTP cookie传递到脚本的信息。这些cookie一般是由以前执行的PHP脚本通过PHP函数setcookie ( ) 设置的。例如,假设使用 setcookie ( )存储了一个名为 example.com、值为ab2213的cookie。以后就可以通过调用$_COOKIE[ \' example.com\' ]来获得这个值。

⑨.$_SESSION $_SESSION 超级全局变量包含与所有会话有关的信息。注册会话信息能为你提供便利,这样就能在整个网站中引用这些会话信息,而无需通过GET或POST显示的传递数据。

36.tcp和udp的区别?参考地址:

http://blog.csdn.net/li_ning_/article/details/52117463

https://www.cnblogs.com/xiaomayizoe/p/5258754.html

https://www.cnblogs.com/bizhu/archive/2012/05/12/2497493.html

  1. 基于连接与无连接;
    2.对系统资源的要求(TCP较多,UDP少);
    3.UDP程序结构较简单;
    4.流模式与数据报模式 ;
    5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

37. myisam 和 innodb 谁支持事物 谁支持外键

区别太多了;详细的地址:http://blog.csdn.net/wjtlht928/article/details/46641865

MyISAM 和 InnoDB的适用场景

MyISAM适合:(1)做很多count 的计算;(2)插入不频繁,查询非常频繁;(3)没有事务。

InnoDB适合:(1)可靠性要求比较高,或者要求事务;(2)表更新和查询都相当的频繁,并且表锁定的机会比较大的情况。

1)MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持

2)mysiam表不支持外键

3)在执行数据库写入的操作(insert,update,delete)的时候,mysiam表会锁表,而innodb表会锁行

4)当你的数据库有大量的写入、更新操作而查询比较少或者数据完整性要求比较高的时候就选择innodb表。当你的数据库主要以查询为主,相比较而言更新和写 入比较少,并且业务方面数据完整性要求不那么严格,就选择mysiam表。因为mysiam表的查询操作效率和速度都比innodb要快

 

38. linux awk命令是?

参考:https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html

简介

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。

awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。

使用方法

awk \'{pattern + action}\' {filenames}

尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。

awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。

通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。

调用awk

有三种方式调用awk

1.命令行方式awk [-F  field-separator]  \'commands\'  input-file(s)

其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。

awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。

2.shell脚本方式

将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。

相当于shell脚本首行的:#!/bin/sh

可以换成:#!/bin/awk

3.将所有的awk命令插入一个单独文件,然后调用:awk -f awk-script-file input-file(s)

其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。

 

39.关系型数据库非关系数据库的区别?

参考地址:http://blog.csdn.net/longxingzhiwen/article/details/53896702

1.关系型数据库通过外键关联来建立表与表之间的关系,
2.非关系型数据库通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定

1:数据库事务必须具备ACID特性,ACID是Atomic原子性,Consistency一致性,Isolation隔离性,Durability持久性

2:数据的持久存储,尤其是海量数据的持久存储,还是需要一种关系数据库。

40.说下常见的 http 返回状态码?
:
1××   保留   
2××   表示请求成功地接收   
3××   为完成请求客户需进一步细化请求   
4××   客户错误   
5××   服务器错误   
100 Continue
指示客户端应该继续请求。回送用于通知客户端此次请求已经收到,并且没有被服务器拒绝。
客户端应该继续发送剩下的请求数据或者请求已经完成,或者忽略回送数据。服务器必须发送
最后的回送在请求之后。
101 Switching Protocols
服务器依照客服端请求,通过Upgrade头信息,改变当前连接的应用协议。服务器将根据Upgrade头立刻改变协议
101回送以空行结束的时候。

2、Successful

200 OK
指示客服端的请求已经成功收到,解析,接受。
201 Created
请求已经完成并一个新的返回资源被创建。被创建的资源可能是一个URI资源,通常URI资源在Location头指定。回送应该 包含一个实体数据
并且包含资源特性以及location通过用户或者用户代理来选择合适的方法。实体数据格式通过煤体类型来指定即content- type头。最开始服务 器
必须创建指定的资源在返回201状态码之前。如果行为没有被立刻执行,服务器应该返回202。
202 Accepted
请求已经被接受用来处理。但是处理并没有完成。请求可能或者根本没有遵照执行,因为处理实际执行过程中可能被拒绝。
203 Non-Authoritative Information
204 No Content
服务器已经接受请求并且没必要返回实体数据,可能需要返回更新信息。回送可能包含新的或更新信息由entity-headers呈 现。
205 Reset Content
服务器已经接受请求并且用户代理应该重新设置文档视图。
206 Partial Content
服务器已经接受请求GET请求资源的部分。请求必须包含一个Range头信息以指示获取范围可能必须包含If-Range头信息 以成立请求条件。

3、Redirection

300 Multiple Choices
请求资源符合任何一个呈现方式。
301 Moved Permanently
请求的资源已经被赋予一个新的URI。
302 Found
通过不同的URI请求资源的临时文件。
303 See Other
304 Not Modified
如果客服端已经完成一个有条件的请求并且请求是允许的,但是这个文档并没有改变,服务器应该返回304状态码。304
状态码一定不能包含信息主体,从而通常通过一个头字段后的第一个空行结束。
305 Use Proxy
请求的资源必须通过代理(由Location字段指定)来访问。Location资源给出了代理的URI。
306 Unused
307 Temporary Redirect

4、Client Error

400 Bad Request
因为错误的语法导致服务器无法理解请求信息。
401 Unauthorized
如果请求需要用户验证。回送应该包含一个WWW-Authenticate头字段用来指明请求资源的权限。
402 Payment Required
保留状态码
403 Forbidden
服务器接受请求,但是被拒绝处理。
404 Not Found
服务器没有找到任何匹配Request-URI的资源。
405 Menthod Not Allowed
Request-Line 请求的方法不被允许通过指定的URI。
406 Not Acceptable
407 Proxy Authentication Required
408 Reqeust Timeout
客服端没有提交任何请求在服务器等待处理时间内。
409 Conflict
410 Gone
411 Length Required
服务器拒绝接受请求在没有定义Content-Length字段的情况下。
412 Precondition Failed
413 Request Entity Too Large
服务器拒绝处理请求因为请求数据超过服务器能够处理的范围。服务器可能关闭当前连接来阻止客服端继续请求。
414 Request-URI Too Long
服务器拒绝服务当前请求因为URI的长度超过了服务器的解析范围。
415 Unsupported Media Type
服务器拒绝服务当前请求因为请求数据格式并不被请求的资源支持。
416 Request Range Not Satisfialbe
417 Expectation Failed

5、Server Error

500 Internal Server Error
服务器遭遇异常阻止了当前请求的执行
501 Not Implemented
服务器没有相应的执行动作来完成当前请求。
502 Bad Gateway
503 Service Unavailable
因为临时文件超载导致服务器不能处理当前请求。
504 Gateway Timeout
505 Http Version Not Supported

 

41.php 语言的优势?

答:PHP全称英文超级文本预处理语言(Hypertext Preprocessor),它是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。

PHP语言主要有以下特点:

1、开源性和免费性。由于PHP的解释器的源代码是公开的,所以安全系数较高的网站可以自己更改PHP的解释程序。另外,PHP运行环境的使用也是免费的。

2、跨平台性强。由于PHP的解释器是开源的,所以能够在所有的操作系统平台上非常稳定地运行,这使它成为常用的服务器语言。

3、快捷性。PHP是一种非常容易学习和使用的一门语言,它的语法特点类似于C语言,但又没有C语言复杂的地址操作,而且又加入了面向对象的概念,再加上它具有简洁的语法规则,使得它操作编辑非常简单,实用性很强

4、面向过程和面向对象并用。在PHP语言的使用中,可以分别使用面向过程和面向对象,而且可以将PHP面向过程和面向对象两者一起混用,这是其他很多编程语言是做不到的。

5、运行高效性。由于PHP运行在相应的平台解释器上,消耗系统资源比较少,运行的环境简单,所以效率就很高。

6、数据库连接的广泛性。PHP可以与很多主流的数据库建立起连接,如MySQLODBCOracleAdabasDS等,PHP是利用编译的不同函数与这些数据库建立起连接的,PHPLIB就是常用的为一般事务提供的基库。

 

 

42.hash 索引主要是为了解决什么问题?

:hash索引主要解决在查询的过程中减少查询时间,提高效率,因为hash索引可以一次定位,检索效率极高。

43.rbac概念?如何优化?

:RBAC是基于角色的访问控制的一个简单而又强大的集中存取控制机制。

角色是 权限 的集合 (例如:建贴、改贴)。一个角色 可以指派给一个或者多个用户。要检查某用户是否有一个特定的权限, 系统会检查该包含该权限的角色是否指派给了该用户。

可以用一个规则 rule 与一个角色或者权限关联。一个规则用一段代码代表, 规则的执行是在检查一个用户是否满足这个角色或者权限时进行的。

RBAC优化:由于在实际工作中,同一角色对应的不同用户,由于所处的部门不同,职责不同,在同一个系统中的操作对象也不同,需要对角色、权限进行细分。所以我们在要在用户、角色、权限对象的概念,还引入了业务组织单元、业务组织角色、功能的概念。通过对用户的分层,在通过角色之间的关系进行对角色的分层。更加的清晰合理的分配每一个权限,对权限控制的层次更清晰,更加的好操控到每一个行动上。

44.redis 一个队列 最多插入 多少字段?

:List最大长度是4294967295

 

45.composer  是什么?

答:Composer PHP5.3以上 的一个依赖管理工具,ComposerPHP中用来管理依赖关系的工具。你可以在自己的项目中声明所依赖的外部工具库,Composer会帮你安装这些依赖的库文件。

 

46.负载均衡 有哪几种方式?

答:负载均衡有三种部署方式:路由模式、桥接模式、服务直接返回模式,

路由模式:服务器的网关必须设置成负载均衡机的LAN口地址,且与WAN口分署不同的逻辑网络。因此所有返回的流量也都经过负载均衡。这种方式对网络的改动小,能均衡任何下行流量。

 

桥接模式:桥接模式配置简单,不改变现有网络。负载均衡的WAN口和LAN口分别连接上行设备和下行服务器。LAN口不需要配置IP,所有的服务器与负载均衡均在同一逻辑网络中,由于这种安装方式容错性差,网络架构缺乏弹性,对广播风暴及其他生成树协议循环相关联的错误敏感,因此一般不推荐这种安装架构。

 

服务器直接返回模式:这种安装方式负载均衡的LAN口不使用,WAN口与服务器在同一个网络中,互联网的客户端访问负载均衡的虚IPIP对应负载均衡机的WAN口,负载均衡根据策略将流量分发到服务器上,服务器直接响应客户端的请求。因此对于客户端而言,响应他的IP不是负载均衡机的虚IP,而是服务器自身的IP地址。也就是说返回的流量是不经过负载均衡的。因此这种方式适用大流量高带宽要求的服务。

 

47.相较于myisam  innodb 那个安全性高  ?

答:innodb安全性较高 因为myisam容易崩溃他恢复不了数据

  1. 实现session 存入 redis 需要设置什么参数?
  2. sphinx 的实现原理?
  3. xss全名?
    1. pdo 和 mysqli 的区别?

PHP-MySQLi 的 i 代表 Improvement ,提更了相对进阶的功能,就 Extension 而言,本身也增加了安全性.

 PDO是PHP5.1之后才支持的,他为访问数据库采用了一致性的接口,有非常多的操作却是MySQL扩展库所不具备的:

1). PDO真正的以底层实现的统一接口数库操作接口
2). PDO支持更高级的DB特性操作,如:存储过程的调度等,mysql原生库是不支持的.
3). PDO是PHP官方的PECL库,兼容性稳定性必然要高于MySQL Extension,可以直接使用 pecl upgrade pdo 命令升级

  1. tcp 与udp 的 应用场景?

TCP(Transmission Control Protocol),又叫传输控制协议;

UDP(User Datagram Protocol),又叫用户数据报协议,它们都是传输层的协议,但两者的机制不同

特点

TCP

UDP

连接性

面向连接

面向非连接

可靠性

可靠

不可靠

传输效率

若通信数据完整性需让位与通信实时性,则应该选用 TCP 协议(如文件传输、重要状态的更新等);反之,则使用 UDP 协议(如视频传输、实时通信等)。

  1. 应用层协议了解么?

应用层协议(application layer protocol)定义了运行在不同端系统上的应用程序进程如何相互传递报文。

应用层协议:FTP、Telnet、SMTP、HTTP、RIP、NFS、DNS。

应用层协议的定义

(1)交换的报文类型,如请求报文和响应报文;

(2)各种报文类型的语法,如报文中的各个字段公共详细描述;

(3)字段的语义,即包含在字段中信息的含义;

(4)进程何时、如何发送报文及对报文进行响应。

应用层协议分类

(1)域名系统(Domain Name System,DNS):用于实现网络设备名字到IP地址映射的网络服务。

(2)文件传输协议(File Transfer Protocol,FTP):用于实现交互式文件传输功能。

(3)简单邮件传送协议(Simple Mail Transfer Protocol, SMTP):用于实现电子邮箱传送功能

(4)超文本传输协议(HyperText Transfer Protocol,HTTP):用于实现WWW服务。

(5)简单网络管理协议(simple Network Management Protocol,SNMP):用于管理与监视网络设备。

(6)远程登录协议(Telnet):用于实现远程登录功能。

详细地址 https://baike.baidu.com/item/%E5%BA%94%E7%94%A8%E5%B1%82%E5%8D%8F%E8%AE%AE/3668945?fr=aladdin

  1. mysql 内置函数  及想获取当前时间 只要时分秒?

 

SELECT CURRENT_TIMESTAMP();

SELECT CURRENT_TIMESTAMP;

  1. memcache 内存满了怎么办?

1. salb allocation分配机制:

每个slab被划分成多个page,每个page又被划分为多个chunk。每个slab实际上是相同尺寸的chunk的集合。

memcache会根据存储数据的大小,选择最合适数据大小的slab进行存储。而如果这时候所有内存都被占用了,并且指定了执行LRU算法,那么最近时间段内最少使用的同规格的chunk会被重写。这可能就会导致命中率下降。

memcache的chunk分配可以指定一个growth factor,用于当前slab都不适合存储的情况下,创建新的slab。计算的方式:新的chunk大小 = (当前最大size的chunk) * factor。

memcache这种分配机制会导致:内存利用率不高。因为固定大小的chunk无法做到存储严格相等的value值。

 

2. memcache内存回收机制

memcache不释放内存,而是重新利用。

memcache是一个lazy的删除模式,需要新的对象请求入驻这个chunk或者过期的对象被get的时候才会清除。LRU算法会将过期的chunk先删除掉。

 

3. memcache lru算法

每个slab会维护一个队列,刚插入的数据在队头,经常get的数据也会移动到队头,这样较老或者访问较少的数据相对都留在队尾。该算法从队尾开始淘汰。当slab分配不到足够的内存时,首先会检查队尾是否有过期数据。如果有的话会直接将其覆盖为新的对象,如果没有,会开始淘汰队尾的对象。

  1. linux 上 实时监控一个文件 命令  tail –f?

tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容

1命令格式;

tail[必要参数][选择参数][文件]   

2命令功能:

用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件

3命令参数:

-f 循环读取

-q 不显示处理信息

-v 显示详细的处理信息

-c<数目> 显示的字节数

-n<行数> 显示行数

--pid=PID 与-f合用,表示在进程ID,PID死掉之后结束. 

-q, --quiet, --silent 从不输出给出文件名的首部 

-s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒 

4使用实例:

实例1:显示文件末尾内容

命令:

tail -n 5 log2014.log

输出:

[root@localhost test]# tail -n 5 log2014.log 

2014-09

2014-10

2014-11

2014-12

==============================[root@localhost test]#

说明:

显示文件最后5行内容

实例2:循环查看文件内容

命令:

tail -f test.log

输出:

[root@localhost ~]# ping 192.168.120.204 > test.log &

[1] 11891[root@localhost ~]# tail -f test.log 

PING 192.168.120.204 (192.168.120.204) 56(84) bytes of data.

64 bytes from 192.168.120.204: icmp_seq=1 ttl=64 time=0.038 ms

64 bytes from 192.168.120.204: icmp_seq=2 ttl=64 time=0.036 ms

64 bytes from 192.168.120.204: icmp_seq=3 ttl=64 time=0.033 ms

64 bytes from 192.168.120.204: icmp_seq=4 ttl=64 time=0.027 ms

64 bytes from 192.168.120.204: icmp_seq=5 ttl=64 time=0.032 ms

64 bytes from 192.168.120.204: icmp_seq=6 ttl=64 time=0.026 ms

64 bytes from 192.168.120.204: icmp_seq=7 ttl=64 time=0.030 ms

64 bytes from 192.168.120.204: icmp_seq=8 ttl=64 time=0.029 ms

64 bytes from 192.168.120.204: icmp_seq=9 ttl=64 time=0.044 ms

64 bytes from 192.168.120.204: icmp_seq=10 ttl=64 time=0.033 ms

64 bytes from 192.168.120.204: icmp_seq=11 ttl=64 time=0.027 ms

[root@localhost ~]#

说明:

ping 192.168.120.204 > test.log & //在后台ping远程主机。并输出文件到test.log;这种做法也使用于一个以上的档案监视。用Ctrlc来终止。 

实例3:从第5行开始显示文件

命令:

tail -n +5 log2014.log

输出:

[root@localhost test]# cat log2014.log 

2014-01

2014-02

2014-03

2014-04

2014-05

2014-06

2014-07

2014-08

2014-09

2014-10

2014-11

2014-12

==============================

[root@localhost test]# tail -n +5 log2014.log

2014-05

2014-06

2014-07

2014-08

2014-09

2014-10

2014-11

2014-12

==============================

这个网站也是:

https://www.cnblogs.com/end/archive/2013/01/11/2855999.html

 

  1. fopen 所有参数 含义?

fopen — 打开文件或者 URL

说明:

resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] )

参数:点击下面网址

http://php.net/manual/zh/function.fopen.php

http://www.cnblogs.com/ai616818/archive/2012/04/26/2470918.html

  1. 什么是管道符?

管道符就是:“|”可以把两条命令连起来,前面一条命令的输出当成后面一条命令的输入。

管道符的作用:

“|”是管道命令操作符,简称管道符。利用Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为 第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。

它仅能处理经由前面一个指令传出的正确输出信息,也就是 standard output 的信息,对于 standard error 信息没有直接处理能力。

 

用法示例:

ls -l | more

该命令列出当前目录中的文档,并把输出送给more命令作为输入,more命令分页显示文件列表。

 

  1. 魔术常量?

PHP 向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。

php魔术常量

名称

说明

__LINE__

文件中的当前行号。

__FILE__

文件的完整路径和文件名。如果用在被包含文件中,则返回被包含文件的文件名。自php4.0.2起,__file__总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。

__DIR__

文件所在的目录。如果被包含文件中,则返回被包含的文件所在的目录。它等价于dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(php5.3.0中新增)

__FUNCTION__

函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

__CLASS__

类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如 Foo\Bar)。注意自 PHP 5.4 起 __CLASS__ 对 trait 也起作用。当用在 trait 方法中时,__CLASS__ 是调用 trait 方法的类的名字。

__TRAIT__

Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定义时的名字(区分大小写)。Trait 名包括其被声明的作用区域(例如 Foo\Bar)。

__METHOD__

类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。

__NAMESPACE__

当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。

 

  1. php的 按值传递 和 引用值传递?
    1. 传值:是把实参的值赋值给行参 ,那么对行参的修改,不会影响实参的值
    2. 传引用 :真正的以地址的方式传递参数传递以后,行参和实参都是同一个对象,只是他们名字不同而已对行参的修改将影响实参的值

说明:

  1. 传值:根copy是一样的。打个比方,我有一橦房子,我给你建筑材料,你建了一个根我的房子一模一样的房子,你在你的房子做什么事都不会影响到我,我在我的房子里做什么事也不会影响到你,彼此独立。
  2. 传引用:让我想起了上大学时学习C语言的指针了,感觉差不多。打个比方,我有一橦房子,我给你一把钥匙,我们二个都可以进入这个房子,你在房子做什么都会影响到我。

php实例请点击网址:http://blog.51yip.com/php/878.html

  1. 说出两个聚合函数?

答:聚合函数是对一组值执行机算并返回单一的值。

聚合函数有:常用的有:1.求个数count()、2.求和sum()、3.求平均数avg()4.最小值min()5.最大值max()等;聚合函数一般和select语句的group by一起使用。

 

  1. 通过 session 入库 实现 session共享 后 在第一次设置免登陆 的情况 下怎么确保下次登录?

1.在用户登录成功时,创建session对象,保存用户信息2. 将此session的sessionid保存到cookie中3. 同时将sessionid于session对应关系存储到应用域中,以便后面可以根据sessionid来获取到session4. 在用户关闭浏览器,重新打开浏览器访问网站时,读取用户的cookie,得到sessionid5. 根据sessionid获取到第3步存储到应用域中的session对象6. session中读取用户信息。

  1. linux 查看文件内容命令?

1) cat 由第一行开始显示内容,并将所有内容输出cat语法:cat[-n] 文件名-n:显示时。连行号一起输出)

2) tac 从最后一行倒叙显示内容,并间所有内容输出。tac语法:tac文件名。

3) more 根据窗口大小,一页一页的实现文件内容。More的语法:more文件名。

4) less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符。Less的语法:less文件名。

5) head 只显示头几行。Head的语法:head[n number] 文件名number显示行数)

6) tail 只显示最后几行。Tail的语法:tail[-n number] 文件名

7) nl 类似cat –n ,显示时输出行号。nl的语法:nl文件名

8) tailf 类似于tail –f。

 

  1. tcp udp 的中文名称?

答:tcp(Transmission Control Protocol)传输控制协议,传输数据前需要先建立连接,是一种可靠的、基于字节流的传输层通信协议

udp(User Datagram Protocol)用户数据报协议,传输数据的时候不需要建立连接,是一种面向事务的简单不可靠的信息传送协议。

  1. 说下你理解的线程与进程?

:(1)定义:进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。

2)关系:一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。

3)区别:1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 2) 线程的划分尺度小于进程,使得多线程程序的并发性高。3) 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。4) 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。5)从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

4)优缺点:线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时,线程合适与SMP机器运行,而进程则可以跨机器迁移。

  1. session默认的生存时间?

1) session的默认有效时间php.ini 查看session.gc_maxlifetime。

PHP中的session有效默认是1440秒(24分钟)【php5默认是180分钟】

 

2)设置生存时间:

  A.session_set_cookie_params(); 来设置 Session 的生存期的,该函数必须 session_start() 函数调用之前调用:

B.ini_set(\'session.gc_maxlifetime\',3600);

 

  1. 单点登录的实现原理?

1)单点登录原理:单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存  的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次  登录能得到其他所有系统的信任。单点登录在大型网站里使用得非常频繁,例  如像阿里巴巴这样的网站,在网站的背后是成百上千的子系统,用户一次操作  或交易可能涉及到几十个子系统的协作,如果每个子系统都需要用户认证,不仅  用户会疯掉,各子系统也会为这种重复认证授权的逻辑搞疯掉。实现单点登录说  到底就是要解决如何产生和存储那个信任,再就是其他系统如何验证这个信任的  有效性,因此要点也就以下几个:存储信任、验证信任

2)共享session

共享Session可谓是实现单点登录最直接、最简单的方式。将用户认证信息保存于Session中,即以Session内存储的值为用户凭证,这在单个站点内使用是很正常也很容易实现的,而在用户验证、用户信息管理与业务应用分离的场景下即会遇到单点登录的问题,在应用体系简单,子系统很少的情况下,可以考虑采用Session共享的方法来处理这个问题。

3)基于openID的单点登录

 这种单点登录将用户的身份标识信息简化为OpenId存放于客户端,当用户登录某个子系统时,将OpenId传送到服务端,服务端根据OpenId构造用户验证信息,多用于C/S与B/S相结合的系统

4)基于cookie的openid存储方案

   我们知道,Cookie的作用在于充当一个信息载体在Server端和Browser端进行信息传递,而Cookie一般是以域名为分割的,例如a.xxx.com与b.xxx.com的Cookie是不能互相访问的,但是子域名是可以访问上级域名的Cookie的。即a.xxx.com和b.xxx.com是可以访问xxx.com下的Cookie的,于是就能将顶级域名的Cookie作为OpenId的载体。

5)在多个顶级域名的情况下,我们将无法让各个子系统的OpenId共享。处理B/S环境    下的跨域问题,我们首先就应该想到JSONP

验证步骤如下:

  1. 用户通过登录子系统进行用户登录;
  2. 用户登录子系统记录了用户的登录状态、OpenId等信息;
  3. 用户使用业务子系统;
  4. 若用户未登录业务子系统则将用户跳转至用户登录子系统;
  5. 用户子系统通过JSONP接口将用户OpenId传给业务子系统;
  6. 业务子系统通过OpenId调用验证服务;
  7. 验证服务返回认证信息、业务子系统构造用户登录凭证;(此时用户客户端已经与子业务系统的验证信息已经一一对应)

 

  1. 将用户登录结果返回用户登录子系统,若成功登录则将用户跳转回业务子系统;
  2. 将授权后的内容返回客户端;

 

  1. yii自带的操作方法?

 $Admin = new Admin();

 A.//查找多条记录,返回二维数组

        $Admin->findAll();

        $Admin->findAll("id = 22");

        $Admin->findAll(array("select"=>"id,name,password","condition"=>"id>2"));

        $Admin->findAllBySql("select语句");

  B.//查找一条记录,返回一维数组

        $Admin->find();

        $Admin->find("id = 22");

        $Admin->findByPK(22);

        $Admin->findByPK(array(22,23,24));

        $Admin->findBySql("select语句");

   C.//添加记录,返回影响行数

        $Admin->userName="wang";

        $Admin->password="123456";

        $Admin->save();

   D.//删除记录,返回影响行数

        $Admin->deleteAll();

        $Admin->deleteAll("id = 22");

        $Admin->deleteAllByPK(22);

        $Admin->deleteAllByPK(array(22,23,24));

   E.//修改记录,返回影响行数

        $Admin->updateAll(关联数组,"id = 22");

        $Admin->updateAllByPK(22,关联数组);

        $Admin->updateAllByPK(array(22,23,24),关联数组);

   F.//返回多条记录的二维数组(select),返回二维数组

        $db   = Yii::app()->db;

        $st   = $db->createCommand("select语句");

        $rs   = $st->queryAll();

    G.//返回一条记录的以为数组(select),返回一维数组

        $db   = Yii::app()->db;

        $st   = $db->createCommand("select语句");

        $rs   = $st->queryRow();

    H.//执行insert、delete、update语句,返回受影响行数

        $db   = Yii::app()->db;

        $st   = $db->createCommand("insert、delete、update语句");

        $rs   = $st->execute();

     F.//查询的记录数(一般用于select语句)

        $row  = $Admin->count();

        $row  = $Admin->count("id > 12");

 

  1. 说下你对于命名空间的理解?

(1) PHP中的命名空间是什么?

  1. 命名空间是一种封装事物的方法
  2. 命名空间就是一个容器,这个容器内我们可以放入类、函数和变量,他们在同 一命名空间内可以无条件相互访问。在命名空间之外,就必须引用或者导入其他命 名空间,才能调用它们包含的这些项。
  3. 命名空间跟shell中的文件目录的概念是一样一样的。在当前目录下可以直接 用文件名访问所有文件,如果需要访问其他目录下的文件,就需要输入相对路径或 绝对路径。

(2)命名空间可以解决下面两个问题:

  1. 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字 冲突。
  2. 为很长的标识符创建一个别名,提高代码的可读性,减少代码的编写量。

(3)命名空间的引入机制

A.空间的引入:关键字use,注意:当移入空间后,必须要用限定名称访问方式访问引入空间里面的函数(或类、常量),不能使用非限定名称方式访问,这样会访问到当前命名空间下的函数(或类、常量)。

B.空间类元素的引入:关键字use。注意:只能引入类,然后可以使用非限定名 称访问。

  1. 查看主从库的状态 命令?

master端:
show master status;—查看状态:
show processlist; –查看slavemysql进程信息
reset master; #慎用,将清空日志及同步position (位置)

 

slave端:
show slave status;
show slave logs;
show processlist;
reset slave; #慎用,将清空slave配置信息、日志及同步position

 

  1. 用过事务吗?及事务的应用场景?

事务的特性:

1、原子性 一个事务的执行被视为一个不可分割的最小单元。事务里面的操作,要么全部成功执行,要么全部失败回滚,不可以只执行其中的一部分。 

 

2、一致性 一个事务的执行不应该破坏数据库的完整性约束。如果上述例子中第2个操作执行后系统崩溃,保证A和B的金钱总计是不会变的。

 

3、隔离性 通常来说,事务之间的行为不应该互相影响。然而实际情况中,事务相互影响的程度受到隔离级别的影响。

 

4、持久性 事务提交之后,需要将提交的事务持久化到磁盘。即使系统崩溃,提交的数据也不应该丢失。

 

用过,首先是MyISAM不支持事物,InnoDB支持事物

事务广泛的运用于订单系统、银行系统等多种场景。如果有以下一个场景:A用户和B用户是银行的储户。现在A要给B转账500元。那么需要做以下几件事:

1. 检查A的账户余额>500元;

2. A账户扣除500元;

3. B账户增加500元;

正常的流程走下来,A账户扣了500,B账户加了500,皆大欢喜。那如果A账户扣了钱之后,系统出故障了呢?A白白损失了500,而B也没有收到本该属于他的500。以上的案例中,隐藏着一个前提条件:A扣钱和B加钱,要么同时成功,要么同时失败。事务的需求就在于此。

 

 

 

 

(长见识,可以吹牛皮)

事务的四种隔离级别

前文中提到,事务的隔离性受到隔离级别的影响。那么事务的隔离级别是什么呢?事务的隔离级别可以认为是事务的"自私"程度,它定义了事务之间的可见性。隔离级别分为以下几种:

1.READ UNCOMMITTED(未提交读)。在RU的隔离级别下,事务A对数据做的修改,即使没有提交,对于事务B来说也是可见的,这种问题叫脏读。这是隔离程度较低的一种隔离级别,在实际运用中会引起很多问题,因此一般不常用。

2.READ COMMITTED(提交读)。在RC的隔离级别下,不会出现脏读的问题。事务A对数据做的修改,提交之后会对事务B可见,举例,事务B开启时读到数据1,接下来事务A开启,把这个数据改成2,提交,B再次读取这个数据,会读到最新的数据2。在RC的隔离级别下,会出现不可重复读的问题。这个隔离级别是许多数据库的默认隔离级别。

3.REPEATABLE READ(可重复读)。在RR的隔离级别下,不会出现不可重复读的问题。事务A对数据做的修改,提交之后,对于先于事务A开启的事务是不可见的。举例,事务B开启时读到数据1,接下来事务A开启,把这个数据改成2,提交,B再次读取这个数据,仍然只能读到1。在RR的隔离级别下,会出现幻读的问题。幻读的意思是,当某个事务在读取某个范围内的值的时候,另外一个事务在这个范围内插入了新记录,那么之前的事务再次读取这个范围的值,会读取到新插入的数据。Mysql默认的隔离级别是RR,然而mysqlinnoDB引擎间隙锁成功解决了幻读的问题。

4.SERIALIZABLE(可串行化)。可串行化是最高的隔离级别。这种隔离级别强制要求所有事物串行执行,在这种隔离级别下,读取的每行数据都加锁,会导致大量的锁征用问题,性能最差。

为了帮助理解四种隔离级别,这里举个例子。如图1,事务A和事务B先后开启,并对数据1进行多次更新。四个小人在不同的时刻开启事务,可能看到数据1的哪些值呢?

 

  1. 输入俩人的名字 , 求出 俩人的缘分值?

通过两人的名字md5加密后简单的对比如果有重复的数字的话就加分,重复数字越多分数越高,没有重复则直接计算为0

http://blog.csdn.net/json_ligege/article/details/51371820

 

  1. mysql 临时表 派生表?

临时表的意义:

工作中有时候需要查询一些特殊的数据,尤其一个大表里的个别字段的数值,可以这些字段放到临时表,查询会更快些。

 

创建临时表:

 和正常一样只需要加上 temporary

 create temporary table test(id int, name VARCHAR(32));

 

创建临时表,同时将要查询的记录插入临时表:

 CREATE TEMPORARY TABLE tmp_table SELECT * FROM table_name;

临时表和正常表相关问题

同时存在名称相同的临时表,临时表操作的优先级更高

同名正常表不能同时存在,同名临时表也不能共存

派生表:当主查询中包含派生表,或者当select 语句中包含union字句,或者当select语句中包含一个字段的order by 子句(对另一个字段的group by 子句)时,MySQL为了完成查询,则需要自动创建临时表存储临时结果集,这种临时表由MySQL自行创建,自行维护,成为自动创建的临时表。对于自动创建的临时表,由于内存临时表的性能更为优越,mysql总是首先使用内存临时表,而当内存临时表变得太大时,达到某个阈值的时候,内存临时表就转存为外存临时表。也就是说,外存临时表是内存临时表在存储空间上的一种延伸。内存临时表转存为外存临时表的阈值由系统变量max_heap_table_size和tmp_table_size的较小值决定。

派生表一般在from子句中使用。如:

select * from (select * from table) as t;

 

  1. linux 查看内存空间命令?

 

:

top命令能显示系统内存

 

Linux下查看内存我们一般用free命令:

 

所包含参数意思:

total:总计物理内存的大小。
used:已使用多大。
free:可用有多少。
Shared:多个进程共享的内存总额。
Buffers/cached:磁盘缓存的大小。

 

 

 

 

 

  1. 往一张数据量比较大的表中添加字段,怎么添加?

比如test表,数据量:1500万左右

1、重新建一张新表tmp_test,把test表的数据copy到新表tmp_test里,然后给新表加上主键,唯一索引。


2、rename表名,切换业务。(将test改为test_bak,将tmp_test改为test)


3、由于原test表不停的有数据的insert 和update操作,所以把第一步执行过程中原test表insert和update变动的数据,更新到新test表。

 

  1. http 和 https 的 区别

 

https协议需要到ca申请证书,一般免费证书很少,需要交费。


     http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。


    http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。


     http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全

 

  1. linux  关机命令

关机命令如下:
1、halt   立刻关机

 

2、poweroff  立刻关机


3、shutdown -h now 立刻关机(root用户使用)


4、shutdown -h 10 10分钟后自动关机

 

111.token 值怎么生成?

接口特点汇总:

1、因为是非开放性的,所以所有的接口都是封闭的,只对公司内部的产品有效;

2、因为是非开放性的,所以OAuth那套协议是行不通的,因为没有中间用户的授权过程;

3、有点接口需要用户登录才能访问;

4、有点接口不需要用户登录就可访问;

针对以上特点,移动端与服务端的通信就需要2把钥匙,即2个token。

第一个token是针对接口的(api_token);

第二个token是针对用户的(user_token)

api_token = md5 (\'模块名\' + \'控制器名\' + \'方法名\' + \'2013-12-18\' + \'加密密钥\') = 770fed4ca2aabd20ae9a5dd774711de2

1、 \'2013-12-18\' 为当天时间,

2、\'加密密钥\' 为私有的加密密钥,手机端需要在服务端注册一个“接口使用者”账号后,系统会分配一个账号及密码,数据表设计参考如下:

字段名

字段类型

注释

client_id

varchar(20)

客户端ID

client_secret

varchar(20)

客户端(加密)密钥

再说第二个token(user_token

它的职责是保护用户的用户名及密码多次提交,以防密码泄露。

如果接口需要用户登录,其访问流程如下:

1、用户提交“用户名”和“密码”,实现登录(条件允许,这一步最好走https);

2、登录成功后,服务端返回一个 user_token,生成规则参考如下:

服务端用数据表维护user_token的状态,表设计如下:

字段名

字段类型

注释

user_id

int

用户ID

user_token

varchar(36)

用户token

expire_time

int

过期时间(Unix时间戳)

(注:只列出了核心字段,其它的再扩展吧!!!)

服务端生成 user_token 后,返回给客户端(自己存储),客户端每次接口请求时,如果接口需要用户登录才能访问,则需要把 user_id 与 user_token 传回给服务端,服务端接受到这2个参数后,需要做以下几步:

1、检测 api_token的有效性;

2、删除过期的 user_token 表记录;

3、根据 user_id,user_token 获取表记录,如果表记录不存在,直接返回错误,如果记录存在,则进行下一步;

4、更新 user_token 的过期时间(延期,保证其有效期内连续操作不掉线);

5、返回接口数据;

112.php 的工作原理?

PHP的所有应用程序都是通过WEB服务器(如IIS或Apache)和PHP引擎程序解释执行完成的,工作过程:

 

(1)当用户在浏览器地址中输入要访问的PHP页面文件名,然后回车就会触发这个PHP请求,并将请求传送化支持PHP的WEB服务器。

(2)WEB服务器接受这个请求,并根据其后缀进行判断如果是一个PHP请求,WEB服务器从硬盘或内存中取出用户要访问的PHP应用程序,并将其发送给PHP引擎程序。

(3)PHP引擎程序将会对WEB服务器传送过来的文件从头到尾进行扫描并根据命令从后台读取,处理数据,并动态地生成相应的HTML页面。

(4)PHP引擎将生成HTML页面返回给WEB服务器。WEB服务器再将HTML页面返回给客户端浏览器。

 

113.redis集群怎么做的,官方的方案 还是 其他的 。

主服务器配置
mkdir /mnt/redis/redisDB
mkdir /mnt/redis/redisLog

vi /etc/redis/redis.conf
dbfilename /mnt/redisDB/dump.rdb --修改磁盘上保存数据库文件的位置
loglevel warning --修改日志级别
logfile /mnt/redis/redisLog/redis.log --修改日志文件的位置

从机配置
cp redis.conf /etc/redis_slave.conf

vim redis_slave.conf

修改其中的一行
配置master的ip地址和redis-server的端口。
slaveof <10.45.39.39> <6379> --设置主从服务器的主服务器的地址和端口


daemonize no --是否把redis-server启动在后台,默认是“否”。若改成yes,会生成一个pid文件。

主从测试

主机: redis-server /etc/redis.conf
从机: redis-server /etc/redis_slave.conf
3.1 测试
在主机上启动redis客户端:
ssh 192.168.1.1
redis-cli
>set k1 v1
>get k1
"v1"
.登陆从机,并在从机上启动客户端:
ssh 192.168.1.2
redis-cli
>get k1
"v1"

 

114.apache和nginx如何和PHP进行交互?

nginx与PHP的关系.

对比, apache和PHP的关系, 将PHP安装成apache的一个功能模块, 导致的结果, 对外只有一个apache程序, PHP并不独立出现, 仅仅是apache的模块. 修改php的配置, 重启apache才能生效.

但是, nginx与PHP, 不是模块的关系. 是相互独立交互的关系.

nginx接收到浏览器的的http请求后, 将请求在转发给PHP进行处理. 在nginx与PHP间也存在一种网络交互.

通常: PHP的会在9000端口进行监听, 当nginx有请求需要处理时, 将请求在转发到PHP的9000端口上.

ApacePHP的关系.

apache接受你的http请求 然后调用php模块 路径什么的都在配置文件里写好了
然后php模块开始解释php代码就是运行了 运行完就把东西交给apache 然后返回到客户端

115.接口怎么加密?

1、最简单的 固态签名

 sign = xxxxxx 的模式 ,通常配合time()时间戳传递,一般用来做为普通接口不涉及安全性的接口。

2、动态签名 这种 常规的:

1.请求参数

user_code :分配唯一标识,区分不同商户

order_no :请求单号,多个逗号隔开。

order_type:   请求单号类型: 0订单 号,1运单号

request_time:请求时间戳 YmdHis

sign : 签名有字符串,签名规则:

MD5(user_code+order_no+order_type+request_time+private_key) ,其中private_key为约定秘钥。


通常MD5加密的字符串 是按照ASCII排序

通过传递参数和动态md5加密 ,因为约定的private_key 只有双方知道,因此数据被抓包对面也没法加密出正确的sign 

 

 

116.aof持久化方案及具体两种方案的同步方式

(1)快照:默认redis是会以快照的形式将数据持久化到磁盘的(一个二进制文件,dump.rdb,这个文件名字可以指定),在配置文件中的格式是:save N M表示在N秒之内,redis至少发生M次修改则redis抓快照到磁盘。当然我们也可以手动执行save或者bgsave(异步)做快照

(2)AOFAOF就可以做到全程持久化,只需要在配置文件中开启(默认是no),appendonly yes开启AOF之后,redis每执行一个修改数据的命令,都会把它添加到aof文件中,当redis重启时,将会读取AOF文件进行“重放”以恢复到redis关闭前的最后时刻。

 

 

117.支付宝同步显示成功异步显示失败应该相信哪个?

(1)同步通知是给用户看的

(2)异步通知是给服务器看的

同步通知方便用户查看是否充值成功,如果这里就判断并更新数据库,肯定会出事的,首先网络慢或者用户关闭太早,造成用户充值成功但是数据库没有更新,同时这里更新数据库容易被伪造,数据不真实,异步通知一般都采用自动通知,并且有证书校验,不收前端影响,伪造数据难度高,所以说还是应该相信异步!

 

118.订单表分表

方案:

(1)原始订单表按照买家ID取模分表

(2)新建买家与订单的映射关系表(也会数据量很大,可以再按照oederid取模分表)

查询处理逻辑:

(1)买家查询自己所有的订单:按照userid取模找到对应的订单分表,取数据;

(2)买家按照订单号查询订单L根据orderid从买家订单映射中获得userid,然后仍然是按照userid取模找到对应的订单分表

 

 

119.主从复制由谁来搭建?

MySQL主从负责依赖binlog,要想实现复制必须打开binlog。主从复制的过程中由主服务器(Master)的IO进程配合从服务器(Slave)的IO进程和SQL进程共同完成,具体不知如下:
  1SlaveIO进程向Master请求指定日志文件指定位置后的日志内容;
  2Master收到请求后,通过MasterIO进程读取Slave请求的数据并返回给SlaveIO进程,除了请求的内容还会给Slave返回本次读取到的binlog文件名称和位置;
  3SlaveIO进程收到返回内容后将日志内容添加到relay-log后面,并将文件位置信息保存到master-info中;
  4SlaveSQL进程发现relay-log有新内容后就会取出relay-log中的语句执行。

 

 

120.数据库怎么备份?

使用mysqldump命令备份

mysqldump命令可以讲数据库中的数据备份成一个文本文件。表结果和表中的数据将存储在生成的文本中。mysqldump的工作原理很简单。他先查出需要备份的表结构,在在文本中文件中生存一个create语句,然后,将表中的所有记录转换成一条insert语句,这些create语句和insert语句都是还原时使用,还原数据时就可以使用其中的create语句来创建表,使用其中的insert语句来还原数据。

mysqldump -h主机名  -P端口 -u用户名 -p密码 (–database) 数据库名 > 文件名.sql

121. 值传递 & 引用传递的区别? 
按值传递:函数范围内对值的任何改变在函数外部都会被忽略 
引用传递:函数范围内对值的任何改变在函数外部会反应出这些改变
优缺点:按值传递时,php必须复制值,对于大型字符串和对象来说,这是代价很大的操作。引用传递不需要复制值,对于性能提高有好处
122. empty 的返回值?
Bool
123. include 和 require 的区别?
require一个文件存在错误的话,那么程序就会中断执行了,并显示致命错误 
include一个文件存在错误的话,那么程序不会中端,而是继续执行,并显示一个警告错误。
Include有返回值,但是require没有
124. php 垃圾回收机制 了解 吗?
每个分配的内存区域都有一个计数器,记录有多少个变量指针指向这片内存。当指向该片内存的指针数量为0,那么该片内存区域就可以被回收。
125. 数组去重了解哪些方式?
可以用函数array_unique(array) 

126.tp5和tp3 的路由?

tp3支持正则路由定义和普通URL模式

tp5是全部改为规则路由配合变量规则(正则定义)的方式,如果在路由中定义了配置的url,则不允许直接访问,会抛出异常

127.哈希加盐碰撞?

哈希加盐就是哈希加密之后在后面加上一个随机字符串加密。

128.索引覆盖指的是什么?

如果查询的列恰好是索引的一部分,那么查询只需要在索引文件上进行,不需要回行到磁盘再找数据,这种查询速度非常快,称为“索引覆盖”。

129.出现死锁了咋办?

出现死锁的四个条件:

  1. 互斥:其他所需的进程不能访问已分配给其他进程的资源
  2. 占有并等待:当一个进程等待其他进程时,继续占用已分配资源
  3. 不可抢占:不能强行占用进程以占有的资源
  4. 循环等待:存在一个循环的进程链,使用每个进程至少占有此链中下一个进程所需的一个资源

死锁的预防

通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或几个,来预防发生死锁。然后在资源的动向分配过程中,用某种方法去防止系统进入不安全状态,从而避免死锁。

 

当系统在运行过程中发生死锁,可以通过系统所设置的检测机构,及时的检测出死锁的发生,并精确地确定与死锁有关的进程和资源,然后采取适当措施,从系统中将已发生的死锁清除掉。

 

  1. 索引覆盖?

如果查询的列恰好是索引的一部分,那么查询只需要在索引文件上进行,不需要进行到磁盘中找数据,若果查询得列不是索引的一部分则要到磁盘中找数据。

  1. ajax技术利用了什么协议?简述ajax的工作机制

Ajax利用的是http请求。简单说它就是调用了一个activeX发送了一个HTTP请求。只不过这个是看不到的。

Ajax工作机制:

(1)初始化对象并发出XMLHttpRequest请求。为了让Javascript可以向服务器发送HTTP请求,必须使用XMLHttpRequest对象。使用之前,要先将XMLHttpRequest对象实例化。

(2)指定那个响应处理函数

指定当服务器返回信息时客户端处理方式。只要将相应的处理函数赋给XMLHttpRequest对象的onreadystatechange属性就可以了

(3)发送http请求

指定响应处理函数之后,就可以向服务器发出HTTP请求了。这一步调用XMLHttpRequest对象的open和send方法

(4)处理服务器返回信息

  1. 虚拟内存

为了解决系统运行过程中不同进程之间内存的合理分配和利用,防止不同进程同一时刻在物理内存中运行而对物理内存的争夺和践踏(一旦某一进程失去控制,占用的资源不停增大,就会将物理内存占满,并导致其他进程中断,甚至导致服务器崩溃,这是及其危险的),我们采用了虚拟内存。

虚拟内存存在的意义就在于使不同进程在运行过程中,它所看到的是自己独自占有了当前系统的4G内存,当然这是一个假象。在这种假象之下,内核悄悄的将当前进程所占用的内存转化为了物理内存

  1. mysql5.7版本和以前的版本有什么不同

(1)安全性方面

Mysql5.7以后密码不再默认为空。Mysql在安装过程中将随机创建一个root账号的密码,并将改密码标记为过期状态。这就强制root用户使用临时密码进去后必须修改密码。

(2)性能方面

极大的提高了innodb的读取性能,减少了MDL锁的开销;改善了innodb的读写负载性能,innodb的索引锁替换成了“块锁”

(3)数据类型

Mysql5.7版本新增了json这个数据类型,并内置了json函数

  1. session_id和服务器session文件的关系

Session_id是一个回话的key。当浏览器第一次访问时,服务端会生成一个session,有一个session_id与之相对应。

服务器端在创建session的同时,会生成一个与之相对应的唯一的seesion_id,而这个Session id在随后的请求中会被用来重新获得已经创建的Session。Session创建以后,session值存放在服务器端的session文件中,发送到客户端的只有session_id;当客户端再次发送请求时,会将session_id带上,服务器收到请求后,依据传过来的session_id找的相对应的seesion。

  1. 防止session_id泄露

1)sessionID的值只允许cookie设置,而不是通过URL重置方式设置,同时设置cookie的httponly为true,这个属性是设置是否可通过客户端脚本访问这个设置的cookie,第一这个可以防止这个cookie被XSS读取从而引起session劫持,第二cookie设置不会像URL重置方式那么容易获取sessionID。

第二步就是在每个请求里面加上token,实现类似前面章节里面讲的防止form重复递交类似的功能,我们在每个请求里面加上一个隐藏的token,然后每次验证这个token,从而保证用户的请求都是唯一性。

(2)间隔生成新的SID

session额外设置一个创建时间的值,一旦过了一定的时间,我们销毁这个sessionID,重新生成新的session,这样可以一定程度上防止session劫持的问题。

  1. 每次请求都会判断客户端是否存在session_id?

  1. zend引擎在版本几中出现的,解决了什么问题?

Zend引擎在PHP4版本中首次出现。

zend engine引擎的出现使得php有了质的提高:

1、把边解释边运行的方式变为先进行预编译(compile),再执行(execute)的方式极大提高了php的运行效率。

2、使得执行效率大幅提高

3、由于实行功能分离,降低了模块间的耦合度,扩展性大大加强

Zend Engine 最主要的特性就是把 PHP 的边解释边执行的运行方式改为先进行预编译(Compile),然后再执行(Execute)。这两者的分开给 PHP 带来了革命性的变化:执行效率大幅提高;由于实行了功能分离,降低了模块间耦合度,可扩展性也大大增强。

106.了解php 钩子函数吗?

   钩子就像一个”陷阱”、”监听器”,当A发送一个消息到B时,当消息还未到达目的地B时,被钩子拦截调出一部分代码做处理,这部分代码也叫钩子函数或者回调函数

作用:

钩子函数可以截获并处理其他应用程序的消息。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。

107.php内核的 垃圾回收机制 和 内存管理机制?

php的内存管理机制是:预先给出一块空间,用来存储变量,当空间不够时,再申请一块新的空间

  1. 存储变量名,存在符号表。
  2. 变量值存储在内存空间。
  3. 在删除变

 

 

108.集群和分布式部署有什么区别?

分布式(distributed) 是指在多台不同的服务器中部署不同的服务模块,通过远程调用协同工作,对外提供服务。

集群(cluster) 是指在 多台不同的服务器中部署相同应用或服务模块 ,构成一个集群,通过负载均衡设备对外提供服务。

109.怎么通过curl实现采集?

   .开启curl支持:

由于php环境安装后默认是没有打开curl支持的,需修改php.ini文件,找到;extension=php_curl.dll,把前面的冒号去掉,重启服务即可

.使用curl抓取数据:

   1.初始化一个 cURL 对象 

$curl = curl_init();

  2.设置你需要抓取的URL 

curl_setopt($curl, CURLOPT_URL, \'http://www.kugou.com/yy/html/special.html\');

  3.设置header 

curl_setopt($curl, CURLOPT_HEADER, 1);

4.设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。 

curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

5.运行cURL,请求网页 

$data = curl_exec($curl);

 6.关闭URL请求 

curl_close($curl);//print_r($data);

三、通过正则匹配找到关键数据

//$data是curl_exec返回的的值,即采集的目标内容 

preg_match_all("/<div class=\"top\"><em>(.*)<\/em><strong><a title=\"(.*)\" href=\"(.*)\">.*<\/a>/",$data, $arr);print_r($arr);

 

 

110.怎么开启事务?

1. BEGIN 开始一个事务

ROLLBACK 事务回滚

COMMIT 事务确认

2、直接用 SET 来改变 MySQL 的自动提交模式:

SET AUTOCOMMIT=0 禁止自动提交

SET AUTOCOMMIT=1 开启自动提交

111.六种网站优化的方案?

1、HTML静态化

2、图片服务器分离

3、数据库集群,库表散列

4、缓存

5、镜像(一个或多个域名不同,但内容完全相同的网站

6、负载均衡

 

112.如何在linux 下配置环境变量?

在家目录下面有个隐藏文件.bash_profile文件,在里面用alias进行配置

cd ~ 切换家目录   ls -a 查找所有文件 vim .bash_profile进入文件  

如配置php的环境变量 alias php7110="/usr/local/php7.1.10/bin/php"

配置完source .bash_profile进行刷新,用alias可以查看所有的环境变量

 

113.怎么分区?一、分区概念 

分区是指允许根据指定的规则,跨文件系统分配单个表的多个部分。表的不同部分在不同的位置被存储为单独的表。

通俗地讲表分区是将一张大表,根据条件分割成若干个小表。数据库存存储的时候会存在多个文件中。而对于程序或者数据库来说,依旧是一张表,就是将mysql相关的数据文件,分成了多个存储。 MYSQL 5.1之后支持分区】

比如:某用户表的记录超过了1500万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区。当然也可根据其他的条件分区。 【mysql含char类型单表不建议超过500万数据,标量类型不建议超过1000万】

 

二、为什么要对表进行分区
为了改善大型表以及具有各种访问模式的表的可伸缩性,可管理性和提高数据库效率。
分区的一些优点包括:
      1)、与单个磁盘或文件系统分区相比,可以存储更多的数据。
      2)、对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有关的分区,很容易地删除那些数据。相反地,在某些情况下,添加新数据的过程又可以通过为那些新数据专门增加一个新的分区,来很方便地实现。
      3)、一些查询可以得到极大的优化,这主要是借助于满足一个给定WHERE语句的数据可以只保存在一个或多个分区内,这样在查找时就不用查找其他剩余的分区。因为分区可以在创建了分区表后进行修改,所以在第一次配置分区方案时还不曾这么做时,可以重新组织数据,来提高那些常用查询的效率。
      4)、涉及到例如SUM()和COUNT()这样聚合函数的查询,可以很容易地进行并行处理。这种查询的一个简单例子如 “SELECT  COUNT (*) from user;”。 并行这意味着该查询可以在每个分区上同时进行,最终结果只需通过总计所有分区得到的结果
      5)、通过跨多个磁盘来分散数据查询,来获得更大的查询吞吐量。

三、mysql表文件说明:

 

mysql两种常用存储引擎myisam和innodb

myisam不支持事务;innodb支持事务

myisam的数据库的物理文件结构为:

.frm文件:与表相关的原始数据信息都存放在frm文件,包括表结构的定义信息等。各种存储引擎都需要frm文件,并且存放于数据库名目录下。

.myd文件:myisam存储引擎专用,用于存储myisam表的数据

.myi文件:myisam存储引擎专用,用于存储myisam表的索引相关信息

innodb的数据库的物理文件结构为:

.frm文件

.ibd文件和.ibdata文件:

这两种文件都是存放innodb数据的文件,之所以用两种文件来存放innodb的数据,是因为innodb的数据存储方式能够通过配置来决定是使用共享表空间存放存储数据,还是用独享表空间存放存储数据。

独享表空间存储方式使用.ibd文件,并且每个表一个ibd文件

共享表空间存储方式使用.ibdata文件,所有表共同使用一个ibdata文件

关于共享表空间和独享表空间:http://www.linuxidc.com/Linux/2015-01/111241.htm

四、查看mysql是否支持分区:

mysql可以通过下面语句判断是否支持分区:

SHOW VARIABLES LIKE \'%partition%\';

如果输出:

have_partitioning   YES 表示支持分区。

或者通过:

SHOW PLUGINS;

显示所有插件,如果有partition ACTIVE STORAGE ENGINE GPL 插件则表明支持分区

 

 

五、mysql几种分区类型说明:

分区类型

特点

RANGE分区

允许将数据划分不同范围。

例如:可以将一个表通过年份划分成若干个分区,或者是按照id的值范围进行划分。

LIST分区

这种模式允许系统通过预定义的列表的值来对数据进行分Values In (1,2,3)

例如:将用户按照地图进行划分【省id 1,2,3在一个分区 4,5,6在一个分区等】

Hash分区

这中模式允许通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区。

例如:可以建立一个对表主键进行分区的表【根据hash算法将数据平均分配在分区内】

Key分区

上面Hash模式的一种延伸,这里的Hash Key是MySQL系统产生的

 

 

六、mysql几种分区类型说明:

1、RANGE分区

 说明:基于属于一个给定连续区间的列值,把多行分配给分区

创建一个订单表: [JD我的订单页面]

按年来分:

CREATE TABLE `my_order` (

  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT \'自增id\',

 `order_id`  int NULL COMMENT \'订单号\' ,

`order_amount`  decimal NULL COMMENT \'订单金额\' ,

`user_id`  int NULL COMMENT \'用户id\' ,

`order_payway`  tinyint(1) NOT NULL COMMENT \'支付方式\' ,

`order_pay_time`  int NULL COMMENT \'支付时间\' ,

`create_time`  datetime NULL COMMENT \'创建时间\' ,

`update_time`  datetime NULL COMMENT \'修改时间\' ,

PRIMARY KEY (`id`,`create_time`)

)ENGINE=InnoDB  PARTITION BY RANGE ( YEAR(  create_time) ) (

    PARTITION order_2015 VALUES LESS THAN (2015),

    PARTITION order_2016 VALUES LESS THAN (2016),

    PARTITION order_2017 VALUES LESS THAN (2017),

    PARTITION other VALUES LESS THAN MAXVALUE

)

 

按天分区

PARTITION BY RANGE(TO_DAYS (createtime))
(
PARTITION p0 VALUES LESS THAN (TO_DAYS(\'2010-04-15\')),
PARTITION p1 VALUES LESS THAN (TO_DAYS(\'2010-05-01\')),
PARTITION p2 VALUES LESS THAN (TO_DAYS(\'2010-05-15\')),
PARTITION p3 VALUES LESS THAN (TO_DAYS(\'2010-05-31\')),
PARTITION p4 VALUES LESS THAN (TO_DAYS(\'2010-06-15\')),
PARTITION p19 VALUES LESS ThAN  MAXVALUE);

 

按照id  [ 超多用户 ]

PARTITION BY RANGE (id) (     

PARTITION p0 VALUES LESS THAN (5000000),    

PARTITION p1 VALUES LESS THAN (10000000),     

PARTITION p2 VALUES LESS THAN (15000000),     

PARTITION p3 VALUES LESS THAN MAXVALUE

);

 

 

------------

INSERT INTO `my_order` ( `order_id`, `order_amount`, `user_id`, `order_payway`, `create_time`, `update_time`) VALUES (\'2\', \'211\', \'100\', \'1\', \'2016-06-28 01:58:47\', \'2016-06-28 01:58:52\');

INSERT INTO `my_order` ( `order_id`, `order_amount`, `user_id`, `order_payway`, `create_time`, `update_time`) VALUES ( \'2\', \'211\', \'100\', \'1\', \'2016-06-28 01:58:47\', \'2016-06-28 01:58:52\');

INSERT INTO `my_order` ( `order_id`, `order_amount`, `user_id`, `order_payway`, `create_time`, `update_time`) VALUES ( \'2\', \'211\', \'100\', \'1\', \'2016-06-28 01:58:47\', \'2016-06-28 01:58:52\');

INSERT INTO `my_order` ( `order_id`, `order_amount`, `user_id`, `order_payway`, `create_time`, `update_time`) VALUES ( \'2\', \'211\', \'100\', \'1\', \'2016-06-28 01:58:47\', \'2016-06-28 01:58:52\');

INSERT INTO `my_order` ( `order_id`, `order_amount`, `user_id`, `order_payway`, `create_time`, `update_time`) VALUES ( \'2\', \'211\', \'100\', \'1\', \'2016-06-28 01:58:47\', \'2016-06-28 01:58:52\');

INSERT INTO `my_order` ( `order_id`, `order_amount`, `user_id`, `order_payway`, `create_time`, `update_time`) VALUES ( \'2\', \'211\', \'100\', \'1\', \'2016-06-28 01:58:47\', \'2016-06-28 01:58:52\');

 

2、LIST分区

说明:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择

CREATE TABLE `list_order` (

`id` INT (11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT \'自增id\',

`order_id` INT (11) DEFAULT NULL COMMENT \'订单号\',

`order_amount` DECIMAL (10, 0) DEFAULT NULL COMMENT \'订单金额\',

`user_id` INT (11) DEFAULT NULL COMMENT \'用户id\',

`order_payway` TINYINT (1) NOT NULL COMMENT \'支付方式 1、货到付款 2、支付宝 3、微信 4、银行卡\',

`order_pay_time` INT (11) DEFAULT NULL COMMENT \'支付时间\',

`create_time` datetime NOT NULL DEFAULT \'0000-00-00 00:00:00\' COMMENT \'创建时间\',

`update_time` datetime DEFAULT NULL COMMENT \'修改时间\',

PRIMARY KEY (`id`, `order_payway`)

) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8

PARTITION BY LIST (order_payway)(

PARTITION offline_buy VALUES IN (1),

PARTITION online_buy VALUES IN (2, 3, 4)

);

 

INSERT INTO `list_order` (  `order_amount`, `user_id`, `order_payway`, `create_time`, `update_time`) VALUES (\'211\', \'100\', \'1\', \'2016-06-28 01:58:47\', \'2016-06-28 01:58:52\');

INSERT INTO `list_order` (  `order_amount`, `user_id`, `order_payway`, `create_time`, `update_time`) VALUES ( \'211\', \'100\', \'1\', \'2016-06-28 01:58:47\', \'2016-06-28 01:58:52\');

INSERT INTO `list_order` (  `order_amount`, `user_id`, `order_payway`, `create_time`, `update_time`) VALUES ( \'211\', \'100\', \'1\', \'2016-06-28 01:58:47\', \'2016-06-28 01:58:52\');

INSERT INTO `list_order` (  `order_amount`, `user_id`, `order_payway`, `create_time`, `update_time`) VALUES ( \'211\', \'100\', \'1\', \'2016-06-28 01:58:47\', \'2016-06-28 01:58:52\');

INSERT INTO `list_order` (  `order_amount`, `user_id`, `order_payway`, `create_time`, `update_time`) VALUES ( \'211\', \'100\', \'1\', \'2016-06-28 01:58:47\', \'2016-06-28 01:58:52\');

INSERT INTO `list_order` (  `order_amount`, `user_id`, `order_payway`, `create_time`, `update_time`) VALUES ( \'211\', \'100\', \'1\', \'2016-06-28 01:58:47\', \'2016-06-28 01:58:52\');

 

这使得在表中增加或删除记录变得容易起来。如果要删除所有线上交易的记录,可以使用查询“ALTER TABLE list_order DROP PARTITION online_buy”来进行删除,它与具有同样作用的DELETE (删除)查询“DELETE query DELETE FROM employees WHERE store_id IN (2,3,4);”比起来,要有效得多。

 

这样的SQL语句是不能执行成功的: [收到分区的影响,找不到要写的位置]

INSERT INTO `list_order` (  `order_amount`, `user_id`, `order_payway`, `create_time`, `update_time`) VALUES ( \'211\', \'100\', \'5\', \'2016-06-28 01:58:47\', \'2016-06-28 01:58:52\');

删除和查询没有影响。

 

 

3HASH分区      

 基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。
      要使用HASH分区来分割一个表,要在CREATE TABLE 语句上添加一个“PARTITION BY HASH (expr)”子句,其中“expr”是一个返回一个整数的表达式。它可以仅仅是字段类型为MySQL 整型的一列的名字。此外,你很可能需要在后面再添加一个“PARTITIONS num”子句,其中num 是一个非负的整数,它表示表将要被分割成分区的数量。

 

CREATE TABLE `hash_order` (

`id` INT (11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT \'自增id\',

`order_id` INT (11) DEFAULT NULL COMMENT \'订单号\',

`order_amount` DECIMAL (10, 0) DEFAULT NULL COMMENT \'订单金额\',

`user_id` INT (11) DEFAULT NULL COMMENT \'用户id\',

`order_payway` TINYINT (1) NOT NULL COMMENT \'支付方式 1、货到付款 2、支付宝 3、微信 4、银行卡\',

`order_pay_time` INT (11) DEFAULT NULL COMMENT \'支付时间\',

`create_time` datetime NOT NULL DEFAULT \'0000-00-00 00:00:00\' COMMENT \'创建时间\',

`update_time` datetime DEFAULT NULL COMMENT \'修改时间\',

PRIMARY KEY (`id`)

) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8

PARTITION BY HASH (id)

PARTITIONS 4;

4、key分区

CREATE TABLE `hash_key_order` (

`id` INT (11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT \'自增id\',

`order_id` INT (11) DEFAULT NULL COMMENT \'订单号\',

`order_amount` DECIMAL (10, 0) DEFAULT NULL COMMENT \'订单金额\',

`user_id` INT (11) DEFAULT NULL COMMENT \'用户id\',

`order_payway` TINYINT (1) NOT NULL COMMENT \'支付方式 1、货到付款 2、支付宝 3、微信 4、银行卡\',

`order_pay_time` INT (11) DEFAULT NULL COMMENT \'支付时间\',

`create_time` datetime NOT NULL DEFAULT \'0000-00-00 00:00:00\' COMMENT \'创建时间\',

`update_time` datetime DEFAULT NULL COMMENT \'修改时间\',

PRIMARY KEY (`id`)

) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8

PARTITION BY LINEAR KEY (id)

PARTITIONS 4;

 

七、手动分表和分区对比

 

手动分表 

分区

多张数据表

一张数据表

重复数据的风险

没有数据重复的风险

写入多张表

写入一张表

没有统一的约束限制

强制的约束限制

 

Mysql 约束 :

 主键约束 --- 约束为1

 非空约束  

 外键约束

1、PHP的运行原理?

PHP总共有三个模块:内核、Zend引擎、以及扩展层;PHP内核用来处理请求、文件流、错误处理等相关操作;Zend引擎(ZE)用以将源文件转换成机器语言,然后在虚拟机上运行它;扩展层是一组函数、类库和流,PHP使用它们来执行一些特定的操作。比如,我们需要mysql扩展来连接MySQL数据库;当ZE执行程序时可能会需要连接若干扩展,这时ZE将控制权交给扩展,等处理完特定任务后再返还;

最后,ZE将程序运行结果返回给PHP内核,它再将结果传送给SAPI层,最终输出到浏览器上。

2、Tcp和upd的应用场景?

115.TCP/UDP的优缺点:

TCP的优点:

可靠,稳定

TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。

TCP的缺点:

慢,效率低,占用系统资源高,易被攻击
TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。
而且,因为TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。

UDP的优点:

快,比TCP稍安全
UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。但UDP也是无法避免攻击的,比如:UDP Flood攻击……

UDP的缺点:

不可靠,不稳定
因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。

TCP/UDP应用场景:

基于上面的优缺点,那么:

什么时候应该使用TCP:

当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。
在日常生活中,常见使用TCP协议的应用如下:

浏览器,用的HTTP

FlashFXP,用的FTP

Outlook,用的POPSMTP

Putty,用的TelnetSSH

QQ文件传输

…………

那么什么时候应该使用UDP:

当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。
比如,日常生活中,常见使用UDP协议的应用如下:

QQ语音

QQ视频

TFTP

 

3、Mysql 的运行原理?

1.客户端请求,服务端(连接器)开辟线程相应用户
2.用户发起SQL语句查询数据库
3.查询缓存:记录用户的SQL查询语句。如果挨次查询同样内容。就返回缓存
4.如果缓存没有进入分析器。(分析器也可能借鉴缓存)
不得不说说:
语法分析器。用户命令语法是否正确。将用户的命令进行切片。一个词一个词。用空格隔开。获得用户要查询的表。内容,权限等。
5.优化:执行路径的选择,生成执行树,
每一个SQL语句都有很多执行路径。优化的目的就是在这些执行路径里面,选择一个最优的执行路径。
6.存储引擎:用于管理存储在文件系统。甚至是裸设备上的数据管理程序,它本身给上层应用提供不同的管理,有的支持事务,有的不支持事务。

4、文件锁  排它锁

文件锁定是一种机制,强制访问计算机文件只能由一个用户或在任何特定时间的过程。

1。一个进程读取从一个文件包含帐户信息,包括客户的帐户余额和电话号码的客户记录。

2。进程B读取相同的文件相同的记录,所以它有它自己的拷贝。

3。进程A在其客户记录副本的帐户余额的变化,并记录写回文件。

4。进程B - 仍然有原始陈旧的价值在其客户记录副本的帐户余额 - 更新客户的电话号码,并写入客户记录文件。

5。进程B现在已经写入了其过时的帐户平衡值的文件,造成到丢失的过程中所作的更改。

排它锁又称为写锁((eXclusive lock,简记为X锁)),若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。它防止任何其它事务获取资源上的锁,直到在事务的末尾将资源上的原始锁释放为止。

在更新操作(INSERT、UPDATE 或 DELETE)过程中始终应用排它锁。

相对于共享锁的区别:

 

共享锁又称为读锁(Share lock,简记为S锁),若事务T对数据对象A加上S锁,则其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。

 

5、什么是hash?

Hash,一般翻译做“散列”,也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。

简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

HASH主要用于信息安全领域中加密算法,他把一些不同长度的信息转化成杂乱的128位的编码里,叫做HASH值. 也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系

了解了hash基本定义,就不能不提到一些著名的hash算法,MD5 和 SHA1 可以说是目前应用最广泛的Hash算法,而它们都是以 MD4 为基础设计的。那么他们都是什么意思呢?
这里简单说一下:

1) MD4
MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年设计的,MD 是 Message Digest 的缩写。它适用在32位字长的处理器上用高速软件实现--它是基于 32 位操作数的位操作来实现的。

2) MD5
MD5(RFC 1321)是 Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与 MD4 相同。MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好

3) SHA1 及其他
SHA1是由NIST NSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1 设计时基于和MD4相同原理,并且模仿了该算法。

那么这些Hash算法到底有什么用呢?
Hash算法在信息安全方面的应用主要体现在以下的3个方面:

1) 文件校验
我们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。
MD5 Hash算法的"数字指纹"特性,使它成为目前应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。
2) 数字签名
Hash 算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。 对 Hash 值,又称"数字摘要"进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。而且这样的协议还有其他的优点。
3) 鉴权协议
如下的鉴权协议又被称作"挑战--认证模式:在传输信道是可被侦听,但不可被篡改的情况下,这是一种简单而安全的方法。

以上就是一些关于hash以及其相关的一些基本预备知识。那么在emule里面他具体起到什么作用呢?

什么是文件的hash值呢?

大家都知道emule是基于P2P (Peer-to-peer的缩写,指的是点对点的意思的软件), 它采用了“多源文件传输协议”(MFTP,the Multisource FileTransfer Protocol)。在协议中,定义了一系列传输、压缩和打包还有积分的标准,emule 对于每个文件都有md5-hash的算法设置,这使得该文件独一无二,并且在整个网络上都可以追踪得到。

MD5-Hash-文件的数字文摘通过Hash函数计算得到。不管文件长度如何,它的Hash函数计算结果是一个固定长度的数字。与加密算法不同,这一个Hash算法是一个不可逆的单向函数。采用安全性高的Hash算法,如MD5、SHA时,两个不同的文件几乎不可能得到相同的Hash结果。因此,一旦文件被修改,就可检测出来。

当我们的文件放到emule里面进行共享发布的时候,emule会根据hash算法自动生成这个文件的hash值,他就是这个文件唯一的身份标志,它包含了这个文件的基本信息,然后把它提交到所连接的服务器。当有他人想对这个文件提出下载请求的时候, 这个hash值可以让他人知道他正在下载的文件是不是就是他所想要的。尤其是在文件的其他属性被更改之后(如名称等)这个值就更显得重要。而且服务器还提供了,这个文件当前所在的用户的地址,端口等信息,这样emule就知道到哪里去下载了.

一般来讲我们要搜索一个文件,emule在得到了这个信息后,会向被添加的服务器发出请求,要求得到有相同hash值的文件。而服务器则返回持有这个文件的用户信息。这样我们的客户端就可以直接的和拥有那个文件的用户沟通,看看是不是可以从他那里下载所需的文件。

对于emule中文件的hash值是固定的,也是唯一的,它就相当于这个文件的信息摘要,无论这个文件在谁的机器上,他的hash值都是不变的,无论过了多长时间,这个值始终如一,当我们在进行文件的下载上传过程中,emule都是通过这个值来确定文件。

那么什么是userhash呢?

道理同上,当我们在第一次使用emule的时候,emule会自动生成一个值,这个值也是唯一的,它是我们在emule世界里面的标志,只要你不卸载,不删除config,你的userhash值也就永远不变,积分制度就是通过这个值在起作用,emule里面的积分保存,身份识别,都是使用这个值,而和你的id和你的用户名无关,你随便怎么改这些东西,你的userhash值都是不变的,这也充分保证了公平性。其实他也是一个信息摘要,只不过保存的不是文件信息,而是我们每个人的信息。

那么什么是hash文件呢?

我们经常在emule日至里面看到,emule正在hash文件,这里就是利用了hash算法的文件校验性这个功能了,文章前面已经说了一些这些功能,其实这部分是一个非常复杂的过程,目前在ftp,bt等软件里面都是用的这个基本原理,emule里面是采用文件分块传输,这样传输的每一块都要进行对比校验,如果错误则要进行重新下载,这期间这些相关信息写入met文件,直到整个任务完成,这个时候part文件进行重新命名,然后使用move命令,把它传送到incoming文件里面,然后met文件自动删除,所以我们有的时候会遇到hash文件失败,就是指的是met里面的信息出了错误不能够和part文件匹配,另外有的时候开机也要疯狂hash,有两种情况一种是你在第一次使用,这个时候要hash提取所有文件信息,还有一种情况就是上一次你非法关机,那么这个时候就是要进行排错校验了

119. 一个文件的文件权限是 rwx  rwx  rwx  每个位置所对应的是谁的权限?

 文件夹的所有者   所属组, 和其他用户

120.进制文件格式

MySQL中,二进制日志文件是非常重要的一种日志文件,MySQL数据库的高可用架构都是以二进制日志文件为基础的,在备份数据库时,除了要备份数据文件之外,二进制日志文件也一定要备份,如果忽略了这一点,可能会给以后的工作中造成很大的麻烦,MySQL数据库的二进制日志文件中存储的是所有执行成功的,注意是执行成功的对MySQL数据库的修改事件,包括增删改查时间和对表结构的修改事件。那么二进制日志文件以什么样的格式来存储这些内容呢?有三种格式:1.STATEMENT、2.ROW、3.MIXED,在MySQL中配置二进制日志文件的格式可以通过参数binlog_format来设置。

 

    STATEMENT

 

    以段的格式存储二进制日志,使用这种格式,数据库会将每个事件的SQL语句进行存储,这种格式的优点是日志规模比较小,可以减少磁盘和网络IO;缺点是,由于记录的是SQL语句,在主从复制架构模式下,为了保证从服务器上执行SQL语句的结果与主服务器一致,那么就必须记录上下文信息,但即使是这样,当在修改数据时使用了uuid(),user()这样的非确定性函数,还是可能会造成主从服务器数据的不一致性。

 

    ROW

 

    以行记录的形式保存二进制日志,在MySQL5.7之前的版本,默认的二进制日志格式是STATEMENT,到5.7之后默认的格式就是ROW了。以这种格式记录二进制日志会记录每一行数据的修改,显然这种格式的二进制日志文件通常会比STATEMENT格式的二进制日志文件大,比如一条SQL语句修改了100行记录,那么在STATEMENT格式的二进制日志文件中只会保留一条SQL语句,而在ROW格式的文件中会保留100个行记录。在主从复制架构下,ROW格式的二进制日志文件势必会造成更大的磁盘和网络IO操作。这种格式的优点是使主从复制数据一致性能得到更大的保障,而且对每一行数据的修改比基于STATEMENT的修改的复制效率要高,可以降低主从复制延迟。

 

    MySQL数据库的开发者考虑到ROW格式的二进制日志文件过大的问题,设置了binlog_log_image参数,这个参数有三个值分别是:FULL、MINIMAL、NOBLOB。FULL表示记录数据行的所有信息,无论字段是否被更新;MINIMAL表示只记录数据行上给更新了的字段;NOBLOB表示记录TEXT和BLOB类型以外的字段。

 

    MIXED

 

    这种日志格式不是一种独立的日志格式,混合模式是STATEMENT和ROW格式的混合使用,判断使用哪种格式由数据库决定。

 

    以上就是MySQL数据库二进制日志文件的几种格式,个人在实际使用过程中,基本都是使用ROW格式配以MINIMAL以保证数据的安全和尽量降低日志的大小。可以根据各自系统处理的业务的实际情况和网络等因素,选择适合自己的日志文件格式。

121.怎么使用sphinx  sphinx 的原理

Sphinx工作流程图:

 

Sphinx工作流程图

                    创建/更新索引

Indexer                    ->                   Searchd

   |数据源,从数据库到索引            搜索查询    | |  搜索结果

                         

Database                 Sql查询                  App

                           <-          

                            ->

                          sql返回行   

流程图解释:

 

 

    Database:数据源,是Sphinx做索引的数据来源。因为Sphinx是无关存储引擎、数据库的,所以数据源可以是MySQL、PostgreSQL、XML等数据。

    Indexer:索引程序,从数据源中获取数据,并将数据生成全文索引。可以根据需求,定期运行Indexer达到定时更新索引的需求。

    Searchd:Searchd直接与客户端程序进行对话,并使用Indexer程序构建好的索引来快速地处理搜索查询。

    APP:客户端程序。接收来自用户输入的搜索字符串,发送查询给Searchd程序并显示返回结果。

 

Sphinx的工作原理

 

Sphinx的整个工作流程就是Indexer程序到数据库里面提取数据,对数据进行分词,然后根据生成的分词生成单个或多个索引,并将它们传递给searchd程序。然后客户端可以通过API调用进行搜索。

 

介绍了Sphinx的工作原理后,那么接下来就要让Sphinx工作起来,先来看看Sphinx的配置。

http://blog.jobbole.com/101672/

  1. 事务的隔离级别?

1,脏读

  脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。

  当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致。例如:用户A向用户B转账100元,对应SQL命令如下

    update account set money=money+100 where name=’B’;  (此时A通知B)

 

    update account set money=money - 100 where name=’A’;

  当只执行第一条SQL时,A通知B查看账户,B发现确实钱已到账(此时即发生了脏读),而之后无论第二条SQL是否执行,只要该事务不提交,则所有操作都将回滚,那么当B以后再次查看账户时就会发现钱其实并没有转。

2,不可重复读

  不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。

  例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。

  不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。

  在某些情况下,不可重复读并不是问题,比如我们多次查询某个数据当然以最后查询得到的结果为主。但在另一些情况下就有可能发生问题,例如对于同一个数据A和B依次查询就可能不同,A和B就可能打起来了……

3,虚读(幻读)

  幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。

  幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

 

  现在来看看MySQL数据库为我们提供的四种隔离级别:

  ① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

  ② Repeatable read (可重复读):可避免脏读、不可重复读的发生。

  ③ Read committed (读已提交):可避免脏读的发生。

  ④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。

 

  以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低。像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。

  在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。

  在MySQL数据库中查看当前事务的隔离级别:

    select @@tx_isolation;

  MySQL数据库中设置事务的隔离 级别:

    set  [glogal | session]  transaction isolation level 隔离级别名称;

 

    set tx_isolation=’隔离级别名称;’

1:查看当前事务的隔离级别:

  

2:将事务的隔离级别设置为Read uncommitted级别:

  

或:

  

记住:设置数据库的隔离级别一定要是在开启事务之前!

  如果是使用JDBC对数据库的事务设置隔离级别的话,也应该是在调用Connection对象的setAutoCommit(false)方法之前。调用Connection对象的setTransactionIsolation(level)即可设置当前链接的隔离级别,至于参数level,可以使用Connection对象的字段:

  

JDBC中设置隔离级别的部分代码:

  

  后记:隔离级别的设置只对当前链接有效。对于使用MySQL命令窗口而言,一个窗口就相当于一个链接,当前窗口设置的隔离级别只对当前窗口中的事务有效;对于JDBC操作数据库来说,一个Connection对象相当于一个链接,而对于Connection对象设置的隔离级别只对该Connection对象有效,与其他链接Connection对象无关。

 

125:项目在进行读写分离时,程序如何区分是读还是写?

   :    1.可以根据服务器的IP进行读写判断,看数据需要进行哪种数据处理,然后选择对应的服务器即可。

         2.还可以就是在DB模型底层控制;如果是select就去读,如果是insert就去写。然后执行数据库操作,就用模型去进行操作。

         3.可以利用数据库中间件,让中间件帮你路由。

 

126:两条数据同时向一张表中插入数据,如何防止ID冲突?

   答:   1.使用 ignore 关键字

insert ignore into table_name(email,phone,user_id) values(\'test9@163.com\',\'99999\',\'9999\') 

 

2. 使用 replace into

replace into table_name(col_name, ...) values(...) 

 

3.ON DUPLICATE KEY UPDATE 

            mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)     

-> ON DUPLICATE KEY UPDATE c=3; 

 

 

127:现在要做一个红包功能,怎么保证数字时随机的且加起来的数字符合设定的数值?

  答:$total=20;//红包总金额   

$num=10;// 分成10个红包,支持10人随机领取   

$min=0.01;//每个人最少能收到0.01元   

 

for ($i=1;$i<$num;$i++)   

{   

    $safe_total=($total-($num-$i)*$min)/($num-$i);//随机安全上限   

    $money=mt_rand($min*100,$safe_total*100)/100;   

    $total=$total-$money;  

     

    echo \'第\'.$i.\'个红包:\'.$money.\' 元,余额:\'.$total.\' 元 \';   

}   

echo \'第\'.$num.\'个红包:\'.$total.\' 元,余额:0 元\';  

运行以上代码,会输出以下结果:

1个红包,金额2.08元,余额17.92元

2个红包,金额1.81元,余额16.11元

3个红包,金额0.15元,余额15.96元

4个红包,金额1.61元,余额14.35元

5个红包,金额1.11元,余额13.24元

6个红包,金额1.51元,余额11.73元

7个红包,金额1.21元,余额10.52元

8个红包,金额2.58元,余额7.94元

9个红包,金额5.4元,余额2.54元

10个红包,金额2.54元,余额0元

 

128:一级域名如何与子域名共享session:

答:1.利用COOKIE存放session_id();

     2.通过修改php.ini配置同步;

 

129:哈希加盐碰撞?

  答:比如可以在密码中混入一段“随机”的字符串再进行哈希加密,这个被字符串被称作盐值,盐值并不需要保密,由于随机化了哈希值,查表法、反向查表法和彩虹表都不再有效。攻击者无法确知盐值,于是就不能预先计算出一个查询表或者彩虹表。这样每个用户的密码都混入不同的盐值后再进行哈希,因此反向查表法也变得难以实施。

 

130:MYSQL获取今天的日期,只要日期?

 答:1:select DATE_SUB(curdate(),INTERVAL 0 DAY) ;

     2:select date_format(now(),\'%y-%m-%d\');

分类:

技术点:

相关文章: