fighter

fighter 查看完整档案

北京编辑天津城建大学  |  cs 编辑瓜子  |  PHP工程师 编辑填写个人主网站
编辑

A phper and gopher :)

个人动态

fighter 关注了用户 · 2019-02-27

member @var

擅长计算机开关机、Windows系统的安装。
请大家不要向我付费提问

关注 143

fighter 赞了文章 · 2019-02-27

高级PHP(初级架构师)面试题

PHP 篇

GC

  • PHP 7 的内存回收原理?

    请详细描述ZendMM的工作原理

  • PHP 7 的垃圾回收和 PHP 5 有什么区别?

结构

  • PHP 7 中对zVal做了哪些修改?
  • PHP 7 中哪些变量类型在,哪些变量类型在

    变量在栈会有什么优势?PHP 7是如何让变量新建在栈的?

  • 详细描述PHPHashMap的结构是如何实现的?
  • 下面代码中,在PHP 7下, $a$b$c$d 分别指向什么zVal结构?

    $d 被修改的时候,PHP 7 / PHP 5 的内部分别会有哪些操作?

    $a = 'string';
    $b = &$a;
    $c = &$b;
    $d = $b;
    $d = 'to';
  • JIT 是做了哪些优化,从而对PHP的速度有不少提升?

字符串操作

  • strtrstr_replace 有什么区别,两者分别用在什么场景下?

    strtr的程序是如何实现的?

  • 字符串在手册中介绍,「PHP可安全用于二进制对象」,比如:str_replace strpos str等函数下都有这句话,这句话怎么理解,为什么是操作二进制是安全的?
  • 字符串连接符.,在PHP内核中有哪些操作?

    多次.连接,是否会造成内存碎片过多?

多线程

  • PHP中创建多进程有哪些方式?

    互斥信号该如何实现?

  • Swoole服务端启动后有哪些进程,这些进程分别是完成什么工作?
  • 线上环境中,PHP进程偶尔会卡死(或者运行卡顿),请问如何检测本质问题?

管道

  • Laravel的中间件的顺序执行,是如何实现的?
  • 实现管道的makeFn函数

    function pipe($input, $list) {
        $fn = makeFn($list); 
        return $fn($input);
    }
    $r = pipe(0, [$a, $b, $c]);
    echo $r;
    
    //$a, $b, $c 类似于
    $a = function($input, $next) {
        $input++;
        $output = $next($input);
        return $output;
    };
    
    function makeFn($list){
        //请实现
    
    }
    

内存优化

Cli

  • PHP实现一个定时任务器,类似crontab,需要做到前一个任务不论运行时长、运行失败,都不能影响下一个任务的准点执行?

安全

  • PHP中密码加密,使用什么方式加密?

    这种加密的优点是什么?

  • RSAAES 加密的区别,分别用于什么场景下?

反射

  • 实现如下函数(PHP 7)

    echo a(1, 3); //4
    echo a(3)(5); //8
    echo a(1, 2)(3, 4, 5)(6); //21
  • 如何读取某函数的参数列表,以及参数的默认值。
  • 如何模拟Java的注解方法,比如识别如下代码中的路由
class Controller {
     /**
      * @Route("/", name="index")
      * @CheckRequest
      */
     public function index(Request $request){
         return 'result';
     }
}
  • 描述下IoCDI)的实现原理?

算法

  • 目前有{} () [] <>四种配对符号,要求写一个算法检查类似{([()()]<()>)}是否配对(此字符串是正确的配对),

    比如{ ( [ () ( ] ) < ( ) > ) }即是不合规,因为其中(])() 跨越了]

    这种符号配对算法常用于语法判断,比如IDE。(你需要回答的是上面的题目,下面只作为题目的解释),比如以下PHP代码中的括号不论如何嵌套,都必须保持配对的原则才能通过编译:
    if ($a) { 
        $user['posts'][  $user['id_list'][ User::get($request['token'])['id'] ]  ] = null;
    }
  • 生成2亿个优惠券码,长度在14位,有效字符是3456789ABCDEFGHJKMNPQRSTUVWXY,其中不含有印刷歧义的0 O 1 I L 2 Z。需要快速生成并设计一个结构能快速验证是否已经被使用
  • 写一个最长匹配的替换算法,比如字符串aabcabcabaa应该得到的结果是1345,最长匹配会这样分割:aabc abc ab aa

    替换对应关系如下

    ab => 4
    aa => 5
    aabc => 1
    abc => 3
  • 有一个文件,保存了20亿行的数字,每个数字长度在5-10之间,这些数字中有很多重复,设计一个算法在只有2核1G内存的电脑上对这些数字快速去重并保存?

