分类 php 下的文章

今天接到一个需求,需要获取一个根据用户的总成绩及地区进行一个排名,参与人数约为20万,原计划直接查库操作,后来考虑到需要将所有数据查出再做排名处理,有可能会查询效率问题,最后决定用redis的有序集合来解决这一问题,大概逻辑如下:
一、返回所有参与用户地市的排名,按照分数从高到低排序

$redis = Redis::connection();
$redisKey = 'user-ranking-list-'.$city.':';//定义当前地市排名
$total = $redis->zcard($redisKey)
$result = $redis->zrangebyscore($redisKey, 0, $total);

二、验证用户是否存在,不存在则直接插入并返回排名,存在即返回当前排名

if($redis->zrevrank($redisKey, $mobile) == null){
    $redis->zadd($redisKey, $score, $mobile);
}
$sort = $redis->zrevrank($redisKey,$mobile)+1;//排名+1

更多有序集合介绍可以参考:https://www.runoob.com/redis/redis-sorted-sets.html

首先,进入项目根目录,这里以laravel项目为例:
cd /vaw/www/myweb/(程序根目录,非public)
然后执行以下命令,gatewayworker 启动命令和停止命令

sudo php /var/www/myweb/artisan gateway-worker:server stop    //停止服务
sudo php /var/www/myweb/artisan gateway-worker:server restart    //重启服务
sudo php /var/www/myweb/artisan gateway-worker:server start &  //启动后在后台执行

当跨域文件中包含header('Access-Control-Allow-Headers:*');时,必须将options请求过滤掉
header('Access-Control-Allow-Origin:*');
header('Access-Control-Allow-Headers:*');
header("Content-type: text/html; charset=UTF-8");
if (strtolower($_SERVER['REQUEST_METHOD']) == 'options') {
exit;
}

1、php -v 查看当前php版本
1.png
2、去官网下载对应php版本源码
2.png
3、解压缩源码包
4、进入源码包:cd php7.1.19/ext/pcntl/
5、执行命令:phpize
3.png
(注意:如果出现上述问题,先执行下面两句:
a: cd /Library/Developer/CommandLineTools/Packages
b: open macOS_SDK_headers_for_macOS_10.14.pkg {注:macOS_10.14 为系统当前版本号}
执行上面两条命令后,执行phpize即可正常返回)
4.png
6、执行./configure 命令
7、执行make && make install 命令
8、把modules/pcntl.so 复制到本地php ext目录
cp modules/pcntl.so /Applications/MAMP/bin/php/php7.1.20/lib/php/extensions/no-debug-non-zts-20160303
9、在本地php.ini中增加一条信息
echo "extension=pcntl.so" >> /Applications/MAMP/bin/php/php7.1.20/conf/php.ini
10、进入本地php安装目录,测试pcntl扩展是否安装成功
/Applications/MAMP/bin/php/php7.1.20/bin/php --ri pcntl 返回如下信息,则表示扩展安装成功:
5.png

到此扩展安装完成!

<?php
/**

  • @param array $config
  • @param string $filename 生成的文件名,包括文件名称和扩展
  • @return bool|string
    */

