分类 PHP 下的文章

ThinkPHP5 自定义模版标签tablib

ThinkPHP5 自定义模版标签tablib

新建文件application/common/taglib/Diy.php
Diy.php

<?php
// +----------------------------------------------------------------------
// | 自定义模版标签
// +----------------------------------------------------------------------
// | Author: SenSen <1050575278> 2018-12
// +----------------------------------------------------------------------
namespace app\common\taglib;

use think\Db;
use think\template\TagLib;

class Sen extends TagLib
{
    protected $tags = [
        'arclist' => ['attr'=> 'field,id,limit,cid,order,name,flag,type', 'close'=>1],
        'show' => ['attr'=> 'title,field', 'close'=>0],
    ];

    /**
     * 文章标签
     * @param $tag
     * @param $content
     * @return string
     */
    public function tagArclist($tag, $content)
    {
        $id = isset($tag['id']) ? $tag['id'] : 'vo';
        $order = empty($tag['order']) ? "'id DESC'" : '"'.$tag['order'].'"';
        $name = 'article';
        $field = "''";
        if (!empty($tag['field'])) {
            if (strpos($tag['field'], '$') === 0) {
                $field = $tag['field'];
                $this->autoBuildVar($field);
            } else {
                $field = "'{$tag['field']}'";
            }
        }
        $cid = "''";
        if (!empty($tag['cid'])) {
            if (strpos($tag['cid'], '$') === 0) {
                $cid = $tag['cid'];
                $this->autoBuildVar($cid);
            } else {
                $cid = "'{$tag['cid']}'";
            }
        }
        $flag = "''";
        if (!empty($tag['flag'])) {
            if (strpos($tag['flag'], '$') === 0) {
                $flag = $tag['flag'];
                $this->autoBuildVar($flag);
            } else {
                $flag = "'{$tag['flag']}'";
            }
        }
        $type = "''";
        if (!empty($tag['type'])) {
            if (strpos($tag['type'], '$') === 0) {
                $type = $tag['type'];
                $this->autoBuildVar($type);
            } else {
                $type = "'{$tag['type']}'";
            }
        }
        $limit = "''";
        if (!empty($tag['limit'])) {
            if (strpos($tag['limit'], '$') === 0) {
                $limit = $tag['limit'];
                $this->autoBuildVar($limit);
            } else {
                $limit = "'{$tag['limit']}'";
            }
        }else{
            $limit = '0,6';
        }
        $parse = <<<parse
<?php
    \$$name = \app\common\model\Article::tagArticle([
    'field'   => {$field},
    'cid'=>{$cid},
    'limit'=>{$limit},
    'flag'=>{$flag},
    'type'=>{$type},
    'order'=>{$order}
]);
?>
{volist name="{$name}" id="{$id}"}
{$content}
{/volist}
parse;
        return $parse;
    }

    /**
     * 广告标签
     * @param $tag
     * @return mixed
     */
    public function tagShow($tag)
    {
        $title = $tag['title'] ? $tag['title'] : '';
        $result = Db::name('ad')->where(['tag'=>$title, 'status'=>1])->find();
        return $result['content'];
    }

}

- 阅读剩余部分 -

PHP下载微信头像 微信活动海报

最近搞一个微信分享吸粉的活动,需要生成用户推广海报,使用TP的图像处理类可轻易添加昵称、图片、二维码等水印信息。但在生成此海报时,由于下载微信头像到本地/服务器用时太长,导致海报生成时间过长问题。

解决方法
使用curl压缩下载图片,加速图片下载速度,实现海报生成速度由8s左右到1s的提升。

- 阅读剩余部分 -

UUID简介

UUID 通用唯一识别码(Universally Unique Identifier)其目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。

UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。

- 阅读剩余部分 -

php将base64保存为图片