数据库篇

  • 搭建MySQL分布式,有哪些方式?
  • MySQL主从同步,和主主同步有哪些区别,以及优劣势?
  • Laravel中,多态一对多,多态多对多,数据库要怎么设计?

    比如一个关键词表tags,需要关联用户、帖子、评论、视频等表。

  • 描述MySQL的注入原理,以及防止注入有哪些方式?
  • 怎么解决数据库中常见的 N+1 效率问题

    比如:

    $users = SELECT * FROM `users` WHERE `gender` = 'male';
    foreach ($users as &$user)
        $user['posts'] = SELECT * FROM `posts` WHERE `user_id` = $user['id'];
  • MySQL中脏读应该怎么处理?

    引申:比如京东的库存,0点多人抢购的时候库存问题?

  • 如下数据库中会有哪些值

    //请注意是多重嵌套事务
    START TRANSACTION;
      INSERT INTO `users` (`name`) VALUES('a');
      START TRANSACTION;
        INSERT INTO `users` (`name`) VALUES('b');
        START TRANSACTION;
          INSERT INTO `users` (`name`) VALUES('c');
        ROLLBACK;
      COMMIT;
    ROLLBACK;
  • MySQL行锁在什么情况下会退化为表锁?
  • 数据库不使用B+树,还可以使用什么数据结构?
  • 为什么MySQL使用B+树,而不是其它树,比如红黑树
  • MySQL在什么时候会不使用索引?
  • Elasticsearch 如何实现类似SQLWHERE id = 12 AND gender IN ('male', 'unknow');
  • Elasticsearch 如何实现类似SQLGROUP BY nickname, gender
  • Redis 是如何保证执行的原子性的?
  • Redis有哪些数据结构,其中的bitmap, bloom filter用于什么场景?
  • Redis 在事务中如何做到:发现事务执行过程中数据被污染就回滚执行?

前端篇

  • 描述XSS注入原理,以及如何防止?
  • 描述Csrf注入原理,以及如何防止?

ES 6

  • ES 6中的 Promise 对象是做什么的?
  • 解释ES 6async、await的使用场景?
  • ES 6遍历器Iterator 怎么写,其作用是什么?

    回调地狱(callback hell) 如何使用 遍历器Iterator 实现,提示:Thunk

  • 写出下面代码执行后输出的内容

    var p1 = new Promise(resolve => {
        console.log(1);
        resolve(2);
    })
    let p2 = new Promise(resolve => {
        console.log(3);
        resolve(p1);
    });
    p1.then(re => {
        console.log(re);
    });
    p2.then(re => {
        console.log(re);
    });
  • 请简述JavascriptEvent Loop规范,并描述MacroTask机制和MicroTask机制的区别,以及对应的函数?

Vue

  • vueangularJS 中检测脏数据的原理有什么区别?
  • vue中,vuex的主要作用是什么?
  • vuedatacomputed 有什么区别?

    {
        computed: {
            now() {
                return new Date();
            }
        }
    }

    上面的now变量,是否能够在每次调用时得到当前时间?

  • vuexmutationsactions 有什么区别?
  • vuex中如何在外部(可以理解为任意一段<script>中)设置变量的值,以及如何调用mutations

通讯协议篇

  • 详细描述 HTTPSSSL)工作原理?
  • Web服务器,客户端的IP能伪造吗?如果能,列出伪造方法;如果不能,说明原因?
  • 描述域名劫持的各种方法,为什么HTTPS不能被劫持?
  • 描述HTTP协议是什么,以及HTTP 2HTTP 1.1 有什么区别?
  • 详细描述IP协议TCP协议,以及UDP协议与它们的区别。
  • TCP协议中,最大传输单元MTU一般最大是多少,在TCP协议中,如果一个数据被分割成多个包,这些包结构中什么字段会被标记相同。
    UDP分包和TCP分包会有哪些区别?
  • HTTP协议Transfer-Encoding: Chunked 适用于哪些应用场景,这个与使用Content-Length: xxx在收到的报文包上有哪些区别?

