microtime();  //返回当前 Unix 时间戳的微秒数:
$start = microtime(true);
$data = range(0, 1000000, 1);
foreach ($data as $val){
    echo $val;
}
$end = microtime(true);
echo  '耗时' . round($end - $start, 3) . '秒' . "\n";

memory_get_usage();  //返回当前分配给PHP脚本的内存量,单位是字节(byte)
echo '开始内存:'.memory_get_usage(), ''; 
$tmp = str_repeat('hello', 1000);   
echo '运行后内存:'.memory_get_usage(), '';  
unset($tmp);   
echo '回到正常内存:'.memory_get_usage(); 

<?php
    function geturl($url){
            $headerArray =array("Content-type:application/json;","Accept:application/json");
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($url,CURLOPT_HTTPHEADER,$headerArray);
            $output = curl_exec($ch);
            curl_close($ch);
            $output = json_decode($output,true);
            return $output;
    }


    function posturl($url,$data){
            $data  = json_encode($data);    
            $headerArray =array("Content-type:application/json;charset='utf-8'","Accept:application/json");
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE);
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArray);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            $output = curl_exec($curl);
            curl_close($curl);
            return json_decode($output,true);
    }


    function puturl($url,$data){
        $data = json_encode($data);
        $ch = curl_init(); //初始化CURL句柄 
        curl_setopt($ch, CURLOPT_URL, $url); //设置请求的URL
        curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //设为TRUE把curl_exec()结果转化为字串,而不是直接输出 
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST,"PUT"); //设置请求方式
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//设置提交的字符串
        $output = curl_exec($ch);
        curl_close($ch);
        return json_decode($output,true);
    }


    function delurl($url,$data){
        $data  = json_encode($data);
        $ch = curl_init();
        curl_setopt ($ch,CURLOPT_URL,$put_url);
        curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "DELETE");   
        curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
        $output = curl_exec($ch);
        curl_close($ch);
        $output = json_decode($output,true);
    }


    function patchurl($url,$data){
        $data  = json_encode($data);
        $ch = curl_init();
        curl_setopt ($ch,CURLOPT_URL,$url);
        curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "PATCH");  
        curl_setopt($ch, CURLOPT_POSTFIELDS,$data);     //20170611修改接口,用/id的方式传递,直接写在url中了
        $output = curl_exec($ch);
        curl_close($ch);
        $output = json_decode($output);
        return $output;
    }
?>

前提:目前需要删除大部分的数据,保留最近一段时间的数据

1、delete删除数据
我们知道delete语句的删除速度与索引量成正比,此表中的索引量已经很大了,而且数据量非常之巨大,若采用常规delete语句删除,必定会话费很长的时间。并且Delete语句删除不会释放出磁盘空间,所以肯定还是会出现报警,所以此种方式不可取。
2、drop删除表
流程简述:新建结构相同的表,命名“table_new”,’将需要保存的数据插入到此表中,然后drop掉老表"table_old",然后修改“table_new”的表名。

# Sql语句如下:
# 基于老表新建新表
CREATE TABLE table_new LIKE table_old;
# 插入数据到新表(以保存2019-10-01到现在的数据为例,如果数据过大可分批插入)
INSERT INTO table_new SELECT * FROM table_old WHERE date > '2019-10-01 00:00:00';
# 然后drop老表“table_old”
DROP TABLE table_old;
# 重命名新表“table_new”
ALTER TABLE table_new RENAME TO table_old;

CentOS安装GeoIP

yum -y install nginx-module-geoip

yum 安装好后找到安装的模块文件
如果nginx是用yun安装的一般是安装到 /etc/nginx/modules/目录下

手动加入模块

在nginx.conf配置文件的头部载入模块和http是同一个级别的

load_module "modules/ngx_http_geoip_module.so";
load_module "modules/ngx_stream_geoip_module.so";
ps: load_module 不能放在events{} 的后面,放在后面重启nginx会报错

因为GeoIP是基于MaxMind 提供了数据库文件来读取地域信息的所以需要下载ip的地域文件。
这个数据库是二进制的,不能用文本编辑器打开,需要上面的 GeoIP 库来读取,下面提供下载地址。
country.dat.gz
city.dat.gz
解压之后到nginx目录的geoip文件夹中,然后在项目的http中配置

