前言

Life's too short to waste a second.

工作

如在2018年对公司的担忧一样,公司在2019年的四月倒闭了。虽然不是正式意义上的倒闭,但是拖欠员工工资到劳动仲裁的角度来看,和倒闭也相差无几了。

在家休整了两个月,出来面试受到了不小的打击。前前后后面试了近20家公司,合适的不给 Offer,给 Offer 的觉得不合适,最后寻寻觅觅才遇到了现在的这家公司。现在的岗位跟我在「中软国际」的一模一样,市场部的“全干工程师”,在这样的工作环境下, 我唯一的发展方向就是「全栈工程师」了。

生活

减肥始终是件难事,健身什么的——完全不存在的。拍结婚照的动力都没能让我减肥成功,但是仔细想想减肥这事现在开始就好了,并不是非要一个契机才行的。而且发糕给我买的「健身环大冒」险已经在路上了,加油。

回看往年的文字,我好像每年跨年的这段时间,情绪就会变得不太稳地,可能这段时间是我的「水逆期」吧。最近和发糕的矛盾比较多,说起来我和她都有责任。发糕因为考编的事最近情绪都比较低落,有些对我来说强迫症的地方,她并没有注意到。而我最近又是「水逆期」,所以看到强迫症的地方就会莫名的火大。告诉自己,控制好自己的情绪,多多爱发糕。

没想到,离上面文字的写作时间已经过了两个月了。也就是说我自己拖稿到3月份了。这两个月里发生了不少的事,理应记录一下,但这篇文章还是按照两个月之前的心情来写吧。不知道自己还能不能找到来个月以前的感觉。

Swoole 把自己玩死了!最近本来使用 Swoole 的框架,纷纷决定使用 Golang 作为 Swoole 的替代品。因为 Swoole 钦定了一个「官方」框架「Hyperf」,而且 Swoole 的稳定版本将只提供给付费用户。看来学习路径已经非常的明确了,PHP + Golang 才是唯一的出路。近些年来 Java 大有完全取代 PHP 的势头,不知道 PHP 还能撑多久。

爱情

我的老婆是一只猫。她是一只懒洋洋的猫,一只会在家里捣乱的猫,一只同样的错误会犯很多次的猫,一只不会理财的猫,一只会冲动消费的猫。她也是一只善解人意的猫,一只会倾听我抱怨的猫,一只会做饭的猫,一只超爱我的猫。而我也是超爱她,愿意和她这只猫共度余生。

计划

修身:

  • 健身环大冒险
  • 上班不迟到,且能喝上咖啡
  • 种香料
  • 写好英文圆体

技术:

  • PHP 基础
  • Golang
  • 合理的前端知识

写作:

  • 至少达到两周一篇的文章输出量

总结

2020 年全世界的开局都不对,都非常的危险。而我只希望和她幸福的生活下去,别无他求。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>富媒体与WebForms2.0</title>
</head>
<body>

<!-- canvas -->
<canvas id="my" width="360" height="240">
    <p>you are my only love</p>
    <img src="" alt="">
</canvas>
<script>
    //
    var canvas = document.getElementById('my');
    var context = canvas.getContext('2d');
    //
    context.strokeStyle = '#990000';
    context.strokeRect(20, 30, 100, 50);
</script>

<!-- audio 音频 -->
<audio controls id="audio">
    <source src="https://oss.alrcly.com/Typora/video.mp4" type="video/mp4">
</audio>
<div>
    <button onclick="document.getElementById('audio').play()">Play</button>
    <button onclick="document.getElementById('audio').pause()">Pause</button>
    <button onclick="document.getElementById('audio').volume+=0.1">VolumeUp</button>
    <button onclick="document.getElementById('audio').volume=0.1">VolumeDown</button>
</div>

<!-- video 视频 -->
<video controls width="800" height="450" poster="https://oss.alrcly.com/Typora/video.jpg">
    <source src="https://oss.alrcly.com/Typora/video.mp4" type="video/mp4">
</video>

<!-- form 表单 -->
<form>
    <!-- datalist 下拉输入-->
    <label>You Home</label>
    <input type="text" name="home" id="home" list="planets">
    <datalist id="planets">
        <option value="Mercury1">
        <option value="Mercury2">
        <option value="Mercury3">
    </datalist>
    <!-- search 搜索-->
    <label for="text">输入文本:</label><input id="text" type="text">
    <label for="search">进行搜索:</label><input id="search" type="search">
    <!-- email、url、tel-->
    <label for="email">输入电子邮箱:</label><input id='email' type="email">
    <label for="url">输入URL:</label><input id="url" type="url">
    <label for="tel">输入电话:</label><input id="tel" type="tel">
    <br>
    <!-- amount 活动块-->
    <label for="range">滑动块</label>
    <input id="range" type="range">
    <!-- number 数字微调-->
    <label for="number">数字微调</label>
    <input id="number" type="number">
    <!-- data 时间-->
    <label for="date">时间</label>
    <input id="date" type="date">
    <!-- color 拾色器-->
    <label for="color">拾色器</label>
    <input id="color" type="color">
    <!-- pattern 正则自定义-->
    <label for="zip">正则自定义</label>
    <input id="zip" pattern="[\d]{5}(-[\d]{4})">
