风烟俱净,天山共色

从流飘荡, 任意东西


  • 首页

  • 标签

  • 分类

  • 归档

php执行shell

发表于 2019-06-04 | 分类于 编程

php执行shell

需求

最近收到一个奇葩的需求:后台需要添加子站

主站是www.abc.com,后台需要添加huaji.abc.com,gaoxiao.abc.com等子站,内容基本一致,就是修改下网站的title,logo等信息

方案

php调用shell脚本,复制一个站点文件夹,并修改相应的网站配置和nginx配置,并重新加载nginx配置,域名手动解析

难点

linux权限问题

实现

服务器上新建一个shell脚本

cp.sh

1
2
3
4
5
6
7
8
9
10
#!/bin/sh

cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/huaji.conf
sed -i 's/www.abc.com/huaji.abc.com/g' /etc/nginx/conf.d/huaji.conf
sed -i 's/web\/html\/www/web\/html\/huaji/g' /etc/nginx/conf.d/huaji.conf

cp -r /web/html/www /web/html/huaji
sed -i 's/www/huaji/g' /web/html/huaji/index.php

/usr/bin/sudo /usr/sbin/nginx -s reload

php中调用该脚本

1
2
3
4
5
6
7
$shell = "bash /web/html/www/cp.sh";
exec($shell, $result, $status);
if(!$status){
echo 'success';
}else{
echo 'failed';
}

php-fpm的执行用户是apache

  1. 需要给apache用户相应文件夹的读写权限

  2. 增加apache的nginx脚本管理权限

    1
    2
    3
    4
    5
    6
    7
    8
    #1.设置sudo配置文件可写权限
    chmod u+w /etc/sudoers
    #2.增加apache用户的nginx脚本管理权限
    apache ALL=(root) NOPASSWD: /usr/sbin/nginx
    #3.关闭【强制控制台登录】执行
    #Defaults requiretty
    #4.还原配置文件权限
    chmod u-w /etc/sudoers
备注

网站安全性有待提升

我为什么要养一只猫?

发表于 2019-05-04 | 更新于 2019-06-04 | 分类于 生活

我为什么要养一只猫?

2018年12月16日,天气晴朗,下午2点左右。我刚洗完澡穿着T恤,楼道上回响着小猫奶声奶气的叫声,是杨雪带着她的小猫来到我家了,还带了一些猫粮和猫咪的感冒药,小猫即将成为我的小猫。把它从笼子里抓出来的时候,没抓好,小猫顺着T恤往上爬,尖锐的爪子直接扎进了皮肤里,疼得我龇牙咧嘴,真是一个残忍的见面礼。在杨雪的帮助下才把它抓下来,交代了一些注意事项之后房间里就只剩下我们俩了。相顾无言,后来它就找了个角落躲起来了。

躲猫猫
躲猫猫

作为一个新晋猫奴,我对猫的印象还停留在小时候。我小时候跟爷爷奶奶长大,那时候奶奶养了一只狸花猫,好帅的,待人和善,给摸给抱还给亲,还能上山抓兔子,抓了2只兔子,真是又萌又凶。只是后来啊,它可能在外面吃了不干净的食物,没有回家,它的孩子们和人又没那么亲,再后来它的孙子们都不见了,大概是成了野猫吧。

还好,我这只小猫后来就没那么怕生了,会吃手上的猫粮,吃完还舔一舔,舔完一口咬出血。熟悉了一两天之后就会和我玩耍,会看电视,会爬人了(这真不是一个好习惯)。

玩耍
玩耍
踩键盘
踩键盘
歪头杀
歪头杀

好景不长,小猫感冒了,每天泪汪汪的,还鼻塞。

感冒了
感冒了

从此我每天早晚都要给它喂药,各种辛酸:得把药丸碾碎倒入针筒冲水;还得用毛巾把它包好,防止喂药的时候乱窜,把人抓伤。恨不得自己能多长几只手,经过艰苦卓绝的一周之后感冒终于好了。一切似乎都已步上正轨,哦不,它还没学会用猫砂,可怜的铲屎官每天都要给它捡屎吸尿,可坏了,总是找角落排泄,拖把都伸不进去,只能用毛巾擦。又半周之后,终于会用猫砂了。老怀大慰

第一次用猫砂
第一次用猫砂

