Web
Web

随机字符串生成

原理是利用二进制的或与操作,注意二进制的数据的位数不能冲突。例如

1 = 0001

2 = 0010

3 = 0011

1和3就是冲突的,因为最后一位都是1


<?php

$p1=1;//数字
$p2=2;//小写字母
$p3=8;//大写字母

$var_p=$p1|$p3;

$len=6;

$sour=[];

if(($var_p & $p1) == $p1)
    array_push($sour,"012345");
if(($var_p & $p2) == $p2)
    array_push($sour,"abcdef");
if(($var_p & $p3) == $p3)
    array_push($sour,"ABCDEF");

$str="";

for($i=0;$i<$len;$i++)
    $str.=substr($sour[rand(0,count($sour)-1)],rand(0,$len-1),1);

echo $str;


LayUI 省市区三级联动插件

pcasunzip.js 在LayUI在下拉上有问题,下面这个是重写的一个地区数据用的pcasunzip.js,所以把下面的代码放到pcasunzip.js的最后就可以了。用法与pcasunzip.js基本一致。


/* 兼容 LayUI 版本 */
let PCAL_LP,PCAL_LC,PCAL_LA,PCAL_VP,PCAL_VC,PCAL_VA;
function PCAL() {
    PCAL_LP = document.getElementsByName(arguments[0])[0];
    PCAL_LC = document.getElementsByName(arguments[1])[0];
    PCAL_LA = document.getElementsByName(arguments[2])[0];
    PCAL_VP = PCAL_LA ? arguments[3] : arguments[2];
    PCAL_VC = PCAL_LA ? arguments[4] : arguments[3];
    PCAL_VA = PCAL_LA ? arguments[5] : arguments[4];
    /* 初始化省份 */
    PCAL.InitP();
    /* 省份选择 */
    form.on('select('+arguments[0]+')', function(data){
        PCAL.SetC(data.value);
    });
    if (PCAL_VA){
        /* 市级选择 */
        form.on('select('+arguments[1]+')', function(data){
            PCAL.SetA(data.value)
        });
    }
};
/* 初始化省份 返回第一个市 */
PCAL.InitP=function(){
    let po=0;
    for (let i=0;i<PCAP.length;i++){
        PCAL_LP.options.add(new Option(PCAP[i], PCAP[i]))
        if(PCAL_VP){
            if(PCAP[i]==PCAL_VP){
                po=i;
            }
        }
    }
    PCAL_LP[po].selected=true;
    PCAL.SetC(PCAP[po]);
    form.render('select');
    return PCAP[0];
}
/* 设置区域 传入市 */
PCAL.SetA=function (_value) {
    PCAL_LA.innerHTML="";
    let po=1;
    for (let i=0;i<PCAA.length;i++){
        let e=PCAA[i];
        for (let k=0;k<e.length;k++){
            if(e[k][0]==_value){
                let s=e[k];
                for (let n=1;n<s.length;n++){
                    PCAL_LA.options.add(new Option(s[n], s[n]))
                    if(PCAL_VA){
                        if(s[n]==PCAL_VA){
                            po=n;
                        }
                    }
                }
                PCAL_LA[po-1].selected=true;
                form.render('select');
                break;
            }
        }
    }
}
/* 设置市 传入省 */
PCAL.SetC=function (_value) {
    PCAL_LC.innerHTML="";
    let po=1;
    for (let i=0;i<PCAC.length;i++){
        if(PCAC[i][0]==_value){
            //更新城市
            for (let ii=1;ii<PCAC[i].length;ii++){
                PCAL_LC.options.add(new Option(PCAC[i][ii], PCAC[i][ii]))
                if(PCAL_VC){
                    if(PCAC[i][ii]==PCAL_VC){
                        po=ii;
                    }
                }
            }
            PCAL_LC[po-1].selected=true;
            PCAL.SetA(PCAC[i][po]);
            form.render('select');
            break;
        }
    }
}


宝塔 微擎 负载均衡

选择要建立负载均衡的网址,在server的上面配置如下代码

upstream fzjh {

  server xxx.xxx.xxx.xxx:8081; #负载1

  server xxx.xxx.xxx.xxx:8081  weight=1; #本机

}

然后在root下面配置如下代码

location /

