夜雪天狼
学习笔记
技术博文
转载备份
心灵鸡汤
程序员笔面试集锦
发布者:caijw
阅读量:41255
发布时间:2014-12-07 11:38:59
# PHP #### 表单提交中的Get和Post的异同点 * get通过url拼接传递参数,参数可见;post通过请求body体传递,参数不可见 * get请求是可以缓存;post请求不可以缓存 * get请求页面后退不产生影响;post请求页面后退会重新提交 * get一般传输数据大小取决于浏览器限制的url长度,一般不超过2K~4K;post请求传输数据的大小根据php.ini 配置文件设定 * get请求将header和data一起发送,服务器响应200则返回数据;post请求浏览器先发送header,服务器响应100,浏览器再发送data,服务器响应200则返回数据 #### echo(),print(),print_r()的区别? echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用) print() 只能打印出简单类型变量的值(如int,string) print_r() 可以打印出复杂类型变量的值(如数组,对象) echo 输出一个或者多个字符串 #### 写一个email的正则表达式 `/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/` #### 数组[‘a’, ‘b’, ‘c’] 转换成字符串 ‘abc’ ```php echo implode('', ['a', 'b', 'c']); echo join(['a', 'b', 'c'], ''); ``` #### 获取字符串’aAbB’中A首次出现的位置 ```php $str='aAbB'; echo strpos($str,'A'); ``` #### 编写一段用最小代价实现将字符串完全反序, e.g. 将 “1234567890” 转换成 “0987654321”. (用前述你最熟悉的语言编写并标注简单注释, 不要使用函数 ```php $s = '1234567890'; $o = ''; $i = 0; while(isset($s[$i]) && $s[$i] != null) { $o = $s[$i++].$o; } echo $o; ``` #### 数组内置的排序方法有哪些? ```php sort($array); //数组升序排序 rsort($array); //数组降序排序 asort($array); //根据值,以升序对关联数组进行排序 ksort($array); //根据建,以升序对关联数组进行排序 arsort($array); //根据值,以降序对关联数组进行排序 krsort($array); // 根据键,以降序对关联数组进行排序 ``` #### 用PHP写出显示客户端IP与服务器IP的代码 ```php $_SERVER["REMOTE_ADDR"] $_SERVER["SERVER_ADDR"] ``` #### 语句include和require的区别是什么?为避免多次包含同一文件,可用什么语句代替它们? 区别: 1. require在运行前载入,当文件不存在时,产生错误中断程序 2. include在运行时载入,当文件不存在时,include产生一个warning 可以使用require_once,include_once代替 #### session与cookie的区别? session:储存用户访问的全局唯一变量,存储在服务器上的php指定的目录中的(session_dir)的位置进行的存放 cookie:用来存储连续訪問一个頁面时所使用,是存储在客户端,对于Cookie来说是存储在用户WIN的Temp目录中的。 两者都可通过时间来设置时间长短 # 数据库 #### sql语句应该考虑哪些安全性 1. 防止sql注入,对特殊字符进行转义,过滤或者使用预编译sql语句绑定 2. 使用最小权限原则,特别是不要使用root账户,微不同的动作或者操作建立不同的账户 3. 当sql出错时,不要把数据库出错的信息暴露到客户端 #### 优化mysql 数据库方法 1. 选取适当的字段,打字段设置为NOT NULL,在查询的时候数据库不用比较NULL; 2. 使用链接(join)代替子查询; 3. 使用联合(UNION)查询代替手动创建临时表; 4. 尽量减少使用(LIKE)关键字和通配符 5. 使用事务和外健 #### 谈谈你对 mysql 引擎中的 MyISAM与InnoDB的区别理解 1、 存储结构 MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。 InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。 2、 存储空间 MyISAM:可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。 InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。 3、 可移植性、备份及恢复 MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。 InnoDB:免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了。 4、 事务支持 MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。 InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。 5、 AUTO_INCREMENT MyISAM:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增。 InnoDB:InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。 6、 表锁差异 MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。 InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。 7、 全文索引 MyISAM:支持 FULLTEXT类型的全文索引 InnoDB:不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。 8、 表主键 MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。 InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。 9、 表的具体行数 MyISAM:保存有表的总行数,如果select count(*) from table;会直接取出出该值。 InnoDB:没有保存表的总行数,如果使用select count(*) from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样。 10、 CURD操作 MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。 InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令。 11、 外键 MyISAM:不支持 InnoDB:支持 # 性能优化 #### 对于大流量的网站,你会采用什么方法来解决访问量 1. 首先确认服务器硬件是否满足支持当前的流量; 2. 优化数据库的访问; 3. 禁止外部盗链; 4. 控制大文件下载; 5. 使用不同的主机分流; 6. 使用流量分析统计; # 缓存 #### redis 和 memache 缓存的区别 1. 数据类型 Redis数据类型丰富,支持list,set,hash等类型 memcache支持简单数据类型,需要客户端自己处理复杂对象 2. 持久性 redis支持数据落地持久化存储 memcache不支持数据持久存储 3. 分布式存储 redis支持master-slave复制模式 memcache可以使用一致性hash做分布式 4. value大小不同 memcache是一个内存缓存,key的长度小于250字符,单个item存储要小于1M,不适合虚拟机使用 5. 数据一致性不同 redis使用的是单线程模型,保证了数据按顺序提交。 memcache需要使用cas保证数据一致性。CAS(Check and Set)是一个确保并发一致性的机制,属于“乐观锁”范畴;原理很简单:拿版本号,操作,对比版本号,如果一致就操作,不一致就放弃任何操作 6. cpu利用 redis单线程模型只能使用一个cpu,可以开启多个redis进程 7. 使用底层模型不同: 新版本的redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求 8. Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcached相比一个最大的区别。 9. Redis支持数据的备份,即master-slave模式的数据备份。 10. Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。 11. memcache只能当做缓存,cache,redis的内容是可以落地的,就是说跟MongoDB有些类似,然后redis也可以作为缓存,并且可以设置master-slave -separator-