<?php 
$base64_url = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAA5CAYAAACMGIOFAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkNFN0E3M0I0Mjc4NDExRTU5RkYxQjg1Rjk2QkEyNzBEIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkNFN0E3M0I1Mjc4NDExRTU5RkYxQjg1Rjk2QkEyNzBEIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6Q0U3QTczQjIyNzg0MTFFNTlGRjFCODVGOTZCQTI3MEQiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6Q0U3QTczQjMyNzg0MTFFNTlGRjFCODVGOTZCQTI3MEQiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6o6V5PAAADu0lEQVR42uyaTUgVURTHm/cigiS1LEitoHoqbgtcZAStngtDoYxa9rFsYYuWfUBhuSjCneiylkH2oavoEZlC4aYsM9toakWLnpsWyfQfOMJrOvdjZs6bedQc+OF7d9499/y9M/fj3HFc110Xo3WAYfp8BozG0agTs8hFsIM+L4H6f1GkvzEnjkYz6/4DS0WmIlORSlsq+bxcKSI3gkHwBlwSGA3PkrjPNE+GnhXAZYprkOLUjOmYQjT0un/aMHAMdcqNQ3GUWq+ujqknt/i+nwZDcc1vih4cojh0cQbqyQaw4P5tSfQo14OezYNGXV0b5zly5Le+mEX2KQTmTHVtl3U58BQ0lpQtgJ2Gei2gE7SDVrANVIMf4Bt4B56Dh+C9wdc80/4RMGteTNr/J/09+lhzW3WBCTeYTVA91WPwKGgPBrldS9kFBkA/qGOuN4FnbjTz6jczvuuoXa/93UHilnxmjoMVV8ZWyJ9IbFICz4FVV9ZWyW9FiDwGfmmCnQIXQBuoBxvobxuVT2nqen57khbpPYNFRYBzoNtiPnXod3MKP0VqJxGRjmaQGQXVAf1VUz3VYOQkIbJLEdADkA3pM0v1OetKQuQ4E8gHUBXxEfDqzzC+x+MW2aL4b+eFRuu8wn9LGH9hN82dTNlrMCa02xgjf347GmdmoJ0puyu8rbrHlB2MU2QrUzYuLLJg2a6VyA7KbLsMi3Tdb9sVuwRJ+2TZrjF+b+4pTd2rkk/1hky4Z+vBapkz7lzW3Ri/ze3KpTqKTNlmYYG1TNlKmJRJpiSDxpkqq/aVKdsrLHIPU/ZFkwFUxu/dYk8M3c3ZNNjnKzsEXgmKPKxo12/G+MOOri+YslPCPXnSst2yTSEjTNkBkBcSmCd/Nu1aDF/hl15cDmdGYO26SXrtGuUs5AZT1kQrn2xIn1la6TQx1/rDT0TR9pMFxUL6fogeraJ6nBWS2k+uZQZUyauPtOO38dNNv1cltZqTzvH0WOZ49oMaqlND321yPCfSbF2ad5UXufaMFiIKLER9BqOK9Ea4m2CZEk61mrOQyYDiJjUpzFpqb5nad8olkjsfvG6RC7oIRsBsSY62SN9H6Lopd3MtyvmorcCM4gD0dkxnk7eiHARHEWg84RWkUXPinZEQeSXsCa8wOYXQqxIi31aAQN3R/rTEAv1lqCNs3taSTqoEmclmqf2FIFlCm3cGvBeBzoOt4I7vraqgJvW+awPF9B0MgJ9RRZYz+5a+75qKTEWmIstuFfm+q7RJve8ayH4LMACaxEJEaXs23AAAAABJRU5ErkJggg==';

preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_url, $result);
$type = $result[2];

$base64_body = substr(strstr($base64_url,','),1);
$img = base64_decode($base64_body);

$file_name_ok = md5(time()).".".$type;
file_put_contents($file_name_ok, $img);

ThinkPHP5 后台不使用API路由

THINKPHP5开发API接口路由容易影响后台管理系统访问,需在route.php中使用路由变量规则定义API路由
Route::pattern('ver','^v\d+');
此时定义API路由
Route::get(':ver/version', "api/common/get_version");