geoip_country /etc/nginx/geoip/GeoIP.dat;  #加载国家IP
geoip_city /etc/nginx/geoip/GeoLiteCity.dat; #加载城市IP

server中添加配置

#判断如果不是中国的就返回403;
if ($geoip_country_code != CN) {
    return 403;
}

这样就可以实现除中国以外的ip访问返回403.

背景

因老服务器负载较高 故新增一台服务器 需要调整时间到加拿大温哥华时区

步骤

首先真正常调整时区时间

// 首先备份
mv /etc/localtime /etc/localtimeBak
// 再调整
ln -sf /usr/share/zoneinfo/America/Vancouver /etc/localtime

调整之后发现执行的java程序不管怎么样都跟北京时间一样,然后各种百度,

hwclock --set --date="08/30/19 07:26:50"
.
hwclock --hctosys
.
.
.
然并卵...

结果

最后发现问题出在 /etc/timezone 上面,在 /etc/timezone 中设置的是 Asia/Shanghai ,把它修改成 America/Vancouver ,问题解决 ...

一、描述
Ubuntu新搭建的lnmp环境测试环境是否正常,在网站根目录创建index.php,输出phpinfo,浏览器访问页面为空。

二、原因
原因是nginx无法正确的将 *.php 文件的地址传递给php-fpm去解析, 相当于php-fpm接收到了请求,但这请求却指向一个不存在的文件,于是返回空结果

三、解决
修改fastcgi_params

vim /etc/nginx/fastcgi_params

添加以下参数

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO       $fastcgi_script_name;

//基于layui修改弹框消息美化(TP5.0)
function alert($msg='',$url='',$icon='',$time=3){
    $str='<script type="text/javascript" src="'.config('admin_static').'/script/js/jquery.min.js"></script><script type="text/javascript" src="'.config('admin_static').'/script/lib/layui/layui.js"></script>';//加载jquery和layui
    $str.='<script>$(layui.use(\'layer\', function(){layer.msg("'.$msg.'",{icon:'.$icon.',time:'.($time*1000).'}, function(){location.href="'.$url.'"})}));</script>';//主要方法
    return $str;
}



//tp5.1(2019.5.27)
function alert($msg='',$url='',$icon='',$time=3){
    $str='<script type="text/javascript" src="/static/jquery.min.js"></script><script type="text/javascript" src="/static/admin/layui/layui.js"></script>';//加载jquery和layui
    $str.='<script>$(layui.use(\'layer\', function(){layer.msg("'.$msg.'",{icon:'.$icon.',time:'.($time*1000).'}, function(){location.href="'.$url.'"})}));</script>';//主要方法
    return $str;
}

<?php 
    static public function unlimitedForLevel($cate,$html='|—',$pid=0,$level=0){
        //建立空数组存储结果
        $arr = array();
        //循环$cate,如果这级的pid等于上一级的cid,就先压入数组,再找当前的下一级
        foreach ($cate as $v) {
            //查找当前分类是否有子分类
            if ($v['parent_id'] == $pid) {
                $v['level'] = $level + 1;
                $v['html'] = str_repeat($html, $level);

                $arr[] = $v;
                //递归合并数组
                $arr = array_merge($arr,self::unlimitedForLevel($cate,$html,$v['id'],$level+1));
            }
        }
        return $arr;
    }

    //静态方法获取多维数组递归结果
    static public function unlimitedForMore($cate,$name='child',$pid=0){
        $arr = array();
        foreach ($cate as $v) {
            if ($v['parent_id'] == $pid) {
                $v[$name] = self::unlimitedForMore($cate,$name,$v['id']);
                $arr[] = $v;
            }
        }
        return $arr;
    }

    //递归获取父函数
    static public function getParents($cate,$cid){
        $arr = array();
        foreach ($cate as $v) {
            if ($v['id'] == $cid) {
                $arr[] = $v;
                $arr = array_merge(self::getParents($cate,$v['parent_id']),$arr);
            }
        }
        return $arr;
    }

 ?>