</form>

</body>
</html>

最近在项目中使用到了勾号,但是尝试了很多,最后的显示结果却是 √ 这样的根号。

经过寻找,终于找到了正确的勾号,记录一下以备以后使用。

符号Unicode码(Hex)名字
U+2713CHECK MARK(勾号)
U+2714HEAVY CHECK MARK(粗勾号)
U+2717BALLOT X (交叉)
U+2718HEAVY BALLOT X (粗体交叉)
U+2610BALLOT BOX(方格)
U+2611BALLOT BOX WITH CHECK(打勾方格)
U+2612BALLOT BOX WITH X (带交叉方格)

1. 写出你能想到的所有 HTTP 返回状态值,并说明用途

状态值用途
200成功
500服务器内部错误
401未经授权得访问
403禁止访问
404资源未找到
301永久重定向
302零时重定向
502从上游服务器接受到无效的响应

2. HTTP 中 POST、GET 方式的区别

  • GET参数通过URL传递,POST放在Request body中。
  • GET请求在URL中传送的参数是有长度限制的,而POST没有。
  • GET产生一个TCP数据包;POST产生两个TCP数据包。

3. PHP中双引号和单引号的区别

单引号:PHP当作纯字符串处理,不会解析字符串内包含的变量和字符转义。

双引号:会解析字符串内包含的变量和字符转义。

4. echoprint_rprintvar_dump 之间的区别

echo 输出一个或者多个字符

print 和echo一样,速度比echo慢

print_r 可以打印数组

var_dump 可以打印数组,包括表达式的类型与值。

5. require 一个不存在的文件时,如何避免抛出异常错误

可以先用 file_exists() 判断文件是否存在

6. 写一段 PHP demo 代码实现单例模式

<?php
  class DB {
    private static $obj = null;

      private function __construct(){}
 
    private function __cloce(){}
  
    static function getInstance()
    {
      if(is_null(self:$obj)){
        self:obj = new self();
      }
      return self:$obj;
    }
  
      public function fun()
    {
      
    }
}

7. 请描述一下 PHP 的自动加载机制

使用 spl_aotoload_registrer() 函数和 PSR-4规范 完成自动加载

8. 发送 PSOT 请求时,application/x-www-form-urlencoded 各派和 multipart/form-data 有什么区别,如果需要发送 json 格式到后台,发送时 Content-Type 如何设置。

application/x-www-form-urlencoded:浏览器的原生表单的默认方式

multipart/form-dat:使用表单上传文件时

方案一:application/x-www-form-urlencoded 。把 JSON 字符串作为 value 放在键值对里。

方案二:application/json 。从 php://input 获取原始输入流转 JSON。

9. 阐述下你对 MVC 的理解

使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。

10. MySQL 查询慢有哪些原因?能否给出你的优化建议?为什么会有死锁?

当事务试图以不同的顺序锁定资源时,就可能产生死锁。多个事务同时锁定同一个资源时也可能会产生死锁。

11. 如何使用 shell 脚本统计网站前一天出现 40X 错误的 url 总数?

大概的思路,就是读取访问日志。

12. 谈谈你对消息列队的理解?除了 redis 有用过哪些?

消息列队的作用就是解耦、异步、削峰。

13. 请在表格右侧写出执行每一行后每个变量的值,每行变量的值依赖上一行。

$a=1;$b=2;$c=3;$d=4;$e=5$a$b$c$d$e
$b=&$a;11345
$b="30$a";301301345
$e=$c=($b++);3013013014301
$d=($c>$b)?($a+=2):(--$b);301301301301301
$e=implode(',',[$c,$e]);301301301301301,301

14. 优化题:有一序列1,1,2,3,5,8,13,21…… 研究规律后有了下列的算法来求第 N 位的值。

<?PHP
  function fun($n){
      if($n==1||$n==2){
      return 1;
    }
  return fun($n-1)+fun($n-2);
}
  1. 指出这个递归的性能问题
  2. 请给出优化方案,仍然使用递归。

1 PHP中魔术方法有哪几个?请举例说明各自的用法。