PHP获取关键词在百度、360、搜狗排名 关键词排名查询

工作过程需要定时查询某些关键在百度、360及搜狗中的排序,于是写了一个简单的查询类,有更好的方法或错误可以回复交流。
基本思路:根据关键词搜索结果匹配所在页面中的排序值
ThinkPHP5 /extend/org/util/KeyRank.php

<?php
namespace org\util;

error_reporting(E_ALL & ~E_NOTICE);

/**
 * 获取关键词在百度、360、搜狗排名
 * 
 * Author: IceCry <http://www.zhinizhiwo.com>
 *
 * @param      string   $key    检测关键字
 * @param      string   $url    检测域名
 * @param      integer  $deep   页面深度
 * @param      integer  $start  起始页面
 * @param      integer  $trytime尝试次数
 *
 * @return     integer  排名(不包含竞价广告,为自然排名)
 */
class KeyRank{
    private static $url;
    private static $key;
    private static $start;
    private static $deep;
    private static $trytime;

    public function __construct($key='', $url='', $deep=3, $start=1, $trytime=3) {
        if($key==='' || $url===''){
            die('key & url required !');
        }
        self::$url = $url;
        self::$key = $key;
        self::$deep = $deep;
        self::$start = $start;
        self::$trytime = $trytime;
    }
    
    //百度
    public static function baiduRank(){
        $rank=$page=0;
        $res = ['rank'=>$rank, 'page'=>$rank];
        for ($d=self::$start; $d <= self::$deep; $d++) {
            $pn = 10*($d-1);
            $url  = "http://www.baidu.com/s?ie=utf-8&wd=".urlencode(self::$key).'&pn='.$pn;
            $str = self::https_request($url);
            preg_match("/<div id=\"content_left\">.*?<div id=\"rs\">/ism", $str, $content);
            $str = $content[0];
            $arr = explode('<div class="result', $str);
            // var_dump($arr);die;

            if(!$arr[0]){
                for ($i=0; $i < self::$trytime; $i++) {
                    $str = self::https_request($url);
                    preg_match("/<div id=\"content_left\">.*?<div id=\"rs\">/ism", $str, $content);
                    $str = $content[0];
                    $arr = explode('<div class="result', $str);
                    if($arr[0] != ''){
                        break;
                    }
                    sleep(3);
                }
                if(!$arr[0]){
                    $err = date('Y/m/d H:i:s')."【错误】#百度#关键词@".self::$key."@页面抓取失败\r\n";
                    file_put_contents('./err.log', $err, FILE_APPEND);
                    break;
                }
            }

            foreach ($arr as $k => $v) {
                if($k==0) continue;
                // preg_match("/<div class=\"f13\">.*?<\/a>/ism", $v, $xxx);
                preg_match("/class=\"c-showurl\".*?>.*?<\/[^b|.]*?>/ism", $v, $xxx);
                if(isset($xxx[0]) && strstr(strip_tags($xxx[0]), self::$url)){
                    global $rank, $page;
                    $page = $d;
                    $rank = $k + ($d-1)*10;
                    break;
                }
            }
            
            if($rank){
                $res['rank'] = $rank;
                $res['page'] = $page;
                return $res;
            }
        }
        return $res;
    }