之后一切步入正轨,“皮”的本性暴露无遗,码代码的时候来抓手,去踩键盘,烧菜的时候要爬到肩膀上,刷牙的时候要跳到背上,看书的时候要睡到书上,写字的时候不是咬笔杆就是在纸上闲逛,健身的时候要霸占一块地盘,听音乐抖腿也有风险,跑过来就是一爪,连睡觉也要睡到大腿上

皮1
皮1
皮2
皮2
皮3
皮3
皮4
皮4
皮5
皮5
皮6
皮6

在家猛如虎,外出怂成二哈,比二哈还不如,瑟瑟发抖,抱着大腿不敢动弹

怂1
怂1
怂2
怂2

最近天热了,家里出现了一只蚊子,天天妄想着能抓到蚊子

那个黑点是蚊子
那个黑点是蚊子

每天早上,我一有动静就开始“喵喵喵”,不理它就到胸口踩奶,踩累了就趴下打呼,还啃下巴

爪子好暖
爪子好暖

那么我为什么要养一只猫呢?当时我应该从杨雪那里要2只猫的,这样我上班的时候它们就有伴了。是的我应该养2只,失策了!

2019.04.14

发表于 2019-04-14 | 更新于 2019-06-04 | 分类于 生活

随笔

今日下午在看视频,斯丢匹德躺在我大腿上睡着了,还打呼。

斯丢匹德
斯丢匹德

在它的影响下,我也看睡着了(失眠的人是不是可以考虑下养只猫),然后就躺到了床上睡觉,过了一会儿感觉胸口好像被什么东西压住,原来是这个小家伙趴在被子上睡觉。

一想到明天还要上班,不禁扪心自问:难道今天还要这么颓废睡半天吗?逢春不游乐,但恐是痴人。于是说服了自己去爬个老和山(反正当我想做某件事情的时候总能找出很多理由说服自己)。

追风少年
追风少年

西溪湿地有很多汉服小姐姐小哥哥出没。

进了树丛就能感觉到沁人心脾的清凉,拾级而上,能遇见许多同道中人。

青石台阶
青石台阶

温馨的父子俩,小朋友还唱着李叔同的《送别》:长亭外,古道边,芳草碧连天...

温馨的父子俩
温馨的父子俩

路边开着形形色色的花,也为旅途增色不少。

画质感人。拍照技术烂得不行啊!

偶遇一位在山顶看书的大佬,悄悄偷拍了一张。

山巅读书人
山巅读书人

大佬的对面就是西湖,可谓是

1
2
3
湖光山色尽收眼底
鸟语花香皆在身旁
身体和灵魂都在路上

下山的时候还发现了一辆小黄车,莫非小黄车的性能这么好了。。

孤零零的小黄车
孤零零的小黄车

还有一只不怕生人,会无影头神功的大猫

猫界大佬
猫界大佬

我家斯丢匹德一有风吹草动就躲进小树林了,还没把它的胆子练出来。。

快到西溪路的时候还发现2个汉子在辽E的车子旁边相对而坐,正在吃饭,边上还有野炊的餐具。这才是浪迹天涯吧!

我也曾梦想浪迹天涯,后来bug多没去!.jpg

入手港行T480s

发表于 2019-03-23 | 分类于 其他

入手港行T480s

一

大学时买的华硕A43一年前出现了wifi经常断的问题,而且重连还连不上,只能关机或者注销之后才能正常连接。而且最近这个问题出现的越来越频繁,加上扬声器播放音乐时会出现杂音。可能是硬件老化了吧,虽然加了固态和内存,也抵挡不住时间的伟力,所以就产生了再入手一台机器的想法

二

都听别人说MBP适合码农,本来是准备入手一台MBP的。后来啊,一个死党听说了我要买本子,极力推荐美帝良心。说他用的T460p非常好,又给我发了T系列极限测试的视频,看起来是真的牛逼啊!再加上还要适应MacOs,所以就买ThinkPad吧

三

刚开始准备买的是美行,还注册了八通道账号,一番百度之后发现要美私美卡,还有转运的之类很烦的事。不想折腾,就准备淘宝代购(之前死党的就是代购的),找到了同一家店铺,咨询店家之后发现杭州关税可能不便宜,就准备寄到北京同学那儿先。一番联系之后发现大学室友竟然不在帝都工作了,又联系了另一个同学。将要下单的时候,发现杂七杂八的费用加起来可能还是港行更便宜。

