博客

  • 实现红包算法(给定总金额 总人数 最大金额 最小金额)生成红包列表–PHP

    描述:给定总积分,给定总人数,给定最大与最小值产生随机数
    源代码:
        public function getBonus()
        {
            $total_point = 32000; //单位:分
            $total_people = 20;
            $point_max = 2000;  //单位:分
            $point_min = 1000;  //单位:分
            $bonus = $this->_getBonus($total_point, $total_people, $point_max, $point_min);
    
            return ajax_success('ok', $bonus);
        }
    
        /**
         * 功能:求一个数的平方
         * @param $n
         * @return float|int
         */
        public function _sqr($n)
        {
            return $n * $n;
        }
    
        /**
         * 功能:产生红包
         * @param $total_point
         * 红包总额
         * @param $total_people
         * 红包个数
         * @param $point_max
         * 每个小红包的最大额
         * @param $point_min
         * 每个小红包的最小额
         * @return array
         * 存放生成的每个小红包的值的一维数组
         */
        public function _getBonus($total_point, $total_people, $point_max, $point_min)
        {
            $result = array();
            $average = $total_point / $total_people;
            if ($point_max < $average) {
                for ($i = 0; $i < $total_people; $i++) {
                    $result[$i] = $point_max;
                }
                return $result;
            }
    
            if ($point_min > $average) {
                for ($i = 0; $i < $total_people; $i++) {
                    $result[$i] = $average;
                }
                return $result;
            }
    
            for ($i = 0; $i < $total_people; $i++) {
                //因为小红包的数量通常是要比大红包的数量要多的,因为这里的概率要调换过来。
                //当随机数>平均值,则产生小红包
                //当随机数<平均值,则产生大红包
                if (rand($point_min, $point_max) > $average) {
                    //    在平均线上加积分
                    $temp = $point_min + $this->_xRandom($point_min, $average);
                    $result[$i] = $temp;
                    $total_point -= $temp;
                } else {
                    //    在平均线上减钱
                    $temp = $point_max - $this->_xRandom($average, $point_max);
                    $result[$i] = $temp;
                    $total_point -= $temp;
                }
            }
            //        如果还有余积分,则尝试加到小红包里,如果加不进去,则尝试下一个。
            while ($total_point > 0) {
                for ($i = 0; $i < $total_people; $i++) {
                    if ($total_point > 0 && $result[$i] < $point_max) {
                        $result[$i]++;
                        $total_point--;
                    }
                }
            }
            //如果积分是负数了,还得从已生成的大于最小红包的红包中抽取回来
            while ($total_point < 0) {
                for ($i = 0; $i < $total_people; $i++) {
                    if ($total_point < 0 && $result[$i] > $point_min) {
                        $result[$i]--;
                        $total_point++;
                    }
                }
            }
            return $result;
        }
    
        /**
         * 功能:生产 min 和 max 之间的随机数,但是概率不是平均的,从 min  到 max 方向概率逐渐减小。
         * 先平方,然后产生一个平方值范围内的随机数,再开方,这样就产生了一种 膨胀 再 收缩 的效果。
         * @param $point_max
         * 每个小红包的最大额
         * @param $point_min
         * 每个小红包的最小额
         * @return int
         */
        public function _xRandom($point_min, $point_max)
        {
            $sqr = intval($this->_sqr($point_max - $point_min));
            $rand_num = rand(0, ($sqr - 1));
            return intval(sqrt($rand_num));
        }
    
    
    返回示例:返回的数据单位也是分。
    {
        "code": 200,
        "msg": "ok",
        "content": [
            1652,
            1556,
            1853,
            1814,
            1784,
            1572,
            1819,
            1051,
            1850,
            1519,
            1317,
            1752,
            1579,
            1557,
            1417,
            1602,
            1694,
            1427,
            1542,
            1643
        ]
    }
    
  • php实现pdf转图片(参考)

    最近遇到一个需求,需要将pdf在web或者app中进行展示。有很多js控件或者app空间可以直接展示pdf,或者说很多第三方外链可以做到直接展示pdf文件的内容。
    第三方不说了,他们做的优化足够好,但是集成到web或pc中样式是否可以接受?
    用第三方空间,无疑增加了前段的处理压力和展示时间(如果pdf过大,js处理可能会需要很久才能展示图片,而且还有遇见过方向错误等问题)

    so: 没错,可以吧pdf转化成图片,返回给客户端展示啊。

    按照这个思路我就写了php版本的pdf转图片的。

    开始

    以centos系统环境为例子吧。

    php要实现将pdf转化成图片,主要依赖于一个软件:ImageMagick,没错他是一个强大的图片处理软件。在centos上,该软件想要读取pdf,依赖于另外一个软件Ghostscript(gs),该软件能够帮助ImageMagick读取pdf文件内容。

    安装gs
    1
    2
    3
    4
    5
    6
    
    安装gs(不安装gs,会导致读取pdf失败)
    下载最新版本
    tar -zxvf 
    ./configure --prefix=/usr/local/ghostscript
    make all
    make install
    

    gs的指令必须在usr/bin/gs,请务必确认/usr/bin/gs是否存在,不存在ln 进来。

    安装ImageMagick
    1
    2
    3
    4
    5
    
    下载地址:ftp://ftp.u-aizu.ac.jp/pub/graphics/image/ImageMagick/imagemagick.org/ImageMagick-7.0.9-1.tar.gz
    tar -zxvf ./ImageMagick-7.0.8-68.tar.gz
    ./configure -prefix=/usr/local/imagemagick
    make 
    make install
    
    安装ImageMagick扩展
    1
    2
    3
    4
    5
    6
    7
    8
    
    wget https://pecl.php.net/get/imagick-3.4.4.tgz
    tar -zxvf ./imagick-3.4.4.tgz
    /usr/local/php/bin/phpize
    ./configure --with-php-config=/usr/local/php/bin/php-config --with-imagick=/usr/local/imagemagick/
    make
    make install
    
    php.ini文件中写入扩展:imagemagick.so
    

    使用demo

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    $im = new \Imagick();
    $im->setCompressionQuality(50);
    $im->setResolution(100, 100);
    $im->readImage($img . "[4]"); // 一定要在设置Resolution后读取文件,保证清晰度(如果先读取文件再设置清晰度,亲测清晰度和质量很低)
    $im->scaleImage(1190, 1682);
    $im->setImageBackgroundColor('white');
    $im->setImageUnits(1);
    $im = $im->mergeImageLayers(\Imagick::LAYERMETHOD_FLATTEN); //不设置,无法出现白底,png默认透明,jpg黑底
    $filename =  md5($img).'_5' . '.jpg';
    $filePath = __ROOT__ .'/public/uploads/signImg/'.$filename;
    $im->setImageFormat('jpeg');
    $res = $im->writeImage($filePath);
    $im->clear();
    $im->destroy(); // 使用后请务必及时销毁,读写文件的内存资源很重要
    
    
  • PHP pdf转化为图片(PNG)(亲测可用)

    /**
     * 将pdf文件转化为多张png图片
     * @param string $pdf  pdf所在路径 (/www/pdf/abc.pdf pdf所在的绝对路径)
     * @param string $path 新生成图片所在路径 (/www/pngs/)
     *
     * @return array|bool
     */
    function pdf2png($pdf, $path)
    {
        if (!extension_loaded('imagick')) {
            return false;
        }
        if (!file_exists($pdf)) {
            return false;
        }
        $im = new Imagick();
        $im->setResolution(120, 120); //设置分辨率 值越大分辨率越高
        $im->setCompressionQuality(100);
        $im->readImage($pdf);
        foreach ($im as $k => $v) {
            $v->setImageFormat('png');
            $fileName = $path . md5($k . time()) . '.png';
            if ($v->writeImage($fileName) == true) {
                $return[] = $fileName;
            }
        }
        return $return;
    }
     
    /**
     * 将pdf转化为单一png图片
     * @param string $pdf  pdf所在路径 (/www/pdf/abc.pdf pdf所在的绝对路径)
     * @param string $path 新生成图片所在路径 (/www/pngs/)
     *
     * @throws Exception
     */
    function pdf2png2($pdf, $path)
    {
        try {
            $im = new Imagick();
            $im->setCompressionQuality(100);
            $im->setResolution(120, 120);//设置分辨率 值越大分辨率越高
            $im->readImage($pdf);
     
            $canvas = new Imagick();
            $imgNum = $im->getNumberImages();
            //$canvas->setResolution(120, 120);
            foreach ($im as $k => $sub) {
                $sub->setImageFormat('png');
                //$sub->setResolution(120, 120);
                $sub->stripImage();
                $sub->trimImage(0);
                $width  = $sub->getImageWidth() + 10;
                $height = $sub->getImageHeight() + 10;
                if ($k + 1 == $imgNum) {
                    $height += 10;
                } //最后添加10的height
                $canvas->newImage($width, $height, new ImagickPixel('white'));
                $canvas->compositeImage($sub, Imagick::COMPOSITE_DEFAULT, 5, 5);
            }
     
            $canvas->resetIterator();
            $canvas->appendImages(true)->writeImage($path . microtime(true) . '.png');
        } catch (Exception $e) {
            throw $e;
        }
    }

    ————————————————
    版权声明:本文为CSDN博主「ainiaa」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/jeff_love_marina/article/details/80838055
  • php 将pdf转成图片且将图片拼接(参考)

    说明:

    1.pdf转图片通过安装php扩展imagick实现。

    2.由于windows扩展安装的一系列问题,建议在linux环境开发,windows大伙可以尝试安装。

    3.为Centos 安装ImageMagick imagick for php步骤。ImageMagick是一套软件系列,主要用于图片的创建、编辑以及转换等  (安装方式有多种,本文只介绍一种安装方式)

    (一)安装步骤:

    1. 下载安装ImageMagick

    wget ftp://mirror.aarnet.edu.au/pub/imagemagick/ImageMagick-6.6.8-10.tar.gz
    
    tar -xzvf ImageMagick-6.6.8-10.tar.gz
    ./configure --prefix=/usr/local/imagemagick
    make
    make install
    

    2.下载安装Imagick
    地址:http://pecl.php.net/package/imagick

    wget http://pecl.php.net/get/imagick-3.1.0RC1.tgz
    
    tar -xzvf imagick-3.1.0RC1
    phpize
    ./configure --with-php-config=/usr/local/php/bin/php-config --with-imagick=/usr/local/imagemagick
    make
    make install
    

    3.手动配置php.ini

    Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/ 
    Installing header files:          /usr/local/php/include/php/
    
    生成imagick.so到/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/

    至此,php扩展安装完成。

     

    (二)使用方法

    /**
     * PDF2PNG
     * @param $pdf  待处理的PDF文件   
     * @param $path 待保存的图片路径
     * @param $page 待导出的页面 -1为全部 0为第一页 1为第二页
     * @return      保存好的图片路径和文件名
     * 注:此处为坑 对于Imagick中的$pdf路径 和$path路径来说,   php版本为5+ 可以使用相对路径。php7+版本必须使用绝对路径。所以,建议大伙使用绝对路径。
     */
    function pdf2png($pdf,$path,$page=-1)
    {
        if(!extension_loaded('imagick'))
        {
            return false;
        }
        if(!file_exists($pdf))
        {
            return false;
        }
    	if(!is_readable($pdf))
        {
            return false;
        }
        $im = new Imagick();
        $im->setResolution(150,150);
        $im->setCompressionQuality(100);
        if($page==-1)
            $im->readImage($pdf);
        else
            $im->readImage($pdf."[".$page."]");
        foreach ($im as $Key => $Var)
        {
            $Var->setImageFormat('png');
            $filename = $path. md5($Key.time()).'.png';
            if($Var->writeImage($filename) == true)
            {
                $Return[] = $filename;
            }
        }
        //返回转化图片数组,由于pdf可能多页,此处返回二维数组。
        return $Return;
    }
    
    
    /**
     * Spliceimg
     * @param array  $imgs pdf转化png  路径  
     * @param string $path 待保存的图片路径
     * @return string  将多个图片拼接为成图的路径
     * 注:多页的pdf转化为图片后拼接方法
     */
    function Spliceimg($imgs = array(),$img_path = '')
    {
        //自定义宽度
        $width = 1230;
        //获取总高度
        $pic_tall = 0;
        foreach ($imgs as $key => $value) {
            $info = getimagesize($value);
            $pic_tall += $width/$info[0]*$info[1];
        }
        // 创建长图
        $temp = imagecreatetruecolor($width,$pic_tall);
        //分配一个白色底色
        $color = imagecolorAllocate($temp,255,255,255);
        imagefill($temp,0,0,$color);
        $target_img = $temp;
        $source = array();
        foreach ($imgs as $k => $v) {
            $source[$k]['source'] = Imagecreatefrompng($v);
            $source[$k]['size'] = getimagesize($v);
        }
        $num  = 1;
        $tmp  = 1;
        $tmpy = 2; //图片之间的间距
        $count = count($imgs);
        for ($i = 0; $i < $count; $i++) {
            imagecopy($target_img, $source[$i]['source'], $tmp, $tmpy, 0, 0, $source[$i]['size'][0], $source[$i]['size'][1]);
            $tmpy = $tmpy + $source[$i]['size'][1];
            //释放资源内存
            imagedestroy($source[$i]['source']);
        }
        $returnfile = $img_path.date('Y-m-d');
        if (!file_exists($returnfile))
    	{
    		if (!make_dir($returnfile))
    		{
    		    /* 创建目录失败 */
                        return false;
                    }
        }
        $return_imgpath = $returnfile.'/'.md5(time().$pic_tall.'pdftopng').'.png';
        imagepng($target_img,$return_imgpath);
        return $return_imgpath;
    }
    
    
    /**
     * make_dir
     * @param string $folder 生成目录地址
     * 注:生成目录方法
     */
    function make_dir($folder)
    {
        $reval = false;
        if (!file_exists($folder))
        {
            /* 如果目录不存在则尝试创建该目录 */
            @umask(0);
            /* 将目录路径拆分成数组 */
            preg_match_all('/([^/]*)/?/i', $folder, $atmp);
            /* 如果第一个字符为/则当作物理路径处理 */
            $base = ($atmp[0][0] == '/') ? '/' : '';
            /* 遍历包含路径信息的数组 */
            foreach ($atmp[1] AS $val)
            {
                if ('' != $val)
                {
                    $base .= $val;
                    if ('..' == $val || '.' == $val)
                    {
                        /* 如果目录为.或者..则直接补/继续下一个循环 */
                        $base .= '/';
                        continue;
                    }
                }
                else
                {
                    continue;
                }
                $base .= '/';
                if (!file_exists($base))
                {
                    /* 尝试创建目录,如果创建失败则继续循环 */
                    if (@mkdir(rtrim($base, '/'), 0777))
                    {
                        @chmod($base, 0777);
                        $reval = true;
                    }
                }
            }
        }
        else
        {
            /* 路径已经存在。返回该路径是不是一个目录 */
            $reval = is_dir($folder);
        }
        clearstatcache();
        return $reval;
    }    
    

     

    调用方法,实现将pdf 转为图片 进而拼接图片的功能~over~

     

    内容来源于网络如有侵权请私信删除

  • 常用正则表达式 – PHP

    1、正则匹配价格金额允许保留小数点后面两位数.
    /^(([1-9][0-9]*)|0|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/;  //允许0值的情况

    示例:

    /**
     * 检查金额格式
     * @param $money
     * @return bool
     */
    function check_money($money){
        $money_reg = '/^(([1-9][0-9]*)|0|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/';
        if(!preg_match($money_reg, $money)){
            return false;
        }
        return true;
    }

    2、邮箱的正则表达式为:/^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$/;

    3、php检查字符串是否由汉字,数字,英文字母,下划线组成,注意这里只是针对utf-8字符集的字符串检查。

    数字 汉字 英文字母:

    if (!preg_match("/^[\x{4e00}-\x{9fa5}A-Za-z0-9]+$/u", $str)) {
        echo "<font color=red>您输入的[" . $str . "]含有违法字符</font>";
    }
    

    数字 汉字 英文字母  下划线:

    if (!preg_match("/^[\x{4e00}-\x{9fa5}A-Za-z0-9_]+$/u", $str)) {
        echo "<font color=red>您输入的[" . $str . "]含有违法字符</font>";
    }
  • mysql between and 遇到日期查询边界问题

    最近实现一个按日期范围查询列表,例如输入的是日期 2015-11-01到2015-11-03,想得到1号到3号的数据,

    执行 select * from table where create_date between '2015-11-01' and '2015-11-03' 结果是1号到2号的数据,这是因为时间范围是1号0时0分0秒到3号0时0分0秒之间的数据,

    只需要把后面的日期加一天即可。

    修改,使用date_add方法

    select * from table where create_date between '2015-11-01' and date_add('2015-11-03',interval 1 day); 
    OK!

    mysql 日期加减:

    DATE_ADD(date,INTERVAL expr type) –加法
    DATE_SUB(date,INTERVAL expr type) –减法
    ————————————————
    版权声明:本文为CSDN博主「自豪潇洒」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/hchaoyangming/article/details/49619985

  • TP-高级查询

    快捷查询

    快捷查询方式是一种多字段相同查询条件的简化写法,可以进一步简化查询条件的写法,在多个字段之间用|分割表示OR查询,用&分割表示AND查询,可以实现下面的查询,例如:

    Db::table('think_user')
        ->where('name|title','like','thinkphp%')
        ->where('create_time&update_time','>',0)
        ->find();

    生成的查询SQL是:

    SELECT * FROM `think_user` WHERE ( `name` LIKE 'thinkphp%' OR `title` LIKE 'thinkphp%' ) AND ( `create_time` > 0 AND `update_time` > 0 ) LIMIT 1

    快捷查询支持所有的查询表达式。

    批量(字段)查询

    可以进行多个条件的批量条件查询定义,例如:

    Db::table('think_user')
        ->where([
            ['name', 'like', 'thinkphp%'],
            ['title', 'like', '%thinkphp'],
            ['id', '>', 0],
            ['status', '=', 1],
        ])
        ->select();

    生成的SQL语句为:

    SELECT * FROM `think_user` WHERE `name` LIKE 'thinkphp%' AND `title` LIKE '%thinkphp' AND `id` > 0 AND `status` = '1'

    数组方式如果使用exp查询的话,一定要用raw方法。

    Db::table('think_user')
        ->where([
            ['name', 'like', 'thinkphp%'],
            ['title', 'like', '%thinkphp'],
            ['id', 'exp', Db::raw('>score')],
            ['status', '=', 1],
        ])
        ->select();

    数组查询方式,确保你的查询数组不能被用户提交数据控制,用户提交的表单数据应该是作为查询数组的一个元素传入,如下:

    Db::table('think_user')
        ->where([
            ['name', 'like', $name . '%'],
            ['title', 'like', '%' . $title],
            ['id', '>', $id],
            ['status', '=', $status],
        ])
        ->select();

    注意,相同的字段的多次查询条件可能会合并,如果希望某一个where方法里面的条件单独处理,可以使用下面的方式,避免被其它条件影响。

    $map = [
            ['name', 'like', 'thinkphp%'],
            ['title', 'like', '%thinkphp'],
            ['id', '>', 0],
        ];
    Db::table('think_user')
        ->where([ $map ])
        ->where('status',1)
        ->select();

    生成的SQL语句为:

    SELECT * FROM `think_user` WHERE ( `name` LIKE 'thinkphp%' AND `title` LIKE '%thinkphp' AND `id` > 0 ) AND `status` = '1'

    如果使用下面的多个条件组合

    $map1 = [
            ['name', 'like', 'thinkphp%'],
            ['title', 'like', '%thinkphp'],
        ];
        
    $map2 = [
            ['name', 'like', 'kancloud%'],
            ['title', 'like', '%kancloud'],
        ];    
        
    Db::table('think_user')
        ->whereOr([ $map1, $map2 ])
        ->select();

    生成的SQL语句为:

    SELECT * FROM `think_user` WHERE ( `name` LIKE 'thinkphp%' AND `title` LIKE '%thinkphp' ) OR ( `name` LIKE 'kancloud%' AND `title` LIKE '%kancloud' )

    善用多维数组查询,可以很方便的拼装出各种复杂的SQL语句

    闭包查询

    $name = 'thinkphp';
    $id = 10;
    Db::table('think_user')->where(function ($query) use($name, $id) {
        $query->where('name', $name)
            ->whereOr('id', '>', $id);
    })->select();

    生成的SQL语句为:

    SELECT * FROM `think_user` WHERE ( `name` = 'thinkphp' OR `id` > 10 )

    可见每个闭包条件两边也会自动加上括号。

    混合查询

    可以结合前面提到的所有方式进行混合查询,例如:

    Db::table('think_user')
        ->where('name', 'like', 'thinkphp%')
        ->where(function ($query) {
            $query->where('id', '<', 10);
        })
        ->select();

    生成的SQL语句是:

    SELECT * FROM `think_user` WHERE  `name` LIKE 'thinkphp%' AND ( `id` < 10 )

    字符串条件查询

    对于一些实在复杂的查询,也可以直接使用原生SQL语句进行查询,例如:

    Db::table('think_user')
        ->whereRaw('id > 0 AND name LIKE "thinkphp%"')
        ->select();

    为了安全起见,我们可以对字符串查询条件使用参数绑定,例如:

    Db::table('think_user')
        ->whereRaw('id > :id AND name LIKE :name ', ['id' => 0, 'name' => 'thinkphp%'])
        ->select();

    快捷方法

    系统封装了一系列快捷方法,用于简化查询,包括:

    方法 作用
    whereOr 字段OR查询
    whereXor 字段XOR查询
    whereNull 查询字段是否为Null
    whereNotNull 查询字段是否不为Null
    whereIn 字段IN查询
    whereNotIn 字段NOT IN查询
    whereBetween 字段BETWEEN查询
    whereNotBetween 字段NOT BETWEEN查询
    whereLike 字段LIKE查询
    whereNotLike 字段NOT LIKE查询
    whereExists EXISTS条件查询
    whereNotExists NOT EXISTS条件查询
    whereExp 表达式查询
    whereColumn 比较两个字段

    下面举例说明下两个字段比较的查询条件whereColumn方法的用法。

    查询update_time大于create_time的用户数据

    Db::table('think_user')
        ->whereColumn('update_time','>','create_time')
        ->select();

    生成的SQL语句是:

    SELECT * FROM `think_user` WHERE ( `update_time` > `create_time` ) 

    查询namenickname相同的用户数据

    Db::table('think_user')
        ->whereColumn('name','=','nickname')
        ->select();

    生成的SQL语句是:

    SELECT * FROM `think_user` WHERE ( `name` = `nickname` )

    相同字段条件也可以简化为

    Db::table('think_user')
        ->whereColumn('name','nickname')
        ->select();

    支持数组方式比较多个字段

    Db::name('user')->whereColumn([
    	['title', '=', 'name'],
        ['update_time', '>=', 'create_time'],
    ])->select();

    生成的SQL语句是:

    SELECT * FROM `think_user` WHERE ( `name` = `nickname` AND `update_time` > `create_time` ) 

    动态查询

    查询构造器还提供了动态查询机制,用于简化查询条件,包括:

    动态查询 描述
    whereFieldName 查询某个字段的值
    whereOrFieldName 查询某个字段的值
    getByFieldName 根据某个字段查询
    getFieldByFieldName 根据某个字段获取某个值

    其中FieldName表示数据表的实际字段名称的驼峰法表示,假设数据表user中有emailnick_name字段,我们可以这样来查询。

    // 根据邮箱(email)查询用户信息
    $user = Db::table('user')
    	->whereEmail('thinkphp@qq.com')
        ->find();
    
    // 根据昵称(nick_name)查询用户
    $email = Db::table('user')
        ->whereNickName('like', '%流年%')
        ->select();
        
    // 根据邮箱查询用户信息
    $user = Db::table('user')
        ->getByEmail('thinkphp@qq.com');
        
    // 根据昵称(nick_name)查询用户信息
    $user = Db::table('user')
        ->field('id,name,nick_name,email')
        ->getByNickName('流年');
        
    // 根据邮箱查询用户的昵称
    $nickname = Db::table('user')
        ->getFieldByEmail('thinkphp@qq.com', 'nick_name');
        
    // 根据昵称(nick_name)查询用户邮箱
    $email = Db::table('user')
        ->getFieldByNickName('流年', 'email');

    getBygetFieldBy方法只会查询一条记录,可以和其它的链式方法搭配使用

    条件查询

    查询构造器支持条件查询,例如:

    Db::name('user')->when($condition, function ($query) {
        // 满足条件后执行
        $query->where('score', '>', 80)->limit(10);
    })->select();

    并且支持不满足条件的分支查询

    Db::name('user')->when($condition, function ($query) {
        // 满足条件后执行
        $query->where('score', '>', 80)->limit(10);
    }, function ($query) {
        // 不满足条件执行
        $query->where('score', '>', 60);
    });

  • TP-having

    HAVING方法用于配合group方法完成从分组的结果中筛选(通常是聚合条件)数据。

    having方法只有一个参数,并且只能使用字符串,例如:

    Db::table('score')
        ->field('username,max(score)')
        ->group('user_id')
        ->having('count(test_time)>3')
        ->select(); 
    

    生成的SQL语句是:

    SELECT username,max(score) FROM score GROUP BY user_id HAVING count(test_time)>3
  • Linux Crontab 定时任务

    linux内置的cron进程能帮我们实现这些需求,cron搭配shell脚本,非常复杂的指令也没有问题。

    cron介绍

    我们经常使用的是crontab命令是cron table的简写,它是cron的配置文件,也可以叫它作业列表,我们可以在以下文件夹内找到相关配置文件。

    • /var/spool/cron/ 目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名
    • /etc/crontab 这个文件负责调度各种管理和维护任务。
    • /etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。
    • 我们还可以把脚本放在/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly目录中,让它每小时/天/星期、月执行一次。

    crontab的使用

    我们常用的命令如下:

    crontab [-u username]    //省略用户表表示操作当前用户的crontab
        -e      (编辑工作表)
        -l      (列出工作表里的命令)
        -r      (删除工作作)

    我们用crontab -e进入当前用户的工作表编辑,是常见的vim界面。每行是一条命令。

    crontab的命令构成为 时间+动作,其时间有分、时、日、月、周五种,操作符有

    • * 取值范围内的所有数字
    • / 每过多少个数字
    •  从X到Z
    • 散列数字

    实例

     

    实例1:每1分钟执行一次myCommand

    * * * * * myCommand

    实例2:每小时的第3和第15分钟执行

    3,15 * * * * myCommand

    实例3:在上午8点到11点的第3和第15分钟执行

    3,15 8-11 * * * myCommand

    实例4:每隔两天的上午8点到11点的第3和第15分钟执行

    3,15 8-11 */2  *  * myCommand

    实例5:每周一上午8点到11点的第3和第15分钟执行

    3,15 8-11 * * 1 myCommand

    实例6:每晚的21:30重启smb

    30 21 * * * /etc/init.d/smb restart

    实例7:每月1、10、22日的4 : 45重启smb

    45 4 1,10,22 * * /etc/init.d/smb restart

    实例8:每周六、周日的1 : 10重启smb

    10 1 * * 6,0 /etc/init.d/smb restart

    实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb

    0,30 18-23 * * * /etc/init.d/smb restart

    实例10:每星期六的晚上11 : 00 pm重启smb

    0 23 * * 6 /etc/init.d/smb restart

    实例11:每一小时重启smb

    0 */1 * * * /etc/init.d/smb restart

    实例12:晚上11点到早上7点之间,每隔一小时重启smb

    0 23-7/1 * * * /etc/init.d/smb restart
    
  • Guzzlehttp – 如何获得Guzzle 6的回应?

    Guzzle实施PSR-7。这意味着它将默认将消息正文存储在使用PHP临时流的Stream中。要检索所有数据,可以使用casting操作符:

    $contents = (string) $response->getBody();
    

    你也可以这样做

    $contents = $response->getBody()->getContents();
    

    两种方法之间的区别在于getContents返回剩余内容,因此除非你使用rewind 查找流的位置,否则第二个调用将不会返回任何内容seek

    $stream = $response->getBody();
    $contents = $stream->getContents(); // returns all the contents
    $contents = $stream->getContents(); // empty string
    $stream->rewind(); // Seek to the beginning
    $contents = $stream->getContents(); // returns all the contents
    

    相反,使用PHP的字符串转换操作,它将从头开始读取数据流中的所有数据,直到达到结束为止。

    $contents = (string) $response->getBody(); // returns all the contents
    $contents = (string) $response->getBody(); // returns all the contents