面试记录

淘宝校招二面PHP 悲剧:

问题一:新浪微博首页 你和他共同关注的人  功能实现,用于存储人这个信息的方法是什么?

1.可以使用redis的set方式存储,使用sinter命令返回交集。

2.可以使用PHP的array_intersect函数实现。

问题二:PHP静态类的特性

答:1、被声明为静态类的类不允许包含任何非静态成员

2、抽象静态类中的静态方法不允许调用,它必须先被继承。

3、在静态类中,允许抽象的静态方法。

4、静态类不允许含有 构造函数、析构函数、动态拦截函数以及 __toString()。

5、静态类不允许继承自非静态类。

6、为了向下兼容,目前含有静态成员的抽象类/非静态类的行为不会被改变。

7、在抽象类中添加 __setStatic() 以及 __getStatic() 以代替 __get() 、 __set()。

8、静态类不能被实例化

9、静态类可以实现自只包含静态方法的接口

 

扫盲:所谓静态类指的是无需实例化成对象,直接通过静态方式调用的类。代码如下:



class Math
{
public static function ceil($value)
{
return ceil($value);
}

public static function floor($value)
{
return floor($value);
}
}



此时类所扮演的角色更像是命名空间,这或许是很多人喜欢使用静态类最直接的原因。

 

问题三:用PHP以及shell和perl写出从access_log中查找出出现最多的IP的方法。

 PHP代码如下:

 1 function new_sort($a,$b){
2 if ($a == $b) return 0;
3 return ($a>$b) ?-1:1;
4 }
5 $pattern='/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/';
6 if($file = file_get_contents("/var/log/httpd/access_log"))
7 {
8 if(preg_match_all($pattern, $file, $matches))
9 {
10 $result = array_count_vaules($matches[0]);
11 uasort($result,"new_sort");
12 print_r($result);
13 }else{echo "match failed!"}
14 }else{echo "open file failed!!"}



Perl代码如下:

#!/usr/bin/perl -w
open(ACCESS,'/var/log/httpd/access_log');
@log = <ACCESS>;
foreach $word (@log){
$word =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/;
$match = $&;
$matchlist{$match} +=1;
}
@sorted = map {{($_=>$matchlist{$_})}}
sort {$matchlist{$a} cmp $match{$b} or $a cmp $b} keys %matchlist;
foreach $cap (keys(%matchlist)){
($key,$value) = each %$cap;
print("$key => $value\n");
}
close(ACCESS);




直接命令实现:

awk -F' ' '{print $1}' /var/log/httpd/access_log | uniq -c | sort -nr

 

问题四:PHP获取网页内容的方法。

1.file_get_contents: 将整个文件读入一个字符串。

2.Curl:流程为curl_init();curl_setopt();curl_exec();curl_close();

<?php 
$url = "http://www.jb51.net";
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
//在需要用户检测的网页里需要增加下面两行
//curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
//curl_setopt($ch, CURLOPT_USERPWD, US_NAME.":".US_PWD);

$contents = curl_exec($ch);
curl_close($ch);
echo $contents;



3.fopen->fread->fclose:实现类似file_get_contents,通过打开远程文件并读取。

其中  fopen和file_get_contents需要开启php.ini中的allow_url_fopen选项,Curl需要开启curl选项。

 

4.经rtxbc提醒,知道了其实常用的是socket方法抓取网页内容。

找到了一段示例代码如下:

function get_content_by_socket($url, $host){ 
$fp = fsockopen($host, 80) or die("Open ". $url ." failed");
$header = "GET /".$url ." HTTP/1.1\r\n";
$header .= "Accept: */*\r\n";
$header .= "Accept-Language: zh-cn\r\n";
$header .= "Accept-Encoding: gzip, deflate\r\n";
$header .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; InfoPath.1; .NET CLR 2.0.50727)\r\n";
$header .= "Host: ". $host ."\r\n";
$header .= "Connection: Keep-Alive\r\n";
//$header .= "Cookie: cnzz02=2; rtime=1; ltime=1148456424859; cnzz_eid=56601755-\r\n\r\n";
$header .= "Connection: Close\r\n\r\n";

fwrite($fp, $header);
while (!feof($fp)) {
$contents .= fgets($fp, 8192);
}
fclose($fp);
return $contents;
}

 

 

问题五:Memcache和memcached的区别,缓存的时间应该怎么设置?

memcached中有getmulti和setmulti,很实用,而且还有很多方法是memcache没有的,因此可以理解为memcache的升级版。

问题六:Redis有哪些存储类型,各有什么特点。

具体类型包括strings, list, set, sorted set, hash。

http://www.cnblogs.com/bigdog/archive/2011/09/24/2189612.html

问题七:Node.js的特性,什么是异步?

异步,事件驱动,非阻塞。

异步的特点就是一个调用者发出一个请求之后不需要马上得到结果,而是等待处理者得出结果集之后返回给调用者,和同步的你说完我再说概念不同。