四

又找了一家代购店买了港行的,虽然保修烦一点。经过3天的漫长等待之后,笔记本终于到了。

请忽略指头印

网站自动备份

发表于 2019-03-04 | 分类于 编程

网站自动备份

新建backup文件夹

1
cd / && mkdir backup

新建backup.sh脚本文件

1
vim backup.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash

day=`date +%y%m%d`

if [ -d "/backup/$day" ]; then
rm -rf /backup/$day
fi

mkdir /backup/$day

old_day=`date +%y%m%d -d"-7 days"`

mysqldump --defaults-extra-file=/etc/my.cnf --databases database > /backup/$day/database.sql

dist="/www"

tar -C $dist -zcf /backup/$day/website.tar.gz website/

if [ -d "/backup/$old_day" ]; then
rm -rf /backup/$old_day
fi

echo $day" backup success!"

修改mysql配置文件

1
vim /etc/my.cnf
在[client]中添加配置
1
2
3
4
[client]
host=host
user=user
password='password'

新增crontab任务

1
crontab -e
1
0 5 * * * /backup/backup.sh >> /backup/backup.log

每天凌晨5点钟自动备份网站数据和文件,并保留7天

mysql排序问题记录

发表于 2019-02-28 | 分类于 编程

mysql排序问题记录

今天看到一个面试题

一张表中有id 1-10的10条数据,要根据指定的顺序查询出结果集,比如(5,4,8,7,9,2..)

才发现原来mysql除了order by `column` desc|asc 还有 order by field(`column`, value1, value2, value3....)这种用法

1
SELECT * FROM `works` ORDER BY FIELD(`id`, 5,4,8,7,9,2);

查询结果为

FIELD()函数是将参数1的字段对后续参数进行比较,并返回1、2、3等等,如果遇到null或者没有在结果集上存在的数据,则返回0,然后根据升序进行排序。

因为其他id没在列出的结果集中,所以返回0,如果没有规定排序顺序的话,默认asc,所以排在前面

1
SELECT * FROM `works` ORDER BY FIELD(`id`, 5,4,8,7,9,2) DESC, id ASC;

查询结果为

  1. 如果想让指定id的数据排在前面,又不愿意先对指定顺序倒序处理再查询,我的想法是用union

    1
    2
    3
    (SELECT * FROM `works` WHERE `id` IN (5,4,8,7,9,2) ORDER BY field(`id`, 5,4,8,7,9,2))
    UNION
    (SELECT * FROM `works` WHERE `id` NOT IN (5,4,8,7,9,2))

    查询结果

    这和预想的不一样

  2. 查完资料后说要用如下语句

    1
    2
    3
    SELECT * FROM (SELECT * FROM `works` WHERE `id` IN (5,4,8,7,9,2) ORDER BY field(`id`, 5,4,8,7,9,2)) t1 
    UNION
    SELECT * FROM (SELECT * FROM `works` WHERE `id` NOT IN (5,4,8,7,9,2)) t2;

    结果还是一样

  3. 查资料后发现没有limit导致order by被优化器干掉了

    变成了

    1
    2
    3
    (SELECT * FROM `works` WHERE `id` IN (5,4,8,7,9,2))
    UNION
    (SELECT * FROM `works` WHERE `id` NOT IN (5,4,8,7,9,2))

    1和2,都被优化成了3

    -_-||

  4. 终极解决办法

    1
    2
    3
    SELECT * FROM (SELECT * FROM `works` WHERE `id` IN (5,4,8,7,9,2) ORDER BY field(`id`, 5,4,8,7,9,2) LIMIT 100) t1 
    UNION
    SELECT * FROM (SELECT * FROM `works` WHERE `id` NOT IN (5,4,8,7,9,2) LIMIT 100) t2;

    查询结果

mysql版本5.7.20-log


UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。

UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。

从效率上说,UNION ALL 要比UNION快很多


--摘抄自 别人的博客

php接收post数据

发表于 2019-02-27 | 分类于 编程

php接收post数据

今天开发接口接收合作方post过来的数据

在本地调试的时候是没有问题的,但是线上调试时接收不到客户数据

查了下资料

发现$_POST只能接收Content-Type: application/x-www-form-urlencoded提交的数据

