0xBoo

0xBoo 查看完整档案

深圳编辑  |  填写毕业院校Victory runing  |  伪全栈 编辑 www.0x2beace.com/ 编辑
编辑

Stay foolish, Stay hungry

个人动态

0xBoo 发布了文章 · 10月23日

MySQL Integer类型与INT(11)详解

MySQL支持的整数类型有TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT。

每种整数类型所需的存储空间和范围如下:

类型字节最小值(有符号)最大值(有符号)最小值(无符号)最大值(无符号)
TINYINT1-1281270255
SMALLINT2-3276832767065535
MEDIUMINT3-83886088388607016777215
INT4-2147483648214748364704294967295
BIGINT8-9223372036854775808(9223372036854775807018446744073709551615

有无限制的区别

在创建数据表时,通常会看见 int(11)int这样的写法,这两者有什么区别,各自又代表什么意思呢?

  1. 对应Integer 类型而言,仅表示字段的显示宽度。
  2. 对于DECIMAL类型,表示数字的总数。
  3. 对于字符字段,这是可以存储的最大字符数,例如VARCHAR(20)可以存储20个字符。

显示宽度并不影响可以存储在该列中的最大值。int(3)int(11) 所能存储的最大范围是一样的。

将某个字段设置成INT(20)并不意味着将能够存储20位数字,这个字段最终能存储的最大范围还是 INT 的范围。

示例

创建一张临时表:

CREATE TABLE tmp_table_a (
    id INT(3) NOT NULL AUTO_INCREMENT,
    name varchar(16) DEFAULT '' NOT NULL, 
    PRIMARY KEY (`id`)
);

查看表结构:

mysql> desc tmp_table_a;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(3)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(16) | NO   |     |         |                |
+-------+-------------+------+-----+---------+----------------+

插入超过"长度"的数字:

INSERT INTO tmp_table_a(id, name) VALUES(123456, "boo");

查看结果,发现数字并没有插入失败:

mysql> select * from tmp_table_a;
+--------+------+
| id     | name |
+--------+------+
| 123456 | boo  |
+--------+------+
1 row in set (0.00 sec)

有无符号的区别

那么问题来了,既然加不加数字并没有什么区别,那为什么还多此一举呢?

这是因为“正常”情况下确实没有什么区别,只有当字段设置为UNSIGNED ZEROFILL 属性时,为INT 增加数字才会有意义。

表示如果要存储的数字少于N 个字符,则这些数字将在左侧补零。

示例

创建一张 UNSIGNED ZEROFILL 的数据表:

CREATE TABLE tmp_table_b (
    id INT(3) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT,
    name varchar(16) DEFAULT '' NOT NULL, 
    PRIMARY KEY (`id`)
);

查看表结构:

mysql> desc tmp_table_b;
+-------+--------------------------+------+-----+---------+----------------+
| Field | Type                     | Null | Key | Default | Extra          |
+-------+--------------------------+------+-----+---------+----------------+
| id    | int(3) unsigned zerofill | NO   | PRI | NULL    | auto_increment |
| name  | varchar(16)              | NO   |     |         |                |
+-------+--------------------------+------+-----+---------+----------------+

插入记录:

INSERT INTO tmp_table_b(id, name) VALUES(1, "boo");

查看记录:

mysql> select * from tmp_table_b;
+-----+------+
| id  | name |
+-----+------+
| 001 | boo  |
+-----+------+

总结

  1. 对于Integer 类型而言,“数字”并不会限制其能存储的最大范围。
  2. 有无符号,不仅会限制其能存储的最大范围,还可以配置“数字”自动补零。

参考链接

查看原文

赞 0 收藏 0 评论 0

0xBoo 提出了问题 · 10月21日

Swoole 如何同时向多个客户端推送数据?

问题描述:
有一台服务器需要在本地启动一个 TCP 服务,并向外暴露一个端口。
该服务器会产生一些数据,提供给需要的客户端,客户端如果需要,就去主动连接该服务器。

需求如下:

  1. 当客户端连接成功后,才会向该客户端推送数据。
  2. 当客户端断开连接时,停止向该客户端推送数据。
  3. 允许多个客户端同时连接。
  4. 因为数据源是不间断的,理论上只要客户端的连接不主动断开,服务端的数据推送就不会主动停止。

服务端伪代码如下:

<?php
// 监听服务端 9503 端口 
$server = new Swoole\Server("0.0.0.0", 9503);

/**
 * 监听连接进入事件
 */
$server->on("Connect", function ($server, $fd){
    while(true){
       // todo (获取数据)
        
       // 向客户端推送数据
       $server->send($fd, $data);
    };    
});

/**
 * 监听数据接收事件
 */
$server->on("Receive", function ($server, $fd, $from_id, $data){
    ...
});

/**
 * 监听连接关闭事件
 */
$server->on('Close', function ($server, $fd) {
    ...
});

// 启动 TCP 服务器
$server->start();

请问这个场景怎样处理更合适一些?

关注 2 回答 1

0xBoo 发布了文章 · 10月20日

PHP 常见浮点数操作

浮点数操作在实际应用中还是挺多的,这篇笔记用来整理常见操作。

保留N位小数做四舍五入

想要保留N 位小数同时做四舍五入的方式还是挺多的,下面列举常用的几种。

sprintf

sprintf 函数用于返回一个格式化之后的字符串。

<?php
$num = 22.356;
echo sprintf("%.2f", $num); // 22.36

%.2f 是目标格式,其中2 表示2 位,f表示视为浮点数。

round

round 函数用于对浮点数进行四舍五入。

还可以通过传入参数,决定从第几位开始四舍五入。如果没有参数,默认从小数点后一位开始四舍五入。

<?php
echo round(3.4);         // 3
echo round(3.5);         // 4
echo round(22.356, 2);   // 22.36

保留N位小数不做四舍五入

<?php
$num = 22.356;
echo sprintf("%.2f",substr(sprintf("%.3f", $num), 0, -1));  // 22.35

获取小数位长度

<?php
$num = 22.356;
echo strlen(substr(strrchr($num, "."), 1));  // 3
查看原文

赞 1 收藏 1 评论 0

0xBoo 发布了文章 · 10月17日

对于null、空、0、false等数据类型的理解

之所以决定写这片笔记,是因为一直对 空 这个概念很模糊,在代码逻辑中常会遇到需要判断的时候,总是模拟两可。

常见的“空”有以下这些:

  • 整形0:0
  • 字符1:1
  • 字符空:""
  • 字符零:"0"
  • 空数组:[]
  • true
  • false
  • null

NUll 上面的那些都好理解,都是常见的,重点介绍一下NULL。

NULL 是什么?

Null是在计算机具有保留的值,可以用于指针不去引用对象,现在很多程序都会使用指针来表示条件,但是在不同的语言中,含义是不一样的。

这里我们只介绍 PHP 中的 NULL。

在 PHP 中,表示一个变量没有赋值、或者是被赋值的值为 NULL,以及被 unset 的。

使用PHP 函数对变量进行比较:

表达式gettype()empty()is_null()isset()boolean : if($x)
$x = "";stringTRUEFALSETRUEFALSE
$x = null;NULLTRUETRUEFALSEFALSE
var $x;NULLTRUETRUEFALSEFALSE
$x is undefinedNULLTRUETRUEFALSEFALSE
$x = array();arrayTRUEFALSETRUEFALSE
$x = false;booleanTRUEFALSETRUEFALSE
$x = true;booleanFALSEFALSETRUETRUE
$x = 1;integerFALSEFALSETRUETRUE
$x = 42;integerFALSEFALSETRUETRUE
$x = 0;integerTRUEFALSETRUEFALSE
$x = -1;integerFALSEFALSETRUETRUE
$x = "1";stringFALSEFALSETRUETRUE
$x = "0";stringTRUEFALSETRUEFALSE
$x = "-1";stringFALSEFALSETRUETRUE
$x = "php";stringFALSEFALSETRUETRUE
$x = "true";stringFALSEFALSETRUETRUE
$x = "false";stringFALSEFALSETRUETRUE

松散判断 ==

TRUEFALSE10-1"1""0""-1"NULLarray()"php"""
TRUETRUEFALSETRUEFALSETRUETRUEFALSETRUEFALSEFALSETRUEFALSE
FALSEFALSETRUEFALSETRUEFALSEFALSETRUEFALSETRUETRUEFALSETRUE
1TRUEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSE
0FALSETRUEFALSETRUEFALSEFALSETRUEFALSETRUEFALSETRUETRUE
-1TRUEFALSEFALSEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSEFALSE
"1"TRUEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSE
"0"FALSETRUEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSE
"-1"TRUEFALSEFALSEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSEFALSE
NULLFALSETRUEFALSETRUEFALSEFALSEFALSEFALSETRUETRUEFALSETRUE
array()FALSETRUEFALSEFALSEFALSEFALSEFALSEFALSETRUETRUEFALSEFALSE
"php"TRUEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSE
""FALSETRUEFALSETRUEFALSEFALSEFALSEFALSETRUEFALSEFALSETRUE

严格比较 ===

TRUEFALSE10-1"1""0""-1"NULLarray()"php"""
TRUETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
FALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
1FALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
0FALSEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
-1FALSEFALSEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
"1"FALSEFALSEFALSEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSE
"0"FALSEFALSEFALSEFALSEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSE
"-1"FALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSEFALSEFALSEFALSE
NULLFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSEFALSEFALSE
array()FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSEFALSE
"php"FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSE
""FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUE

参考链接

PHP 类型比较表

查看原文

赞 0 收藏 0 评论 0

0xBoo 发布了文章 · 10月16日

当 Docker 容器无法正常启动时如何修改配置文件?

在容器无法正常启动的情况下,如何修改其配置文件?

问题描述:因为错误的配置文件导致容器运行异常,无法正常启动,通常情况下只有进入容器才能修改配置文件,所以在不能进入容器的情况下该怎么办呢?

这种情况下,有两种方式去修改:

  1. Docker 容器的配置文件一般在 /var/lib/docker/overlay/目录下,可以找到该目录下对应的配置文件进行修改。
  2. 把容器中的配置文件复制到主机中,修改完之后,再移动到容器中。

方式一

  1. 查询日志
docker logs <容器名称/容器id>

ERROR: mysqld failed while attempting to check config
command was: "mysqld --verbose --help"
2020-09-03T12:15:54.644699Z 0 [ERROR] unknown variable 'realy-log=slave-relay-bin'
2020-09-03T12:15:54.650119Z 0 [ERROR] Aborting

由于异常日志可以得知是因为我将relay-log 写成了 realy 导致容器无法正常启动。

  1. 查找文件
$ find / -name mysqld.cnf

/var/lib/docker/overlay2/02e1644bc1a4dc1adc9a0300e1815f364416570d69b715fb3b7de0a06cf0c495/diff/etc/mysql/mysql.conf.d/mysqld.cnf
/var/lib/docker/overlay2/02e1644bc1a4dc1adc9a0300e1815f364416570d69b715fb3b7de0a06cf0c495/merged/etc/mysql/mysql.conf.d/mysqld.cnf
/var/lib/docker/overlay2/4f128d7fb1200f722b0d2cfe3606149fe72987a7a16bc78551a2b1fe6c6c6572/diff/etc/mysql/mysql.conf.d/mysqld.cnf
/var/lib/docker/overlay2/a68f1af4adf982b037f1bd37d61082fde1fa2b0e26ea0e2fe146edcb69b198ea/diff/etc/mysql/mysql.conf.d/mysqld.cnf

这里可能会出现多个配置文件,这是因为每一次重启Mysql 容器都会保留一个配置文件,所以理论上,直接修改第一个配置文件,就是当前Mysql 所使用的配置文件。

  1. 修改配置文件
  2. 重启容器即可。

方式二

如果第一种方式没生效,那可以尝试第二种方式。

  1. 复制容器中的配置文件到主机:
# 语法:docker cp <容器名称/容器id>:<配置文件在容器中的路径> <需要复制到主机的路径>

$ docker cp mysql:/etc/mysql/mysql.conf.d/mysqld.cnf ~/mysqld.cnf
  1. 修改主机中的配置文件
  2. 将该配置文件mv 到容器中:
# 语法:docker cp <配置文件在主机中的路径> <容器名称/容器id>:<配置文件在容器中的路径>

$ docker cp ~/mysqld.cnf mysql:/etc/mysql/mysql.conf.d/mysqld.cnf  
  1. 重启配置文件即可。

总结:两种方式均可以有效解决上述问题,当然这类方式仅适用于容器是因错误的配置文件导致无法正常启动的情况。

参考链接

查看原文

赞 0 收藏 0 评论 0

0xBoo 发布了文章 · 10月15日

关于 Markdown 的一些技巧

这篇笔记的目的是整理Markdown 的一些不常用,却又十分有用的小技巧。

什么是Markdown?

Markdown 是一种轻量级标记语言,创始人为约翰·格鲁伯。它允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML文档。这种语言吸收了很多在电子邮件中已有的纯文本标记的特性。 —— 维基百科

Markdown 高级技巧

在Markdown 中,可以直接插入 HTML,目前支持的HTML 元素有:

  • <kbd>
  • <b>
  • <i>
  • <em>
  • <sub>
  • <sup>
  • <br>

键盘标签

可以使用<kbd>标签使文本看起来像按钮,这与常规反引号文本略有不同。

Copy code with Control + C

可视化差异

可以使用反引号可视化差异,并diff根据需要突出显示红色或绿色的线。

10 PRINT “BASIC IS COOL”
- 20 GOTO 11
+ 20 GOTO 10

隐藏不必要的输出

添加冗长的错误日志或冗长程序输出的问题可以解决的错误有帮助的,但如果它占用页的垂直空间,可以考虑使用<details><summary>标签。

<details>
<summary>git clone 成功,点击查看详情信息</summary>
<pre>
Cloning into 'php-markdown-blog'...
remote: Enumerating objects: 67, done.
remote: Counting objects: 100% (67/67), done.
remote: Compressing objects: 100% (55/55), done.
remote: Total 67 (delta 12), reused 59 (delta 7), pack-reused 0
Unpacking objects: 100% (67/67), done.
</details>

<details>
<summary>git clone 成功,点击查看详情信息</summary>
<pre>
Cloning into 'php-markdown-blog'...
remote: Enumerating objects: 67, done.
remote: Counting objects: 100% (67/67), done.
remote: Compressing objects: 100% (55/55), done.
remote: Total 67 (delta 12), reused 59 (delta 7), pack-reused 0
Unpacking objects: 100% (67/67), done.
</details>

使图像文字居中

HTML 中的<div align="center"> 居然可以神奇的应用在 Markdown 中,然所有内容居中。

<div align="center">
![](https://octodex.github.com/images/dunetocat.png)
<p>This is some centered text.</p>
</div>

<div align="center">

<p>This is some centered text.</p>
</div>

较小的文字

使用<sub><sup>标签,可以使文字变小,非常适合在图像下面添加描述。

<div align="center">
![](https://octodex.github.com/images/megacat-2.png)<br>
<sup><strong>Fig 1:</strong> Megatocat into action</sup>
</div>
View more octocats on the [Octodex](https://octodex.github.com/)!

<div align="center">


Fig 1: Megatocat into action
</div>

View more octocats on the Octodex

参考链接

查看原文

赞 0 收藏 0 评论 0

0xBoo 发布了文章 · 10月14日

PHP-FPM 配置初始化

php-fpm(FastCGI Process Manger)是一个PHP FastCGI 管理器,专门和Nginx 的 ngx_fastcgi_modul模块对接,用来处理动态请求。

初始化

当安装了PHP 之后,可以从以下三个方向来对默认配置进行修改,以达到优化的效果。

1. 核心配置文件

核心配置文件其实就是 php.ini,该配置文件的作用通常是用来启用或禁用第三方模块,及修改PHP 时区等。

# vim /usr/local/etc/php/php.ini

date.timezone = Asia/Shanghai

2. 全局配置文件

全局配置文件php-fpm.conf,通常用来配置一些辅助性功能。

# vim /usr/local/etc/php-fpm.conf

error_log = /var/log/php-fpm/error.log
log_level = notice
;process_max = 0
deamonize = yes

参数解析:

  • error_log:错误日志路径
  • log_level:日志级别,默认为notice

    • alert:必须立即处理
    • error:错误情况
    • warning:警告情况
    • notice:一般重要信息
    • debug:调试信息
  • process_max:控制最大子进程数的全局变量,不建议设置具体数量,因为会限制扩展配置。
  • daemonize:是否开启守护进程,默认为yes

通常不会在php-fpm.conf中设定 process_max,因为会限制www.conf中的配置。

3. 扩展配置文件

扩展配置文件www.conf通常是与php-fpm服务相关的配置,大部分优化都是需要更改这个配置文件。

# vim /usr/local/etc/php-fpm.d/www.conf

listen = 127.0.0.1:9000
slowlog = /var/log/php-fpm/www-slow.log

# 这里按照10G 的空闲内存去设定
pm = dynamic
pm.start_servers = 16
pm.max_children = 256
pm.min_spare_servers = 16
pm.max_spare_servers = 32
pm.max_requests = 1000

参数解析:

  • listen:有两种方式可以进行通讯。

    • socketunix:/run/php/php7.3-fpm.sock
    • http127.0.0.1:9000 因为php-fpmngx_fastcgi_modul的通讯方式是 9000端口,所以默认是 127.0.0.1:9000
  • slowlog:慢查询日志路径
  • pm:进程管理方式

    • static:静态模式。始终保持固定数量的子进程数,配合最大子进程数一起使用,这个方式很不灵活,通常不是默认。

      • pm.max_children:最大子进程数。
    • dynamic:动态模式。按照固定的最小子进程数启动,同时用最大子进程数去限制。

      • pm.start_servers:默认开启的进程数
      • pm.min_spare_servers:最小空闲的进程数
      • pm.max_spare_servers:最大空闲的进程数
      • pm.max_children:最大子进程数
      • pm.max_requests:每个进程能响应的请求数量,达到此限制之后,该PHP 进程就会被自动释放掉。
    • nodaemonize:每个进程在闲置一定时候后就会被杀掉。

      • pm.max_children:最大子进程数
      • pm.process_idle_timeout:在多少秒之后,一个空闲的进程将会被杀死

注意:max_children 是 PHPFPM Pool 最大的子进程数,它的数值取决于服务器实际空闲内存。

假设你有一台10G 运行内存的服务器,我们知道一个空闲的PHP 进程占用的是 1M 内存,而一个正在处理请求的PHP 进程 大概会占用10M-40M内存,这里按照每个PHP 请求占用 40M 内存,那么max_children = 10*1024M/40M = 256,所以这个值得根据实际环境而设定。

以上就是php-fpm 初始化配置的核心部分了。

查看原文

赞 1 收藏 1 评论 0

0xBoo 发布了文章 · 10月11日

在 Linux 命令行中执行和使用 PHP 代码

众所周知,PHP是一门脚本语言,主要用于服务端(JavaScript 用于客户端)以通过HTTP 生成动态网页。

所以与其他脚本语言一样,可以直接在终端中不需要网页浏览器来运行PHP 代码。

获取安装信息

在安装完PHP 以及Nginx 之后,接下来我们通常需要做的是,在/usr/local/var/www (Mac 上的Nginx 工作目录)上创建一个内容为<?php phpinfo(); ?>,名为index.php的文件来测试PHP 是否安装正确。

执行以下命令即可:

# echo '<?php phpinfo(); ?>' > /usr/local/var/www/index.php

然后,使用浏览器访问http://127.0.0.1/index.php,不出意外可以看到:

如何在终端中直接查看该信息?
# php -f /usr/local/var/www/index.php | less

如果你觉得上面这种方式太麻烦了,那么还有一种更简便的方式可以达到同样的效果。

# php -r 'php phpinfo();' | less

交互模式

有时候我们会遇到这样一种情况,想测试一小段代码,看看其运行结果,但是又不想重新创建一个文件,太麻烦了。

如果这个时候有一个地方可以直接运行这段代码且输出结果,那该多好啊。

PHP 为我们提供了两种交互模式,前者是自动的,后者是手动的。

  1. Interactive shell
  2. Interactive mode enabled

两种模式都是使用 php -a 命令进入。

Interactive shell

使用这个交互式shell,你可以直接在命令行窗口里输入PHP并直接获得输出结果。

$ php -a
Interactive shell

php >echo "Hello PHP";
Hello PHP
php > echo 10+90;
100

回车即可查看输出内容。

Interactive mode enabled

$ php -a
Interactive mode enabled

php >echo "Hello PHP";

如果出现的是这个模式,说明你的PHP并不支持交互式shell,

不过不用担心,这个模式同样也可以执行PHP 代码,只是代码的执行方式有些区别。

输入了所有PHP代码后,输入Ctrl-Z(windows里),或输入Ctrl-D(linux里),你输入的所有代码将会一次执行完成并输出结果。

输入exit或者⌃ + c 退出交互模式。

PHP 脚本

在终端中可以把PHP 脚本作为Shell 脚本来运行。

首先你需要创建一个PHP 脚本文件:

# echo -e '#!/usr/bin/php\n<?php phpinfo();?>' > phpscript.php

-e 表示激活转义字符。

注意,这个脚本文件中的第一行#!/usr/bin/php,就像是Shell 脚本中的#!/bin/bash。目的是告诉Linux 命令行使用PHP 解析器来解析该文件。

运行该脚本:

# chmod +x phpscript.php  // 使脚本具有执行权限
# ./phpscript.php   //执行脚本

PHP 服务

PHP 有内置一个WebServer,可以很方便快速的搭建一个PHP 服务。

$ php -t /project to path -S localhost:port

然后通过浏览器访问localhost:port 就可以了。

总结

  • php -a:进入交互模式
  • php -f:解析和执行文件
  • php -h:获取帮助
  • php -i:查看PHP 信息和配置
  • php -m:显示已经安装的模块
  • php -r:运行PHP代码不使用脚本标签'<?..?>'
  • php -v:查看PHP 版本
  • php -ini:查看加载配置文件(php.ini、conf.d)
  • php -i | grep configure:查看静态编译模块
  • php --ri swoole:查看指定模块的配置

参考链接

查看原文

赞 0 收藏 0 评论 0

0xBoo 提出了问题 · 10月9日

解决根据业务场景寻找合适解决方案(PHP)?

系统环境:

  • Linux
  • PHP 7.3
  • ThinkPHP 6

先说一下业务场景:

  1. 订单创建成功之后,每一笔订单都需要进行统计及其他业务处理。
  2. 如何及时发现处理失败的订单,然后进行补单处理。
  3. 订单所产生佣金的处理。

要解决以上问题,最简单的办法就是通过脚本定时去扫表处理。

但是扫表存在一些问题:

  1. 长时间与数据库保持连接进行查询操作,消耗服务器资源。
  2. 在数据量较大或者延时较高的情况下,不能及时处理完,会影响其他业务。

想请教一下,这个场景适合用什么方案去解决?

关注 5 回答 4

0xBoo 发布了文章 · 9月30日

如何修改 Linux 默认时区

在上一篇笔记中,我们知道了如何在Linux 中查看系统默认时区,这篇笔记来学习以下如何修改默认时区。

在Linux 服务器或系统上保持正确的时间始终是一个好习惯,它可能具有以下优点:

  • 由于Linux 中的大多数任务都是按时间控制的,因此可以保持系统任务的及时运行。
  • 在系统上记录事件和其他信息的正确时间等等。

在Linux 中设置时区,有几种方式。

0x1. 使用tzselete 命令

  1. 使用tzselete 命令选择所在时区。
  2. 将时区所在的配置文件TZ='Asia/Shanghai'; export TZ 添加到~/.profile文件。
  3. 使用source ~/.profire命令,使时区设置生效。

0x2. 使用timedatectl 命令

Ubuntu 系统提供了timedatectl 命令,非常方便的供我们查看设置Linux 系统时区。

$ timedatectl set-timezone "Asia/ShangHai"

如果你忘记了你想要的时区叫什么名字,那么可以使用下面的命令查看所有可用时区:

$ timedatectl list-timezones

因为 Linux 的时间分为两种:

  1. 硬件时间:由 BIOS(或CMOS)所负责。
  2. 系统时间:由 Linux 所负责,系统时间在系统开关机后读取硬件时间后,再由 Linux 管理时间。

0x3. 设置硬件时间

$ ls -al | grep localtime
lrwxrwxrwx  1 root root         27 Jul 24 00:57 localtime -> /usr/share/zoneinfo/Etc/UTC

可以看到默认链接的是UTC,所以需要手动更改链接时区文件。

$ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 

查看硬件时间

$ hwclock -r

将系统时间改为硬件时间

$ hwclock --hctosys

需要想清楚的是,时间戳本身是永远不变的,无论在哪个时区同一时刻所生成的时间戳一定是一样的。

会发生变化的只有时区,而时间戳则是根据时区的不同而解析出来的时间不同。

参考链接

查看原文

赞 0 收藏 0 评论 0

认证与成就

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

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2018-06-28
个人主页被 330 人浏览