美图网 2018年高级PHP笔记题

1、写一段代码,实现PHP内部的通知机制,如当一个类的属性发生变化时,另外一个类就可以收到通知。

<?php

/**

* 观察者模式

* @author: Mac

* @date: 2012/02/22

*/

class Paper{ /* 主题 */

private $_observers = array();

public function register($sub){ /* 注册观察者 */

$this->_observers[] = $sub;

}

public function trigger(){ /* 外部统一访问 */

if(!empty($this->_observers)){

foreach($this->_observers as $observer){

$observer->update();

}

}

}

}

 

/**

* 观察者要实现的接口

*/

interface Observerable{

public function update();

}

class Subscriber implements Observerable{

public function update(){

echo "Callback\n";

}

}

下面是测试代码

/* 测试 */

$paper = new Paper();

$paper->register(new Subscriber());

//$paper->register(new Subscriber1());

//$paper->register(new Subscriber2());

$paper->trigger();

 

2、 以下代码会输出结果吗?如果能请说明原因,如果不能请尝试修改使其能输出结果

class CateData {

private $_data=array();

public function __construct($data){

$this->_data=$data;

}

}

$data = array(

'a'=>'分类1',

'b'=>'分类2',

'c'=>'分类3',

'd'=>'分类4',

);

$cate=new CateData($data);

foreach($cate as $key => $val){

echo "$key : ". $val;

}

不会

可修改为

 

$cate=new CateData($data);

foreach($cate as $key => $val){

echo "$key : ". $val;

 

3、看代码回答问题

$a = 1;

function func($a){

echo $a;

$a = 100;

}

func($a);

echo $a;

 

class A{

public $a = 10;

}

$obj = new A();

func($obj->a);

echo $obj->a;

 

请说出以上代码输出的结果,详细说明两次调用的差异

111010;

 

4、如何解决或降低缓存服务的单点故障导致数据库的流量井喷

解决单点故障的最好方法就是做数据库服务器集群,同时让数据库做好主从备份保证数据完整性,以及适当数据库冗余,当一台缓存服务出现故障,从服务器通过检测心跳可快速提供服务,保证服务的不间断;再加上MySQL Proxy实现负载均衡、读写分离等功能,在使用主从复制的基础上,再使用垂直切分及水平切分;或者不使用主从复制,完全使用垂直切分加上水平切分再加上类似Memcached的内存缓存系统可以解决问题。

 

5、请用PHP实现一个双向链表,并提供基本的增删改查功能

<?php

class link

{

public $preLink = NULL; //前指针

public $number; //排名

public $name; //名字

public $nextLink = NULL; //后指针

//构造函数,初始化值

public function __construct($number= '', $name = '')

{

$this->number = $number;

$this->name = $name;

}

//增加数据

static public function addDom($head, $data)

{

$obj = $head;

$isExist = FALSE;

if(NULL == $obj->nextLink)

{

$obj->nextLink = $data;

$data->preLink = $head;

}

//找到添加的位置

while(NULL != $obj->nextLink)

{

if($obj->nextLink->number > $data->number)

{

break;

}

else if($obj->nextLink->number == $data->number)

{

$isExist = TRUE;

echo "<br>不能添加相同的编号";

}

$obj = $obj->nextLink;

}

if(!$isExist)

{

if(NULL !=$obj->nextLink)

{

$data->nextLink =$obj->nextLink;

}

$data->preLink = $obj;

if(NULL !=$obj->nextLink)

{

$data->nextLink->preLink = $data;

}

$obj->nextLink = $data;

}

}

//输出链表数据

static public function showDom($head)

{

$obj = $head;

while(NULL != $obj->nextLink)

{

echo "<br>编号:".$obj->nextLink->number."名字:".$obj->nextLink->name;

$obj = $obj->nextLink;

}

}

static public function delDom($head, $num)

{

$obj = $head;

$isFind = FALSE;

while(NULL != $obj)

{

if($obj->number == $num)

{

$isFind = TRUE;

break;

}

$obj = $obj->nextLink;

}

if($isFind)

{

if(NULL !=$obj->nextLink)

{

$obj->preLink->nextLink = $obj->nextLink;

echo '<br/>删除的号码是'.$obj->number;

}

else

{

echo "<br>没有找到目标";

}

}

}

static public function updateDom($head, $num, $name)

{

$obj = $head;

while(NULL != $obj)

{

if($obj->number == $num)

{

$obj->name = $name;

echo "<br/>改变号码{$obj->number}的结果:".$obj->name;

break;

}

$obj = $obj->nextLink;

}

}

}

$head = new link();

$one = new link(1,'oooooooo');

$two = new link(2,'wwwwwwww');

$three = new link(3,'eeeeeeee');

link::addDom($head,$one);

link::addDom($head,$two);

link::addDom($head,$three);

link::showDom($head);

link::delDom($head, 2);

link::showDom($head);

link::updateDom($head,3, 'kkkkkk');

link::showDom($head);

 

 

 

 

6、设计一个数据库表,实现评论楼盖楼效果,并写出sql语句

a、写出建表语句

 create table comment

(

`id` int(10) unsigned not null auto_increment primary key,

//  通过把id逗号连接确定父级关系 1,3,5  

`path` varchar(100) not null,

'deepth' tinyint(3) not null,

`comment_text` text not null,

`time` int(10) not null,

) engine=innodb defalut charset=utf8;

 

b、查询一个评论的所有子评论

select * from commet where path regexp (该父评论的path + "," + 父评论的id + ",");

 

c、写出每次新增和删除的sql语句

insert into comment  (父评论的path + 父评论的 id, 父评论的deepth + 1 , '评论内容' , now());

delete from coment where id = 要删除的id

 

d、写出计算层级深度的sql语句

select deepth from comment where id = 要计算的id

 

7、美图APP有上亿用户使用,为了深刻挖掘用户需求,需要设计一个日志收集系统,用于收集用户日常使用情况,请用你知道的知识设计一套这样的日志收集系统。

假设,用户每次操作、点击美图APP都将发起请求。

请给出系统架构设计图,数据库存储方式,需要的机器量,以及能承载的QPS,尽可能详细的描述此系统中的难点、解决方案。

参考我的segmentfault问题:https://segmentfault.com/q/1010000013834130

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章