用户提交的不是Content-Type: application/x-www-form-urlencoded标准数据类型的数据

所以要用file_get_content("php://input")接收

$GLOBLES['HTTP_RAW_POST_DATA']在php7中已经废弃

注意

php://input不能用于接收enctype="multipart/form-data"的数据

hexo解析数学公式

发表于 2019-02-25 | 更新于 2019-02-27 | 分类于 编程

hexo解析数学公式

今天写博客要用到数学公式

用Typora写好之后执行hexo g && hexo s 之后发现没有被解析成数学公式,原样输出了

遂开始百度

发现大家都说hexo-renderer-pandoc好

按照指示下载pandoc装上

卸载hexo默认的markd,安装hexo-renderer-pandoc

1
2
npm uninstall hexo-renderer-marked --save
npm install hexo-renderer-pandoc --save

然后hexo g报错unknown extension smart

查完资料发现是pandoc版本问题(艰难)

明明下载的是2.6版本符合要求啊

然后在本地找啊找Everything发现之前装的Anaconda3中有了pandoc,版本1.9不符合要求(坑自己啊)

更改完之后执行是不报错了,但是解析出来的和想象中的相去甚远。

仔细阅读了next主题的配置文件

原来是没有加载js文件

在.md文件头部加入mathjax: true然后重新生成就ok了

复杂度分析

发表于 2019-02-23 | 更新于 2019-02-26 | 分类于 编程

复杂度分析

时间复杂度分析

  1. 只关注循环执行次数最多的一段代码

    1
    2
    3
    4
    5
    6
    7
    8
    function sum($n)
    {
    $sum = 0;
    for($i = 1; $i <= $n; $i++){
    $sum += $i;
    }
    return $sum;
    }

    只需要关注第4、5行代码,其他的都是常量执行时间,这个方法的时间复杂度是O(n)。

  2. 加法法则:总复杂度等于量级最大的那段代码的复杂度

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    function sum($n)
    {
    $sum_1 = 0;
    $sum_2 = 0;
    $sum_3 = 0;
    for($i = 1; $i <= 100; $i++){
    $sum_1 += $i;
    }

    for($i = 1; $i <= $n; $i++){
    $sum_2 += $i;
    }

    for($i = 1; $i <= $n; $i++){
    for($j = 1; $j <= $n; $j++){
    $sum_3 += $i * $j;
    }
    }
    return $sum_1 + $sum_2 + $sum_3;
    }

    第6、7行代码的时间复杂度是常量执行时间,第10、11行代码的时间复杂度是O(n),第14、15、16行代码的时间复杂度是O(n2),所以这个方法的时间复杂度是O(n2)。

  3. 乘法法则:嵌套代码的复杂度等于嵌套内外代码的复杂度的乘积

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    function sum($n)
    {
    $sum = 0;
    for($i = 1; $i <= $n; $i++){
    $sum += f($i);
    }
    return $sum;
    }
    function f($n)
    {
    $sum = 0;
    for($i = 1; $i <= $n; $i++){
    $sum += $i;
    }
    return $sum;
    }

    如果f(\(n)的时间复杂度是常量,那sum(\)n)的时间复杂度就是O(n),但是f(\(n)的时间复杂度是O(n),所以sum(\)n)的时间复杂度是O(n2)。

    常见的时间复杂度实例分析

1
2
3
4
$i = 1;
while($i <= $n){
$i *= 2;
}

2x = n => x=log2n;该代码段执行log2n次,所以该代码段的时间复杂度是O(logn)

log3n = log32*log2n

最好、最坏、平均、均摊时间复杂度

1
2
3
4
5
6
7
8
9
function find($array ,$x)
{
foreach ($array as $key => $value) {
if($value == $x){
return $key;
}
}
return -1;
}

最好情况时间复杂度 如果x是第一个元素,那就不用遍历剩下的元素了,时间复杂度是O(1);

最坏情况时间复杂度如果x是最后一个元素,就要遍历整个数组,时间复杂度是O(n);

