shell

shell 中的判断

  1. 字符串判断

str1 = str2     当两个串有相同内容、长度时为真
str1 != str2    当串str1和str2不等时为真
-n str1       当串的长度大于0时为真(串非空)
-z str1       当串的长度为0时为真(空串)
str1         当串str1为非空时为真

  1. 数字的判断

int1 -eq int2    两数相等为真
int1 -ne int2    两数不等为真
int1 -gt int2    int1大于int2为真
int1 -ge int2    int1大于等于int2为真
int1 -lt int2    int1小于int2为真
int1 -le int2    int1小于等于int2为真

-n “$var” 判断一个变量是否有值

3 文件的判断

-r file     用户可读为真
-w file     用户可写为真
-x file     用户可执行为真
-f file     文件为正规文件为真
-d file     文件为目录为真
-c file     文件为字符特殊文件为真
-b file     文件为块特殊文件为真
-s file     文件大小非0时为真
-t file     当文件描述符(默认为1)指定的设备为终端时为真

3、复杂逻辑判断

-a         与
-o        或
!         非

ssh保持链接

Client configuration

Try creating the file: ~/.ssh/config
Add the contents:

1
2
3
Host *
ServerAliveInterval 30
ServerAliveCountMax 5

Server configuration

Edit configuration file: /etc/ssh/sshd_config

1
2
ClientAliveInterval 20
ClientAliveCountMax 5

快速搭建vpn

VPS端一键安装Shadowsocks (SS Python版一键安装脚本支持CentOS 6,7,Debian所有版本,Ubuntu所有版本),

1
2
3
wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks.sh
chmod +x shadowsocks.sh
./shadowsocks.sh 2>&1 | tee shadowsocks.log

中间会提示输入SS SERVER使用的端口和连接密码。不输入则是系统默认.

安装完成后,脚本提示如下(记得记录下来):
Congratulations, shadowsocks install completed!
Your Server IP:your_server_ip
Your Server Port:your_server_port
Your Password:your_password
Your Local IP:127.0.0.1
Your Local Port:1080
Your Encryption Method:aes-256-cfb

看到以上提示后就表明VPS上SS已经安装成功,并且已经设置了开机启动,VPS重启后不用手工启动SS。
到此就安装成功可以科学上网了

卸载方法:
使用root用户登录,运行以下命令:

1
./shadowsocks.sh uninstall

单用户配置文件 Sample:
配置文件路径:/etc/shadowsocks.json

1
2
3
4
5
6
7
8
9
10
{
"server":"0.0.0.0",
"server_port":8989,
"local_address":"127.0.0.1",
"local_port":1080,
"password":"yourpassword",
"timeout":300,
"method":"aes-256-cfb",
"fast_open": false
}

