好记性不如烂笔头


# 查看SSL延迟(命令中的w参数表示指定输出格式,time_connect变量表示TCP握手的耗时(秒),time_appconnect变量表示SSL握手的耗时(秒),s参数和o参数用来关闭标准输出)
curl -w "TCP handshake: %{time_connect}, SSL handshake: %{time_appconnect}\n" -so /dev/null https://www.baidu.com

# 终端下将 man 命令的结果输出到文件(以epoll为例)
man epoll | col -b > epoll.txt

# 内核优化相关
# 1. 查看所有默认配置
sysctl -a

# SCP
# 1. 从服务器上下载文件
scp username@servername:/path/filename /var/www/local_dir(本地目录)
# 2. 从服务器下载整个目录
scp -r username@servername:/var/www/remote_dir/(远程目录) /var/www/local_dir(本地目录)
# 3. 上传本地文件到服务器
scp /path/filename username@servername:/path
# 4. 上传目录到服务器
scp -r local_dir username@servername:remote_dir

# 计算机系统常见单位及换算

1 字节 = 8 位
单字 = 4 字节 = 32 位
双字 = 8 字节 = 64 位

bit : 位
byte: 字节
word: 字

K = 2 ^ 10 byte (2的10次方)
M = 2 ^ 20 byte
G = 2 ^ 30 byte
T = 2 ^ 40 byte
P = 2 ^ 50 byte
E = 2 ^ 60 byte

# composer
composer config vendor-dir library/vendor
composer require phpoffice/phpexcel:1.8

# firewalld 配置

systemctl status firewalld
firewall-cmd --state

# 列出所有区域(zones)
firewall-cmd --get-zones
# 查看默认区域
firewall-cmd --get-default-zone
# 设置默认区域,比如为home
firewall-cmd --set-default-zone=home
# 查看当前激活区域
firewall-cmd --get-active-zones

# 列出所有存在的服务
firewall-cmd --get-services
# 添加http服务至public区域
firewall-cmd --permanent --zone=public --add-service=http
# 删除public区域添加的http服务
firewall-cmd --permanent --zone=public --remove-service=http

# 添加端口
firewall-cmd --zone=public --add-port=8888/tcp --permanent
firewall-cmd --zone=public --add-port=8888/udp --permanent
# 删除端口
firewall-cmd --zone=public --remove-port=8888/tcp --permanent
firewall-cmd --zone=public --remove-port=8888/udp --permanent

# 添加端口转发
firewall-cmd --permanent --zone=public --add-masquerade
# 添加80转发到8080
firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=8080
# 删除80转发到8080
firewall-cmd --permanent --zone=public --remove-forward-port=port=80:proto=tcp:toport=8080
# # 添加443转发到8443
firewall-cmd --permanent --zone=public --add-forward-port=port=443:proto=tcp:toport=8443

# 重新加载配置
firewall-cmd --reload
# 列出所有以及应用的配置
firewall-cmd --list-all

# Mysql

# 1. 设置编码
SET NAMES UTF8;

