首页
关于
归档
朋友
壁纸
留言
API平台
告白墙
更多
休闲游戏
留言板
练字贴
Layui手册
Search
1
【PHP】PHPoffice/PHPSpreadsheet读取和写入Excel
1,021 阅读
2
【Git】No tracked branch configured for branch master or the branch doesn't exist.
750 阅读
3
【composer】composer常用命令
490 阅读
4
【Layui】控制页面元素展示隐藏
443 阅读
5
【MySQL】MySQL触发器应用场景和使用方法
422 阅读
默认分类
PHP
ThinkPHP
Laravel
面向对象
设计模式
算法
基础
网络安全
Web
HTML
CSS
JavaScript
jQuery
Layui
VUE
uni-app
Database
MySQL
Redis
RabbitMQ
Nginx
Git
Linux
Soft Ware
Windows
网赚
Go
登录
Search
标签搜索
PHP
函数
方法
类
MySQL
ThinkPHP
OOP
JavaScript
Layui
Web
Linux
Array
设计模式
Git
PHPSpreadsheet
PHPoffice
排序算法
面试题
Windows
基础
小破孩
累计撰写
212
篇文章
累计收到
16
条评论
首页
栏目
默认分类
PHP
ThinkPHP
Laravel
面向对象
设计模式
算法
基础
网络安全
Web
HTML
CSS
JavaScript
jQuery
Layui
VUE
uni-app
Database
MySQL
Redis
RabbitMQ
Nginx
Git
Linux
Soft Ware
Windows
网赚
Go
页面
关于
归档
朋友
壁纸
留言
API平台
告白墙
休闲游戏
留言板
练字贴
Layui手册
搜索到
208
篇与
的结果
2022-06-23
【RabbitMQ】简介以及使用场景
一. RabbitMQ 简介MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、 安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。二. RabbitMQ 使用场景解耦(为面向服务的架构(SOA)提供基本的最终一致性实现)场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。传统模式的缺点:假如库存系统无法访问,则订单减库存将失败,从而导致订单失败订单系统与库存系统耦合引入消息队列订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦为了保证库存肯定有,可以将队列大小设置成库存数量,或者采用其他方式解决。基于消息的模型,关心的是“通知”,而非“处理”。短信、邮件通知、缓存刷新等操作使用消息队列进行通知。消息队列和RPC的区别与比较:RPC: 异步调用,及时获得调用结果,具有强一致性结果,关心业务调用处理结果。消息队列:两次异步RPC调用,将调用内容在队列中进行转储,并选择合适的时机进行投递(错峰流控)2. 异步提升效率场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种 1.串行的方式;2.并行方式(1)串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端(2)并行方式:将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间(3)引入消息队列,将不是必须的业务逻辑,异步处理。改造后的架构如下:3. 流量削峰流量削锋也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛应用场景:系统其他时间A系统每秒请求量就100个,系统可以稳定运行。系统每天晚间八点有秒杀活动,每秒并发请求量增至1万条,但是系统最大的处理能力只能每秒处理1000个请求,于是系统崩溃,服务器宕机。之前架构:大量用户(100万用户)通过浏览器在晚上八点高峰期同时参与秒杀活动。大量的请求涌入我们的系统中,高峰期达到每秒钟5000个请求,大量的请求打到MySQL上,每秒钟预计执行3000条SQL。但是一般的MySQL每秒钟扛住2000个请求就不错了,如果达到3000个请求的话可能MySQL直接就瘫痪了,从而系统无法被使用。但是高峰期过了之后,就成了低峰期,可能也就1万用户访问系统,每秒的请求数量也就50个左右,整个系统几乎没有任何压力。引入MQ:100万用户在高峰期的时候,每秒请求有5000个请求左右,将这5000请求写入MQ里面,系统A每秒最多只能处理2000请求,因为MySQL每秒只能处理2000个请求。系统A从MQ中慢慢拉取请求,每秒就拉取2000个请求,不要超过自己每秒能处理的请求数量即可。MQ,每秒5000个请求进来,结果只有2000个请求出去,所以在秒杀期间(将近一小时)可能会有几十万或者几百万的请求积压在MQ中。这个短暂的高峰期积压是没问题的,因为高峰期过了之后,每秒就只有50个请求进入MQ了,但是系统还是按照每秒2000个请求的速度在处理,所以说,只要高峰期一过,系统就会快速将积压的消息消费掉。我们在此计算一下,每秒在MQ积压3000条消息,1分钟会积压18万,1小时积压1000万条消息,高峰期过后,1个多小时就可以将积压的1000万消息消费掉。三. 引入消息队列的优缺点优点优点就是以上的那些场景应用,就是在特殊场景下有其对应的好处,解耦、异步、削峰。缺点系统的可用性降低系统引入的外部依赖越多,系统越容易挂掉,本来只是A系统调用BCD三个系统接口就好,ABCD四个系统不报错整个系统会正常运行。引入了MQ之后,虽然ABCD系统没出错,但MQ挂了以后,整个系统也会崩溃。系统的复杂性提高引入了MQ之后,需要考虑的问题也变得多了,如何保证消息没有重复消费?如何保证消息不丢失?怎么保证消息传递的顺序?一致性问题A系统发送完消息直接返回成功,但是BCD系统之中若有系统写库失败,则会产生数据不一致的问题。总结所以总结来说,消息队列是一种十分复杂的架构,引入它有很多好处,但是也得针对它带来的坏处做各种额外的技术方案和架构来规避。引入MQ系统复杂度提升了一个数量级,但是在有些场景下,就是复杂十倍百倍,还是需要使用MQ。
2022年06月23日
145 阅读
0 评论
0 点赞
2022-06-23
【JS】静止事件的脚本
//关闭右键 document.oncontex`请输入代码`tmenu=function(){event.returnValue=false;} //关闭所有f2-f12快捷键 屏蔽 Ctrl+n document.onkeydown=function(){if(111<event.keyCode<123||(event.ctrlKey&&(event.keyCode==78))){event.keyCode=0;event.returnValue=false;}} //关闭 f1帮助 document.onhelp=function(){event.returnValue=false;} //关闭shift+点击链接 document.onclick=function(){if(event.shiftKey&&(event.srcElement.tagName=="A")){event.returnValue=false;}} //禁止拷贝 document.oncopy=function(){event.returnValue=false;} //禁止选择 document.onselectstart=function(){event.returnValue=false;} //禁止粘贴 document.onpaste=function(){event.returnValue=false;} //禁止 退格键的 前进后退功能 document.onkeydown = function() {}//{if (event.keyCode==8) {event.returnValue=false;}} //禁止打印 window.onbeforeprint=function(){window.document.body.style.display="none"}
2022年06月23日
106 阅读
0 评论
0 点赞
2022-06-23
【PHP】魔术方法
__constuct: 构建对象的时被调用;__destruct: 明确销毁对象或脚本结束时被调用;__set: 当给不可访问或不存在属性赋值时被调用__get: 读取不可访问或不存在属性时被调用__isset: 对不可访问或不存在的属性调用isset()或empty()时被调用__unset: 对不可访问或不存在的属性进行unset时被调用__call: 调用不可访问或不存在的方法时被调用__callStatic: 调用不可访问或不存在的静态方法时被调用__sleep: 当使用serialize时被调用,当你不需要保存大对象的所有数据时很有用__wakeup: 当使用unserialize时被调用,可用于做些对象的初始化操作__clone: 进行对象clone时被调用,用来调整对象的克隆行为__toString: 当一个类被转换成字符串时被调用__invoke: 当以函数方式调用对象时被调用__set_state: 当调用var_export()导出类时,此静态方法被调用。用__set_state的返回值做为var_export的返回值。__debuginfo: 当调用var_dump()打印对象时被调用(当你不想打印所有属性)适用于PHP5.6版本 <?php class Magic { public $var = 'test'; //构造函数,在创建对象的时候调用 public function __construct() { echo '__construct called'.PHP_EOL; } //某个对象的引用都被删除、对象被销毁、调用exit()后、脚本关闭时被调用 public function __destruct() { echo '__destruct called'.PHP_EOL; } //当给不可访问或不存在属性赋值时被调用 public function __set($name, $value) { echo $name.'-'.$value; echo '__set called'.PHP_EOL; } //读取不可访问或不存在属性时被调用 public function __get($name) { echo $name; echo '__get called'.PHP_EOL; } //调用不可访问或不存在的方法时被调用 public function __call($name, $arguments) { echo $name . '-' . implode(',', $arguments); echo '__call called'.PHP_EOL; } //调用不可访问或不存在的静态方法时被调用 public static function __callStatic($name, $arguments) { echo $name . '-' . implode(',', $arguments); echo '__callStatic called'.PHP_EOL; } //对不可访问或不存在的属性调用isset()或empty()时被调用 public function __isset($name) { echo $name; echo '__isset called'.PHP_EOL; return true; } //对不可访问或不存在的属性进行unset时被调用 public function __unset($name) { echo $name; echo '__unset called'.PHP_EOL; } //serialize时被调用,当你不需要保存大对象的所有数据时很有用 public function __sleep() { echo '__sleep called'.PHP_EOL; return array('var1111111111'); } //unserialize时被调用,可用于做些对象的初始化操作 public function __wakeup() { echo '__wakeup called'.PHP_EOL; $this->var = 'test after wakeup'; } //当一个类被转换成字符串时被调用 public function __toString() { return '__toString called'.PHP_EOL; } //进行对象clone时被调用,用来调整对象的克隆行为 public function __clone() { echo '__clone called'.PHP_EOL; } //当以函数方式调用对象时被调用 public function __invoke() { echo '__invoke called'.PHP_EOL; } //当调用var_export()导出类时,此静态方法被调用。用__set_state的返回值做为var_export的返回值。 public static function __set_state($arr) { return '__set_state called'.PHP_EOL; } //当调用var_dump()打印对象时被调用(当你不想打印所有属性)适用于PHP5.6版本 public function __debuginfo($arr) { echo '__debuginfo called'.PHP_EOL; return array( 'var' => 'test fro __debuginfo' ); } } $m = new Magic(); //__construct()被调用 $m->not_exist_property = test; //__set()被调用 echo $m->not_exist_property;//__get()被调用 $m->abc(1,2,3); //__call()被调用 echo isset($m->not_exist_property); //__isset()被调用,返回bool值 unset($m->not_exist_property); //__unset()被调用 echo $tmp = serialize($m); //__sleep()被调用 unserialize($tmp); //__wakeup()被调用 $m1 = clone $m; //__clone()被调用,对象默认是引用传递,使用clone关键词则可实现对象复制 $m(); //__invoke() eval( '$m2 = ' . var_export ( $m , true ) . ';' );var_dump($m2); var_dump($m); //最后__destruct()被调用 /* 结果: __construct called not_exist_property-test__set called not_exist_property__get called abc-1,2,3__call called not_exist_property__isset called 1not_exist_property__unset called __sleep called O:5:"Magic":1:{s:13:"var1111111111";N;}__wakeup called __destruct called __clone called __invoke called string(20) "__set_state called " class Magic#1 (1) { public $var => string(4) "test" } __destruct called __destruct called */
2022年06月23日
136 阅读
0 评论
0 点赞
2022-06-23
【PHP】PHP实现链式操作
实现链式操作的核心方法就是 : return $this;下面是例子: /** * 设置是否严格检查字段名 * @access public * @param bool $strict 是否严格检查字段 * @return $this */ public function strict(bool $strict = true) { $this->options['strict'] = $strict; return $this; } /** * 设置自增序列名 * @access public * @param string $sequence 自增序列名 * @return $this */ public function sequence(string $sequence = null) { $this->options['sequence'] = $sequence; return $this; } /** * 设置JSON字段信息 * @access public * @param array $json JSON字段 * @param bool $assoc 是否取出数组 * @return $this */ public function json(array $json = [], bool $assoc = false) { $this->options['json'] = $json; $this->options['json_assoc'] = $assoc; return $this; }
2022年06月23日
104 阅读
0 评论
0 点赞
2022-06-23
【PHP】SPL四种常用的数据结构
spl,指SPL - Standard PHP Library 标准PHP类库 1.栈【先进后出】 <span style="font-size:18px;">$stack = new SplStack(); $stack->push('data1'); $stack->push('data2'); $stack->push('data3'); echo $stack->pop(); //输出结果为 //data3</span><span style="font-size:24px;font-weight: bold;"> </span> 2.队列【先进先出 后进后出】 <span style="font-size:18px;">$queue = new SplQueue(); $queue->enqueue("data1"); $queue->enqueue("data2"); $queue->enqueue("data3"); echo $queue->dequeue(); //输出结果为 //data1</span> 3.堆 <span style="font-size:18px;">$heap = new SplMinHeap(); $heap->insert("data1"); $heap->insert("data2"); echo $heap->extract(); //输出结果为 //data1</span> 4.固定尺寸数组 <span style="font-size:18px;">$array = new SplFixedArray(5); $array[0]=1; $array[3]=3; $array[2]=2; var_dump($array); //输出结果为 // object(SplFixedArray)[1] // public 0 => int 1 // public 1 => null // public 2 => int 2 // public 3 => int 3 // public 4 => null</span>
2022年06月23日
164 阅读
0 评论
0 点赞
2022-06-23
【PHP】PHP实现JWT生成和验证
JWT里面的 encode 和 decode方法进行生成token和验证token /** * @Author: 小破孩嫩 * @Email: 3584685883@qq.com * @Time: 2021/6/17 16:14 * @param $uid * @return mixed * @Description:生成token */ public function setToken($uid){ //私钥 $privateKey = <<<EOD -----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQC8kGa1pSjbSYZVebtTRBLxBz5H4i2p/llLCrEeQhta5kaQu/Rn vuER4W8oDH3+3iuIYW4VQAzyqFpwuzjkDI+17t5t0tyazyZ8JXw+KgXTxldMPEL9 5+qVhgXvwtihXC1c5oGbRlEDvDF6Sa53rcFVsYJ4ehde/zUxo6UvS7UrBQIDAQAB AoGAb/MXV46XxCFRxNuB8LyAtmLDgi/xRnTAlMHjSACddwkyKem8//8eZtw9fzxz bWZ/1/doQOuHBGYZU8aDzzj59FZ78dyzNFoF91hbvZKkg+6wGyd/LrGVEB+Xre0J Nil0GReM2AHDNZUYRv+HYJPIOrB0CRczLQsgFJ8K6aAD6F0CQQDzbpjYdx10qgK1 cP59UHiHjPZYC0loEsk7s+hUmT3QHerAQJMZWC11Qrn2N+ybwwNblDKv+s5qgMQ5 5tNoQ9IfAkEAxkyffU6ythpg/H0Ixe1I2rd0GbF05biIzO/i77Det3n4YsJVlDck ZkcvY3SK2iRIL4c9yY6hlIhs+K9wXTtGWwJBAO9Dskl48mO7woPR9uD22jDpNSwe k90OMepTjzSvlhjbfuPN1IdhqvSJTDychRwn1kIJ7LQZgQ8fVz9OCFZ/6qMCQGOb qaGwHmUK6xzpUbbacnYrIM6nLSkXgOAwv7XXCojvY614ILTK3iXiLBOxPu5Eu13k eUz9sHyD6vkgZzjtxXECQAkp4Xerf5TGfQXGXhxIX52yH+N2LtujCdkQZjXAsGdm B2zNzvrlgRmgBrklMTrMYgm1NPcW+bRLGcwgW2PTvNM= -----END RSA PRIVATE KEY----- EOD; $payload = [ 'iss'=>'xiaopohai', //签发人(官方字段:非必需) 'exp'=>time()+3600*24*7, //过期时间(官方字段:非必需) 'aud'=>'everyone', //受众(官方字段:非必需) 'nbf'=>time(), //生效时间(官方字段:非必需) 'iat'=>time(), //签发时间(官方字段:非必需) 'userInfo'=>[ 'id' =>$uid, ], ]; $token = JWT::encode($payload,$privateKey,'HS256'); return $token; } /** * @Author: 小破孩嫩 * @Email: 3584685883@qq.com * @Time: 2021/6/17 16:01 * @param $token * @return int[] * @Description:验证token */ public function checkToken($token){ try{ //公钥 $publicKey = <<<EOD -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8kGa1pSjbSYZVebtTRBLxBz5H 4i2p/llLCrEeQhta5kaQu/RnvuER4W8oDH3+3iuIYW4VQAzyqFpwuzjkDI+17t5t 0tyazyZ8JXw+KgXTxldMPEL95+qVhgXvwtihXC1c5oGbRlEDvDF6Sa53rcFVsYJ4 ehde/zUxo6UvS7UrBQIDAQAB -----END PUBLIC KEY----- EOD; $res = JWT::decode($token,$publicKey,['HS256']); returnResponse('200','请求成功', $res); }catch (Exception $e) { returnResponse(100,$e->getMessage()); } }学习地址:https://github.com/firebase/php-jwt
2022年06月23日
409 阅读
0 评论
0 点赞
2022-06-23
【PHP】RSA 类 和 使用
下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin目录,执行以下命令: a、openssl genrsa -out rsa_private_key.pem 1024 b、openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem c、openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 第一条命令生成原始 RSA私钥文件 rsa_private_key.pem 第二条命令将原始 RSA私钥转换为 pkcs8格式 第三条生成RSA公钥 rsa_public_key.pem 上面几个就可以看出:通过私钥能生成对应的公钥RSA类: <?php class Rsa { /** * 获取私钥 * @return bool|resource */ private static function getPrivateKey() { $abs_path = dirname(__FILE__) . '/rsa_private_key.pem'; $content = file_get_contents($abs_path); return openssl_pkey_get_private($content); } /** * 获取公钥 * @return bool|resource */ private static function getPublicKey() { $abs_path = dirname(__FILE__) . '/rsa_public_key.pem'; $content = file_get_contents($abs_path); return openssl_pkey_get_public($content); } /** * 私钥加密 * @param string $data * @return null|string */ public static function privEncrypt($data = '') { if (!is_string($data)) { return null; } return openssl_private_encrypt($data,$encrypted,self::getPrivateKey()) ? base64_encode($encrypted) : null; } /** * 公钥加密 * @param string $data * @return null|string */ public static function publicEncrypt($data = '') { if (!is_string($data)) { return null; } return openssl_public_encrypt($data,$encrypted,self::getPublicKey()) ? base64_encode($encrypted) : null; } /** * 私钥解密 * @param string $encrypted * @return null */ public static function privDecrypt($encrypted = '') { if (!is_string($encrypted)) { return null; } return (openssl_private_decrypt(base64_decode($encrypted), $decrypted, self::getPrivateKey())) ? $decrypted : null; } /** * 公钥解密 * @param string $encrypted * @return null */ public static function publicDecrypt($encrypted = '') { if (!is_string($encrypted)) { return null; } return (openssl_public_decrypt(base64_decode($encrypted), $decrypted, self::getPublicKey())) ? $decrypted : null; } } **demo:** <?php require_once "Rsa.php"; $rsa = new Rsa(); $data['name'] = 'Tom'; $data['age'] = '20'; $privEncrypt = $rsa->privEncrypt(json_encode($data)); echo '私钥加密后:'.$privEncrypt.'<br>'; $publicDecrypt = $rsa->publicDecrypt($privEncrypt); echo '公钥解密后:'.$publicDecrypt.'<br>'; $publicEncrypt = $rsa->publicEncrypt(json_encode($data)); echo '公钥加密后:'.$publicEncrypt.'<br>'; $privDecrypt = $rsa->privDecrypt($publicEncrypt); echo '私钥解密后:'.$privDecrypt.'<br>'; 也有一些网站提供生成rsa公钥私钥的服务:http://www.bm8.com.cn/webtool/rsa/文章参考:https://www.cnblogs.com/xuweiqiang/p/9784584.html
2022年06月23日
328 阅读
1 评论
0 点赞
2022-06-23
【PHP】单点登录(SingleSignOn,SSO)的思路
用到的工具:JWP类, RSA非对称加密类composer require firebase/php-jwt;JWT包含三部分数据:Header:头部,通常头部有两部分信息:1.token类型:JWT2.加密方式:base64(HS256)Payload:载荷,就是有效数据,一般包含下面信息:1.用户身份信息(注意,这里因为采用base64编码,可解码,因此不要存放敏感信息)2.注册声明:如token的签发时间,过期时间,签发人等这部分也会采用base64编码,得到第二部分数据Signature:签名,是整个数据的认证信息。根据前两步的数据,再加上指定的密钥(secret)(不要泄漏,最好周期性更换),通过base64编码生成。用于验证整个数据完整和可靠性RSA非对称加密:需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。将私钥private_key.pem用在服务器端,公钥发放给android跟ios等前端就是将非对称加密的信息传递到JWT里面的做解密验证
2022年06月23日
106 阅读
0 评论
0 点赞
2022-06-23
【PHP】PHP实现创建文件目录
/** * @Author: 小破孩嫩 * @Email: 3584685883@qq.com * @Time: 2021/4/12 13:36 * @param $path * @Description:设置路径判断是否存在,不存在创建 */ public function createPath($path){ $Month = date('Ym',time()); $Day = date('d',time()); $path = $this->path.$Month.'/'.$Day.'/'; if(!is_dir($path)){ header("Content-type:text/html;charset=utf-8"); $res = mkdir(iconv("UTF-8", "GBK", $path),0777,true); if(!$res){ $this->createPath(); } } return $path; }
2022年06月23日
75 阅读
0 评论
0 点赞
2022-06-23
【PHP】PHP日志调试方法
/** * @Author: 小破孩嫩 * @Email: 3584685883@qq.com * @Time: 2021/4/2 18:01 * @param string $param 参数 * @param string $res 结果 * @param string $status 状态 false失败,true成功 * @Description:记录日志 */ public function superLog($param = '',$res = '',$status = false){ $logController = $this->request->controller(); $logName = $this->request->action(); $status = $status == true ? '成功'.PHP_EOL : '失败'.PHP_EOL; $dateTime = date('Y-m-d H:i:s',time()); $dateDay = substr($dateTime,0,10); //路径处理 $pathlog = "./fastlog/".$dateDay."/".$logController."/"; if(!is_dir($pathlog)){ header("Content-type:text/html;charset=utf-8"); $res = mkdir(iconv("UTF-8", "GBK", $pathlog),0777,true); if(!$res){ self::superLog(); } } //参数处理 if(is_array($param)){ $param = json_encode($param,JSON_UNESCAPED_UNICODE); } if(is_array($res)){ $res = json_encode($res,JSON_UNESCAPED_UNICODE); } error_log($dateTime.'=>'.$logName."\n"."参数:".$param."\n"."结果:".$res."\n".$status,3,$pathlog.$logName.'.txt'); } **便捷使用:** error_log(date('Y-m-d H:i:s',time())."=>aaa\n".print_r($data,true)."\n",3,"./aaa_log.txt");
2022年06月23日
119 阅读
0 评论
0 点赞
2022-06-23
【PHP】通过CURL获取结果集
在PHP调用别人的接口,需要用到curl相关操作,本文章集成了多个操作方法,并在今后的工作中不断完善 /** * @Author: 小破孩嫩 * @Email: 3584685883@qq.com * @Time: 2021/4/1 10:39 * @param string $url url地址 * @param bool $params 参数 * @param int $ispost 是否是post请求,默认get * @param int $https 是否是https,默认http * @param int $flbg 返回值是否转成数组,默认不转 * @param int $header 是否传递header值,默认不传,header值格式:$header = ['CLIENT-IP:127.0.0.1','X-FORWARDED-FOR:127.0.0.1']; * @param int $headercontent 是否获取请求的header值内容,默认不获取 * @param int $local 是否使用本地ip进行请求,默认不使用 * @return array|bool|mixed|string * @Description:curl请求 */ public function curl($url, $params = false, $ispost = 0, $https = 0, $flbg = 0, $header = 0,$headercontent = 0,$local = 0){ // $httpInfo = []; $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36'); // curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400'); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); if($header){ curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); } if($headercontent){ curl_setopt($ch, CURLOPT_HEADER, 1); } if($local){ $header = [ 'CLIENT-IP:127.0.0.1', 'X-FORWARDED-FOR:127.0.0.1' ]; curl_setopt($ch, CURLOPT_HTTPHEADER, $header); } if($https){ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // 对认证证书来源的检查 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // 从证书中检查SSL加密算法是否存在 } if($ispost){ curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); curl_setopt($ch, CURLOPT_URL, $url); }else{ if($params){ if (is_array($params)) { $params = http_build_query($params); } curl_setopt($ch, CURLOPT_URL, $url . '?' . $params); }else{ curl_setopt($ch, CURLOPT_URL, $url); } } $response = curl_exec($ch); // if($response === FALSE){ // echo "CURL Error: " . curl_error($ch); // return false; // } // $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // $httpInfo = array_merge($httpInfo, curl_getinfo($ch)); if($headercontent){ //对返回的结果进行字符串处理 if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == '200') { $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $headers = substr($response, 0, $headerSize); $body = substr($response, $headerSize); return [$headers,$body]; //body内容是图片 } } curl_close($ch); if ($flbg) { $response = json_decode($response, true); } return $response; } 上面的用本地请求的场景是,被curl请求接口做了IP限制,如果本地不可以用,可以使用下面的方法需要一个有效的代理ip和端口号,有的还需要用户名密码,代码如下:curl_setopt($ch, CURLOPT_PROXY, "http://39.156.69.79:8080");窍门:一般情况下是不需要代理,但是伪造的ip不能用,就ping一下你扒取接口的网址,然后用这个网址的ip做伪造。百分百成功。如遇类似问题不能解决,欢迎留言讨论。
2022年06月23日
83 阅读
0 评论
0 点赞
2022-06-23
【PHP】$_SERVER详解
## $_SERVER详解 ## > 以 "http://local.sdd.com/public/index.php/fast" 这个地址为例; $_SERVER['SCRIPT_NAME']; //当前脚本的路径 /public/index.php dirname($_SERVER['SCRIPT_NAME']); //dirname() 返回路径中的目录部分 /public $_SERVER['SCRIPT_FILENAME']; //当前脚本执行的绝对路径 D:/phpstudy_pro/WWW/sdd/public/index.php $_SERVER['HTTP_HOST']; //获取当前域名 local.sdd.com $_SERVER['SERVER_NAME']; //输出配置文件httpd.conf中的ServerName,一般情况下与HTTP_HOST值相同 local.sdd.com $_SERVER['SystemRoot']; //当前服务器的操作系统的目录 C:\WINDOWS $_SERVER['SERVER_SOFTWARE']; //服务器软件配置信息 Apache/2.4.39 (Win64) OpenSSL/1.1.1b mod_fcgid/2.3.9a mod_log_rotate/1.02 $_SERVER['SERVER_PORT']; //服务器端口 80 $_SERVER['REMOTE_PORT']; //用户连接到服务器时所使用的端口 58222 $_SERVER['SERVER_ADDR']; //服务器的ip地址 127.0.0.1 $_SERVER['REMOTE_ADDR']; //浏览网页的用户ip。 127.0.0.1 $_SERVER['DOCUMENT_ROOT']; //当前运行脚本所在的根目录 D:/phpstudy_pro/WWW/sdd $_SERVER['REQUEST_SCHEME']; //服务器通信协议,是http或https。 http $_SERVER['SERVER_ADMIN']; //服务器管理员信息 admin@example.com $_SERVER['REQUEST_METHOD']; //请求数据的方式 GET $_SERVER['REQUEST_URI']; //当前脚本路径,根目录之后的目录 /public/index.php/fast $_SERVER['PHP_SELF']; //当前正在执行脚本的文件名 /public/index.php/fast $_SERVER['REQUEST_TIME']; //得到请求开始时的时间戳。 1616986524 $_SERVER['HTTP_COOKIE']; //获取浏览器的cookie信息。 authId=u%2B4BNnh9IsFDM%2BM%7C1617241258%7C7b4GM396cJIXMeM%2BS3v0tszZx%2FKx; shownum=10 $_SERVER['HTTP_CONNECTION']; //当前请求的连接情况 close $_SERVER['HTTP_USER_AGENT']; //获取用户相关信息,包括用户浏览器、操作系统等信息 Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36 $_SERVER['HTTP_ACCEPT']; //当前请求的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.9 $_SERVER['HTTP_ACCEPT_LANGUAGE']; //返回用户默认的语言设置,后面的q值表示用户对该语言的喜好程度 zh-CN,zh;q=0.9
2022年06月23日
124 阅读
0 评论
0 点赞
2022-06-23
【jQuery】点击复制微信号并跳转到微信
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script> <script src="https://cdn.jsdelivr.net/clipboard.js/1.5.12/clipboard.min.js"></script> <title>复制按钮</title> </head> <body> 微信号:<span id="target">需要被复制的微信号</span> <button class="btn" data-clipboard-action="copy" data-clipboard-target="#target" id="copy_btn"> 点击复制 </button> </body> <script> $(document).ready(function(){ var clipboard = new Clipboard('#copy_btn'); clipboard.on('success', function(e) { alert("微信号复制成功",1500); window.location.href='weixin://'; e.clearSelection(); console.log(e.clearSelection); }); }); </script> </html>
2022年06月23日
189 阅读
0 评论
1 点赞
2022-06-23
【Windows】 windows10 遇到“该文件没有与之关联的应用来执行操作请安装应用若已安装应用程序请在默认应用设置”
1.win+R 输入 regedit 回车 2.找到“计算机\HKEY_CURRENT_USER\Software\Classes\ms-settings” 3.删除即可,亲测有效!
2022年06月23日
97 阅读
0 评论
0 点赞
2022-06-23
【Layui】实现发送验证码倒计时
/** * 发送验证码 */ var countdown=60; function sendsms(){ var sms = $('#sendsmsid').text(); if(sms == '发送验证码' || sms == '重新发送验证码'){ var iphone = $("#phone").val(); $.ajax({ url:"{:url('index/getSmsByIphoneNumber')}", type:'get', dataType: "json", data:{mobile_num:iphone}, success:function(res){ // console.log(res); // return false; if(res.code == 200){ layer.msg(res.message, { icon: 6,//成功的表情 },function(){ judgeAgainSend(); }); return false; }else{ layer.msg(res.message,{icon: 5});//失败的表情 return false; } }, }); }else{ judgeAgainSend(); } } /** * 判断重新发送 * @returns {boolean} */ function judgeAgainSend(){ if(countdown == 0){ $('#sendsmsid').text('重新发送验证码'); $('#sendsmsid').removeClass('layui-btn-disabled'); countdown = 60; return false; }else{ $('#sendsmsid').text('已发送 '+countdown+'秒 后可重新发送'); $('#sendsmsid').addClass('layui-btn-disabled'); countdown--; setTimeout(function() { sendsms(); } ,1000) } }
2022年06月23日
113 阅读
0 评论
0 点赞
2022-06-23
【PHP】民族数组
["汉族","蒙古族","回族","藏族","维吾尔族","苗族","彝族","壮族","布依族","朝鲜族","满族","侗族","瑶族","白族","土家族", "哈尼族","哈萨克族","傣族","黎族","傈僳族","佤族","畲族","高山族","拉祜族","水族","东乡族","纳西族","景颇族","柯尔克孜族", "土族","达斡尔族","仫佬族","羌族","布朗族","撒拉族","毛南族","仡佬族","锡伯族","阿昌族","普米族","塔吉克族","怒族", "乌孜别克族", "俄罗斯族","鄂温克族","德昂族","保安族","裕固族","京族","塔塔尔族","独龙族","鄂伦春族","赫哲族","门巴族","珞巴族","基诺族"];
2022年06月23日
118 阅读
0 评论
0 点赞
2022-06-23
【Layui】x-admin后台页面使用layer.msg提示失败解决办法
form.on 监听提交,所包含的代码最后要加上 return false; layui.use(['form', 'layer'], function() { $ = layui.jquery; var form = layui.form, layer = layui.layer; //自定义验证规则 form.verify({ pass: [/(.+){6,12}$/, '密码必须6到12位'], repass: function(value) { if ($('#L_pass').val() != $('#L_repass').val()) { return '两次密码不一致'; } }, phonesms:function(value){ if(!value.match('^[0-9]*$')){ return '验证码是数字'; } if(value.length != 6){ return '验证码长度是6位数字'; } } }); //监听提交 form.on('submit(add)', function(data) { //发异步,把数据提交给php layer.confirm('是否确定进行下一步',{ icon: 3, //问号的表情 btn: ['下一步','取消'] ,//按钮 },function () { var result = data.field, info = $('.layui-form').serialize(); $.ajax({ url:"{:url('page/registOne')}", type:'get', dataType: "json", data:$('.layui-form').serialize(), success:function(res){ // console.log(res); // return false; if(res.code == 200){ layer.msg(res.message, { icon: 6,//成功的表情 time: 3000 //3秒关闭(如果不配置,默认是3秒) }, function(){ // location.reload(); location.href="{:url('page/registTwo')}"; }); }else{ layer.msg(res.message,{icon: 5});//失败的表情 return; } }, }); }); return false; }) });
2022年06月23日
125 阅读
0 评论
0 点赞
2022-06-21
【PHP】根据身份证号码获取 性别,年龄,出生日期 的信息
//18位身份证取性别,倒数第二位奇数是男,偶数是女; $sex = substr($idcard, (strlen($idcard)==18 ? -2 : -1), 1) % 2 ? '1' : '2'; //取身份证年月日; $birthday = strlen($idcard)==15 ? ('19' . substr($idcard, 6, 6)) : substr($idcard, 6, 8); //身份证年月日转换成时间戳 $birthdays = strtotime(strlen($idcard)==15 ? ('19' . substr($idcard, 6, 6)) : substr($idcard, 6, 8)); //取当天日期; $today = strtotime('today'); //用时间戳相减算出年龄; $diff = floor(($today-$birthdays)/86400/365); //取出年龄值; $age = strtotime(substr($idcard,6,8).'+'.$diff.'years')>$today?($diff+1):$diff;
2022年06月21日
333 阅读
0 评论
0 点赞
2022-06-21
【PHP】CURL调用https请求的接口
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 加上这两行,完美解决
2022年06月21日
168 阅读
0 评论
0 点赞
2022-06-21
【PHP】GET和POST传输方式的区别
Get方式是从服务器上获取数据,在数据查询时,建议用Get方式;如商品信息接口、搜索接口等Post方式是向服务器传送数据,做数据添加、修改或删除时,建议用Post方式,如登录注册接口等。1、GET是用来从服务器上获取数据,而POST是用来向服务器上传递数据。2、GET将表单中数据按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接;而各个变量之间用“&”连接。POST是将表单中的数据放在FORM数据体中,按照变量和值相对应的方式,传递到Action指向的URL中。3、GET是不安全的,因为在传输过程,数据被放在请求的URL中,而如今很多服务器或代理服务器会把请求的URL放到日志文件中,这样会有一些隐私信息会被第三方看到。另外,用户也可以在浏览器上直接看到提交的数据,一些系统内部消息会一同显示在用户面前。POST的所有操作对用户来说是不可见的。4、GET传输的数据量小,主要是受URL长度限制,而POST可以传输大量数据,所以上传文件只能使用POST。5、GET限制FORM表的数据集的值必须为ASCII字符,而POST支持整个ISO10646字符集。Post和Get的区别:1)Get请求只是简单的获取数据,不修改请求的资源;而POST请求会修改请求的资源。导致的后果说相同的GET请求能获取相同的资源,而POST不能保证获取相同的资源。2)GET请求的参数在HTTP中是通过URL传递的,而POST请求的数据是通过requestbody传递的。3)GET请求资源在服务器上能够缓存,POST请求就不能够了。4)GET请求的参数的数据长度是有限制的,而POST请求的数据长度没有限制。5)GET请求无法传递二进制数据到服务器上,而POST可以。1、GET参数通过URL传递,POST放在REQUEST BODY中。2、GET请求在URL中传递是有长度限制的,而POST没有。3、GET比POST更不安全,因为参数直接暴露在URL中,所以不能传递敏感信息。4、GET请求只能进行URL编码,而POST支持多种编码方式。5、GET请求参数会完整保留在浏览器历史记录中,而POST中的参数不会被保留。Get和POST请求有什么区别?1、get比post更不安全2、get传输的数据长度比post小3、get通过在URL后拼接字符串的形式传递参数,post将参数放在RequestBody中4、get产生一个TCP数据包;post产生两个TCP数据包。(get会把 httpheader 和 data 一起发送给服务器,服务器会响应200,post会先把httpheader发送给服务端,服务端响应100,提示客户端继续发送。浏览器接着发送data给服务端。最终服务端响应200)5、get请求可以被缓存起来,post不行
2022年06月21日
161 阅读
0 评论
0 点赞
1
...
5
6
7
...
11