多用户多端口配置文件 Sample:
配置文件路径:/etc/shadowsocks.json
```
{
“server”:”0.0.0.0”,
“local_address”:”127.0.0.1”,
“local_port”:1080,
“port_password”:{
“8989”:”password0”,
“9001”:”password1”,
“9002”:”password2”,
“9003”:”password3”,
“9004”:”password4”
},
“timeout”:300,
“method”:”aes-256-cfb”,
“fast_open”: false
}

使用命令:
启动:/etc/init.d/shadowsocks start
停止:/etc/init.d/shadowsocks stop
重启:/etc/init.d/shadowsocks restart
状态:/etc/init.d/shadowsocks status

那些配置

phpstorm 外部工具

Open Project With Subline
subl
$ProjectFileDir$
$ProjectFileDir$

Open File With Sublime
subl
$FilePath$:$LineNumber$
$ProjectFileDir$

PHP CS Fixer
/usr/local/bin/php-cs-fixer
–level=psr2 –verbose fix $FileDir$/$FileName$
$ProjectFileDir$

从连接中使用subl打开所连接文件

https://github.com/dhoulb/subl.git

接替app端的请求

电脑安装抓包工具(使用charles/fiddler)

同个局域网内,配手机代理,让手机的请求统统都要经过你的电脑

改电脑的hosts

1
2
3
192.168.0.100 test.api.entimm.com
# 反向代理用的
127.0.0.1 api.entimm.com

最后上nginx的反向代理

1
2
3
4
5
6
7
8
9
10
11
server {
listen 80;
listen [::]:80;
server_name api.entimm.com;
location / {
proxy_pass http://test.api.entimm.com;
}
}

搞定!

快速搭建服务器

下载 deploy.sh 脚本

14.04安装脚本
wget https://raw.githubusercontent.com/summerblue/laravel-ubuntu-init/master/deploy.sh

16.04安装脚本
wget https://raw.githubusercontent.com/summerblue/laravel-ubuntu-init/master/deploy-16.sh

设置 MYSQL 密码

vi deploy.sh:

1
2
3
4
# Configure
MYSQL_ROOT_PASSWORD=""
MYSQL_NORMAL_USER="estuser"
MYSQL_NORMAL_USER_PASSWORD=""

开始安装

有需要的话可以使用网易镜像加速:
wget http://mirrors.163.com/.help/sources.list.trusty -O /etc/apt/sources.list

运行脚本:

1
2
chmod +x deploy.sh
./deploy.sh

注:请使用 root 运行。

安装完以后的配置和注意事项

php tips

  • explode 分割字符可以不是单字符

  • 强制类型转换的值不论是否有定义,转换后都会有值

  • E_ALL ^ E_NOTICE 和 E_ALL & ~E_NOTICE 是等效的

  • 无论是函数调用还是文件包含,像 FILE 这种变量,他写在哪个文件,那么他的值就在哪个文件,而不受调用者影响

  • 静态变量是在编译时解析的,不能跟表达式,比如:static $int = sqrt(121)

  • 子类重载父类的属性和方法时,可见性不能比父类小

  • 自 PHP 5.4 起可用 callable 类型指定回调类型 callback

    1. 一个 PHP 的函数以 string 类型传递其名称。可以使用任何内置或用户自定义函数,但除了语言结构例如:array(),echo,empty(),eval(),exit(),isset(),list(),print 或 unset()

    2. 一个已实例化的对象的方法被作为数组传递,下标 0 包含该对象,下标 1 包含方法名

    3. 静态类方法也可不经实例化该类的对象而传递,只要在下标 0 中包含类名而不是对象。自 PHP 5.2.3 起,也可以传递 ‘ClassName::methodName’

    4. 也可传递 closure 给回调参数

  • 对浮点数,数字字符串,纯字母都能进行自增/减运算,对其他类型的值进行自增/减运算不会产生什么效果

  • call_user_func_array 如果回调函数默认设置需要接受的参数是引用传递的时候,按值传递,结果将会输出一个警告, 这时数组参数中的参数需要按引用传递

  • call_user_func 如果回调函数默认设置需要接受的参数是引用传递的时候,无论怎样传参都无法满足

  • 常量NAMESPACE的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串

  • 关键字 namespace 可用来显式访问当前命名空间或子命名空间中的元素。它等价于类中的 self 操作符
  • 命名空间不会因为被包含而影响其在包含文件中的使用方式

  • mysqli::real_escape_string 相比 addslashes 会针对真实数据库环境的字符集做出更好的处理,但是必须在建立数据库链接的基础上

  • 字符串类型变量可以直接当做一个数组,通过数字下面来访问字符串中的字符或者是通过 str_split 函数把字符串分割成单字符数组

那些有趣的代码片段

1
2
3
function multi ($a, $b) {
$b = is_array($b) ? $b : array_slice(func_get_args(), 1);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function incr()
{
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
incr();
}
echo $count;
$count--;
}
incr();
// 结果输出:1234567891010987654321

不使用临时变量,交换2数的数值
下面三种方法不能对自身进行交换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 不仅对数字有效,对字符串也是有效的
function swap1(&$x, &$y)
{
$x = $x ^ $y;
$y = $x ^ $y;
$x = $x ^ $y;
}
// 当心越界
function swap2(&$x, &$y)
{
$x = $x + $y;
$y = $x - $y;
$x = $x - $y;
}
// 当心越界、第二个数不能为0
function swap3(&$x, &$y)
{
$x = $x * $y;
$y = $x / $y;
$x = $x / $y;
}

命名空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
namespace Myns;
class Test
{
}
// ok
new namespace\Test;
// ok
new Test;
// ok
$a = __NAMESPACE__ . '\Test';
new $a;
// ok
$a = 'Myns\Test';
new $a;
// failed, Class 'Myns\Myns\Test' not found
new Myns\Test;

这样的自增运算

1
2
3
4
5
6
7
8
9
10
11
<?php
$i1 = 0;
$i2 = 0;
$a= ++$i1 + ++$i1 + ++$i1;
$b= $i2++ + $i2++ + $i2++;
echo $a;
echo PHP_EOL;
echo $b;
// result:
// 6
// 3

安全两个原则

  1. 永远不要相信用户输入的东西。
  2. 将自己需要输出的数据进行转义。

对象的另一种理解

tmux使用

基本使用

<prefix>$可以重命名当前Session
<prefix>c可以创建新的窗口(Window)
<prefix>%水平分割窗口(形成两个Pane)
<prefix>"垂直分割窗口。退出当前Session的快捷键是<prefix>d

在Bash中可以查看当前的tmux服务中有哪些Session:tmux ls
根据Session的名字可以再回去:tmux a -t myname (or at, or attach)

基本配置

默认的<prefix>Ctrl+b,如果觉得不好按可以调整为Ctrl+a,只需要在配置文件~/.tmux.conf中加入:

1
2
unbind ^b
set -g prefix 'C-a'

为了能让Tmux动态载入配置而不是重启,我们设一个快捷键r来重新载入配置:

1
bind r source-file ~/.tmux.conf \; display-message "Config reloaded"

当前tmux的设置,可通过tmux show -g

窗格切换

可以把hjkl设置为切换窗格的快捷键:

1
2
3
4
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

再给调整窗格大小设置快捷键:

1
2
3
4
bind L resize-pane -L 10 # 向左扩展
bind R resize-pane -R 10 # 向右扩展
bind K resize-pane -U 5 # 向上扩展
bind J resize-pane -D 5 # 向下扩展

php中的坑

路径的坑

$path = ‘/a/m/../b’;
假如 /a 存在
不管 /a/m 目录存不存在, mkdir 都能成功
但是如果不存在,那么 is_dir, realpath 等函数都会失败

计算的坑

1
2
3
4
5
6
7
$a = 5.1;
$b = 5.1;
$size = 100;
$t1 = intval($a = floatval($a) * $size);
$t2 = intval($b = floatval($b) * $size);
$t = rand($t1, $t2);
echo $t; // 计算结果是509,而不是510

图片资源优化

  1. 选择合适的图片格式

    原理:对图片格式转换,在画质可以接受的情况下达到更好的压缩比效果
    优势:减少图片加载流量,效果比较明显
    劣势:服务器和浏览器压力增大,而且服务器需要额外的服务支持,格式转换要考虑浏览器的兼容性

  2. 图片大小小于2KB时可使用base64编码代替图片

  3. 不同终端对同一个图片需求不一样,可以根据终端加载不同的图片来节省没必要的流量

  4. 使用css、svg、canvas或iconfont代替图片

  5. 合并图片:

    优势:可以有效的较少请求个数
    劣势:生成的图片体积较大,减少请求个数同时也增加了图片大小,不合理拆分将不利于并行加载

  6. 图片压缩

    原理:对图片进行无损、有损压缩,转为压缩后图片来实现
    优势:减少图片加载流量,效果比较明显
    劣势:服务器和浏览器压力增大,而且服务器需要额外的服务支持

  7. 使用 CDN

    使用参数自动调节图片质量和大小的,最关键的还是,CDN 的每 G 流量价格普遍比 VPS 按流量付费的价格要低得多!

  8. 部署到单独的服务器中