__set() // 赋值的变量不存时调用
__get() // 获取的变量不存时调用
__isset() // 检测一个对象的属性是否存在时被调用
__unset() // 释放一个对象的属性时被调用
__construct // 构造方法
__destruct // 析构方法
__toString() // 打印对象时调用
__aoutload() // 类不存在时调用
__call()// 方法不存在时调用
__sleep() // serialize 之前被调用
__wakeup() // unserialize 之前被调用
__clone() // 克隆对象时被调用

2 写出将一个数组里的空值去掉的语句。

array_filter($array);

3 写出一个函数,参数为年份和月份,输出结果为指定月的天数。

// 方法一
cal_days_in_month(CAL_GREGORIAN, 8, 2003);

// 方法二
function getDays($date){
    $days=date("t",strtotime($date));
    return $days;
}
$date="2018-11";
echo getDays($date);

// 方法三
function toTime($year,$month){ 
    $days = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];  
        if (2 == $month && 0 === ($year % 4) && (0 !== ($year % 100) || 0 === ($year % 400))) { 
            $days[1] = 29;  
        }  
        return ($days[$month - 1]);  
}
echo toTime(2019, 2);

4 请用 PHP 写出连接本地 MySQL ,Redis ,MongoDB的语句

MySQL 数据库为 dbtest,user:root,Passwore:123;mongdb 数据库为:mongotest,user:actia,passwored :123;

// MySQL(mysql)
$link = mysql_connect('127.0.0.1','root','123');

// MySQL(PDO)
$dbh = new PDO('mysql:dbtest;host=127.0.0.1','root','123');

// Redis
$redis = (new Redis())->connect('127.0.0.1', 6379);

// MongoDB(mongoDB)
$m = new MongoClient('mongodb://actia:123@127.0.0.1:27017/mongotest');

5 以下有两个表

user 表 字段 id(int),name(varchar)

score 表 字段 uid(int),subject(varchar),score(int)

score 表的 uid 字段与 user 表的 id 字段关联

要求写出以下sql语句

#1 在 user 表里新插入一条记录,在 score 表里插入与新加入的记录关联的记录
insert into `user` (name) values ('小王');
insert into `score` (uid,subject,score) value ((select id from `user` order by id desc limit 1),'英语',60);

#3 使用联合查询获取 name 为“张三”的用户的总分数。
select SUM(score) '总分' from `user` a,`score` b where a.name = '小明' and a.id = b.uid ;

#4 删除 name 为“李四”的用户,包括分数记录。
delete from `score` where uid = (select id from `user` a where a.name = '小明' limit 1);
delete from `user` where name = '小明';

#5 清空 score 表
truncate `user`;

#6 删除 user 表
drop table if exists `user`;

6 请问 cgi 和 fastcgi 有什么不同,你在什么情况下会选择哪个?

对于 CGI 来说,每一个 Web 请求 PHP 都必须重新解析 php.ini 、重新载入全部扩展,并重新初始化全部数据结构。而使用 FastCGI ,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接可以工作。

7 如果某段与数据库交互的程序运行较慢你将如何处理?怎么查看 SQL 运行效率?

一是首先提高数据库的查询速度,比如增加索引,优化表的结构。

二是优化程序代码,如果查询比较多,可以尽量用条件查询,减少查询语句,比如能用一条查询语句就不用两条。

三就是提高服务器的速度,优化服务器,把不必要的进程关掉。

在 SQL 语句前面加上 explain 就可以查看 SQL 运行效率了

8 用户在网站表单提交数据的时候,为了防止脚本攻击,PHP 端接收数据的时候,应该如何处理?防止SQL 注入漏洞一般用什么函数?

数字注入,对值进行强校验。字符串注入,限制字符串类型。

对字符串进行转义,addslashes()mysqli_set_charset()

预编译机制,

$stmt = mysqli_prepare($db,$sql);
mysqli_stmt_bind_param($stmt,'ss',$a,$b);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt,$id,$user_name);
mysqli_stmt_fetch($stmt);

9 Redis消息队列机制原理。

Redis的列表类型天生支持用作消息队列。

<?php
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
// 入队列
$v = '123';
$redis->rpush("mylist",$v);
// 出队列
$value = $redis->lpop('mylist');

10 对于大流量的网站,您采用什么样的方法来解决访问量问题?

这个问题,请参《PHP秒杀设计

11 假设给你5台服务器,请大致的描述一下,如何使用你所熟悉的开源软件,承载一个日 PV 300万左右的中型网站?

问题太抽象了,不同的网站,优化的侧重点都不一样。

客户层:页面静态化,CDN+OSS

接入层:一台用作反向代理、Reids服务器。

服务层:四台用作服务器层逻辑处理。

数据层:1托4,主从服务器。

12 负载均衡集群中如何现实 Session 共享。

使用一台 Redis 服务器,存放 session 信息。