分布式篇

  • 描述epollpoll、select的区别,为什么epoll会具备性能优势?
  • 描述下惊群的原因?有什么有效的方法可以避免惊群?
  • 什么是Hash一致性,这个方法主要运用在什么场景?
    如何实现增加新节点之后,整体做最小的数据移动
  • 有哪些常见分布式锁的解决方案,Redis如何完成一个分布式锁?
  • ZooKeeper 能解决哪些问题?具体说明。
  • 分布式一致性有哪些方案?

综合篇

  • 比如: 我国在2020年1月1日08:00:00时, 东京是2020年1月1日09:00:00, 请问他们此时的时间戳差异多少?
  • 描述OAuth2的工作原理,绘制出其工作的时序图?
  • Swoole 或 Go 中协程实现原理,以及为什么会提升效率?
  • 列出几个中文分词工具?
  • git 放弃未提交的文件有哪些方法?
    git删除远程分支、Tag有什么方法?
    git覆盖远程仓库有什么办法?
查看原文

赞 121 收藏 295 评论 20

fighter 回答了问题 · 2018-05-14

解决brew 如何安装mongo扩展?

官方已经不支持这种第三方库安装了 以后只能自己手动编译了

关注 5 回答 4

fighter 关注了用户 · 2018-05-09

黄子毅 @aoyangyudakong

关注 2172

fighter 关注了标签 · 2018-05-09

区块链

区块链(英语:Blockchain 或 Block chain)是一种分布式数据库,起源自比特币。区块链是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一次比特币网络交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块。该概念在中本聪的白皮书中提出,中本聪创造第一个区块,即“创世区块”。

区块链在网络上是公开的,可以在每一个离线比特币钱包数据中查询。比特币钱包的功能依赖于与区块链的确认,一次有效检验称为一次确认。通常一次交易要获得数个确认才能进行。轻量级比特币钱包使用在线确认,即不会下载区块链数据到设备存储中。

比特币的众多竞争币也使用同样的设计,只是在工作量证明上和算法上略有不同。如,采用权益证明和 SCrypt 算法等等。

关注 51199

fighter 关注了专栏 · 2018-01-15

Salamander

上帝在我很小的时候送给我了两个苹果,一个红苹果,一个蓝苹果。红苹果代表疯狂,蓝苹果代表思考

关注 45

fighter 发布了文章 · 2018-01-09

一行命令登录服务器

相信程序员们都避免不了通过堡垒机登录服务器来查看问题,如何快速登录服务器而不用繁琐地输入密码等等步骤呢?下面的shell脚本帮你完成。
auto-login.sh

#!/usr/bin/expect -f

#定义堡垒机账号/密码/IP

set user ***
set passwd ***
set bastion_host ***

if { $argc == 1 } {
    #将第一个参数赋值给dest_host
 set dest_host [lindex $argv 0]
 #qa
 if { $dest_host == "qa" } {
  set dest_host qa-web-v01
 }
 #preview
 if { $dest_host == "pre" } {
  set dest_host sys-pre-v01
 }
}

#执行ssh操作,登陆到堡垒机
spawn ssh $user@$bastion_host
#检测命令行的返回信息,匹配password关键字
expect "*password:"
#自动输入密码 回车
send "$passwd\n"
#没有参数直接返回终端
if { $argc == 0 } {
 interact
 exit 1
}
#监测命令行的返回信息,匹配下面关键字
expect "Opt or Host>:"
#发送登录的机器
send "$dest_host\n"
#自动交互
interact

然后就是将这个脚本执行放到.bashrc文件或是your_custom.zsh(mac os)文件中别名就ok啦

alias autologin='/usr/local/sbin/auto-login.sh'

接下来就可以:

$ autologin qa //直接到qa机器
$ autologin pre //直接到preview机器
$ autologin {machineName} //直接到指定机器
$ autologin //跳到堡垒机欢迎界面 可以查看需要的机器名称 
查看原文

赞 0 收藏 1 评论 0

fighter 关注了用户 · 2017-11-22

懒人记 @lanrenji

场景化学习,让懒人少走弯路

关注 12

fighter 赞了文章 · 2017-10-20

Docker中配置Nginx与PHP