function createPoster($config=[] ,$filename=""){

//如果要看报什么错,可以先注释调这个header
if(empty($filename)) header("content-type: image/png");
$imageDefault = array(
    'left'=>0,
    'top'=>0,
    'right'=>0,
    'bottom'=>0,
    'width'=>100,
    'height'=>100,
    'opacity'=>100
);
$textDefault = array(
    'text'=>'',
    'left'=>0,
    'top'=>0,
    'fontSize'=>32, //字号
    'fontColor'=>'255,255,255', //字体颜色
    'angle'=>0,
);
$background = $config['background'];//海报最底层得背景
//背景方法
$backgroundInfo = getimagesize($background);
$backgroundFun = 'imagecreatefrom'.image_type_to_extension($backgroundInfo[2], false);
$background = $backgroundFun($background);
$backgroundWidth = imagesx($background); //背景宽度
$backgroundHeight = imagesy($background); //背景高度
$imageRes = imageCreatetruecolor($backgroundWidth,$backgroundHeight);
$color = imagecolorallocate($imageRes, 0, 0, 0);
imagefill($imageRes, 0, 0, $color);
// imageColorTransparent($imageRes, $color); //颜色透明
imagefilledrectangle($imageRes, 0, 0, 399, 29, $color);
imagecopyresampled($imageRes,$background,0,0,0,0,imagesx($background),imagesy($background),imagesx($background),imagesy($background));
//处理了图片
if(!empty($config['image'])){
    foreach ($config['image'] as $key => $val) {
        $val = array_merge($imageDefault,$val);
        $info = getimagesize($val['url']);
        $function = 'imagecreatefrom'.image_type_to_extension($info[2], false);
        if($val['stream']){ //如果传的是字符串图像流
            $info = getimagesizefromstring($val['url']);
            $function = 'imagecreatefromstring';
        }
        $res = $function($val['url']);
        $resWidth = $info[0];
        $resHeight = $info[1];
        //建立画板 ,缩放图片至指定尺寸
        $canvas=imagecreatetruecolor($val['width'], $val['height']);
        imagefill($canvas, 0, 0, $color);
        //关键函数,参数(目标资源,源,目标资源的开始坐标x,y, 源资源的开始坐标x,y,目标资源的宽高w,h,源资源的宽高w,h)
        imagecopyresampled($canvas, $res, 0, 0, 0, 0, $val['width'], $val['height'],$resWidth,$resHeight);
        $val['left'] = $val['left']<0?$backgroundWidth- abs($val['left']) - $val['width']:$val['left'];
        $val['top'] = $val['top']<0?$backgroundHeight- abs($val['top']) - $val['height']:$val['top'];
        //放置图像
        imagecopymerge($imageRes,$canvas, $val['left'],$val['top'],$val['right'],$val['bottom'],$val['width'],$val['height'],$val['opacity']);//左,上,右,下,宽度,高度,透明度
    }
}
//处理文字
if(!empty($config['text'])){
    foreach ($config['text'] as $key => $val) {
        $val = array_merge($textDefault,$val);
        list($R,$G,$B) = explode(',', $val['fontColor']);
        $fontColor = imagecolorallocate($imageRes, $R, $G, $B);
        $val['left'] = $val['left']<0?$backgroundWidth- abs($val['left']):$val['left'];
        $val['top'] = $val['top']<0?$backgroundHeight- abs($val['top']):$val['top'];
        imagettftext($imageRes,$val['fontSize'],$val['angle'],$val['left'],$val['top'],$fontColor,$val['fontPath'],$val['text']);
    }
}
//生成图片
if(!empty($filename)){
    $res = imagejpeg ($imageRes,$filename,90); //保存到本地
    imagedestroy($imageRes);
    if(!$res) return false;
    return $filename;
}else{
    imagejpeg ($imageRes); //在浏览器上显示
    imagedestroy($imageRes);
}

}

//调用方法
//调用方法
$config = [

'image'=>[
   [
        'url'=>'WechatIMG392.jpeg',     //二维码资源
        'stream'=>0,
        'left'=>100,
        'top'=>268,
        'right'=>0,
        'bottom'=>0,
        'width'=>178,
        'height'=>178,
        'opacity'=>100
    ]
],
'background'=>'back.jpeg',          //背景图,
'text' =>[
    [
        'text'=>$text,
        'left'=>162,
        'top'=>460,
        'fontPath'=>$font,     //字体文件
        'fontSize'=>$fontSize,             //字号
        'fontColor'=>$color,       //字体颜色
        'angle'=>0,
    ],
    [
        'text'=>$text2,
        'left'=>162,
        'top'=>590,
        'fontPath'=>$font,     //字体文件
        'fontSize'=>$fontSize,             //字号
        'fontColor'=>$color,       //字体颜色
        'angle'=>0,
    ],
]

];

$filename = date("Ymd").'.jpg';
createPoster($config,$filename);//直接生成图片
//createPoster($config);//浏览器直接预览