{

    location ~ .*\.(php|jsp|cgi|asp|aspx|flv|swf|xml)?$

    {

        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_set_header REMOTE-HOST $remote_addr;

        proxy_pass http://fzjh;

    

    }

    proxy_pass http://fzjh;

    proxy_set_header Host $host;

    proxy_set_header X-Real-IP $remote_addr;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_set_header REMOTE-HOST $remote_addr;

    

    #持久化连接相关配置

    #proxy_connect_timeout 30s;

    #proxy_read_timeout 86400s;

    #proxy_send_timeout 30s;

    #proxy_http_version 1.1;

    #proxy_set_header Upgrade $http_upgrade;

    #proxy_set_header Connection "upgrade";


    add_header X-Cache $upstream_cache_status;

    expires 12h;

}

注意:尽量避开80端口,新增的端口需要在服务器运营商后台添加入站规则,比如8081端口。并且关掉系统防火墙。

会测接口测试工具测试一下

微信图片_20190226162749.png

可以发现,1111和2222是随机出现的。对于微擎的负载的话,可直接拷贝所有工程代码,到负载服务器。

整体的配置结构

微信截图_20190226163502.png

Linux supervise PHP常驻

Supervise安装可以参考:上一篇博文

php:php.php

<?php 
$fp = fopen("text.txt",'w');
fwrite($fp,date("Y-m-d H:i:s",time()));
fclose($fp);
while(1){
//保持不退出
}

脚本:run

#!/bin/sh
ps -elf| grep php.php | grep -v grep > /dev/null
if [  $? -ne 0 ]
    then
                php php.php #注意这里不在加 ./ 因为php已经设置环境变量
fi


效果:

初始:

微信截图_20190216145821.png

等待一会,结束掉php的进程。

1550300347(1).png

最终

微信截图_20190216150101.png

Linux supervise进程守护

Daemontools是Linux下的一个软件包,里面包含了supervise。而利用supervise可以达到进程关闭后重启的目的。这种技术也叫作进程守护。

安装

PuTTY连接服务器

1、cd / #切换到根目录

2、 mkdir supervise #新建一个目录 例如:supervise

3、chmod  777 supervise #设置文件夹的权限为777(或者利用WinScp来操作)

4、cd supervise #切换到supervise目录

5、wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz #下载Daemontools源码到supervise

6、tar -xpf daemontools-0.76.tar.gz #解压源码包

7、rm -f daemontools-0.76.tar.gz #删除源码包

8、cd admin/daemontools-0.76 #切换到源码包的目录里

9、wget http://www.qmail.org/moni.csi.hu/pub/glibc-2.3.1/daemontools-0.76.errno.patch #下载一个补丁,用于编译,如果没有这个补丁文件,有可能编译会出错。

10、patch -Np1 -i daemontools-0.76.errno.patch #安装补丁

11、sudo package/install #进行编译Daemontools并且安装,尽量加上sudo提权指令。

12、sudo apt-get install csh #安装csh 也可省略

13、csh -cf '/command/svscanboot &' #启动svscanboot

启动svscanboot会经历如下启动过程:svscanboot启动之后会启动svscan,svscan会启动supervise,supervise会启动并监听/service中存放服务目录下的run可执行文件。

编写脚本

新建一个文件夹:test(可自定义名称),里面需要有一个且必须有一个的文件:run(注意:这个文件是没有后缀的)。

源码:

const char *run[2] = { "./run", 0 };

这个文件最好使用vi来编辑,如果你是在window下用notepad++或其他文本工具编辑的话,文件格式是无法在linux被识别的,也就会抛错。

源码:

  if (stat("down",&st) != -1)
    flagwantup = 0;
  else
    if (errno != error_noent)
      strerr_die4sys(111,FATAL,"unable to stat ",dir,"/down: ");

如果你想在window下编辑,那么你需要在linxu上这样操作:

1、vi run #打开run

2、:set fileformat=unix #执行这条命令

3、:wq #执行这条命令保存并退出

脚本内容:

#!/bin/sh #指定文件是一个脚本文件

./iwonmo  #运行程序,./ 的意思是在当前目录下。如果不加的话,linux脚本执行器会把它当成环境变量

执行脚本:

nohup supervise test/  > /dev/null 2>&1 &  #nohup 后台运行的语法规则,其中的> /dev/null 2>&1 &是输出级别,可以查阅nohup的使用方法

效果:终止iwonmo程序后会立马在启动iwonmo程序。如果需要修改iwonmo程序的话,先要终止守护进程,然后在终止iwonmo。

微信截图_20190216144029.png

终止程序指令:kill -9 pid #这里进来发送9信号,结束程序比较安全。