最近在学docker,顺便配置了一下docker中的nginx与php,发现网上的关于docker中配置nginx与php的资料很少,而且有的也很旧,没有太多的参考性,所以决定自己写一篇,分享一下其中的经验。

版本说明

  1. docker: Version 17.06.2-ce-mac27 (19124)
  2. PHP:7.1
  3. Nginx:1.13.3
  4. 操作系统 Mac 10.12.6

安装docker

直接上docker的官网https://www.docker.com下载docker For Mac这个版本,是docker专门为mac系统编写的软件,相当于一个app,下载安装好后,打开docker App,然后在App中启动docker即可。

安装Nginx

启动docker之后,打开命令行,你的命令行里面就有了docker这个命令:

clipboard.png

然后我直接使用的是官方的nginx镜像,下载方法:

docker pull nginx

等待下载完即可。

安装PHP

同理,我也是使用的官方的PHP镜像,其实nginx和php我都推荐官方的镜像,毕竟官方镜像代表着安全和稳定。

docker pull php:7.1-fpm

你如果想下载其他的版本,上官方镜像上面去看一下,都有各种版本的说明,想下载什么版本的都有。我这里就用的最新的php版本了。

启动Nginx

安装好nginx之后,便用命令启动它:

docker run -p 80:80 --name mynginx -v /Users/Doubleduan/Documents/project:/home -v /Users/Doubleduan/Documents/conf:/etc/nginx/conf.d -d nginx 
  • -p 代表着把容器中的80端口绑定到宿主机的80端口,所以以后访问宿主机的80端口就会转发到nginx容器的80端口
  • --name 启动的容器的名称,自己定义,方便好记就行
  • -v 就是把我主机的/Users/Doubleduan/Documents/project目录映射到容器中的/home目录中,在容器中访问/home你就会发现是我/Users/Doubleduan/Documents/project目录中的东西。我映射了项目目录和配置文件,你也可以把日志目录也映射了,这样你以后操作什么东西直接在主机中操作了,就不用登录容器中去查看了。
  • -d 后台运行容器
  • 后面的那个nginx就是镜像的名称了

启动PHP

docker run -p 9000:9000 --name myphp -v /Users/Doubleduan/Documents/project:/home -d php:7.1-fpm

配置nginx的配置文件

下面贴出我的配置

server {
    listen       80;
    server_name  algo.test.com;
    root /home/algorithm;

    access_log  /var/log/nginx/access.log  main;
    error_log /var/log/nginx/error.log error;

    location / {
        index  index.html index.htm index.php;
    }

    location ~ \.php$ {
        fastcgi_pass   172.17.0.3:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

这个algo.test.com我在主机的hosts文件中配置的指向127.0.0.1,其实就是访问的本机80端口。这里要特别注意两个点:

第一点:是fastcgi_pass 172.17.0.3:9000,这里的172.17.0.3就是php容器的ip,查询容器IP的方法:

docker inspect 容器ID或容器名 |grep '"IPAddress"'

你自己配置的话要替换成你自己的php容器ip,注意不能用127.0.0.1,因为我用的是docker默认的网络连接模式,也就是docker bridge模式,这种模式下你要访问另一个容器就必须用那个容器的虚拟ip,而且端口也必须要与宿主机的相应端口绑定,因为宿主机是一个网关,nginx容器访问php容器要经过宿主机的网关转发的,所以不绑定端口肯定访问不了。

第二点
关于fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name这个配置,如果你想用$document_root变量,那就必须把nginx容器的数据目录与php容器的数据目录弄成一致的,比如我的nginx容器的数据目录是/home/algorithm,在php容器中依然是这个,如果php容器中的目录改变了,不是这个了,那么php容器就会找不到请求的这个文件的。因为两个容器相当于两套文件系统,路径有可能是不一样的。但是呢,如果你偏要设置成不一样的,那么只能写死地址了,比如弄成这样:fastcgi_param SCRIPT_FILENAME /home/algorithm/$fastcgi_script_name,就可以让php容器访问到相应的文件了。

弄好配置文件之后,重启nginx容器,就可以访问了。

查看原文

赞 12 收藏 15 评论 2

fighter 关注了用户 · 2017-09-28

韩天峰 @hantianfeng

Swoole 开源项目创始人

关注 3195

认证与成就

  • 获得 0 次点赞
  • 获得 1 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 1 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2017-04-18
个人主页被 361 人浏览