首页
关于小站
朋友
壁纸
留言
时光之书
笔顺字帖
LayUI手册
Search
1
【PHP】PHPoffice/PHPSpreadsheet读取和写入Excel
2,202 阅读
2
【Layui】控制页面元素展示隐藏
2,014 阅读
3
【Git】No tracked branch configured for branch master or the branch doesn't exist.
1,943 阅读
4
【PHP】PHP实现JWT生成和验证
1,906 阅读
5
【composer】composer常用命令
1,722 阅读
默认分类
PHP
ThinkPHP
Laravel
面向对象
设计模式
算法
基础
网络安全
webman
Web
HTML
CSS
JavaScript
jQuery
Layui
VUE
uni-app
Database
MySQL
Redis
RabbitMQ
Nginx
Git
Linux
Soft Ware
Windows
网赚
Go
Docker
Elasticsearch
登录
Search
标签搜索
PHP
函数
方法
类
MySQL
ThinkPHP
JavaScript
OOP
Layui
Web
Server
Nginx
Docker
PHPSpreadsheet
PHPoffice
Array
设计模式
Git
排序算法
基础
小破孩
累计撰写
261
篇文章
累计收到
13
条评论
首页
栏目
默认分类
PHP
ThinkPHP
Laravel
面向对象
设计模式
算法
基础
网络安全
webman
Web
HTML
CSS
JavaScript
jQuery
Layui
VUE
uni-app
Database
MySQL
Redis
RabbitMQ
Nginx
Git
Linux
Soft Ware
Windows
网赚
Go
Docker
Elasticsearch
页面
关于小站
朋友
壁纸
留言
时光之书
笔顺字帖
LayUI手册
搜索到
162
篇与
的结果
2025-03-13
【PHP】发送腾讯云短信
优化空间很大,先用着,能用<?php namespace app\common\lib\sms\tencent; //缓存 use think\facade\Cache; use TencentCloud\Common\Credential; use TencentCloud\Common\Profile\ClientProfile; use TencentCloud\Common\Profile\HttpProfile; use TencentCloud\Common\Exception\TencentCloudSDKException; use TencentCloud\Sms\V20210111\SmsClient; use TencentCloud\Sms\V20210111\Models\SendSmsRequest; class Sms{ public $SecretID = "......................"; public $SecretKey = "......................."; public $SmsSdkAppId = "..........."; public $TemplateId = "........."; public $SignName = "............"; public $code; public $phone; public function __construct($phone = '', $code = '', $tempID = '') { $this->phone = $phone; $this->code = $code; if(!empty($tempID)){ $this->TemplateId = $tempID; } } public function send(){ try { //控制台 >API密钥管理页面获取 SecretID 和 SecretKey $cred = new Credential($this->SecretID, $this->SecretKey); //实例化一个http选项 [可选] $httpProfile = new HttpProfile(); $httpProfile->setEndpoint("sms.tencentcloudapi.com"); //实例化一个client选项 [可选] $clientProfile = new ClientProfile(); $clientProfile->setHttpProfile($httpProfile); /** * 实例化以sms为例的client对象, [第三个参数 可选] * * 第二个参数是地域信息,可以直接填 ap-guangzhou */ $client = new SmsClient($cred, "ap-beijing", $clientProfile); // 实例化一个sms发送短信请求对象,每个接口都会对应一个request对象。 $req = new SendSmsRequest(); //生成随机验证码 // $code = rand(11111, 99999); // $params = array( // //接收方手机号,带上+86 示例:+8613711112222 // "PhoneNumberSet" => array((string)$this->phone), // //短信应用ID:在 [短信控制台] 添加应用后生成的实际SdkAppId // "SmsSdkAppId" => (string)$this->SmsSdkAppId, // //短信签名内容:[不理解可以看文章里的截图] // "SignName" => (string)$this->SignName, // //模板ID:必须填写已审核通过的模板 // "TemplateId" => (string)$this->TemplateId, // //我的模板中有两个参数 第一个是验证码参数 第二个是有效时间 若无模板参数,则设置为空 // "TemplateParamSet" => array((string)$this->code, '10'), // //SecretID // // "SenderId" => (string)$this->SecretID // ); $params = array( "PhoneNumberSet" => array( (string)$this->phone ), "SmsSdkAppId" => (string)$this->SmsSdkAppId, "SignName" => (string)$this->SignName, "TemplateId" => (string)$this->TemplateId, "TemplateParamSet" => array( (string)$this->code), // "SenderId" => (string)$this->SecretID ); $req->fromJsonString(json_encode($params)); //发出请求,返回一个实例 $resp = $client->SendSms($req); // print_r($resp);die; //如果成功,把验证码存入缓存 //成功实例中的Code值为 Ok if ($resp->SendStatusSet[0]->Code === "Ok") { return true; // Cache::set('name', $code, 600); // return json(['msg' => "发送成功", 'code' => 200]); } } catch (TencentCloudSDKException $e) { echo $e; } } }
2025年03月13日
91 阅读
0 评论
0 点赞
2025-03-13
【PHP】打印猿&蜂打打 开放平台 完整对接
基础类<?php namespace app\common\lib\printman; use think\facade\Log; class Basic { #APPID public $AppId; #密钥 public $AppSecret; #API地址 public $ApiUrl; #打印机ID public $PrinterId; public function __construct($AppId, $AppSecret, $PrinterId) { $this->AppId = $AppId; $this->AppSecret = $AppSecret; $this->ApiUrl = "https://iot-app-prod.fengdada.cn/mk/api"; $this->PrinterId = $PrinterId; } public function encode($BizData, $nonce) { // global $AppSecret; $jsonBytes = mb_convert_encoding($BizData , 'utf-8'); $bizData = strval($jsonBytes); $sign_ori = $bizData . $nonce . $this->AppSecret; $md5_hash = md5($sign_ori, true); $sign = base64_encode($md5_hash); return $sign; } public function generate_verification_code() { $verification_code = ""; for ($i = 0; $i < 6; $i++) { $verification_code .= strval(rand(0, 9)); } return $verification_code; } public function requests_post($url, $data, $headers) { $ch = curl_init(); curl_setopt($ch, CURLOPT_CAINFO, "cacert-2023-01-10.pem"); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); return $response; } public function DoMyPost($URL, $json_BizData) { $ts = round(microtime(true) * 1000); $nonce = $this->generate_verification_code(); $sign = $this->encode($json_BizData, $nonce); $data = array( "bizData" => $json_BizData, "nonce" => $nonce, "appId" => $this->AppId, "timestamp" => strval($ts) ); $headers = array( 'Content-Type: application/json', 'sign:'.$sign ); // $response = $this->requests_post($URL, json_encode($data), $headers); $response = $this->curlRequest($URL, "POST",json_encode($data),true,false, $headers); Log::write("打印机日志:".print_r($response,true),'printman'); if(empty($response)) { echo "Error: no response received"; }else{ return $response; } } // 云打印验证码 public function PrintCaptcha() { $URL = $this->ApiUrl."/print/captcha"; $BizData = array('printerId' => $this->PrinterId); $json_BizData = json_encode($BizData); return $this->DoMyPost($URL, $json_BizData); } // 云打印机绑定 public function PrintBind($VerificationCode) { $URL = $this->ApiUrl."/printer/bind"; $BizData = array('printerId' => $this->PrinterId, 'captcha' => $VerificationCode); $json_BizData = json_encode($BizData); return $this->DoMyPost($URL, $json_BizData); } // 云打印 public function CloudPrint( $ShareCode, $PrintDataList) { $URL = $this->ApiUrl."/print"; $BizData = array('printerId' => $this->PrinterId, 'shareCode' => $ShareCode, 'printData' => $PrintDataList); $json_BizData = json_encode($BizData); return $this->DoMyPost($URL, $json_BizData); } // 云打印状态查询 public function QueryPrintStatus($ShareCode) { $URL = $this->ApiUrl."/printer/status/query"; $BizData = array('printerId' => $this->PrinterId, 'shareCode' => $ShareCode); $json_BizData = json_encode($BizData); return $this->DoMyPost($URL, $json_BizData); } //云打印解绑//0标识解绑失败,1标识解绑成功 public function unbind($ShareCode){ $URL = $this->ApiUrl."/printer/unbind"; $BizData = array('printerId' => $this->PrinterId, 'shareCode' => $ShareCode); $json_BizData = json_encode($BizData); return $this->DoMyPost($URL, $json_BizData); } /** * @Author: 小破孩嫩 * @Email: 3584685883@qq.com * @Time: 2021/4/1 10:39 * @param string $url url地址 * @param string $method 请求方法,默认为 'GET',可选值为 'GET' 或 'POST' * @param mixed $data 要发送的数据,如果是 POST 请求则为数据内容,否则为 null * @param array $headers 自定义请求头信息 * @param int $timeout 超时时间,默认为 30 秒 * @param bool $verifySSL 是否验证 SSL 证书,默认为 true * @param bool $flbg 返回值是否转成数组,默认不转 * @param bool $headercontent 是否获取请求的header值内容,默认不获取 * @return array|bool|mixed|string * @Description:curl请求 */ protected function curlRequest($url, $method = 'GET', $data = null, $flbg = false, $verifySSL = true, $headers = [], $headerContent = false, $timeout = 30) { // 初始化 cURL 会话 $ch = curl_init(); // 设置要请求的 URL curl_setopt($ch, CURLOPT_URL, $url); // 设置获取的信息以字符串形式返回,而不是直接输出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 设置超时时间 curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); // 设置请求方法 if ($method === 'POST') { curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } // 设置请求头 if (!empty($headers)) { curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); } // 设置是否验证 SSL 证书 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $verifySSL); // 执行 cURL 会话并获取响应 $response = curl_exec($ch); // 获取 HTTP 响应码 $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 如果 cURL 执行出错 if (curl_errno($ch)) { // 输出错误信息 echo 'Curl error: ' . curl_error($ch); // 关闭 cURL 会话并返回 false curl_close($ch); return false; } // 如果 HTTP 响应码大于等于 400(表示错误) elseif ($httpCode >= 400) { // 输出错误信息 echo "HTTP error: $httpCode"; // 关闭 cURL 会话并返回 false curl_close($ch); return false; } // 处理是否获取请求头内容 if ($headerContent && $httpCode == 200) { $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $headers = substr($response, 0, $headerSize); $body = substr($response, $headerSize); curl_close($ch); return [$headers, $body]; } // 关闭 cURL 会话 curl_close($ch); // 处理是否将响应转换为数组 if ($flbg) { $response = json_decode($response, true); } // 返回响应内容 return $response; } /** * @Author:小破孩 * @Email:3584685883@qq.com * @Time:2025/1/10 14:02 * @param $code * @return string * @Description:打印机错误码 */ public function errorCode($code){ $errorCodes = [ 200 => "success 成功", 500 => "sys fail 系统异常", 2001 => "sign check fail 签名失败", 2002 => "not find partner 查无合作伙伴", 2003 => "illegal access 非法访问", 3001 => "param check error 参数错误", 3002 => "please input params 请输入参数", 40001 => "please input APPID 请输入appid", 40002 => "biz exception 业务异常", 40003 => "printer xxx is offline 打印机离线", 40004 => "printer xxx is not auth 打印机未授权", 40005 => "shareCode is error 分享码错误", 40006 => "printer xxx after 5 minutes reprinting 请5分钟后重试", 40007 => "printer xxx captcha error 验证码错误", 40008 => "printer xxx captcha expired 验证码过期", 40009 => "printer xxx bind fail 绑定失败", 40023 => "lip not close 盖子未闭合", 40023 => "sticker 粘纸", 40023 => "sticker and lip not close 粘纸并且盖子未闭合", 40023 => "no page 缺纸", 40023 => "no page and lip not close 缺纸并且盖子未闭合", 40023 => "temperature too high 温度过高", 40023 => "temperature too high and lip not close 温度过高且盖子未闭合", 40023 => "temperature too high and sticker 温度过高且粘纸", 40023 => "temperature too high and lip not close and sticker 温度过高且粘纸,盖子未闭合", 40023 => "command error 指令错误" ]; return $errorCodes[$code]; } }模板<?php namespace app\common\lib\printman\template; use app\common\lib\printman\Template; class Temp1 implements Template { protected $id; public function __construct($id = "") { $this->id = $id; } /** * @Author:小破孩 * @Email:3584685883@qq.com * @Time:2025/1/10 10:51 * @return string * @Description:打印模板1 */ public function temp($order = ""){ if(empty($order)){ return "没有订单信息"; } $height = ceil(self::getTempHight($order)/10+50); $i = 40; $template = ""; $template .= "SIZE 72 mm, ".$height." mm\r\n"; $template .= "CODEPAGE 437\r\n"; $template .= "DENSITY 8\r\n"; $template .= "CLS \r\n"; $template .= "CODEPAGE 936\r\n"; $template .= "DIRECTION 0\r\n"; $template .= "TEXT 220,0,\"4\",0,1,1,\""."订单详情"."\"\r\n"; //小票标题 $template .= "TEXT 220,".$i.",\"4\",0,1,1,\"".""."\"\r\n"; //换行 $template .= "TEXT 40,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"订单编号:".$order['o_uuid']."\"\r\n"; $template .= "TEXT 40,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"打印时间:".date("Y-m-d H:i:s")."\"\r\n"; $template .= "TEXT 40,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"申 请 人:".$order['o_address_name']."\"\r\n"; $template .= "TEXT 40,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"联系方式:".$order['o_address_tel_default']."\"\r\n"; $template .= "TEXT 40,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"收货地址:".mb_substr($order['o_address_info'],0,16)."\"\r\n"; if(mb_strlen($order['o_address_info']) > 16){ $template .= "TEXT 40,"; $template .= $i+=30; $template .=",\"0\",0,1,1,\" ".mb_substr($order['o_address_info'],16)."\"\r\n"; } $template .= "TEXT 40,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"申请时间:".$order['o_create_time']."\"\r\n"; // $template .= "TEXT 40,"; // $template .= $i+=30; // $template .= ",\"0\",0,1,1,\"审核时间:".date("Y-m-d H:i:s",$order['o_pay_receipt_allow_time'])."\"\r\n"; $template .= "TEXT 40,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"配 送 员:".$order['salesmaninfo']['sm_name']."\"\r\n"; $template .= "TEXT 40,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"配送电话:".$order['salesmaninfo']['sm_phone']."\"\r\n"; $template .= "TEXT 40,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"出货仓库:".$order['warehouse_name']."\"\r\n"; $template .= "TEXT 40,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"商品总数:".$order['goods_total_num']."\"\r\n"; $template .= "TEXT 40,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"商品总价:".$order['o_real_price']."\"\r\n"; $template .= "BAR 20,"; $template .= $i+=28; $template .= ",720,2\r\n"; $template .= "TEXT 40,"; $template .= $i+=16; $template .= ",\"0\",0,1,1,\"商品 数量 单价 金额\"\r\n"; $template .= "BAR 20,"; $template .= $i+=28; $template .= ",720,2\r\n"; foreach ($order['order_list'] as $kk => $vv){ if(!empty($vv['oi_issendgoods'])){ $firstNamaText = "赠品:"; }else{ $firstNamaText = "商品:"; } $knum = $kk+=1; $template .= "TEXT 30,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"$knum.". mb_substr($firstNamaText.$vv['oi_sku_info']['goods_info']['withgoodsinfoinfo']['sg_name'].'('.$vv['oi_sku_info']['sgcs_name'].')',0,26)."\"\r\n"; if(mb_strlen($firstNamaText.$vv['oi_sku_info']['goods_info']['withgoodsinfoinfo']['sg_name'].'('.$vv['oi_sku_info']['sgcs_name'].')') > 26){ $template .= "TEXT 30,"; $template .= $i+=30; $template .=",\"0\",0,1,1,\" ".mb_substr($firstNamaText.$vv['oi_sku_info']['goods_info']['withgoodsinfoinfo']['sg_name'].'('.$vv['oi_sku_info']['sgcs_name'].')',26)."\"\r\n"; } $template .= "TEXT 65,"; $template .= $i+=30; if(!empty($vv['oi_issendgoods'])){ $template .=",\"0\",0,1,1,\"".$vv['oi_sku_info']['num'].'件'.' '."0.00".' '."0.00"."\"\r\n"; }else{ $template .=",\"0\",0,1,1,\"".$vv['oi_sku_info']['num'].'件'.' '.sprintf("%.2f",$vv['oi_sku_info']['sgcs_price']/$vv['oi_sku_info']['num']).' '.$vv['oi_real_price']."\"\r\n"; } } $template .= "BAR 20,"; $template .= $i+=28; $template .= ",720,2\r\n"; $template .= "TEXT 40,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"数量总计:".$order['goods_total_num'].'件'."\"\r\n"; $template .= "PRINT 1,1"; $instacneStr = new \app\common\lib\data\Str(); $data = [ 'waybillPrinterData' => $instacneStr->gzipAndBase64Encode($template), 'printType' => 'tspl', 'id' => $this->id ]; return [$data]; } protected function getTempHight($order){ $i = 50; $template = ""; $template .= "SIZE 72 mm, 90 mm\r\n"; $template .= "CODEPAGE 437\r\n"; $template .= "DENSITY 8\r\n"; $template .= "CLS \r\n"; $template .= "CODEPAGE 936\r\n"; $template .= "DIRECTION 0\r\n"; $template .= "TEXT 220,0,\"4\",0,1,1,\""."订单详情"."\"\r\n"; //小票标题 $template .= "TEXT 220,".$i.",\"4\",0,1,1,\"".""."\"\r\n"; //换行 $template .= "TEXT 40,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"订单编号:".$order['o_uuid']."\"\r\n"; $template .= "TEXT 40,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"打印时间:".date("Y-m-d H:i:s")."\"\r\n"; $template .= "TEXT 40,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"申 请 人:".$order['o_address_name']."\"\r\n"; $template .= "TEXT 40,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"联系方式:".$order['o_address_tel_default']."\"\r\n"; $template .= "TEXT 40,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"收货地址:".mb_substr($order['o_address_info'],0,16)."\"\r\n"; if(mb_strlen($order['o_address_info']) > 16){ $template .= "TEXT 40,"; $template .= $i+=30; $template .=",\"0\",0,1,1,\" ".mb_substr($order['o_address_info'],16)."\"\r\n"; } $template .= "TEXT 40,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"申请时间:".$order['o_create_time']."\"\r\n"; // if(empty($order['o_help'])){ // $template .= "TEXT 40,"; // $template .= $i+=30; // $template .= ",\"0\",0,1,1,\"审核时间:".date("Y-m-d H:i:s",$order['o_pay_receipt_allow_time'])."\"\r\n"; // } $template .= "TEXT 40,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"配送员姓名:".$order['salesmaninfo']['sm_name']."\"\r\n"; $template .= "TEXT 40,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"配送员电话:".$order['salesmaninfo']['sm_phone']."\"\r\n"; $template .= "TEXT 40,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"出货仓库:".$order['warehouse_name']."\"\r\n"; $template .= "TEXT 40,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"商品总数:".$order['goods_total_num']."\"\r\n"; $template .= "TEXT 40,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"商品总价:".$order['o_real_price']."\"\r\n"; $template .= "BAR 20,"; $template .= $i+=28; $template .= ",720,2\r\n"; $template .= "TEXT 40,"; $template .= $i+=16; $template .= ",\"0\",0,1,1,\"商品 数量 单价 金额\"\r\n"; $template .= "BAR 20,"; $template .= $i+=28; $template .= ",720,2\r\n"; // foreach ($order as $key => $val){ foreach ($order['order_list'] as $kk => $vv){ if(!empty($vv['oi_issendgoods'])){ $firstNamaText = "赠品:"; }else{ $firstNamaText = "商品:"; } $knum = $kk+=1; $template .= "TEXT 30,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"$knum.". mb_substr($firstNamaText.$vv['oi_sku_info']['goods_info']['withgoodsinfoinfo']['sg_name'].'('.$vv['oi_sku_info']['sgcs_name'].')',0,26)."\"\r\n"; if(mb_strlen($firstNamaText.$vv['oi_sku_info']['goods_info']['withgoodsinfoinfo']['sg_name'].'('.$vv['oi_sku_info']['sgcs_name'].')') > 26){ $template .= "TEXT 30,"; $template .= $i+=30; $template .=",\"0\",0,1,1,\" ".mb_substr($firstNamaText.$vv['oi_sku_info']['goods_info']['withgoodsinfoinfo']['sg_name'].'('.$vv['oi_sku_info']['sgcs_name'].')',26)."\"\r\n"; } $template .= "TEXT 65,"; $template .= $i+=30; $template .=",\"0\",0,1,1,\"".$vv['oi_sku_info']['num'].'件'.' '.$vv['oi_sku_info']['sgcs_price'].' '.$vv['oi_sku_info']['sgcs_price']*$vv['oi_sku_info']['num']."\"\r\n"; } $template .= "BAR 20,"; $template .= $i+=28; $template .= ",720,2\r\n"; $template .= "TEXT 40,"; $template .= $i+=30; $template .= ",\"0\",0,1,1,\"数量总计:".$order['goods_total_num']."\"\r\n"; // } $template .= "PRINT 1,1"; return $i; } }
2025年03月13日
315 阅读
0 评论
1 点赞
2025-03-13
【PHP】给富文本内容的图片,视频,文件 拼接当前网址域名
/** * @Author:小破孩 * @Email:3584685883@qq.com * @Time:2024/11/18 15:20 * @param $text * @param $domain * @return string|string[]|null * @Description:给服务文本拼接当前网址域名 */ public function addDomainToPaths($text, $domain){ // 匹配图片路径 $text = preg_replace('/<img.*?src="([^"]+)"/i', '<img src="' . $domain . '$1"', $text); // 匹配视频路径 $text = preg_replace('/<video.*?src="([^"]+)"/i', '<video src="' . $domain . '$1"', $text); // 匹配文件路径(可根据具体文件类型的链接特征进行修改) $text = preg_replace('/<a.*?href="([^"]+)"/i', '<a href="' . $domain . '$1"', $text); return $text; }
2025年03月13日
180 阅读
0 评论
0 点赞
2025-03-13
【PHP】过滤富文本内容
封装了一个类class TextFilter { // 定义要过滤的 SQL 关键字模式 const SQL_PATTERNS = [ '/\b(SELECT|INSERT|UPDATE|DELETE|FROM|WHERE|AND|OR|JOIN|DROP|CREATE|ALTER|TRUNCATE|GRANT|REVOKE|SET)\b/i', '/\b(AS|LIKE|NOT|IN|BETWEEN|IS|NULL|COUNT|SUM|AVG|MIN|MAX)\b/i', '/\b(UNION|ALL|ANY|EXISTS)\b/i', '/\b(ORDER\s+BY|LIMIT)\b/i' ]; // 定义要过滤的常见函数模式 const FUNCTION_PATTERNS = [ '/\b(function\s+\w+\s*\([^)]*\))\b/i', '/\b(eval|exec|system|passthru|shell_exec|assert)\b/i' ]; // 定义要过滤的特殊字符和表达式模式 const SPECIAL_PATTERNS = [ '/\$\{.*?\}/', // 过滤类似 ${expression} 的表达式 '/@.*?;/', // 过滤以 @ 开头并以 ; 结尾的表达式 '/\b(phpinfo|var_dump)\b/i', // 过滤特定的 PHP 函数 '/<\s*(script|iframe|object|embed|applet)[^>]*>/i' // 过滤危险的脚本标签 ]; // 定义要过滤的危险属性模式 const DANGEROUS_ATTRIBUTES_PATTERNS = [ '/on\w+\s*=/i', // 过滤以 "on" 开头的事件属性 '/javascript:[^"]*"/i' // 过滤 JavaScript 协议的链接 ]; /** * @Author:小破孩 * @Email:3584685883@qq.com * @Time:2024/10/24 13:50 * @param $text * @return string|string[]|null * @Description:过滤富文本 */ public static function filterRichText($text) { // 合并所有要过滤的模式 $allPatterns = array_merge( self::SQL_PATTERNS, self::FUNCTION_PATTERNS, self::SPECIAL_PATTERNS, self::DANGEROUS_ATTRIBUTES_PATTERNS ); // 先过滤所有匹配的模式 $filteredText = preg_replace($allPatterns, '', $text); // 保留 <img> 标签,但需要确保 src 属性是安全的 $filteredText = preg_replace_callback('/<img[^>]+>/i', [__CLASS__, 'filterImgTag'], $filteredText); // 允许表情符号和其他图标 $filteredText = preg_replace('/[\x{1F600}-\x{1F64F}]|\x{1F300}-\x{1F5FF}|\x{1F680}-\x{1F6FF}|\x{2600}-\x{26FF}|\x{2700}-\x{27BF}/u', '$0', $filteredText); // 处理可能出现的连续空格 $filteredText = preg_replace('/\s+/', ' ', $filteredText); // 去除前后的空格 $filteredText = trim($filteredText); // 转换 HTML 实体 $filteredText = htmlentities($filteredText, ENT_QUOTES, 'UTF-8'); return $filteredText; } private static function filterImgTag($matches) { $imgTag = $matches[0]; if (preg_match('/src=["\'](?<src>[^"\']+)["\']/i', $imgTag, $srcMatch)) { $src = $srcMatch['src']; // 这里可以进一步验证 src 是否是允许的 URL 或本地路径 if (filter_var($src, FILTER_VALIDATE_URL) || strpos($src, '/') === 0) { return $imgTag; } } return ''; } } // 示例调用 $text = '<script>alert("XSS")</script><img src="https://example.com/image.jpg">'; $filteredText = TextFilter::filterRichText($text); echo $filteredText; 函数 方法 /** * @Author:小破孩 * @Email:3584685883@qq.com * @Time:2024/10/24 13:50 * @param $text * @return string|string[]|null * @Description:过滤富文本 */ public static function filterRichText($text){ // 定义要过滤的 SQL 关键字模式 $sqlPatterns = [ '/\b(SELECT|INSERT|UPDATE|DELETE|FROM|WHERE|AND|OR|JOIN|DROP|CREATE|ALTER|TRUNCATE|GRANT|REVOKE|SET)\b/i', '/\b(AS|LIKE|NOT|IN|BETWEEN|IS|NULL|COUNT|SUM|AVG|MIN|MAX)\b/i', '/\b(UNION|ALL|ANY|EXISTS)\b/i', '/\b(ORDER\s+BY|LIMIT)\b/i' ]; // 定义要过滤的常见函数模式 $functionPatterns = [ '/\b(function\s+\w+\s*\([^)]*\))\b/i', '/\b(eval|exec|system|passthru|shell_exec|assert)\b/i' ]; // 定义要过滤的特殊字符和表达式模式 $specialPatterns = [ '/\$\{.*?\}/', // 过滤类似 ${expression} 的表达式 '/@.*?;/', // 过滤以 @ 开头并以 ; 结尾的表达式 '/\b(phpinfo|var_dump)\b/i', // 过滤特定的 PHP 函数 '/<\s*(script|iframe|object|embed|applet)[^>]*>/i' // 过滤危险的脚本标签 ]; // 定义要过滤的危险属性模式 $dangerousAttributesPatterns = [ '/on\w+\s*=/i', // 过滤以 "on" 开头的事件属性 '/javascript:[^"]*"/i' // 过滤 JavaScript 协议的链接 ]; // 先过滤 SQL 关键字 $filteredText = preg_replace($sqlPatterns, '', $text); // 再过滤函数 $filteredText = preg_replace($functionPatterns, '', $filteredText); // 然后过滤特殊字符和表达式 $filteredText = preg_replace($specialPatterns, '', $filteredText); // 接着过滤危险的属性 $filteredText = preg_replace($dangerousAttributesPatterns, '', $filteredText); // 允许表情符号和其他图标 $filteredText = preg_replace('/[\x{1F600}-\x{1F64F}]|\x{1F300}-\x{1F5FF}|\x{1F680}-\x{1F6FF}|\x{2600}-\x{26FF}|\x{2700}-\x{27BF}/u', '$0', $filteredText); // 处理可能出现的连续空格 $filteredText = preg_replace('/\s+/', ' ', $filteredText); // 去除前后的空格 $filteredText = trim($filteredText); // 转换 HTML 实体 $filteredText = htmlentities($filteredText, ENT_QUOTES, 'UTF-8'); return $filteredText; } /** * @Author:小破孩 * @Email:3584685883@qq.com * @Time:2024/10/24 13:50 * @param $text * @return string|string[]|null * @Description:过滤富文本 */ function filterRichText($text) { // 合并所有要过滤的模式 $patterns = [ '/\b(SELECT|INSERT|UPDATE|DELETE|FROM|WHERE|AND|OR|JOIN|DROP|CREATE|ALTER|TRUNCATE|GRANT|REVOKE|SET)\b/i', '/\b(AS|LIKE|NOT|IN|BETWEEN|IS|NULL|COUNT|SUM|AVG|MIN|MAX)\b/i', '/\b(UNION|ALL|ANY|EXISTS)\b/i', '/\b(ORDER\s+BY|LIMIT)\b/i', '/\b(function\s+\w+\s*\([^)]*\))\b/i', '/\b(eval|exec|system|passthru|shell_exec|assert)\b/i', '/\$\{.*?\}/', '/@.*?;/', '/\b(phpinfo|var_dump)\b/i', '/<\s*(script|iframe|object|embed|applet)[^>]*>/i', '/on\w+\s*=/i', '/javascript:[^"]*"/i' ]; // 先过滤所有匹配的模式 $filteredText = preg_replace($patterns, '', $text); // 允许表情符号和其他图标 $filteredText = preg_replace('/[\x{1F600}-\x{1F64F}]|\x{1F300}-\x{1F5FF}|\x{1F680}-\x{1F6FF}|\x{2600}-\x{26FF}|\x{2700}-\x{27BF}/u', '$0', $filteredText); // 处理可能出现的连续空格 $filteredText = preg_replace('/\s+/', ' ', $filteredText); // 去除前后的空格 $filteredText = trim($filteredText); // 转换 HTML 实体 $filteredText = htmlentities($filteredText, ENT_QUOTES, 'UTF-8'); return $filteredText; } // 示例调用 $text = '<script>alert("XSS")</script><img src="https://example.com/image.jpg">'; $filteredText = filterRichText($text); echo $filteredText;
2025年03月13日
130 阅读
0 评论
0 点赞
2025-03-13
【PHP】获取二维数组里面最小的值
/** * @Author:小破孩 * @Email:3584685883@qq.com * @Time:2024/12/5 17:16 * @param $array * @return array * @Description:获取一个二维数组,数据最小的,并返回对应的key和value */ public function getMinValueKey($array) { $minValue = PHP_INT_MAX; $desiredKey = null; foreach ($array as $key => $subArray) { foreach ($subArray as $subKey => $value) { if ($value < $minValue) { $minValue = $value; $desiredKey = $subKey; } } } return [$desiredKey, $minValue]; } //使用场景 $inatanceMap = new \app\common\lib\map\baidu\Lnglat($this->param['ac_address']); $lnglat = $inatanceMap->addressToLngLat(); $this->param['u_lng'] = $lnglat['lng'];//经度 $this->param['u_lat'] = $lnglat['lat'];//纬度 $companyList = M("AdminCompany")::getCompanyListUseSelect(); $instanceDis = new \app\common\lib\map\Distance(); foreach ($companyList as $key => $val){ $arrAddress[$key][$val['ac_uuid']] = $instanceDis->getdistance($val['ac_lng'],$val['ac_lat'],$lnglat['lng'],$lnglat['lat']); } $instanceArr = new \app\common\lib\data\Arr(); list($minKey, $minValue) = $instanceArr->getMinValueKey($arrAddress); $this->param['u_company_uuid'] = $minKey; $this->param['u_address'] = $this->param['ac_address'];
2025年03月13日
128 阅读
0 评论
0 点赞
2025-03-13
【PHP】按照个商品金额,等比例分配优惠劵
/** * @Author:小破孩 * @Email:3584685883@qq.com * @Time:2024/11/23 11:41 * @param $products ['id' => 'price','id' => price] * @param $totalCouponAmount 优惠劵优惠金额 * @return array * @Description:按照商品比例拆分优惠劵,分配给对应的商品 */ public function getSplitCoupon($products, $totalCouponAmount) { $totalAmount = array_sum($products); $discounts = []; $allocatedDiscount = 0; foreach ($products as $id => $amount) { $ratio = $amount / $totalAmount; $discount = $ratio * $totalCouponAmount; $roundedDiscount = round($discount, 2); $discounts[$id] = $roundedDiscount; $allocatedDiscount += $roundedDiscount; } // 调整以使总和为指定的优惠券总额 $diff = $totalCouponAmount - $allocatedDiscount; if ($diff!= 0) { $sortedDiscounts = $discounts; arsort($sortedDiscounts); $i = 0; foreach ($sortedDiscounts as $id => $discount) { if ($i < abs($diff)) { $discounts[$id] += ($diff > 0)? 0.01 : -0.01; } $i++; } } return $discounts; }
2025年03月13日
155 阅读
0 评论
0 点赞
2024-10-26
【ThinkPHP】最新版本上传文件的类
<?php namespace app\common\lib\file; use think\Exception; use think\exception\ValidateException; class Uploads { private $domain; protected $name; protected $type; protected $module; protected $image; public function __construct($name = '',$image = []) { $this->name = $name; $this->module = app('http')->getName(); $this->image = $image; $this->domain = Request()->domain(); } protected $config = [ 'image' => [ 'validate' => [ 'size' => 10*1024*1024, 'ext' => 'jpg,png,gif,jpeg', ], 'path' => '/images', ], 'audio' => [ 'validate' => [ 'size' => 100*1024*1024, 'ext' => 'mp3,wav,cd,ogg,wma,asf,rm,real,ape,midi', ], 'path' => '/audios', ], 'video' => [ 'validate' => [ 'size' => 100*1024*1024, 'ext' => 'mp4,avi,rmvb,rm,mpg,mpeg,wmv,mkv,flv', ], 'path' => '/videos', ], 'file' => [ 'validate' => [ 'size' => 5*1024*1024, 'ext' => 'doc,docx,xls,xlsx,pdf,ppt,pptx,txt,rar,zip,pem,p12', ], 'path' => '/files', ], ]; private function determineFileType($file) { $mime = $file->getMime(); if (strpos($mime, 'image/') === 0) { $this->type = 'image'; } elseif (strpos($mime, 'video/') === 0) { $this->type = 'video'; } elseif (strpos($mime, 'audio/') === 0) { $this->type = 'audio'; } else { $this->type = 'file'; } if (!in_array($this->type, array_keys($this->config))) { throw new ValidateException("the file type does not exist"); } validate(['file' => self::validateFile()])->check(['file' => $file]); } public function upfile($infoSwitch = false,$savelocal = 'local'){ try{ $file = request()->file($this->name); //检测文件 if($file == null) throw new ValidateException("the file cannot be empty"); //验证文件 $this->determineFileType($file); //上传文件 switch ($savelocal){ case 'aliyun': $savename = \think\facade\Filesystem::disk('aliyun')->putFile( $this->module.$this->config[$this->type]['path'], $file); break; case 'qiniu': $savename = \think\facade\Filesystem::disk('qiniu')->putFile( $this->module.$this->config[$this->type]['path'], $file); break; case 'qcloud': $savename = \think\facade\Filesystem::disk('qcloud')->putFile( $this->module.$this->config[$this->type]['path'], $file); break; case 'local': $savename = \think\facade\Filesystem::disk('public')->putFile( $this->module.$this->config[$this->type]['path'], $file); break; default : $savename = \think\facade\Filesystem::disk('public')->putFile( $this->module.$this->config[$this->type]['path'], $file); break; } // $savename = \think\facade\Filesystem::disk('public')->putFile( $this->module.$this->config[$this->type]['path'], $file); // $savename = \think\facade\Filesystem::disk('aliyun')->putFile( 'topic', $file); //返回文件详情和文件地址 if($infoSwitch){ return self::getFileInfo($file,$savename); } return $this->domain.config('filesystem.disks.public.url').'/'.str_replace('\\','/',$savename); }catch (\think\exception\ValidateException $e){ return show(100,self::languageChange($e->getMessage())); } } private function validateFile(){ if(empty($this->image)){ $validataType = [ 'fileSize' => $this->config[$this->type]['validate']['size'], 'fileExt' => $this->config[$this->type]['validate']['ext'], ]; }else{ if(is_array($this->image)) throw new ValidateException(""); $validataType = [ 'fileSize' => $this->config[$this->type]['validate']['size'], 'fileExt' => $this->config[$this->type]['validate']['ext'], 'image' => $this->image //示例值 [200,200] ]; } return $validataType; } private function languageChange($msg){ $data = [ 'the file type does not exist' => '文件类型不存在!', 'the file cannot be empty' => '文件不能为空!', 'unknown upload error' => '未知上传错误!', 'file write error' => '文件写入失败!', 'upload temp dir not found' => '找不到临时文件夹!', 'no file to uploaded' => '没有文件被上传!', 'only the portion of file is uploaded' => '文件只有部分被上传!', 'upload File size exceeds the maximum value' => '上传文件大小超过了最大值!', 'upload write error' => '文件上传保存错误!', ]; return $data[$msg] ?? $msg; } private function getFileInfo($file,$savename){ $info = [ 'path' => config('filesystem.disks.public.url').'/'.str_replace('\\','/',$savename), 'url' => $this->domain.config('filesystem.disks.public.url').'/'.str_replace('\\','/',$savename), 'size' => $file->getSize(), 'name' => $file->getOriginalName(), 'mime' => $file->getMime(), 'ext' => $file->extension(), 'type' => $this->type ]; return $info; } public function __clone() { throw new Exception("Cloning operation is not allowed"); // TODO: Implement __clone() method. } // 使用方法 : // $instanceUpload = new Uploads($fileName); // $info = $instanceUpload->upfile(true); } 如果要用建议封装一下,使用interface定义个规范,这里更像一个方法函数
2024年10月26日
199 阅读
0 评论
0 点赞
2024-09-30
【PHP】PHP函数详解:call_user_func()使用方法
PHP函数详解:call_user_func()使用方法 call_user_func函数类似于一种特别的调用函数的方法,使用方法如下: <?php function nowamagic($a,$b) { echo $a; echo $b; } call_user_func('nowamagic', "111","222"); call_user_func('nowamagic', "333","444"); //显示 111 222 333 444 ?> 调用类内部的方法比较奇怪,居然用的是array,不知道开发者是如何考虑的,当然省去了new,也挺有新意的: <?php class a { function b($c) { echo $c; } } call_user_func(array("a", "b"),"111"); //实例化a类并调用b方法 //显示 111 ?> call_user_func_array函数和call_user_func很相似,只不过是换了一种方式传递了参数,让参数的结构更清晰: <?php function a($b, $c) { echo $b; echo $c; } call_user_func_array('a', array("111", "222")); //显示 111 222 ?> call_user_func_array函数也可以调用类内部的方法的 <?php Class ClassA { function bc($b, $c) { $bc = $b + $c; echo $bc; } } call_user_func_array(array('ClassA','bc'), array("111", "222")); //显示 333 ?> call_user_func函数和call_user_func_array函数都支持引用,这让他们和普通的函数调用更趋于功能一致: <?php function a($b) { $b++; } $c = 0; call_user_func('a', $c); echo $c;//显示 1 call_user_func_array('a', array($c)); echo $c;//显示 2 ?> 另外,call_user_func函数和call_user_func_array函数都支持引用。 <?php function increment(&$var) { $var++; } $a = 0; call_user_func('increment', $a); echo $a; // 0 call_user_func_array('increment', array(&$a)); // You can use this instead echo $a; // 1 ?>
2024年09月30日
225 阅读
0 评论
0 点赞
2024-06-23
【PHP】H5微信网页自定义分享功能实现
<?php namespace app\index\lib\wechat; header("Access-Control-Allow-Origin:*"); class share { public $appid; public $secret; // 步骤1.appid和secret //header("Access-Control-Allow-Origin:*"); //$appid = "appid"; //$secret = "secret"; public function __construct($appid,$secret) { $this->appid = $appid; $this->secret = $secret; } // 步骤2.生成签名的随机串 public function nonceStr($length){ $str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJK1NGJBQRSTUVWXYZ';//随即串,62个字符 $strlen = 62; while($length > $strlen){ $str .= $str; $strlen += 62; } $str = str_shuffle($str); return substr($str,0,$length); } // 步骤3.获取access_token public function http_get($url){ $oCurl = curl_init(); if(stripos($url,"https://")!==FALSE){ curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1 } curl_setopt($oCurl, CURLOPT_URL, $url); curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 ); $sContent = curl_exec($oCurl); $aStatus = curl_getinfo($oCurl); curl_close($oCurl); if(intval($aStatus["http_code"])==200){ return $sContent; }else{ return false; } } // 步骤4.获取ticket public function getTicket(){ $result = $this->http_get('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$this->appid.'&secret='.$this->secret); $json = json_decode($result,true); $access_token = $json['access_token']; $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$access_token"; $res = json_decode ( $this->http_get ( $url ) ); return $res->ticket; } // 步骤5.生成wx.config需要的参数 //$surl = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; //$ws = getWxConfig( $ticket,$surl,time(),nonceStr(16) ); // public function getWxConfig($jsapiTicket,$url,$timestamp,$nonceStr) { public function getWxConfig() { $jsapiTicket=$this->getTicket(); $url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; $timestamp = time(); $nonceStr = $this->nonceStr(rand(8,15)); $string = "jsapi_ticket=".$jsapiTicket."&noncestr=".$nonceStr."×tamp=".$timestamp."&url=".$url; $signature = sha1 ($string); $WxConfig["appId"] = $this->appid; $WxConfig["nonceStr"] = $nonceStr; $WxConfig["timestamp"] = $timestamp; $WxConfig["url"] = $url; $WxConfig["signature"] = $signature; $WxConfig["rawString"] = $string; return $WxConfig; } } public function getWxShareConfig(){ $instanceWxShare = new \app\index\lib\wechat\share('appid','secret'); return $instanceWxShare->getWxConfig(); } <script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script> <script> // console.log(timestamp); wx.config({ debug: false, appId: '{$wxsc.appId}', timestamp: '{$wxsc.timestamp}', nonceStr: '{$wxsc.nonceStr}', signature: '{$wxsc.signature}', jsApiList: ['updateAppMessageShareData','updateTimelineShareData'] }); wx.ready(function () { //需在用户可能点击分享按钮前就先调用 wx.updateAppMessageShareData({ title: '医博:', // 分享标题 desc: '专业肛肠、胃肠、中医交流平台,为业界名专家们搭建教学、学术平台,为专业医生提供手术直播、科普交流基地,为学者提供学习、沟通、上升平台。', // 分享描述 link: 'https://wx.kmyebo.com', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: 'https://wx.kmyebo.com/yb_share_icon.jpg', // 分享图标 success: function () { // 设置成功 } }) }); wx.ready(function () { //需在用户可能点击分享按钮前就先调用 wx.updateTimelineShareData({ title: '医博:', // 分享标题 link: 'https://wx.kmyebo.com', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: 'https://wx.kmyebo.com', // 分享图标 success: function () { // 设置成功 } }) }); </script>http://www.xmyfw.com.cn/pc/show.php?id=55
2024年06月23日
242 阅读
0 评论
0 点赞
2023-07-20
【PHP】打开文件路径的所有文件
<?php function open_dir($path) { if (!is_dir($path) || empty($path)) die("该" . $path . "不是目录"); $path = $path . '/'; $fileList = []; $dirFile = scandir($path); if (!empty($dirFile) && is_array($dirFile)) { foreach ($dirFile as $file) { if ($file != '.' && $file != '..') { $fullPath = $path . $file; if (is_dir($fullPath)) { // 子文件夹,进行递归 $fileList[$file] = open_dir($fullPath); } else { //根目录下的文件 $fileList[] = $file; } } } } return $fileList; } $list = open_dir("/www/wwwroot/8688web.com/one"); // echo '<pre>'; // print_r($list); // echo '</pre>'; ?>
2023年07月20日
313 阅读
0 评论
0 点赞
2023-07-13
【PHP】$_SERVER内容
Array ( [ALLUSERSPROFILE] => C:\ProgramData [APPDATA] => C:\Users\Administrator\AppData\Roaming [CommonProgramFiles] => C:\Program Files\Common Files [CommonProgramFiles(x86)] => C:\Program Files (x86)\Common Files [CommonProgramW6432] => C:\Program Files\Common Files [COMPUTERNAME] => USER-20230417GP [ComSpec] => C:\Windows\system32\cmd.exe [DriverData] => C:\Windows\System32\Drivers\DriverData [EFC_7072] => 1 [FPS_BROWSER_APP_PROFILE_STRING] => Internet Explorer [FPS_BROWSER_USER_PROFILE_STRING] => Default [HOMEDRIVE] => C: [HOMEPATH] => \Users\Administrator [LOCALAPPDATA] => C:\Users\Administrator\AppData\Local [LOGONSERVER] => \\USER-20230417GP [NUMBER_OF_PROCESSORS] => 4 [OneDrive] => C:\Users\Administrator\OneDrive [OS] => Windows_NT [Path] => C:\Program Files (x86)\Common Files\NetSarang;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;E:\krhwork\phpstudy_pro\Extensions\php\php7.3.4nts;C:\ProgramData\ComposerSetup\bin;D:\krhsoftware\Git\cmd;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;C:\Users\Administrator\AppData\Roaming\Composer\vendor\bin [PATHEXT] => .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC [PROCESSOR_ARCHITECTURE] => AMD64 [PROCESSOR_IDENTIFIER] => Intel64 Family 6 Model 158 Stepping 10, GenuineIntel [PROCESSOR_LEVEL] => 6 [PROCESSOR_REVISION] => 9e0a [ProgramData] => C:\ProgramData [ProgramFiles] => C:\Program Files [ProgramFiles(x86)] => C:\Program Files (x86) [ProgramW6432] => C:\Program Files [PSModulePath] => C:\Program Files\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules [PUBLIC] => C:\Users\Public [SESSIONNAME] => Console [SystemDrive] => C: [SystemRoot] => C:\Windows [TEMP] => C:\Users\ADMINI~1\AppData\Local\Temp [TMP] => C:\Users\ADMINI~1\AppData\Local\Temp [USERDOMAIN] => USER-20230417GP [USERDOMAIN_ROAMINGPROFILE] => USER-20230417GP [USERNAME] => Administrator [USERPROFILE] => C:\Users\Administrator [windir] => C:\Windows [HTTP_COOKIE] => thinkphp_show_page_trace=0|0; thinkphp_show_page_trace=0|0; PHPSESSID=42ebce2914dea21a3b2a6408724e3b03; thinkphp_show_page_trace=0|0; web_token=74a57df797654a2f56951be092c992e1; user_uuid=20221111111111000001 [HTTP_ACCEPT_LANGUAGE] => zh-CN,zh;q=0.9 [HTTP_ACCEPT_ENCODING] => gzip, deflate [HTTP_REFERER] => http://local.huizhan.com/backend/business.register/index [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 [HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 [HTTP_UPGRADE_INSECURE_REQUESTS] => 1 [HTTP_CACHE_CONTROL] => max-age=0 [HTTP_CONNECTION] => keep-alive [HTTP_HOST] => local.huizhan.com [REDIRECT_STATUS] => 200 [SERVER_NAME] => local.huizhan.com [SERVER_PORT] => 80 [SERVER_ADDR] => 127.0.0.1 [REMOTE_PORT] => 61008 [REMOTE_ADDR] => 127.0.0.1 [SERVER_SOFTWARE] => nginx/1.15.11 [GATEWAY_INTERFACE] => CGI/1.1 [REQUEST_SCHEME] => http [SERVER_PROTOCOL] => HTTP/1.1 [DOCUMENT_ROOT] => E:/krhwork/phpstudy_pro/WWW/thinkphp/huizhan/public [DOCUMENT_URI] => /index.php [REQUEST_URI] => /backend/business.register/index [SCRIPT_NAME] => /index.php [CONTENT_LENGTH] => [CONTENT_TYPE] => [REQUEST_METHOD] => GET [QUERY_STRING] => s=//backend/business.register/index [PATH_TRANSLATED] => E:/krhwork/phpstudy_pro/WWW/thinkphp/huizhan/public [PATH_INFO] => [SCRIPT_FILENAME] => E:/krhwork/phpstudy_pro/WWW/thinkphp/huizhan/public/index.php [FCGI_ROLE] => RESPONDER [PHP_SELF] => /index.php [REQUEST_TIME_FLOAT] => 1689236577.974 [REQUEST_TIME] => 1689236577 )
2023年07月13日
299 阅读
0 评论
0 点赞
2023-07-10
laravel内置工具oauth2.0
要在Laravel中使用OAuth 2.0生成接口凭证,您可以按照以下步骤进行操作:1.首先,确保您已经安装了Laravel和laravel/passport扩展包。您可以使用Composer来安装它们:composer require laravel/laravel composer require laravel/passport 2.在终端中运行以下命令以发布Passport的数据库迁移文件和配置文件:php artisan vendor:publish --provider="Laravel\Passport\PassportServiceProvider"这将生成一些必要的文件和表格。3.运行数据库迁移以创建Passport所需的表格:php artisan migrate4.在app/Providers/AuthServiceProvider.php文件中注册Passport的路由和授权策略。在boot方法中添加以下代码:<?php use Laravel\Passport\Passport; public function boot() { $this->registerPolicies(); Passport::routes(); } 5.在app/User.php模型中使用HasApiTokens trait,以启用用户模型的API令牌功能。在类定义中添加以下代码:<?php use Laravel\Passport\HasApiTokens; class User extends Authenticatable { use HasApiTokens; // ... }6.运行以下命令以创建加密访问令牌和刷新令牌的客户端:php artisan passport:install这将生成一个客户端ID和密钥,您需要将其保存起来。7.在config/auth.php文件中配置Passport作为默认的驱动器,例如:<?php 'guards' => [ 'api' => [ 'driver' => 'passport', 'provider' => 'users', ], ], 8.现在,您可以使用Laravel的认证功能来注册和登录用户。当用户成功登录后,您可以使用以下代码生成接口凭证:<?php use Illuminate\Support\Facades\Auth; public function generateToken() { $user = Auth::user(); $token = $user->createToken('Your App Name')->accessToken; return response()->json(['token' => $token]); }请注意,上述代码中的'Your App Name'是您的应用程序名称,您可以根据实际情况进行修改。9.定义一个路由来访问generateToken方法。您可以在routes/api.php文件中添加以下代码:<?php use Illuminate\Support\Facades\Route; Route::middleware('auth:api')->get('/generate-token', 'YourController@generateToken');请将YourController替换为包含generateToken方法的控制器类名。现在,当通过身份验证并访问/generate-token接口时,将生成一个接口凭证(访问令牌),您可以将其用于后续的API请求。请注意,上述代码仅为示例,您可能需要根据您的实际需求进行修改和调整。另外,确保您已正确配置Passport并且您的身份验证逻辑正常工作。
2023年07月10日
314 阅读
0 评论
0 点赞
2023-07-10
基于laravel生成一个短信队列
您可以按照以下步骤在Laravel中使用短信队列:1.首先,确保您已经安装了Laravel和相应的短信服务提供商的SDK。您可以使用Composer来安装它们:composer require laravel/laravelcomposer require your-sms-sdk-package2.在.env文件中配置您的短信服务提供商的相关信息,例如:SMS_DRIVER=your_driver_nameSMS_API_KEY=your_api_key请将your_driver_name替换为您选择的短信服务提供商的驱动名称,将your_api_key替换为您的API密钥。3.在config/services.php文件中添加短信服务提供商的配置,例如:<?php 'sms' => [ 'driver' => env('SMS_DRIVER'), 'api_key' => env('SMS_API_KEY'), // 其他配置项... ], 4.创建一个发送短信的任务类(例如SendSmsJob),并在其中实现发送短信的逻辑。您可以使用Laravel的队列功能来处理短信发送的异步任务。 <?php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use YourSmsSdkPackage; // 替换为您选择的短信服务提供商的SDK class SendSmsJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; protected $phoneNumber; protected $message; /** * Create a new job instance. * * @param string $phoneNumber * @param string $message */ public function __construct($phoneNumber, $message) { $this->phoneNumber = $phoneNumber; $this->message = $message; } /** * Execute the job. * * @return void */ public function handle() { // 使用短信服务提供商的SDK发送短信 YourSmsSdkPackage::sendSms($this->phoneNumber, $this->message); } } 请将YourSmsSdkPackage替换为您选择的短信服务提供商的SDK。5.在需要发送短信的地方,使用以下代码将任务推送到队列中:<?php use App\Jobs\SendSmsJob; dispatch(new SendSmsJob($phoneNumber, $message)); 请将$phoneNumber和$message替换为实际的手机号码和短信内容。6.配置队列驱动器。您可以在.env文件中设置QUEUE_CONNECTION来指定使用的队列驱动器,例如:QUEUE_CONNECTION=database7.运行队列处理器。在终端中运行以下命令以启动队列处理器:php artisan queue:work现在,您的短信将被添加到队列中,并由队列处理器异步发送。请注意,上述代码仅为示例,您可能需要根据您选择的短信服务提供商的SDK和Laravel的版本进行相应的修改和调整。另外,确保您已正确配置短信服务提供商的相关信息,并且您的服务器能够正常访问到短信服务提供商的API。
2023年07月10日
183 阅读
0 评论
0 点赞
2023-07-10
【PHP】基于thinkPHP使用easywechat发送统一下发消息
好的,您可以按照以下步骤使用thinkPHP和easywechat发送下发统一消息:首先,确保您已经安装了thinkPHP和easywechat。您可以使用Composer来安装它们:composer require topthink/thinkcomposer require overtrue/wechat在thinkPHP项目中创建一个控制器(例如MessageController),并在其中添加一个方法(例如sendUnifiedMessage)来处理发送下发统一消息的逻辑。<?php namespace app\controller; use think\Controller; use EasyWeChat\Factory; class MessageController extends Controller { public function sendUnifiedMessage() { // 创建 EasyWeChat 实例 $config = [ 'app_id' => 'your_app_id', 'secret' => 'your_app_secret', // 其他配置项... ]; $app = Factory::officialAccount($config); // 发送下发统一消息 $result = $app->broadcasting->send([ 'touser' => 'openid1,openid2', // 接收消息的用户openid列表 'msgtype' => 'text', 'text' => [ 'content' => '这是一条测试消息' ] ]); // 处理发送结果 if ($result['errcode'] === 0) { return '消息发送成功'; } else { return '消息发送失败:' . $result['errmsg']; } } } 请注意,上述代码中的your_app_id和your_app_secret应替换为您自己的微信公众号的AppID和AppSecret。在路由中定义一个访问该方法的路由。您可以在route/route.php文件中添加以下代码:<?php use think\facade\Route; Route::get('message/send', 'MessageController/sendUnifiedMessage'); 现在,您可以通过访问/message/send来触发发送下发统一消息的逻辑。请注意,上述代码仅为示例,您可能需要根据您的实际需求进行修改和调整。另外,确保您已正确配置微信公众号的相关信息,并且您的服务器能够正常访问到微信服务器。
2023年07月10日
189 阅读
0 评论
0 点赞
2023-07-07
根据数字获取Excel动态表头
在Excel中,表头是由字母A、B、C等组成的。在PHP中,可以使用chr()函数将数字转换为对应的ASCII字符。以下是一个简单的PHP函数,可以将输入的数字转换为对应的Excel表头:function getExcelColumn($num) { $str = ''; while ($num > 0) {$mod = ($num - 1) % 26; $str = chr(65 + $mod) . $str; $num = (int)(($num - $mod) / 26);} return $str;}使用该函数,例如输入数字1,则会返回'A',输入数字27,则会返回'AA'。请注意,此函数只适用于数字不超过702的情况。因为在Excel中,最大的表头是'ZZ',对应的数字是702。
2023年07月07日
294 阅读
0 评论
0 点赞
2023-06-09
【PHP】PHP实现二维数组转一维数组
可以使用 array_reduce() 函数将二维数组转换为一维数组。array_reduce() 函数将通过一个回调函数迭代数组中的所有值,并将它们合并为一个单一的值。在这种情况下,我们将使用 array_merge() 函数将所有子数组合并为一个单一的数组。示例代码如下:function flatten_array($arr) { return array_reduce($arr, function($carry, $item) { return array_merge($carry, is_array($item) ? flatten_array($item) : array($item)); }, array()); } // 测试 $arr = array( array(1, 2, 3), array(4, 5, 6), array( array(7, 8), 9, array(10, 11, 12), ), ); $result = flatten_array($arr); print_r($result); // 输出: // Array // ( // [0] => 1 // [1] => 2 // [2] => 3 // [3] => 4 // [4] => 5 // [5] => 6 // [6] => 7 // [7] => 8 // [8] => 9 // [9] => 10 // [10] => 11 // [11] => 12 // )在上面的示例代码中,我们定义了一个 flatten_array() 函数,该函数使用 array_reduce() 函数和递归调用来将二维数组转换为一维数组。
2023年06月09日
530 阅读
0 评论
0 点赞
2023-05-08
【PHP】PHP实现金额检测
public function checkMoney($value) { if (!is_numeric($value)) { return false; } if ($value <= 0) { return false; } if (preg_match('/^[0-9]+(\.\d{1,2})?$/',$value)) { return true; } else { return false; } } 优化 public function checkMoney($value) { if(is_array($value)){ foreach ($value as $v){ $this->checkMoney($v); } }else{ if (!is_numeric($value)) { return $this->show('100','金额不正确'); } if ($value <= 0) { return $this->show('100','金额不正确'); } if (preg_match('/^[0-9]+(\.\d{1,2})?$/',$value)) { return true; } else { return $this->show('100','金额不正确'); } } }
2023年05月08日
317 阅读
0 评论
0 点赞
2023-04-27
【PHP】针对时间段的处理
/** * 获取最近七天所有日期 */ public function getWeeks($time = '', $format='Y-m-d'){ $time = $time != '' ? $time : time(); //组合数据 $date = []; for ($i=1; $i<=7; $i++){ $date[$i] = date($format ,strtotime( '+' . $i-7 .' days', $time)); } return $date; } /** * 获取起始日期中的所有日期 * @param $start 开始时间 2022-09-22 * @param $end 结束时间 2022-09-29 * @return array */ public function getBetweenTime($startDate, $endDate, $format = 'Y-m-d') { $dates = []; // 确保我们处理的是日期 $start = date('Y-m-d', strtotime($startDate)); $end = date('Y-m-d', strtotime($endDate)); $current = strtotime($start); $last = strtotime($end); while ($current <= $last) { $dates[] = date($format, $current); $current = strtotime('+1 day', $current); } return $dates; } /** * 获取起始时间戳 * @param int|string $type 类型 1本年 2本季度 3上月 4本月 5本周 6上周 7下周 * @param bool $format 是否返回格式化后的时间(Y-m-d H:i:s),默认false返回时间戳 * @return array 包含startTime(开始时间)和endTime(结束时间)的数组 * @throws InvalidArgumentException */ public function getStartEndtime($type = '', bool $format = false): array { // 验证类型参数 $validTypes = [1, 2, 3, 4, 5, 6, 7]; if ($type !== '' && !in_array($type, $validTypes)) { throw new Exception('无效的时间类型参数'); } $now = time(); $startTime = 0; $endTime = 0; switch ($type) { case 1: // 本年 $startTime = strtotime("first day of January " . date('Y', $now) . " 00:00:00"); $endTime = strtotime("last day of December " . date('Y', $now) . " 23:59:59"); break; case 2: // 本季度 $currentMonth = (int)date('n', $now); $currentYear = date('Y', $now); $season = ceil($currentMonth / 3); // 1-4 $seasonStartMonth = ($season - 1) * 3 + 1; $startTime = mktime(0, 0, 0, $seasonStartMonth, 1, $currentYear); $seasonEndMonth = $season * 3; $seasonEndDay = date('t', mktime(0, 0, 0, $seasonEndMonth, 1, $currentYear)); $endTime = mktime(23, 59, 59, $seasonEndMonth, $seasonEndDay, $currentYear); break; case 3: // 上月 $startTime = strtotime("first day of last month 00:00:00"); $endTime = strtotime("last day of last month 23:59:59"); break; case 4: // 本月 $startTime = strtotime("first day of this month 00:00:00"); $endTime = strtotime("last day of this month 23:59:59"); break; case 5: // 本周(周一到周日) $startTime = strtotime('this week Monday 00:00:00'); $endTime = strtotime('this week Sunday 23:59:59'); break; case 6: // 上周 $startTime = strtotime('last week Monday 00:00:00'); $endTime = strtotime('last week Sunday 23:59:59'); break; case 7: // 下周 $startTime = strtotime('next week Monday 00:00:00'); $endTime = strtotime('next week Sunday 23:59:59'); break; default: // 今天 $startTime = strtotime('today 00:00:00'); $endTime = strtotime('today 23:59:59'); break; } // 格式化返回 if ($format) { return [ 'statTime' => date('Y-m-d H:i:s', $startTime), 'endTime' => date('Y-m-d H:i:s', $endTime) ]; } return [ 'startTime' => $startTime, 'endTime' => $endTime ]; } /** * @Author:小破孩 * @Email:3584685883@qq.com * @Time:2024/11/11 11:34 * @return array * @Description:获取当前时间到一周前的时间 */ public function getTimeStamps() { $todayEnd = strtotime(date('Y-m-d 23:59:59')); $sevenDaysAgoStart = strtotime('-6 days 00:00:00'); return [ 'start' => $sevenDaysAgoStart, 'end' => $todayEnd ]; } /** * @Author:小破孩 * @Email:3584685883@qq.com * @Time:2024/12/7 11:05 * @param $year * @param $month * @return array * @Description:获取指定月份的开始时间和结束时间 */ public function getMonthStartAndEndTime($year, $month) { $startTime = strtotime($year. '-'. $month. '-01 00:00:00'); $endTime = strtotime($year. '-'. $month. '-'. date('t', strtotime($year. '-'. $month. '-01')). ' 23:59:59'); return ['statTime'=>$startTime,'endTime'=>$endTime]; }
2023年04月27日
417 阅读
0 评论
0 点赞
2023-03-23
【PHP】php.ini如何配置,才是PHP性能最大优化?
内存 默认设置memory_limit = 128M单个进程可使用的内存最大值,这个值的设定可以从以下几点考虑:应用的类型。如果是内存集中型应用,可增加该值;单个 PHP 进程平均消耗的内存,该值可通过多次运行同一个脚本来计算平均值;能负担多少个 php-fpm 进程;该值等于分配的总内存除以单个 PHP 进程平均消耗的内存文件上传 默认设置file_uploads = On max_file_uploads = 20 upload_max_filesize = 2M max_execution_time = 30 值 为 0 代表没有限制设置max_file_uploads来决定同时允许多少个文件上传;设置upload_max_filesize来决定每个文件上传的最大值;如果是长时间任务,尽量使用队列来处理,因此,可适当缩短max_execution_time的值;注意, Web 服务器也可以设置文件上传大小及超时时间,不能仅仅以 php.ini 的设置为准;会话 PHP 的会话默认是保存在硬盘中session.save_handler = files在实际应用中,应当将会话保存在内存中。可使用 Memcached 或者 Redis。这样做主要有两个好处:提高速度;有助于后期的扩展,如果会话数据存储在硬盘中,不便于增加额外的服务器,如果把会话数据存放在 Memcached 或 Redis 里,任何一台分布式 PHP-FPM 服务器都能访问会话数据。可通过 PECL 安装memcached扩展并设置默认的save_handler为memcachedsession.save_handler = 'memcached' session.save_path = '127.0.0.1:11211'缓冲输出 默认值realpath_cache_size = 4M realpath_cache_ttl = 120PHP 会缓存应用使用的文件路径,这样每次包含或导入文件时就无需不断搜索包含路径了,这个缓存叫真实路径缓存(realpath cache),如果运行的是大型的 PHP 文件(如 Composer 组件),使用了大量文件,增加 PHP 真实路径缓存的大小能得到更好的性能。
2023年03月23日
412 阅读
0 评论
0 点赞
2022-12-26
【ThinkPHP】ThinkPHP6处理接口版本问题
'domain_bind' => [ 'api' => 'api', // blog子域名绑定到blog应用 'admin.tp.com' => 'admin', // 完整域名绑定 '*' => 'home', // 二级泛域名绑定到home应用 ], // url版本路由,在url地址上带版本号 Route::rule(':version/:controller/:function', ':version.:controller/:function') ->allowCrossDomain([ 'Access-Control-Allow-Origin' => '*', // //解决跨域问题 'Access-Control-Allow-Methods' => '*', 'Access-Control-Allow-Headers' => '*', 'Access-Control-Request-Headers' => '*' ]); // 头部模式(请求头部带版本号) $version = request()->header('version'); //默认跳转到v1版本 if ($version == null) $version = "v1"; Route::rule(':controller/:function', $version . '.:controller/:function');
2022年12月26日
335 阅读
0 评论
0 点赞
1
2
3
...
9