php常见面试题(2)
1、session与cookie的联系与区别?
web服务器集群(多台web服务器)后session如何同步和共享?
session运行机制?
禁用cookie后session是否可用,why?
联系:
1)cookie在客户端保存状态,session在服务器端保存状态。但是由于在服务器端保存状态的时候,在客户端也需要一个标识,所以session也可能要借助cookie来实现保存标识位的作用。
2)cookie包括名字,值,域,路径,过期时间。路径和域构成cookie的作用范围。cookie如果不设置过期时间,则这个cookie在浏览器进程 存在时有效,关闭时销毁。如果设置了过期时间,则cookie存储在本地硬盘上,在各浏览器进程间可以共享。
3)session存储在服务器端,服务器用一种散列表类型的结构存储信息。当一个连接建立的时候,服务器首先搜索有没有存储的session
id,如果没有,则建立一个新的session,将session id返回给客户端,客户端可以选择使用cookie来存储session
id。也可以用其他的方法,比如服务器端将session id附在URL上。
区别:
1)cookie数据存放在客户的浏览器上,session数据放在服务器上。
2)cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。
3)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。
4)单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
多台服务器共享session:
1)利用Mysql数据库共享Session数据的方式
使用一个mysql服务器做共享服务器,把所有的session的数据保存mysql服务器上,所有的web服务器都来这台mysql服务器来获取session数据。这里有一个关键的地方,用来存放session的数据表不要跟其他数据库表放在一起,要独立开来,专门放在一个低端的服务器上面。不然,数据库本身压力就很大了,再加上session是需要频繁的读取的,这使得数据库很容易达到瓶颈,从而导致过高的响应延迟。
2)利用cookie共享Session数据
当用户请求后产生的session,我们把他的sessionId和值都存在cookie里面。这样,当你访问a服务器后,产生了session放在客户端的cookie里面,你在访问被分配到b服务器上。这时候,b服务器先判断本身服务器上有没有这个用户的session,如果没有,在去看看客户端的cookie里面有没有这个session,如果有,就获取客户端的这个cookie里面的session。这样就实现了session的同步。
3)使用内存来共享Session数据
这里建议可以选择采用开源的缓存系统来完成session的共享,比如memcache等。原理跟mysql一样,不管哪个服务器产生的session都放在一个"内存池"里面。要获取session数据的时候都统一到这里获取。我建议用这个方法。
session的运行机制:
用户A访问站点Y,如果站点Y指定了session_start();(以下假设session_start()总是存在)那么会产生一个session_id,这个session_id一般会以COOKIE的形式保存到用户A(我们可以通过在php.ini里设置session.use_only_cookies为1,强制SESSIONID必须以COOKIE专递。)。这时候SESSIONID表现为$_COOKIE[‘PHPSESSID’];(PHPSESSID可用session_name()函数来下修改)
用户A接着访问,这个session id($_COOKID[‘PHPSESSID’])就会在A每次访问Y的时候传送到站点Y。
在站点Y上,会有这么一个目录,是用来保存SESSION的实际数据的。站点Y接收到sessionid,然后通过session id,来获得与SESSION数据的关联,并返回SESSION数据。
禁用cookie后session是否可用:
可以,但是需要在传值的时候将Session_id写到URL中;因为禁用以后再传递参数的时候会以网址的形式参数接到后面传过去!
5、 select id, case when name = 'Test1' then 1 else 0 END as isexist ,qty,createddate createdby from 表名;
6、select FROM_UNIXTIME(login_period),count(FROM_UNIXTIME(login_period)) as count from `login` GROUP BY FROM_UNIXTIME(login_period) ORDER BY count desc ;
7、<?php echo count(strlen(“http://php.net”)); ?>的执行结果是?
答案:1
讲解:count(var)是用来统计数组或对象的元素个数的。当var是null或者空数组时,结果为0。如果var是普通变量,则返回1。正常情况下返回var中的元素或属性个数。
8、使用list()函数需要注意什么?
答案:list()是一个语法结构。List($array)是用来快速把数组中的元素赋给一些变量。使用时要注意,$array必须为一个索引数组,并且索引值从0开始。
9、请说明php.ini中的safe_mode开启之后影响了哪些函数?
答案:Safe_mode是php的安全模式。开启之后,主要会对系统操作、文件、权限设置等方法产生影响,主要用来应对webshell。以下是受到影响的一些函数:ckdir,move_uploaded_file,chgrp,parse_ini_file,
chown,rmdir,copy,rename,fopen,require,highlight_file,show_source,include,symlink,link,touch,mkdir,unlink,exec,
shell_exec,pasathru,system,popen
需要注意的是:在php5.3以上版本,safe_mode被弃用,在php5.4以上版本,则将此特性完全去除了。
10、请对POSIX风格和兼容Prel风格两种正则表达式的主要函数进行类比说明。
答案:POSIX 风格 : 匹配正则表达式ereg 和替换 ereg_replace
Prel风格:匹配正则表达式 preg_match 和替换 preg_replace
Preg_match 比ereg的执行效率更快,preg_replace 比ereg_replace的执行效率更快。
11、如何在命令下运行php脚本(写出两种方式),如何向php脚本传递参数?
答案:第一种方式:先进入php安装目录,执行 php 路径/文件名.php。
例:php my_script.php php -f "my_script.php"
第二种方式:php -r “php脚本”;(不需要加php的开始符和结束符)。
例:php -r "print_r(get_defined_constants());"
向php脚本传递参数:
第一种方式:php -r "var_dump($argv);" -- -h (注意:如果要传递的参数开头为-,那么得使用参数列表分隔符 -- 才能正确传参。)
第二种方式:test.php文件代码:#!/usr/bin/php <?phpvar_dump($argv);?>
./test.php -h -- foo(在php文件开头加入#!/usr/bin/php,即可直接传递以-为开头得参数)
12、php5中魔术方法有哪几个?请举例说明各自的用法。
答案:
1、__construct() :实例化对象时自动调用。
2、__destruct() :销毁对象或脚本执行结束时自动调用。
3、__call() :调用对象不存在得方法时执行此函数。
4、__get() :获取对象不存在的属性时执行此函数。
5、__set() :设置对象不存在的属性时执行此函数。
6、__isset() : 检测对象的某个属性是否存在时执行此函数。
7、__unset() :销毁对象的某个属性时执行此函数。
8、__toString() :将对象当作字符串输出时执行此函数。
9、__clone() :克隆对象时执行此函数。
10、__autoload() :实例化对象时,当类不存在时,执行此函数自动加载类。
11、__sleep() :serialize之前被调用,可以指定要序列化的对象属性。
12、__wakeup :unserialize之前被调用,可以执行对象的初始化工作。
13、__set_state() :调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。
14、__invoke() :将对象当作函数来使用时执行此方法,通常不推荐这样做。
13、简述php的垃圾收集机制。
答案:php中的变量存储在变量容器zval中,zval中除了存储变量类型和值外,还有is_ref和refcount字段。refcount表示指向变量的元素个数,is_ref表示变量是否有别名。如果refcount为0时,就回收该变量容器。如果一个zval的refcount减1之后大于0,它就会进入垃圾缓冲区。当缓冲区达到最大值后,回收算法会循环遍历zval,判断其是否为垃圾,并进行释放处理。
关于此问题(http://blog.csdn.net/niluchen/article/details/9468365)有各为详细的讲解!