事件驱动是javascript的特性,当一个动作触发之后驱动一个事件,可以是多对多的关系,也就是说多个动作驱动多个事件。

非阻塞是node.js的一个新特性,传统编程语言是面向过程的流程,也就是上面的操作没完成,下面的操作会阻塞在那里等待操作完成。而node.js的特点就是非阻塞,用下面的例子来说明:

$file = fopen("/etc/file",r+);
$contents = fread($file,filesize("/etc/file"));
fclose();

echo "this will not display";

文件读写没完成的时候,echo不会输出,但是在node.js的特性中就不一样了,看下面的代码:

require("fs")

fs.readFile('/etc/filename','UTF-8',function(err,date){
if(err) throw err;
console.log(date);

});

console.log("running");

这个程序中,读取文件的操作没有影响console.log输出running,而date需要文件读取完毕再输出,两者不阻塞。

大街网上看到的新浪PHP面试题

 1、cookie、session的联系和区别,多台web服务器如何共享session?

        cookie在客户端保存状态,session在服务器端保存状态。但是由于在服务器端保存状态的时候,在客户端也需要一个标识,所以session也可能要借助cookie来实现保存标识位的作用。

      cookie包括名字,值,域,路径,过期时间。路径和域构成cookie的作用范围。cookie如果不设置过期时间,则这个cookie在浏览器进程存在时有效,关闭时销毁。如果设置了过期时间,则cookie存储在本地硬盘上,在各浏览器进程间可以共享。

      session存储在服务器端,服务器用一种散列表类型的结构存储信息。当一个连接建立的时候,服务器首先搜索有没有存储的session id,如果没有,则建立一个新的session,将session id返回给客户端,客户端可以选择使用cookie来存储session id。也可以用其他的方法,比如服务器端将session id附在URL上。

区别:

(1).cookie在本地,session在服务器端。

(2).cookie不安全,容易被欺骗,session相对安全。

(3).session在服务器端,访问多了会影响服务器性能。

(4). cookie有大小限制,为3K

 

 多服务器共享session可以尝试将session存储在memcache中。


 2、http协议中的post和get有何区别?

GET用于获取信息,不应该用于修改信息,POST可用于更新修改信息。

GET可传输数据大小和URL有关,而POST没有限定大小,大小和服务器配置有关。

GET放在URL中,因此不安全,而POST传输数据对于用户来说是不可见的,所以相对安全。

 

经@书好 大大提醒,区别还有:

在ajax: post不被缓存,get被缓存所以一般在请求结尾加Math.random();

 

 

SERVER端接受:因为在submit提交的时候是按不同方式进行编码的,所以服务端在接受的时候会按照不同的方式进行接受!

 

编码方式:如果传递数据是非-ASCII,那么GET一般是不适应的,所以在传递的时候会做编码处理!


 3、reqiure的include都可包含文件,二者的区别何在?
require在包含文件出错之后返回致命错误,跳出运行,而include 在包含文件出错之后返回警告信息,继续运行。

 4、php中web上传文件的原理是什么,如何限制上传文件的大小?

 

PHP上传文件默认大小为2M,设置上传大小的配置项是upload_max_filesize,post_max_size设置一次POST中PHP能接收的最大数据量,应该比upload_max_filesize大。

 5、写一个函数,可以遍历文件夹下的所有文件和文件夹。

  不知道我的理解是不是不对,如果是简单的列出文件和文件夹的话,下面两个应该可以。本人水平菜,没发现什么陷阱..考虑了一下,会不会题目是要求做一个遍历,把子文件夹下的文件都要显示出来,这样的话需要使用递归对文件夹进行显示。对每次scandir出来的条目进行is_dir判断,是dir的话递归进行下一轮的scandir。

 1 function bianli($dir)
2 {
3 if(is_dir($dir))
4 {
5 $output = scandir($dir);
6 print_r($output);
7 }
8 }
9
10 function bianli2($dir)
11 {
12 if(is_dir($dir)){
13 $command = "ls -a $dir";
14 $ret = `$command`;
15 $pattern = "/\S+/";
16 if(preg_match_all($pattern,$ret,$matches))
17 {
18 print_r($matches);
19 }
20 }
21 }

 


 6、有mail.log的一个文档,内容为若干邮件地址,其中用'\n'将邮件地址分隔。要求从中挑选出sina.com的邮件地址(包括从文件读取、过滤到列印出来)。

 

1 $mail = file_get_contents('mail.log');
2 $pattern = "/\S+sina\.com/";
3 $rpattern = "/\\n/";
4 preg_filter($rpattern,"",$mail);
5 if(preg_match_all($pattern,$mail,$matches))
6 {
7 print_r($matches);
8 }



 

posted @ 2011-09-24 10:32  chainsaw  阅读(972)  评论(30编辑  收藏  举报