静态页面安全、运行速度快,缺点:工作量大
动态页面使用动态语言配合数据库,显示内容。灵活性高,维护量小,与静态页面相对比运行速度慢。页面静态化是将动态页面显示的内容转换为静态页面来显示。
安全性高,性能更高,加载速度快。符合浏览器搜索优化。
最常用的方式:OB缓存
静态化适用于更新不频繁的项目。如新闻,门户网站
Ob_start();开启OB缓存
Ob_get_contents();获取OB缓存中的内容
Ob_clean():清空OB缓存中的内容
Ob_end_clean():清空并且关闭OB缓存
Ob_flush();手动的刷新OB缓存到程序缓存中
Ob_end_flush();将OB缓存中的内容刷新到程序缓存并且关闭OB缓存
2.伪静态:
从url地址上查看类似真静态,但处理请求还是动态语言完成。方便记忆,并且符合搜索引擎优化。实现:借助web服务器的重写机制实现,借助框架中的路由功能。
3.Mysql:
mysql脏读,不可重复读,幻读;脏读就是一个事物读取到另一个事物的中间状态的数据;不可重复读就是一个事物读取到另一个事物提交后更新的数据,导致该事物前后两次读取的数据不一致;一个事物在读取某个范围内的数据时由于另一个事物在该范围内添加或删除了某些数据,导致该事物前后两次读取的数据量不一致。
4.redis :
字符串缓存(set,hset)
队列实战(rpush 插入数据,lrang查看队列,lpop出队列,lrang查看队列)
发布订阅实战(publish 发布 订阅)
计数器实战 排行榜
简单字符串悲观锁实战
每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁。
场景:如果项目中使用了缓存且对缓存设置了超时时间。
当并发量比较大的时候,如果没有锁机制,那么缓存过期的瞬间,
大量并发请求会穿透缓存直接查询数据库,造成雪崩效应。
5.锁机制:
简单事务的乐观锁实战
解释:乐观锁 (Optimistic Lock), 顾名思义,就是很乐观。
每次去拿数据的时候都认为别人不会修改,所以不会上锁。
watch 命令会监视给定的 key,当 exec 时候如果监视的 key 从调用 watch 后发生过变化,则整个事务会失败。
也可以调用 watch 多次监视多个 key。这样就可以对指定的 key 加乐观锁了。
注意 watch 的 key 是对整个连接有效的,事务也一样。
如果连接断开,监视和事务都会被自动清除。
当然了 exec,discard,unwatch 命令都会清除连接中的所有监视。
6.CGI&FastCGI:
CGI 是 Web Server 与后台语言交互的协议,有了这个协议,开发者可以使用任何语言处理 Web Server 发来的请求,动态的生成内容。但 CGI 有一个致命的缺点,那就是每处理一个请求都需要 fork 一个全新的进程,随着 Web 的兴起,高并发越来越成为常态,这样低效的方式明显不能满足需求。就这样,FastCGI 诞生了,CGI 很快就退出了历史的舞台。FastCGI,顾名思义为更快的 CGI,它允许在一个进程内处理多个请求,而不是一个请求处理完毕就直接结束进程,性能上有了很大的提高。
7.HTTP状态码:
常见的 HTTP 相应状态码
200:请求被正常处理
204:请求被受理但没有资源可以返回
206:客户端只是请求资源的一部分,服务器只对请求的部分资源执行 GET 方法,相应报文中通过 Content-Range 指定范围的资源。
301:永久性重定向
302:临时重定向
303:与 302 状态码有相似功能,只是它希望客户端在请求一个 URI 的时候,能通过 GET 方法重定向到另一个 URI 上
304:发送附带条件的请求时,条件不满足时返回,与重定向无关
307:临时重定向,与 302 类似,只是强制要求使用 POST 方法
400:请求报文语法有误,服务器无法识别
401:请求需要认证
403:请求的对应资源禁止被访问
404:服务器无法找到对应资源
500:服务器内部错误
503:服务器正忙
8.Session & Cookie:
说说你对 session 和 cookies 的理解,尽可能把你所知道的全部说出来。
答:cookie 是用来保存当前会话的一些信息的, 因为 http 请求是无状态的, 所以有时候需要根据 cookie 来保存一些我们希望能保存到客户端的信息. session 则是将信息保存到服务器上, 返回给客户端的只是 cookieid(浏览器会把 sessionname->sessionid 存到 cooike 中).
9.说说你对 get 和 post 的理解,尽可能把你所知道的全部说出来。
答:get 是用于从服务器获取数据的, 其不能对服务器数据造成影响, 而 post 是用来添加数据的.
10.说说你对 PHP 命名空间的理解?
答:相当于 PHP 的文件夹.
11.从用户在浏览器输入一个网址:比如 http://laravist.com,按下 enter,到用户最终看到相对应的网页(laravist 首页),尽可能描述此过程发生了什么事情。
答:请求通过 dns 转化为 ip, 然后根据 ip 找到站点, 根据服务器的分发找到 index.php 文件, 再编译并执行代码, 返回响应, 浏览器渲染页面.
12.依赖注入你怎么理解?它有什么优缺点?
答: 将依赖关系倒置, 使得代码更容易解耦. 缺点: 调用更麻烦.
13.你赞同面向接口编程么?同意的话,说出理由,不同意的话,也说出原因。
答:支持, 理由同上, 但是不能滥用.
14.nginx 使用哪种网络协议?
答:nginx 是应用层,我觉得从下往上的话,传输层用的是 tcp/ip,应用层用的是 http,fastcgi 负责调度进程!
15.echo(),print(),print_r() 的区别?
答:echo 是语言结构,无返回值; print 功能和 echo 基本相同,不同的是 print 是函数,有返回值; print_r 是递归打印,用于输出数组对象。
16.PHP 有哪些特性?
答:①.php 独特混合了 C,Java,Prel 以及 PHP 自创的语法.
②. 可以比 CGI 或者 Prel 更快速去执行动态网页,与其他变成语言相比,PHP 是讲程序嵌入到 HTML 文档中去执行,执行效率比完全生成 HTML 编辑的 CGI 要高很多,所有的 CGI 都能实现.
③. 支持几乎所有流行的数据库以及操作系统.
④.PHP 可以使用 C,C++ 进行程序的扩展.
17. 求数组中最大数的下标?
答:
function maxkey($arr){
$maxval = max($arr);
foreach($arr as $key=>$val){
if($maxval == $val){
$maxkey = $key;
}
}
return $maxkey;
}
$arr = array(0,-1,-2,5,"b"=>15,3);
echo maxkey($arr);
输出:b
18. 对于大流量的网站, 您采用什么样的方法来解决访问量问题?
答:
①. 有效使用缓存,增加缓存命中率.
②. 使用负载均衡.
③. 对静态文件使用 CDN 进行存储和加速.
④. 想法减少数据库的使用.
⑤. 查看出现统计的瓶颈在哪里.
19. 谈谈 asp,php,jsp 的优缺点?
答:
①.asp 是需要依赖 IIS, 是微软开发的语言
②.php 和 jsp 可以依赖 apache 或者 nginx 等其他服务器
20. 简述两种屏蔽 php 程序的 notice 警告的方法 ?
答:初始化变量,文件开始设置错误级别或者修改 php.ini 设置 error_reporting set_error_handler 和 @抑制错误:
①在程序中添加:error_reporting (E_ALL & ~E_NOTICE);
②. 或者修改 php.ini 中的:error_reporting = E_ALL
改为:error_reporting = E_ALL & ~E_NOTICE
③.error_reporting(0); 或者修改 php.inidisplay_errors=Off
21. 下面哪个选项没有将 john 添加到 users 数组中? (B)
(A) $users[] = ‘john’;
(B) array_add($users,’john’); [没有这个函数]
(C) array_push($users,‘john’);
(D) $users ||= ‘john’;
22. 写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名?
答:例如: http://www.sina.com.cn/abc/de/fg.php?id=1 需要取出 php 或 .php?
<?php
$url = "http://www.sina.com.cn/abc/de/fg.php?id=1";
arr=parseurl(url);
pathArr=pathinfo(arr['path']);
print_r($pathArr['extension']);
23. 写一个函数,能够遍历一个文件夹下的所有文件和子文件夹?
答:如下.
<?php
function aGetAllFile($folder)
{
$aFileArr = array();
if(is_dir($folder))
{
handle=opendir(folder);
while((file=readdir(handle)) !== false)
{
// 如果是. 或者.. 则跳过
if(file=="."||file == "..")
{
continue;
}
if(is_file(folder."/".file))
{
aFileArr[]=file;
}
else if(is_dir(folder."/".file))
{
aFileArr[file] = aGetAllFile(folder."/".file);
}
}
closedir($handle);
}
return $aFileArr;
}
$path = "/home/test/sql";
print_r(aGetAllFile($path);
24. 表单提交中的 Get 和 Post 的异同点
get 请求一般用于向服务端获取数据,post 一般向服务端提交数据
get 传输的参数在 url 中,传递参数大小有限制,post 没有大小限制,
get 不安全,post 安全性比 get 高
get 请求在服务端用 Request.queryString 接受 ,post 请求在服务端用 Requset.form 接受
25.HTML 的 base 标签是干什么用的
必须写在 head 中, base 标签为页面上的所有链接规定默认地址或默认目标
26.echo(),print(),print_r() 的区别?
echo 是 PHP 语句, print 和 print_r 是函数, 语句没有返回值, 函数可以有返回值 (即便没有用)
print() 只能打印出简单类型变量的值 (如 int,string)
print_r() 可以打印出复杂类型变量的值 (如数组, 对象)
echo 输出一个或者多个字符串
27. 写一个 email & 手机号 的正则表达式
/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
/^[1][3,4,5,7,8][0-9]{9}$/
28. 数组 [‘a’, ‘b’, ‘c’] 转换成字符串 ‘abc’
echo implode(‘’,[‘a’, ‘b’, ‘c’]);
echo join([‘a’, ‘b’, ‘c’],'');
29. 获取字符串’aAbB’中 A 首次出现的位置
$str=‘aAbB’;
echo strpos($str,"A");
30. 编写一段用最小代价实现将字符串完全反序, e.g. 将 “1234567890” 转换成 “0987654321”. (用前述你最熟悉的语言编写并标注简单注释, 不要使用函数,
$s = '1234567890';
$o = '';
$i = 0;
while(isset($s[$i]) && $s[$i] != null) {
$o = $s[$i++].$o;
}
echo $o;
31. 请用递归实现一个阶乘求值算法 F(n): n=5;F(n)=5!=54321=120
function F($n){
if($n==0){
return 1;
}else{
return $n* F($n-1);
}
}
var_dump(F(5));
32. 将字符长 fang-zhi-gang 转化为驼峰法的形式:FangZhiGang
//方法一
function Fun($str){
if(isset($str) && !empty($str)){
$newStr='';
if(strpos($str,'-')>0){
$strArray=explode('-',$str);
$len=count($strArray);
for ($i=0;$i<$len;$i++){
$newStr.=ucfirst($strArray[$i]);
}
}
return $newStr;
}
}
//方法二 [简单]
<?php
function test($arr)
{
$a = str_replace('-',' ',$arr); //将- 替换成空格
// var_dump($a);
$b = ucwords($a); //单词首字母大写
// var_dump($b);
$c= str_replace(' ','',$b); //将空格替换掉
// var_dump($c);
return $c;
}
var_dump(test('fang-zhi-gang')); //FangZhiGang
?>
33. 数组内置的排序方法有哪些?
sort($array); //数组升序排序
rsort($array); //数组降序排序
asort($array); //根据值,以升序对关联数组进行排序
ksort($array); //根据键,以升序对关联数组进行排序
arsort($array); //根据值,以降序对关联数组进行排序
krsort($array); // 根据键,以降序对关联数组进行排序
34. 用 PHP 写出显示客户端 IP 与服务器 IP 的代码
$_SERVER["REMOTE_ADDR"]
$_SERVER["SERVER_ADDR"]
35. 语句 include 和 require 的区别是什么? 为避免多次包含同一文件,可用 (?) 语句代替它们?
require是无条件包含也就是如果一个流程里加入require,无论条件成立与否都会先执行require
include有返回值,而require没有(可能因为如此require的速度比include快)
包含文件不存在或者语法错误的时候require是致命的错误终止执行,include不是
36.session 与 cookie 的区别?
session:储存用户访问的全局唯一变量,存储在服务器上的php指定的目录中的(session_dir)的位置进行的存放
cookie:用来存储连续訪問一个頁面时所使用,是存储在客户端,对于Cookie来说是存储在用户WIN的Temp目录中的。
两者都可通过时间来设置时间长短
37.PHP 不使用第三个变量实现交换两个变量的值
//方法一
$a.=$b;
$b=str_replace($b,"",$a);
$a=str_replace($b,"",$a);
//方法二
list($b,$a)=array($a,$b);
var_dump($a,$b);
38. 写一个方法获取文件的扩展名
function get_extension($file){
//方法一
return substr(strrchr($file,'.'), 1);
//方法二
return end(explode('.', $file));
}
echo get_extension('fangzhigang.png'); //png
39. 用 PHP 打印出前一天的时间格式是 2017-3-22 22:21:21
echo date(“Y-m-d H:i:s”, strtotime(“-1 days”));
40.sql 语句应该考虑哪些安全性
(1)防止sql注入,对特殊字符进行转义,过滤或者使用预编译sql语句绑定
(2)使用最小权限原则,特别是不要使用root账户,微不同的动作或者操作建立不同的账户
(3)当sql出错时,不要把数据库出错的信息暴露到客户端
41. 优化 mysql 数据库方法
(1)选取适当的字段,把字段设置为NOT NULL,在查询的时候数据库不用比较NULL;
(2)使用链接(join)代替子查询;
(3)使用联合(UNION)查询代替手动创建临时表;
(4)尽量减少使用(LIKE)关键字和通配符
(5)使用事务和外健(数据表中非主键与另一张表中主键相关联)
42. 对于大流量的网站,你会采用什么方法来解决访问量?
(1)首先确认服务器硬件是否满足支持当前的流量;
(2)优化数据库的访问;
(3)禁止外部盗链;
(4)控制大文件下载;
(5)使用不同的主机分流;
(6)使用流量分析统计;
43.mysql_fetch_row() 和 mysql_fetch_array 之间有什么区别?
这两个函数,返回的都是一个数组,区别就是第一个函数返回的数组是只包含值,我们只能row[1],这样以数组下标来读取数据,
而MySQL_fetch_array()返回的数组既包含第一种,也包含键值对的形式,我们可以这样读取数据,(假如数据库的字段是 username,passwd):row[‘passwd’]
44.MySQL的几个概念:主键,外键,索引,唯一索引
主键(primary key) 能够唯一标识表中某一行的属性或属性组。一个表只能有一个主键,但可以有多个候选索引。主键常常与外键构成参照完整性约束,防止出现数据不一致。主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引。
外键(foreign key) 是用于建立和加强两个表数据之间的链接的一列或多列。外键约束主要用来维护两个表之间数据的一致性。简言之,表的外键就是另一表的主键,外键将两表联系起来。一般情况下,要删除一张表中的主键必须首先要确保其它表中的没有相同外键(即该表中的主键没有一个外键和它相关联)。
索引(index) 是用来快速地寻找那些具有特定值的记录。主要是为了检索的方便,是为了加快访问速度, 按一定的规则创建的,一般起到排序作用。所谓唯一性索引,这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一。
总结:
主键一定是唯一性索引,唯一性索引并不一定就是主键。
一个表中可以有多个唯一性索引,但只能有一个主键。
主键列不允许空值,而唯一性索引列允许空值。
主键可以被其他字段作外键引用,而索引不能作为外键引用。
45.mysql 数据库引擎有哪些?
MyISAM、 ISAM、HEAP、InnoDB、BDB、CVS…
46. 谈谈你对 mysql 引擎中的 MyISAM 与 InnoDB 的区别理解?
InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
以下是一些细节和具体实现的差别:
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:支持
通过上述的分析,基本上可以考虑使用InnoDB来替代MyISAM引擎了,原因是InnoDB自身很多良好的特点,比如事务支持、存储过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多。另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌。
47. redis 和 memache 缓存的区别
总结一:
1.数据类型
Redis数据类型丰富,支持set list等类型
memcache支持简单数据类型,需要客户端自己处理复杂对象
2.持久性
redis支持数据落地持久化存储
memcache不支持数据持久存储
3.分布式存储
redis支持master-slave复制模式
memcache可以使用一致性hash做分布式
value大小不同
memcache是一个内存缓存,key的长度小于250字符,单个item存储要小于1M,不适合虚拟机使用
4.数据一致性不同
redis使用的是单线程模型,保证了数据按顺序提交。
memcache需要使用cas保证数据一致性。CAS(Check and Set)是一个确保并发一致性的机制,属于“乐观锁”范畴;原理很简单:拿版本号,操作,对比版本号,如果一致就操作,不一致就放弃任何操作
5.cpu利用
redis单线程模型只能使用一个cpu,可以开启多个redis进程
总结二:
1.Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcached相比一个最大的区别。
2.Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。
3.Redis支持数据的备份,即master-slave模式的数据备份。
4.Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
我个人认为最本质的不同是Redis在很多方面具备数据库的特征,或者说就是一个数据库系统,而Memcached只是简单的K/V缓存
总结三:
redis和memecache的不同在于:
1、存储方式:
memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小
redis有部份存在硬盘上,这样能保证数据的持久性。
2、数据支持类型:
redis在数据支持上要比memecache多的多。
3、使用底层模型不同:
新版本的redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
4、运行环境不同:
redis目前官方只支持Linux 上去行,从而省去了对于其它系统的支持,这样的话可以更好的把精力用于本系统 环境上的优化,虽然后来微软有一个小组为其写了补丁。但是没有放到主干上
memcache只能当做缓存,cache
redis的内容是可以落地的,就是说跟MongoDB有些类似,然后redis也可以作为缓存,并且可以设置master-slave
48. 表中有 A B C 三列, 用 SQL 语句实现:当 A 列大于 B 列时选择 A 列否则选择 B 列,当 B 列大于 C 列时选择 B 列否则选择 C 列。
drop table table1
create table table1(
a int,
b int,
c int
)
insert into table1 values(22,24,23)
select * from table1
select (case when a>b then a else b end),(case when b>c then b else c end)
from table1
select (case when a>b then a
when a>c then a
when b>c then b else c
end)
from table1
49. 安装 Linux 系统中, 用 netconfig 程序对网络进行配置, 要输入哪些内容?
会让用户输入主机名、域名、域名服务器、IP地址、网关地址和子网掩码等必要信息
50. PHP 如何写接口给人家调用?
public function authenticationApi($data,$url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); //输出格式可以转为数组形式的json格式
$tmpInfo = curl_exec($ch);
curl_close($ch);
return $tmpInfo;
}
51. 用 PHP header() 函数实现页面 404 错误提示功能
Header(“HTTP/1.1 404 Not Found”);
52.heredoc 结构及用法
echo <<<EOT
<html>
<head><title>主页</title></head>
<body>主页内容</body>
</html>
EOT;
注意:结束标识符所在的行不能包含任何其它字符除”;”
53.nowdoc结构及用法
$str = <<<'EOD'
Example of string
spanning multiple lines
using nowdoc syntax.
EOD;
54.javascript 判断弹出窗口是否被屏蔽程序代码
var wroxWin = window.open("http://www.111cn.net", "_blank");
if (wroxWin == null) {
alert("糟糕!弹出窗口被屏蔽了");
}
55. php 序列化和反序列化用的函数
serialize() 序列化
unserialize() 反序列化
56. 利用下表结构,写出发贴数最多的十个人名字的 SQL 语句(members(id,username,posts,pass,email)
select memebers.username from members group by posts desc limit 10
57. 以 Apache 模块的方式安装 PHP,在文件 http.conf 中首先要用语句(?)动态装载 PHP 模块,然后再用语句(?)使得 Apache 把所有扩展名为 php 的文件都作为 PHP 脚本处理。
1.LoadModule php5_module “c:/php/php5apache2.dll”)
2.AddType application/x-httpd-php .php
58. 数据库中的事务是什么?
事务就是一系列的操作,这些操作完成一项任务。只要这些操作里有一个操作没有成功,事务就操作失败,发生回滚事件。即撤消前面的操作,这样可以保证数据的一致性。而且可以把操作暂时放在缓存里,等所有操作都成功有提交数据库,这样保证费时的操作都是有效操作。
59.apche 和 nginx 的优缺
nginx轻量级,比apache占用更少的内存及资源,抗并发,nginx处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能。apache 相对于nginx 的优点:rewrite比nginx 的rewrite 强大,少bug,稳定。(需要性能用nginx,求稳定就apache)。
60.求两个日期的差数,例如2007-2-5 ~ 2007-3-6 的日期差数
// 方法一:用DateTime类
$day1 = '2003-09-16';
$day2 = '2011-11-23';
$d1 = new dateTime($day1);
$d2 = new dateTime($day2);
echo $d1->diff($d2)->days;
// 方法二,用时间戳计算
echo (strtotime($day2) - strtotime($day1))/(24*3600);
61.下面的代码用来做什么?请解释。$date=’08/26/2003′;
print ereg_replace("([0-9]+)/([0-9]+)/([0-9]+)","\\2/\\1/\\3",$date);
这是把一个日期从 MM/DD/YYYY 的格式转为 DD/MM/YYYY 格式。我的一个好朋友告诉我可以把这个正规表达式拆解为以下的语句,对于如此简单的表示是来说其实无须拆解,纯粹为了解说的方便:
// 对应一个或更多 0-9,后面紧随一个斜号$regExpression = “([0-9]+)/”;
// 应一个或更多 0-9,后面紧随另一个斜号$regExpression .= “([0-9]+)/”;
// 再次对应一个或更多 0-9$regExpression .= “([0-9]+)”;至于 \2/\1/\3 则是用来对应括号,第一个括号对的是月份
62. 在 PHP 中,当前脚本的名称(不包括路径和查询字符串)记录在预定义变量(?)中;而链接到当前页面的 URL 记录在预定义变量(?)中。
(1) echo $ _ SERVER[‘PHP_SELF’];
(2) echo $ _ SERVER[“HTTP_REFERER”];
63. 一个函数的参数不能是对变量的引用,除非在 php.ini 中把(?)设为 on.
allow_call_time_pass_reference
64. 问:MVC 分别指代什么
答:MVC 是一种面向对象的开发模式 M 指的是 module V 指的是 view C 指的是 controller
分别指代的是模块 视图 控制器
问:MVC 能给项目开发带来什么好处
答:MVC 的高内聚 低耦合的开发思路,能够让各个程序开发人员之间开发各个不同的模块不受干扰,能够加速开发的进度,方便项目的后期管理和维护和增加功能
问:V 中能不能直接调用 M,M 中可不可以直接调用 C
答:能够直接调用,但如果直接调用的话,不符合规范,会给后期的维护带来困难,项目开发中应该尽量避免。
65. 问:svn 指的是什么
答:svn 指的是版本控制
问:svn 能够给项目开发带来什么好处
答:svn 在项目开发中,可以让多个程序员共同开发一个网站,svn 给每一个上传的文件根据上传的次数备份了一个版本号。当一个程序员错误的覆盖了不是自己应该开发的那个模块的时候,可以采用回滚,把网站的这个文件还原。
66. 问:如何使用 PHP 连接 oracle
答:可以使用 dsn 或者 pdo
(回答错了,正确的是在 php.ini 中打开 oracle,)
67. 问:如何获取当前时间 格式为 年 – 月 – 日 时:分:秒
答:我回答的是 date(Y-m-d H:i:s,当前时间戳)
问:如何获取昨天这个时候的时间
答: date(Y-m-d H:i:s,当前时间戳 – 一天所需的时间戳)
68. 问:如何获取客户端 IP
答:我一般使用 thinkphp,框架里面用自带的函数获取 IP
(事后百度了一下 原来是 $ _ SERVER[“REMOTE_ADDR”];)
69. 问题:描述一下网购流程
答案:比如说,一个人在网上看到一件产品并且想购买,首先它需要注册会员,在注册会员的时候需要填写,收货地址,联系方式,当发生购买行为的时候需要选择支付方式,支付方式有,网上支付,和货到付款,支付完成以后需要经历物流到达客户手中,客户之后收到货,完成交易
(时候:想了想,回答的不够完善,因为,没有涉及到,退货与评论,还有协调方面。我经常在淘宝上买东西,应该知道的,可是当时没细心)
70. 问题: 评论模块与商品模块之间的关系,该如何开发
答案:首先需要建立两张表,一张产品表,一张评论表,程序开发的时候需要将建立关联 id,首先产品表是主 id,评论表需要一个关联 id 关联产品表的主 id。另外在评论的时候会使用到 ajax 技术。
(然后认识又由评论转向 ajax,时候反思,还有个没想到,当客户评论的时候,我们商家还需要一个回复的功能,回复客户的评论,像淘宝那样。)
71. 问题:ajax 在网页开发中有什么好处
答案:ajax 可以实现网页无需刷新页面就可以显示最新的信息,可以通过客户的某个网页动作显示所需要的信息 。
问题:ajax 的运行流程。
答案:ajax 通过一个 js 事件促发一个 php 页面的运行,其中 js 会将所需要的参数传给该 php 页面,当运行完毕会把所输出的信息通过 js 回调回来,在当前浏览器的页面显示
72. 问题:在支付模块中该如何完成支付
答案:一般我们都是通过支付宝完成支付
问题:你们如何使用支付宝是如何完成支付
回答:首先我们需要使用支付宝的接口,像 ecshop 有自带的接口,可以直接使用
(回答失误,因为淘宝需要申请 key。)
73.问题:支付宝接口该如何开发
回答:支付接口有个自己提供的一个数组,需要自己自己需要提交的数据赋值给淘宝接口的数据,然后运行完毕后,会执行一个将支付情况和订单情况返回给我们的系统。
(回答的稀里糊涂的)
74.问题:支付宝生成的订单,和系统的订单是一样的吗?
回答:不一样
75. 问题:有没有开发货运模块,如何管理?
回答:没有
76. 开发手机页面是需要做一个页面还是多个页面
回答:大多数情况下是一个页面,当然有可能有多个页面。做手机页面可能会使用 html5
(不知道,打马虎眼)
77.html5 有什么不同?
回答:html5 可以自定义表情
78. 问题:做过手机页面没有,会使用 html5 不
回答:没有做过,html5 在学习中
79. 问题:cdn 是什么,如何做自动推送
回答:cdn 一种互联网缓存机制,可以加快访问速度,cdn 如果不推送,可以造成开发页面和展示一面不一致,一般我都是手工推送,自动推送没做过
80.swoole
异步任务:Async Task
消息队列
毫秒定时器,linux支持到秒,swoole支持毫秒
异步文件读写,非I/O阻塞
异步DNS,http2.0
并发原子计数器,降低错误发生概率,支持go语言,支持协成(协成高于[java]线程)
互联网,智能家居,网络游戏,移动通信,企业软件
autoconf 生成配置文件,gcc 将c语言编译成可执行文件 make 编译器
81.数据库连接池:
比如mysql能处理400个连接,但每一秒有1000个并发,建立200个和mysql的连接,从连接池中取。
使用单例模式固定连接池
永不断开连接,常驻内存程序。
确保连接数,以及可用连接数。
数组保存;连接池中对象
构造函数中,根据连接数,逐个差生对象
封装查询方法
创建http服务器
在request事件内部进行数据查询操作
从数组中弹出数据 array_pop();
看mysql连接 show processlist
82· linux文件查找命令:
Linux下查找相关命令主要有以下4个:which、whereis、locate、find。
(1)which [-a] cmdname1 cmdname2 ……
作用:locate a command,从环境变量PATH中,定位/返回与指定名字相匹配的可执行文件所在的路径
原理:执行which命令时,which会在当前环境变量PATH中依次寻找能够匹配所找命令名字的可执行文件名,不加-a选项,返回第一个匹配的可执行文件的路径,否则依 次返回满足条件的所有可执行文件的路径名。
适用场合:一般用于查找命令/可执行文件所在的路径。有时候可能在多个路径下存在相同的命令,该命令可用于查找当前所执行的命令到底是哪一个位置处的命令。
(2)whereis [-bmsu] filename1 filename2 …….
作用:locate the binary, source, and manual page files for a command.即:定位/返回与指定名字匹配的二进制文件、源文件和帮助手册文件所在的路径。
原理:whereis命令首先会去掉filename中的前缀空格和以.开头的任何字符,然后再在数据库(var/lib/slocate/slocate.db)中查找与上述处理后的filename相匹配的二进 制文件、源文件和帮助手册文件,使用之前可以使用updatedb命令手动更新数据库。
适用场合:二进制文件、源文件和帮助手册文件路径的查找。
(3)locate [option] filename1 filename2 ……
作用:find files by name from one or more databases prepared by updatedb. 同whereis指令一样,也是从数据库建立的索引中查找,不同的是该命令查找所有部分匹配的文件,使用之前可以使用updatedb命令手动更新数据库。
原理:默认情况下(当filename中不包含通配符),locate会给出所有与 *filename相匹配的文件的路径。
适用场合:没有文件类型性质的模糊查找(你只记得某个文件的部分名称)。
(4)find option [filename]
参数说明:
时间查找参数:
-atime n: 将n * 24小时内access过的文件列出来
-ctime n: 将n * 24小时内状态发生改变的文件列出来
-mtime n: 将n * 4小时内被修改过的文件列出来
-newer file: 把比file还要新的文件列出来
名称查找参数:
-gid n: 寻找群组ID为n的文件
-group name: 寻找群组名称为name的文件
-uid n: 寻找拥有者ID为n的文件
-user name: 寻找拥有者名称为name的文件
-name file: 寻找文件名为file的文件(可以使用通配符)
作用:search for files in a directory hierarchy. 从当前目录递归的搜索文件。
原理:遍历当前工作目录及其子目录,find命令是在硬盘上遍历查找,非常耗硬盘资源,查找效率相比whereis和locate较低。
适用场合:能用which、whereis和locate的时候尽量不要用find.
83. PHP-FPM的作用:
nginx 本身不能处理 PHP,它只是个 web 服务器,当接收到请求后,如果是 php 请求,则发给 php 解释器处理,并把结果返回给客户端。nginx 一般是把请求发 fastcgi 管理进程处理,fascgi 管理进程选择 cgi 子进程处理结果并返回被 nginx。php-fpm , 就是实现了 fastcgi 的一个程序,是一个 PHP FastCGI 管理器。
84.使用 select xxx where in() 查询的排序
默认下, 使用 select xxx where in(xx,xx) 查询, 返回结果是按主键排序的, 如果要按 in() 中值的排列顺序, 可以这样做:
select * from talbe where id in(3,2,4,1) ORDER BY FIND_IN_SET( id, '3,2,4,1')
85.json 和 jsonp
说的直白一点,在我们做 ajax 异步的一些功能的时候,一定会或多或少的遇到两个问题,(1、数据的交换。2、跨域问题)
JSONP 的最基本的原理是:动态添加一个
<script type="text/javascript">
function jsonpCallback(result)
{
alert(result.msg);
}
</script>
<script type="text/javascript" src=" http://crossdomain.com/jsonServerResponse?jsonp= jsonpCallback"></script>
从红色的地方可以看出,两个名字要一直,不过一般采用 callback 然后后面加一个 “?” 此时 jquery 会自动生成一个函数名,这样可以做到发送很多请求的时候,并不会互相影响。 同源策略 :即 JavaScript 只能访问与包含它的文档在同一域下的内容。jsonp 可以跨越同源策略,当我们使用了 jsonp,将会是另外一种协议通信了。 JSONP 的优点是:它不像 XMLHttpRequest 对象实现的 Ajax 请求那样受到同源策略的限制;它的兼容性更好,在更加古老的浏览器中都可以运行,不需要 XMLHttpRequest 或 ActiveX 的支持;并且在请求完毕后可以通过调用 callback 的方式回传结果。 JSONP 的缺点则是:它只支持 GET 请求而不支持 POST 等其它类型的 HTTP 请求;它只支持跨域 HTTP 请求这种情况,不能解决不同域的两个页面之间如何进行 JavaScript 调用的问题。
86.json 和 jsonp使用方法
$.getJSON(" http://跨域的dns/document!searchJSONResult.action?name1="+value1+"&jsoncallback=?",
function(json){
if(json.属性名==值){
// 执行代码
}
});
$.ajax({
async:false,
url: http://跨域的dns/document!searchJSONResult.action,
type:"GET",
dataType:'jsonp',
通常情况一般是这两种使用方法,在跨域问题上,非常简单。
86.<? echo ‘hello tusheng’ ; ?> 没有输出结果, 可能是什么原因, 简述的解决此问题的过程 (提示: 语法没有问题)
:可能服务器上面没有开启短标签 short_open_tag = 设置为 Off,,php.ini 开启短标签控制参数: short_open_tag = On
88.简述下面程序的输出结果, 简要说明为什么, 如何解决这类问题?
<?php
$tmp = 0 == "a"? 1: 2;
echo $tmp;
?>
结果 1 int 和 string 类型强制转换造成的,0==="a"
0 == 0 肯定是 true 啊
PHP 是弱类型。。
$tmp = 0 === "a"? 1: 2;
echo $tmp; 这样就是 2
简而言之就是 “==” 只要求值相等; “===” 要求值和类型都相等
89.已知一个字符串如下: 用一行代码将该字符串里面的赋值给uid, milo 赋值给 赋值给type
:list(user, str);
list: 把数组中的值赋给一些变量
90.有如下数据库, 用原生态 mysql 扩展去连接并查询 user 表的前十行
host: 192.168.0.254 port: 3306 user: one pass: piece database: db_user table: user
$link = mysql_connect("192.168.0.254:3306","one","piece") or die('Could not connect:'.mysql_error());
mysql_select_db('db_user',$link);
$query = mysql_query("select * from user limit 10");
while($rs = mysql_fetch_array($query,MYSQL_ASSOC))
{}
91. 已知一个字符串如下: $str = “1109063 milo 1”;
用一行代码将该字符串里面的 1109063 赋值给 赋值给user, 1 赋值给 $type
空格如下
list($uid, $user, $type) = explode(" ", $str);
\t如下
list($uid, $user, $type) = explode("\t", $str);
list($uid, $user, $type) = sscanf($str, "%d %s %d");
$n = sscanf($auth, "%d\t%s %s", $id, $first, $last);
92. PHP 超级全局变量(9 个)
$GLOBALS 储存全局作用域中的变量
$_SERVER 获取服务器相关信息
$_REQUEST 获取 POST 和 GET 请求的参数
$_POST 获取表单的 POST 请求参数
$_GET 获取表单的 GET 请求参数
$_FILES 获取上传文件的的变量
$_ENV 获取服务器端环境变量的数组
$_COOKIE 浏览器 cookie 的操作
设置 cookie:setcookie(name, value, expire, path, domain);
获取 cookie:$_COOKIE[“user”];
删除 cookie:setcookie(“user”, “”, time()-3600);// 设置过期时间
$_SESSION 服务端 session 的操作
使用 session 前一定要 session_start() 启动 session
储存 session:$_SESSION[“name”]=”King”;// 数组操作
销毁 session:unset($_SESSION[“name”]);// 销毁一个
session_destroy() 和 unset($_SESSION);// 销毁所有的 session
93. PHP 魔术变量(8 个)
LINE 文件中的当前行号。
FILE 文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
DIR 文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。
FUNCTION 常量返回该函数被定义时的名字
CLASS 常量返回该类被定义时的名字(区分大小写)。
METHOD 类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
NAMESPACE 当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。
94. PHP 魔术函数(13 个)
construct() 实例化对象时被调用,当construct 和以类名为函数名的函数同时存在时,__construct 将被调用,另一个不被调用。
__destruct() 当删除一个对象或对象操作终止时被调用。
call() 对象调用某个方法,若方法存在,则直接调用;若不存在,则会去调用call 函数。
get() 读取一个对象的属性时,若属性存在,则直接返回属性值;若不存在,则会调用get 函数。
set() 设置一个对象的属性时,若属性存在,则直接赋值;若不存在,则会调用set 函数。
__toString() 打印一个对象的时被调用。如 echo 或obj;
__clone() 克隆对象时被调用。如:t1=clone $t;
__sleep() serialize 之前被调用。若对象比较大,想删减一点东东再序列化,可考虑一下此函数。
__wakeup() unserialize 时被调用,做些对象的初始化工作。
__isset() 检测一个对象的属性是否存在时被调用。如:isset($c->name)。
__unset() unset 一个对象的属性时被调用。如:unset($c->name)。
set_state() 调用 var_export 时,被调用。用set_state 的返回值做为 var_export 的返回值。
__autoload() 实例化一个对象时,如果对应的类不存在,则该方法被调用。
95. 测试环境和正式环境
测试环境和正式环境无严格区分,只是用一个配置文件的一个配置项的 IP 地址来区分。
96. Myisam 索引和 Innodb 索引的区别
首先你要知道;
无论是 Myisam 和 Innodb 引擎,如果在建表的时候没有显示的定义一行主键列的话,他内部都会自动创建一个隐藏的主键索引;主键索引以外的索引假设称为次索引;首先 Myisam 和 Innodb 两个都是默认采用的 btree 索引,可以脑补一颗二叉树;myisam 引擎的数据在物理磁盘上是按照顺序存储的,而 innodb 引擎的表数据是随机分布的;myisam 的主键索引的叶子节点只存放数据在物理磁盘上的指针,其他次索引也是一样的;innodb 的主键索引的叶子节点下面直接存放数据,其他次索引的叶子节点指向主键 id;由此可以挖掘出一个问题,就是如果 Innodb 有大数据列,比如 varchar(300),这种比较多的话,那么排序的时候用主键 id 排序会比较慢,因为id 主键下面放着所有数据列,而 Myisam 就不需要扫描数据列,要解决这个问题的话可以再建一个和主键 id 一起的联合索引;
索引覆盖与回行:
如果要查找的数据恰好是索引列,那么就不用在去物理磁盘上去找数据了,就是不用回行,称为索引覆盖;
97.假设有一个博客系统,数据库存储采用 MySQL,用户数量为 1000 万,预计文章总数为 10 亿,每天有至少 10 万的更新量,每天访问量为 5000 万,对数据库的读写操作的比例超过 10:1,你如何设计该系统以确保系统高效、稳定的运行?
提示:可以从数据库设计、系统框架、及网络架构方面进行描述,可以自由发挥。
- 增加 cache
- 两套数据库,一个为主数据库,一个为更新数据库,其中更新数据库作为保存近 N(1,2,3)天更新数据,写入后放进 cache,并增加 lease 及时淘汰不常访问的记录,同时后台定期合并到主数据库。
- 数据读取时,cache-> 更新数据库 -> 主数据库
- 主数据库中将元信息(如用户信息)与文章实际内容分开,对每篇文章内容计算热度权重,做主键之一,然后分表。
98.Mysql打开safe_mode后对程序有哪些影响
什么是 PHP 安全模式:safe_mode
简单说,PHP 安全模式就是以安全模式运行 php。php 的安全模式提供一个基本安全的共享环境,在一个有多个用户帐户存在的 php 开放的 web 服务器上。当一个 web 服务器上运行的 php 打开了安全模式,那么一些函数将被完全的禁止,并且会限制一些可用的功能。
在安全模式下,一些尝试访问文件系统的函数功能将被限制。运行 web 服务器用户 id,如果想要操作某个文件,则必须拥有该文件读取或者写入的访问权限,实现这个限制功能对于 php 来说是没有问题的。在安全模式开启的时候,尝试读取或者写入一个本地文件的时候,php 将检查当前访问用户是否是该目标文件的所有者。如果不是所有者,则该操作会被禁止。(写入权限:在较低级别的文件访问权限下,可能会允许读取或者写入系统操作系统的文件,通过 php 的安全模式实现了防止你操作另外一个用户文件的操作。当然,一个 web 服务器可能能够访问一个具有全局写入权限的任意文件。)
当安全模式打开的时候,以下函数列表的功能将会受到限制:
chdir, move_uploaded_file, chgrp, parse_ini_file, chown, rmdir, copy, rename, fopen, require, highlight_file, show_source, include, symlink, link, touch, mkdir, unlink
同样的,一些 php 扩展中的函数也将会受到影响。
(加载模块:在安全模式下 dl 函数将被禁止,如果要加载扩展的话,只能修改 php.ini 中的扩展选项,在 php 启动的时候加载)
在 php 安全模式打开的时候,需要执行系统程序的时候,必须是在 safe_mode_exec_dir 选项指定目录的程序,否则执行将失败。即使允许执行,那么也会自动的传递给 escapeshellcmd 函数进行过滤。
以下执行命令的函数列表将会受到影响:
exec,shell_exec,passthru,system,popen
另外,背部标记操作符 (`) 也将被关闭。当运行在安全模式下,虽然不会引起错误,但是 putenv 函数将无效。同样的,其他一些尝试改变 php 环境变量的函数 set_time_limit, set_include_path 也将被忽略。
99.如何查看Mysql慢查询的sql是什么
1,slow_query_log
这个参数设置为 ON,可以捕获执行时间超过一定数值的 SQL 语句。
2,long_query_time
当 SQL 语句执行时间超过此数值时,就会被记录到日志中,建议设置为 1 或者更短。
3,slow_query_log_file
记录日志的文件名。
4,log_queries_not_using_indexes
这个参数设置为 ON,可以捕获到所有未使用索引的 SQL 语句,尽管这个 SQL 语句有可能执行得挺快。
100.Http跨站通信中如何保持通信的安全性
JQuery
JQuery 提供了几种跨站通信的方法
JSONP
$.getJSON('http://server/path/someaction?callback=?', 'JSON data', function(data) {
// Handle the JSON data
});
callback=? 算是一个固定格式,JQuery 在这个 HTTP Request 发送出去后,会将 ‘?’ 替换成一个随机生成 Function Name,HTTP Server 得到这个 Function Name (假设为 JSONP1234) 后,在返回数据时可以写入如
JSONP1234('response JSON data')
这样的字符串。实际上就是在返回时,JQuery 会执行次 Script,将数据传如回调的处理函数中。
AJAX POST
$.ajax({
type:'POST',
url: 'http://server/path'
crossDomain: true,
data: 'data'
dataType: 'data type'
success: function(data, status, qXHR) {
}
error: function(data, status, error) {
}
});
这个没有什么太多需要强调的了,不过,需要注意的是,Server 端在 HTTP RESPONSE 时要加入
Access-Control-Allow-Origin: *\r\n
否则在 FireFox 中会表现为通信失败,这个 ‘‘ 也可以写成其它制定的域名,并不仅限于 ‘‘
IE
IE 有些特别,在 Cross Domain Post 中是用了自己提供的 API,如果在 IE 中调用上面 Ajax 的方法,会有错误发生。
IE 8 + 以上的版本都支持,XDomainRequest
if ('XDomainRequest' in window) {
var xdr = new XDomainRequest();
xdr.onload = function() {
// Handle Response Data
}
xdr.open('POST', 'http://server/path');
xdr.send('data');
}
需要注意的是,在使用前先判断一下是否可以用 XDomainRequest.
HTTPS
现在很多网站为了安全都使用了 HTTPS 的通信方法,这里需要注意的是,如果发起跨站通信的网页时 HTTPS 的,那么将要通信的那端也必须是 HTTPS 的(并且网站的证书需要受信)否则通信将会失败(如 Chrome)