随机字符串生成

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

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

redis 长连短连区别

PHP_REDIS_API int
redis_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
{
    zval *object;
    char *host = NULL, *persistent_id = "";
    zend_long port = -1, retry_interval = 0;
    strlen_t host_len, persistent_id_len;
    double timeout = 0.0, read_timeout = 0.0;
    redis_object *redis;
#ifdef ZTS
    /* not sure how in threaded mode this works so disabled persistence at
     * first */
    persistent = 0;
#endif
    //获取传入参数
    if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(),
                                     "Os|ldsld", &object, redis_ce, &host,
                                     &host_len, &port, &timeout, &persistent_id,
                                     &persistent_id_len, &retry_interval,
                                     &read_timeout) == FAILURE)
    {
        return FAILURE;
    } else if (!persistent) {
        persistent_id = NULL; //如果是0的话则代表短连接 则先置空 redis_sock_create里 会把它清掉 不然的话 会复用
    }
    //连接超时
    if (timeout < 0L || timeout > INT_MAX) {
        zend_throw_exception(redis_exception_ce,
            "Invalid connect timeout", 0 TSRMLS_CC);
        return FAILURE;
    }
    //读取超时
    if (read_timeout < 0L || read_timeout > INT_MAX) {
        zend_throw_exception(redis_exception_ce,
            "Invalid read timeout", 0 TSRMLS_CC);
        return FAILURE;
    }
    //重来超时
    if (retry_interval < 0L || retry_interval > INT_MAX) {
        zend_throw_exception(redis_exception_ce, "Invalid retry interval",
            0 TSRMLS_CC);
        return FAILURE;
    }
    //判断是否是UNIX套接字
    /* If it's not a unix socket, set to default */
    if(port == -1 && host_len && host[0] != '/') {
        port = 6379;
    }
    //获取redis对象
    redis = PHPREDIS_GET_OBJECT(redis_object, object);
    //如果已经有一个sock对象,则先关闭这个对象,并且清理掉对象内容
    //这里要注意,如果你是一个长连接 redis_sock_disconnect 是不会关掉的链接的
    //而redis_free_socket会释放掉sock属性
    //所以说如果你是长连接的话,你连接的实例是不会被关闭的,但是你的部分参数会被清掉。
    /* if there is a redis sock already we have to remove it */
    if (redis->sock) {
        redis_sock_disconnect(redis->sock, 0 TSRMLS_CC);
        redis_free_socket(redis->sock);
    }
    //创建一个sock对象 这里把sock覆盖掉,如果是长连接的话 redis这个实例是不会被覆盖掉的,这里的sock可以理解为是一个参数对象
    redis->sock = redis_sock_create(host, host_len, port, timeout, read_timeout, persistent,
        persistent_id, retry_interval);
    //连接sock 如果是长连接的话 会直接返回0  如果是短连接的话 才会再次去以新的数据链接
    if (redis_sock_server_open(redis->sock TSRMLS_CC) < 0) {
        if (redis->sock->err) {
            zend_throw_exception(redis_exception_ce, ZSTR_VAL(redis->sock->err), 0 TSRMLS_CC);
        }
        redis_free_socket(redis->sock);
        redis->sock = NULL;
        return FAILURE;
    }
    return SUCCESS;
}


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