    //360
    public static function soRank(){
        $rank=$page=0;
        $res = ['rank'=>$rank, 'page'=>$rank];
        for ($d=self::$start; $d <= self::$deep; $d++) {
            $url = "https://www.so.com/s?ie=utf-8&fr=so.com&src=home_so.com&q=".urlencode(self::$key)."&pn=".$d;
            $str = self::https_request($url);
            preg_match("/<ul class=\"result\">.*?<div id=\"side\">/ism", $str, $content);
            $str = $content[0];
            $arr = explode('<li class="res-list', $str);

            if(!$arr[0]){
                for ($i=0; $i < self::$trytime; $i++) {
                    $str = self::https_request($url);
                    preg_match("/<ul class=\"result\">.*?<div id=\"side\">/ism", $str, $content);
                    $str = $content[0];
                    $arr = explode('<li class="res-list', $str);
                    if($arr[0] != ''){
                        break;
                    }
                    sleep(3);
                }
                if(!$arr[0]){
                    $err = date('Y/m/d H:i:s')."【错误】#360#关键词@".self::$key."@页面抓取失败\r\n";
                    file_put_contents('./err.log', $err, FILE_APPEND);
                    break;
                }
            }

            foreach ($arr as $k => $v) {
                if($k==0) continue;
                preg_match("/<cite>.*?<\/cite>/ism", $v, $xxx);
                if(isset($xxx[0]) && strstr(strip_tags($xxx[0]), self::$url)){
                    global $rank, $page;
                    $page = $d;
                    $rank = $k + ($d-1)*10;
                    break;
                }
            }
            
            if($rank){
                $res['rank'] = $rank;
                $res['page'] = $page;
                return $res;
            }
        }
        return $res;
    }

    //搜狗
    public static function sogouRank(){
        $rank=$page=0;
        $res = ['rank'=>$rank, 'page'=>$rank];
        for ($d=self::$start; $d <= self::$deep; $d++) {
            $url = "https://www.sogou.com/web?query=".urlencode(self::$key)."&page=".$d;
            $str = self::https_request($url);
            preg_match("/<div class=\"results\".*?<div class=\"right\"/ism", $str, $content);
            $str = $content[0];
            $arr = explode('<!-- a -->', $str);

            if(!$arr[0]){
                for ($i=0; $i < self::$trytime; $i++) {
                    $str = self::https_request($url);
                    preg_match("/<div class=\"results\".*?<div class=\"right\"/ism", $str, $content);
                    $str = $content[0];
                    $arr = explode('<!-- a -->', $str);
                    if($arr[0] != ''){
                        break;
                    }
                    sleep(3);
                }
                if(!$arr[0]){
                    $err = date('Y/m/d H:i:s')."【错误】#搜狗#关键词@".self::$key."@页面抓取失败\r\n";
                    file_put_contents('./err.log', $err, FILE_APPEND);
                    break;
                }
            }

            //sogou首页个数非稳定10个 判断排名依据
            foreach ($arr as $k => $v) {
                $total = count($arr);
                if($k==0) continue;
                preg_match("/<cite.*?>.*?<\/cite>/ism", $v, $xxx);
                if(isset($xxx[0]) && strstr(strip_tags($xxx[0]), self::$url)){
                    global $rank, $page;
                    $page = $d;
                    // $rank = $k + ($d-1)*10;
                    $tmp += $total;
                    $rank = $k + $tmp - $total;
                    break;
                }
            }
            
            if($rank){
                $res['rank'] = $rank;
                $res['page'] = $page;
                return $res;
            }
        }
        return $res;
    }

    //curl
    public static function https_request($url, $data = null){
        $headers = array(
            "Content-type:application/html;charset=utf-8",
            "User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36",
            'Cache-Control:no-cache'
        );
        $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_TIMEOUT,3);
        if (!empty($data)){
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        $output = curl_exec($curl);
        curl_close($curl);
        return $output;
    }
}

/*$KeyRank = new KeyRank('婧氏纸尿裤', 'magibaby.net', 2);
$baidu = $KeyRank::baiduRank();
$so = $KeyRank::soRank();
$sogou = $KeyRank::sogouRank();
var_dump($baidu);
var_dump($so);
var_dump($sogou);*/

password_hash密码哈希与安全

支持PHP5.5+
项目中大部分加密基于MD5+SALT,事实上password_hash()已经帮我们处理好了加盐。加进去的随机子串通过加密算法自动保存着,成为哈希的一部分。password_verify()会把随机子串从中提取,所以你不必使用另一个数据库来记录这些随机子串,大大简化了计算密码哈希值和验证密码的操作。

- 阅读剩余部分 -