# 2. 批量替换字段内容
update demoed set image=replace(image, 'http://demo.cn’, 'https://demo.org’) where 1 and image like 'http://demo.cn%’ limit 1;

# 3. mysqldump
# 3.1 导出整个数据库(包括数据库中的数据)
mysqldump -u username -p dbname > dbname.sql
# 3.2 导出数据库结构(不含数据)
mysqldump -u username -p -d dbname > dbname.sql
# 3.3 导出数据库中的某张数据表(包含数据)
mysqldump -u username -p dbname tablename > tablename.sql
# 3.4 导出数据库中的某张数据表的表结构(不含数据)
mysqldump -u username -p -d dbname tablename > tablename.sql
# 3.5 对数据进行还原 方法一
mysql -u username -p test_db < tablename.sql
# 3.5 对数据进行还原 方法二
mysql> source tablename.sql

# Git使用

# 1. 配置示例
git config --global user.email “example@163.com"
git config --global color.ui true
git config --global format.pretty 'format:"%h - %an, %ad: %s"'
git config --global format.pretty 'format:%Cred%h%Creset - %C(yellow)%d%Creset %Cgreen(%ad) %C(bold blue)<%an>%Creset %s'
git config --global log.date iso

# 2. 恢复单个文件的历史版本
git log demo.php  // 首先查看该文件的历史版本信息,记录下需要恢复的commit版本号:如 9aa51d897
git reset 9aa51d897 demo.php  //恢复该文件
git commit -m "revert old file" //提交git

# 3. 查看某行代码谁写的
git blame file_name
git blame -L 58,100 file_name  # 58~100 行代码
# 其输出格式为:
# commit_ID | 代码提交作者 | 提交时间 | 代码位于文件中的行数 | 实际代码
# 接着,根据 commit_ID 可以查看对应的提交记录
# git show commit_ID

# 4. 列出所有远程分支及最后commit时间并按时间排序
for branch in `git branch -r | grep -v HEAD`;do echo -e `git show --format="%ci %cr" $branch | head -n 1` \\t$branch; done | sort -r

# php中文字母表(A-Z)排序

foreach ($words as &$item) {
    $item = iconv('UTF-8', 'GBK//IGNORE', $item);
}
asort($words);
foreach ($words as &$item) {
    $item = iconv('GBK', 'UTF-8//IGNORE', $item);
}

# php 实时输出

# 1. 修改php-fpm.conf文件中 request_terminate_timeout 时间值
# 2. 通过set_time_limit修改 max_execution_time 时间值,如下:
set_time_limit(0);
# 3. 实时输出,让用户感知进度
# 3.1 设置php.ini中output_buffering=0
ob_end_clean();  # 关闭PHP缓存
ob_implicit_flush(); # 这个语句将强制每当有输出就自动刷新,相当于在每个echo后,调用ob_flush()
header('Content-Type: text/html; charset=utf-8');
header('X-Accel-Buffering: no');

# 离线安装pecl拓展

# 1. download pecl Tarball, eg:
wget http://pecl.php.net/get/yaf-3.0.7.tgz
# 2. pear进行安装,eg:
pear install yaf-3.0.7.tgz
# 3. 根据提示修改php.ini配置,eg: 增加一下内容
extension=yaf.so 

# shell脚本设置

# 写法一
set -euxo pipefail

# 写法二
set -eux
set -o pipefail

# 查看系统信息
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
free -m
df -h
du -sh `ls`

# 查看了linux系统版本
lsb_release -a

# 查看某个端口是否被占用
lsof -i:端口号

# 查看进程运行的完整路
ls -l /proc/PID  // 输出结果中:
                 // * cwd符号链接的是进程运行目录
                 // * exe符号连接就是执行程序的绝对路径
                 // * cmdline就是程序运行时输入的命令行命令
                 // * environ记录了进程运行时的环境变量
                 // * fd目录下是进程打开或使用的文件的符号连接

# 编程语言内置web服务器汇总

# 1. php
# 使用当前目录
php -S 0.0.0.0:4000
# 使用其他目录,比如 /home/www/test
php -S 0.0.0.0:4000 -t /home/www/test/

# 2. python
cd /home/www/test
python -m SimpleHTTPServer 8080

# 自动登录功能脚本示例

#!/usr/bin/expect -f
set timeout 30
spawn mysql -h 127.0.0.1 -P 3306 -uroot -p
expect "Enter password:"
send "\n"
set timeout 300

expect "Welcome to the MySQL"
send "SET NAMES UTF8;\n"
expect "mysql>"
send "show databases;\n"
expect "mysql>"
send "use test\n"
expect "mysql>"
send "show tables;\n"

interact {
    -reset \032 {
        send_user "expect exit!\n"
        exec kill -STOP [pid]
    }
}

# 后台任务

# 1. python无缓存输出
nohup python -u test.py > nohup.out 2>&1 &

# Sed字符串批量替换
sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录`

# 批量更改目录下(包括子目录)文件权限
find . -type f -exec chmod a-x {} \;
find . -type f -name "*.sh" -exec chmod a+x {} \;

# Tar打包、解包
tar -h -zcvf demo.tar.gz demo  // -h选项指明包括软链,下同
tar -h -zxvf demo.tar.gz

# 随机9个base64编码的字符串
openssl rand 9 -base64

# 保存vim编辑的没有权限的文件
# 详细原理 https://stackoverflow.com/questions/2600783/how-does-the-vim-write-with-sudo-trick-work
:w !sudo tee %

# 重排Mac Launchpad顺序
defaults write com.apple.dock ResetLaunchPad -bool true; killall Dock

# Mac应用权限开放
sudo spctl --master-disable