平均时间复杂度

  1. 如果x在数组0~n-1位置中和不在数组中的概率相等 \[ \frac{(1+2+3+···+n+n)}{(n+1)} = \frac{n(n+3)}{2(n+1)} \] ​ 平均时间复杂度是O(n)
  2. 如果x在数组中的概率是1/2,在数组中各个元素的概率相等,为1/2n \[ \frac{1}{2n}+\frac{2}{2n}+\frac{3}{2n}+···+\frac{n}{2n}+\frac{n}{2} = \frac{(3n+1)}{4} \]

    这个值叫加权平均时间复杂度或者期望时间复杂度为O(n)

均摊时间复杂度在代码执行的所有复杂度情况中绝大部分是低级别的复杂度,个别情况是高级别复杂度且发生具有时序关系时,可以将个别高级别复杂度均摊到低级别复杂度上。基本上均摊结果就等于低级别复杂度。

空间复杂度

和时间复杂度的分析方法一样

unison双向同步

发表于 2019-02-22 | 更新于 2019-02-23 | 分类于 编程

unison双向同步


安装

Linux下通过源码包编译安装Unison时,需要用到Objective Caml compiler

1
2
3
4
5
6
wget http://caml.inria.fr/pub/distrib/ocaml-4.06/ocaml-4.06.0.tar.gz
tar -zxvf ocaml-4.06.0.tar.gz
cd ocaml-4.06.0
./configure
make world opt
make install

编译安装Unison

1
2
3
4
5
6
wget https://github.com/bcpierce00/unison/archive/v2.51.2.tar.gz
tar -zxvf v2.51.2.tar.gz
cd unison-2.51.2/src
make UISTYLE=text
cp ./unison /usr/local/bin
make install

设置免密登陆

2台服务器操作相同

1
2
3
useradd -m unison
su - unison
ssh-keygen -t rsa

将生成的/home/unison/.ssh/id_rsa.pub复制到另一台服务器,然后写入认证文件中

1
cat  ~/id_rsa.pub >> ~/.ssh/authorized_keys

如果没有.ssh文件夹

1
2
mkdir ~/.ssh
chmod 700 ~/.ssh

重启ssh服务

1
systemctl restart sshd

测试连接

1
ssh unison@xxx.com -i ~/.ssh/id_rsa

同步配置

修改~/.unison/default.prf文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
root = /unison/test

root = ssh://unison@10.124.5.215//unison/test

#force =/unison/test

servercmd=/usr/local/bin/unison

#ignore =/tmp/test_1/a

batch = true

#repeat = 1

#retry = 3

owner = true

group = true

perms = -1

#fastcheck = false

#rsync = false

sshargs = -C

#xferbycopying = true

confirmbigdel=false

log = true

logfile = /home/unison/.unison/unison.log

配置解读

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
两个root表示需要同步的文件夹。

force表示以本地的/unison/test文件夹为标准,将该目录同步到远端,开启后则变成单项同步

ignore = Path表示忽略/unison/test/a目录,即同步时不同步它。

batch=true 表示全自动模式,接受并执行默认动作

log = true表示在终端输出运行信息。

logfile则指定了同时将输出写入log文件。

owner = true //保持同步过来的文件属主

group = true //保持同步过来的文件组信息

perms = -1 //保持同步过来的文件读写权限

repeat = 1 //间隔1秒后,开始新的一次同步检查

retry = 3 //失败重试

sshargs = -C //使用ssh的压缩传输方式

fastcheck true 表示同步时仅通过文件的创建时间来比较,如果选项为false,Unison则将比较两地文件的内容。

auto //接受缺省的动作,然后等待用户确认是否执行。

ignore xxx //增加 xxx 到忽略列表中 :经测试此参数不能用。

ignorecase [true|false|default] //是否忽略文件名大小写

follow xxx //是否支持对符号连接指向内容的同步

xferbycopying = true

immutable xxx //不变目录,扫描时可以忽略

silent //安静模式

times=true //同步修改时间

path xxx 参数 //只同步 -path 参数指定的子目录以及文件,而非整个目录,-path 可以多次出现。

confirmbigdel=false//默认值为true,表示当需要同步的两个目录一个为空时,unison将停止,这里设置为false,即便为空unison也不会停止运转

测试

1
2
su unison
unison

加入crontab定时任务

1
2
3
4
5
su unison
crontab -e


0 5 * * * /usr/local/bin/unison
12
Tomames

Tomames

若无闲事挂心头, 便是人间好时节

13 日志
3 分类
14 标签
GitHub E-Mail
© 2018 – 2019 Tomames