PHP 的 __call 和 __callStatic

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Foo
{
public function __call($name, $arguments)
{
echo 1;
}

public static function __callStatic($name, $arguments)
{
echo 2;
}

public function bar()
{
Foo::abc();
}
}

(new Foo)->bar();

结果是 1 还是 2?答案是 1

接下来解释一下:

  1. __call 方法关注方法能否被访问到,而不仅仅是关注是否存在
  2. __callStatic 方法关注的是方法能否被静态的访问到,而不是关注方法是否存在,是否是静态方法。
  3. 具体执行 __call__callStatic ,是根据调用的上下文。如
PHP

博客迁移公告

很不幸,因为VPS忘记续费,博客的资料没有备份,导致博客资料丢失。
经过深思熟虑,觉得将博客迁移至GitHub,丢失的文章和资料我尽量找回。

如何正确的计算每 N 分钟记录数

表结构

字段 数据类型
id int(11)
created_at datetime

期望结果

时间段 数量
2019-09-29 12:00:00 ~ 2019-09-29 12:05:00 100
2019-09-29 12:05:00 ~ 2019-09-29 12:10:00 120
2019-09-29 12:10:00 ~ 2019-09-29 12:15:00 131
2019-09-29 12:15:00 ~ 2019-09-29 12:20:00 189
2019-09-29 12:20:00 ~ 2019-09-29 12:25:00 134
2019-09-29 12:25:00 ~ 2019-09-29 12:30:00 155
2019-09-29 12:30:00 ~ 2019-09-29 12:35:00 198
2019-09-29 12:35:00 ~ 2019-09-29 12:40:00 133

SQL语句

1
2
3
4
5
6
-- 300 为 5 分钟
select
concat(from_unixtime(unix_timestamp(created_at) - unix_timestamp(created_at) % 300), ' ~ ', from_unixtime(unix_timestamp(created_at) - unix_timestamp(created_at) % 300 + 300)) as per,
count(1)
from table
group by per;

如果 created_at 类型为 int,还可以减少一次转换

1
2
3
4
5
6
-- 300 为 5 分钟
select
concat(from_unixtime(created_at - created_at % 300), ' ~ ', from_unixtime(created_at - created_at % 300 + 300)) as per,
count(1)
from table
group by per;

思路

时间分片 MySQL没有相关的时间分片函数,还好可以用取模(%)实现

如何正确的使用 GitHub Actions 实现 Hexo 博客的 CICD

CI/CD (continuous integration and continuous deployment)

最近同事分享了 GitHub Actions ,发现除了我们常听到的自动部署(项目上线)外还可以做很多事情,比如说就可以自动生成 Hexo 博客,我擦!这不就是我想要的吗?以后就不用每次写完文章之后再执行 hexo clean && hexo g -d 了。

回来各种百度,有几篇针对 HEXO 的文章,照着开始写脚本,发现怎么都不能成功,各种错误。折腾了 3 个小时,终于顺利通过了。

crontab几个特殊字符的含义

含义

字符 含义
* 全部。意思是在该时间的任意点都应当执行
? 不指定,任意。仅用于 日(月)和日(周)。0 0 5 * ? 代表每个月的第5天零点,不论星期几。
0 0 ? * 1 代表每周一,不论是当月的哪天。
, 多个值的分隔符,例如1,5,10 - 代表连续值,例如1-20
/ 步长。例如 5/15,代表从5开始,以15为步长。因此,当5/15位于分钟的位置时,表示小时内的第5、20、35和50分钟
L 最后一天。可以是每月最后一天或者每周最后一天。如果用在 天(周)字段,并且前面加数字,则表示最后一个周N。例如5L,表示最后一个周五(5表示周五,L表示最后)。
W 工作日,指周一到周五的任意一天
# 表示第几个的意思,例如 6#3,表示当月第3个星期六(6表示周六,3表示第3个)

例子

1
2
* 0 9 5L 最后一个周五早上9点
* 0 9 6#3 第三个周五

2019如何更新packagist github-hook

去年(2018)Packagist 就有提醒:

This package is using the legacy GitHub service and will stop being auto-updated in early 2019. Please set up the new GitHub Hook for Packagist so that it keeps working in the future.

大概意思是旧的 GitHub WebHook 被放弃了,请大家更新最新版,目前网上没有比较详细的说明,自己摸索了一下:

  1. 打开 https://packagist.org/profile/edit ,看是否绑定了 GitHub Account ,如果没有直接绑定。如果绑定过,解除重新绑定(因为要重新授权)。
  2. 打开 https://github.com/your-github-account/your-project/settings/hooks ,删除旧的 WebHook(Don’t ask why,just do it)。
  3. 回到 https://packagist.org/profile/ ,点击 retry hook sync 重新同步 WebHook。
  4. 再次查看 GitHub WebHook 的时候发现已经自动配置好了,packagist 对应的项目页面也没有 WebHook 相关提示了。

发布新的 package 也只需要点击 retry hook sync 就可以自动绑定了,不需要手动添加。

10个常见的Redis面试"刁难"问题

导读:在程序员面试过程中Redis相关的知识是常被问到的话题。作为一名在互联网技术行业打击过成百上千名的资深技术面试官,本文作者总结了面试过程中经常问到的问题。十分值得一读。

作者简介:钱文品(老钱),互联网分布式高并发技术十年老兵,目前任掌阅科技资深后端工程师。熟练使用 Java、Python、Golang 等多种计算机语言,开发过游戏,制作过网站,写过消息推送系统和MySQL 中间件,实现过开源的 ORM 框架、Web 框架、RPC 框架等

Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行各种刁难。作为一名在互联网技术行业打击过成百上千名【请允许我夸张一下】的资深技术面试官,看过了无数落寞的身影失望的离开,略感愧疚,故献上此文,希望各位读者以后面试势如破竹,永无失败!