首页
关于
留言
友链
电台
壁纸
我的足迹
推荐
知易而行MCP
Search
1
乐橙CMS影视管理系统最全版本
109,277 阅读
2
VIP视频解析破解电影解析模拟破解影视解析
77,795 阅读
3
乐橙CMS影视管理系统4.0.18版本
16,934 阅读
4
新浪图片链接修复教程集合
15,125 阅读
5
反调试代码调试死机代码禁止F12代码
12,093 阅读
语言
PHP
Java
Go
JavaScript
CSS
Vue
资源教程
网络杂谈
技术文章
影视交流
软件工具
Mac
知易而行
登录
Search
标签搜索
PHP
AI
LINUX
微信
MYSQL
OpenClaw
ESP32S3
小智AI
P2P
JS
破解
乐橙cms
支付
uniapp
人工智能
技术趋势
智能玩具
公众号
typecho
xshell
子沐~
累计撰写
121
篇文章
累计收到
372
条评论
首页
栏目
语言
PHP
Java
Go
JavaScript
CSS
Vue
资源教程
网络杂谈
技术文章
影视交流
软件工具
Mac
知易而行
页面
关于
留言
友链
电台
壁纸
我的足迹
推荐
知易而行MCP
搜索到
6
篇与
的结果
2023-01-06
Think-swoole集成think-queue由于配置问题造成的队列无法监听解决办法
2023-01-06T05:46:39.png问题:如上图所示官方说的queue已经在think-swoole中集成了,但是我们将此配置在swoole.php中更改后,创建完任务后,队列不执行。原因:queue.php的配置和swoole.php的配置不一致造成的。queue配置'connections' => [ 'sync' => [ 'type' => 'sync', ], 'database' => [ 'type' => 'database', 'queue' => 'zimuoo', 'table' => 'jobs', 'connection' => null, ], 'redis' => [ 'type' => 'redis', 'queue' => "zimuoo", 'host' => env('REDIS.REDIS_HOST', '127.0.0.1'), 'port' => env('REDIS.PORT', 6379), 'password' => env('REDIS.REDIS_PASSWORD', ''), 'select' => env('REDIS.SELECT', 0), 'timeout' => 0, 'persistent' => false, ], ],swoole配置//队列 'queue' => [ 'enable' => true, //键名是队列名称 'workers' => [ //下面参数是不设置时的默认配置 'default' => [ 'delay' => 0, 'sleep' => 3, 'tries' => 0, 'timeout' => 60, 'worker_num' => 3, ], //使用@符号后面可指定队列使用驱动 'default@connection' => [ //此处可不设置任何参数,使用上面的默认配置 ], ], ],代码分析先看看think-swoole的启动命令文件中的queue监听,分析代码可以发现队列是queue [$queue],但是咱们两边配置不一样,一个是zimuoo,一个是default,造成任务创建了,但是不执行。protected function createQueueWorkers() { $workers = $this->getConfig('queue.workers', []); foreach ($workers as $queue => $options) { if (strpos($queue, '@') !== false) { [$queue, $connection] = explode('@', $queue); } else { $connection = null; } $workerNum = Arr::get($options, 'worker_num', 1); $this->addBatchWorker($workerNum, function (Process\Pool $pool) use ($options, $connection, $queue) { $delay = Arr::get($options, 'delay', 0); $sleep = Arr::get($options, 'sleep', 3); $tries = Arr::get($options, 'tries', 0); $timeout = Arr::get($options, 'timeout', 60); /** @var Worker $worker */ $worker = $this->app->make(Worker::class); while (true) { $timer = Timer::after($timeout * 1000, function () use ($pool) { $pool->getProcess()->exit(); }); $this->runWithBarrier([$this, 'runInSandbox'], function () use ($connection, $queue, $delay, $sleep, $tries, $worker) { $worker->runNextJob($connection, $queue, $delay, $sleep, $tries); }); Timer::clear($timer); } }, "queue [$queue]"); } }解决只需要将 swoole.php中的队列驱动更改为一直即可。default=>zimuoo
2023年01月06日
2,149 阅读
0 评论
0 点赞
2022-11-11
VIP视频解析破解电影解析模拟破解影视解析
最近看到很多人需要解析VIP视频【企鹅的,某库,某奇艺的等等】,但是自己去开发一套这样的系统好像也很费劲的,需要抓cookie,账号等等一些列的东西,像我这种花不起钱的人 就喜欢 白嫖那么咱们开始白嫖破解别人的吧,下面是记录破解过程。[line]抓取他的请求参数[/line]这里你可以使用一些抓包工具,网上搜一下 很多,随便一个就行,拿到参数咱们就模拟请求即可。[line]伪造请求头信息,防止被发现[/line] //这里是以swoole来做的,大家使用其他语言或者框架也是一样的 //例如 解析地址为http://xxxx.net/api.php //参数 url ua time isIos $client=new \EasySwoole\HttpClient\HttpClient($host); $client->setHeaders([ "User-Agent" => 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36', 'Accept' => 'application/json, text/javascript, */*; q=0.01', 'Origin' => 'https://xxxx.net', 'Accept-Encoding' => 'gzip', 'Pragma' => 'no-cache', 'Cache-Control' => 'no-cache' ]); $client->setConnectTimeout(10000);//定义超时时间 $client->setClientSetting('bind_address',$this->rand_ip());//伪造一个IP $response = $client->post($param); $data=$response->getBody();[line]伪造IP[/line]public function rand_ip() { $ip_long = array( array('607649792', '608174079'), //36.56.0.0-36.63.255.255 array('1038614528', '1039007743'), //61.232.0.0-61.237.255.255 array('1783627776', '1784676351'), //106.80.0.0-106.95.255.255 array('2035023872', '2035154943'), //121.76.0.0-121.77.255.255 array('2078801920', '2079064063'), //123.232.0.0-123.235.255.255 array('-1950089216', '-1948778497'), //139.196.0.0-139.215.255.255 array('-1425539072', '-1425014785'), //171.8.0.0-171.15.255.255 array('-1236271104', '-1235419137'), //182.80.0.0-182.92.255.255 array('-770113536', '-768606209'), //210.25.0.0-210.47.255.255 array('-569376768', '-564133889') //222.16.0.0-222.95.255.255 ); $rand_key = mt_rand(0, 9); $ip = long2ip(mt_rand($ip_long[$rand_key][0], $ip_long[$rand_key][1])); return $ip; }[line]解析成功的结果[/line]{ "code": 200, "url": "https://cdn.oss-cn-m3u8.tv-nanjing-chengdu.myqcloud.com.zh188.net/PlayVideo.php?url=M3EvQmdSaEtGZ2c0NWU0MnFqWHA3SjYrQTcwL2FwaldmLytnMC9wTVNwbHNod1R5T2hpcjBhRlh2ZzAwUGd5WW5XZFFIV3p3QlhZZlRsWWdOK25mejZ4ZXdwSkZsbU9Md3BGaTBjN2VHWlpRd2E2bGcvZHJycEU0ckpUY3Zqck9lYnk5Lyt3NGJFeEI0RGpGSjVXUXFGMFUvWGdmM0dkUXB2d1ovZ09acWhBMDc3d0pZVk5WZU4zZndzUFR0K1dETjRvbkxOZy81aUNubTA1S1FjQVByNU1rUzd2dFp1YjE3NXdEUC9aOW9HZVNwbjdiU2RvU0VHR2tyZk15blp0R2d2NUxTazBUMjk5UmlXQi9NTmhWT3c9PQ==.m3u8", "msg": "解析成功" }
2022年11月11日
77,795 阅读
0 评论
2 点赞
2021-04-16
PHP的strtotime计算2038年以上日期的时间戳错误
今天同事遇到一个bug,获取有效期值错误,同样的代码,其他开发人员操作都没有问题。在定位跟踪后发现有效期有值,如下:$expireDate = 2133999048;但是在该时间戳的基础上加上1 year后, $expireDate的值为false,而不是正确的时间戳。 $expireDate = strtotime("+1 year", $expireDate);Y2K38 漏洞 {message} Y2K38,又称 Unix Millennium Bug,此漏洞将会影响到所有 32 位系统下用 UNIX 时间戳整数来记录时间的 PHP,及其它编程语言。一个整型的变量所能保存的最大时间为 2038 年01月19 日 03:14:07。超过这个时间后,整型数值将会溢出。从 1970 年 01 月 01 日开始,到世界标准时 2038 年 01 月 19 日星期二凌晨 03:14:07 超过 2^31 – 1。2^31 – 1 就是0x7FFFFFFF,相信很多编程员都看过,在 32 位系统里,这表示最大的有符号整数。如果用它来表示秒数,大概相当于 68.1 年,从 1970 年到 2038 年刚好是这个数。{/message}其他解决方案就是升级 php版本到7.1以上
2021年04月16日
1,383 阅读
0 评论
1 点赞
2021-04-15
面试中遇到的sql练习题
面试中面试官问你啥问题,小编都给你整理在这里了。每天都会整理一份最接地气的面试题,希望能帮助到你!1.用一条SQL 语句查询出每门课都大于80 分的学生姓名?// 第一种方式:select name from table where name not in ( select name from table where score< 80 );// 第二种方式:select name from table group by name having min(score) >= 80;2.删除除了自动编号id不同, 其他都相同的学生冗余信息?字段分别是:id,stunum,name,course,scoredelete table where id not in ( select min(id) from table group by stunum,name,course,score );3.一个叫 team 的表,里面只有一个字段name, 一共有4 条纪录,分别是a,b,c,d, 对应四个球对,现在四个球对进行比赛,用一条sql 语句显示所有可能的比赛组合?// 所有组合:ab,ac,ad, bc,bd, cd 所有左侧字母都小于右侧字母select a.name,b.name from team a,team b where a.name < b.name order by a.name,b.name ;4.从TestDB 数据表中查询出所有月份的发生额都比101 科目相应月份的发生额高的科目?AccID :科目代码,Occmonth :发生额月份,DebitOccur :发生额select a.AccID from TestDB a,( select Occmonth,max(DebitOccur) from TestDB where AccID = '101' group by Occmonth )b where a.Occmonth = b.Occmonth and a.DebitOccur > b.DebitOccur;5.怎么把这样一个表儿查成这样一个结果select year, (select amount from table m where month=1 and m.year=aaa.year) as m1, (select amount from table m where month=2 and m.year=aaa.year) as m2, (select amount from table m where month=3 and m.year=aaa.year) as m3, (select amount from table m where month=4 and m.year=aaa.year) as m4 from table group by year6.复制表( 只复制结构, 源表名:a新表名:b)select * into b from a where 1<>1; // where1=1,拷贝表结构和数据内容7.拷贝表( 拷贝数据, 源表名:a目标表名:b)insert into b(a, b, c) select d,e,f from a;8.显示文章、提交人和最后回复时间select a.title,a.username,b.adddate from table a, (select max(adddate) adddate from table where table.title=a.title) b;9.日程安排提前五分钟提醒select * from 日程安排 where datediff('minute',f 开始时间,getdate())>5;10.两张关联表,删除主表中已经在副表中没有的信息delete from info where not exists ( select * from infobz where info.infid=infobz.infid );11.有两个表A 和B ,均有key 和value 两个字段,如果B 的key 在A 中也有,就把B 的value 换为A 中对应的value?update b set b.value=(select a.value from a where a.key=b.key) where b.id in( select b.id from b,a where b.key=a.key );12.已知有如下4张表:学生表:STUDENT(S#,SNAME,SAGE,SSEX)课程表:COURSE(C#,CNAME,T#)成绩表:SC(S#,C#,SCORE)教师表:TEACHER(T#,TNAME)(1)查询课程编号为“001”的课程比“002”的课程成绩高的所有学生的学号?select x.sno,x.score,y.score from sc x,sc y where x.cno=1001 and y.cno=1002 and x.sno=y.sno and x.score> y.score;(2)查询平均成绩大于60分的学生的学号和平均成绩?select sno,avg(score) from sc group by sno having avg(score)>60;(3)查询所有学生的学号、姓名、选课数、总成绩?select sc.sno,sname,count(cno),sum(score) from student join sc on student.sno=sc.sno group by sc.sno,sname;(4)查询姓“悟”的老师的个数?select count(Tname) from teacher where Tname like'悟%';(5)查询没学过“悟空”老师课的学生的学号、姓名?select sno,sname from student where sno not in( select sno from SC where cno in( select cno from course where tno in( select tno from teacher where tname='悟空' ) ) );
2021年04月15日
1,164 阅读
0 评论
3 点赞
2021-04-11
Redis异步队列与延时队列如何实现
消息中间件,大家都会想到 Rabbitmq 和 Kafka 作为消息队列中间件,来给应用程序之间增加异步消息传递功能。这两个中间件都是专业的消息队列中间件,特性之多超出了大多数人的理解能力。但是这种属于重量级的应用,使用比较麻烦点。如果是轻量级的,使用 Redis就可以。比如对于那些只有一组消费者的消息队列,使用 Redis 就可以非常轻松的搞定。Redis 的消息队列不是专业的消息队列,它没>有非常多的高级特性,没有 ack 保证,如果对消息的可靠性没有极致的要求,那么它可以拿来使用。异步消息队列Redis 的 list(列表) 数据结构常用来作为异步消息队列使用,使用rpush/lpush操作入队列,使用lpop 和 rpop来出队列。rpush 和 lpop 结合 或者lpush 和rpop 结合;客户端是通过队列的 pop 操作来获取消息,然后进行处理。处理完了再接着获取消息,再进行处理。如此循环往复,这便是作为队列消费者的客户端的生命周期。问题来了可是如果队列空了,客户端就会陷入 pop 的死循环,不停地 pop,没有数据,接着再 pop,又没有数据。这就是浪费生命的空轮询。空轮询不但拉高了客户端的 CPU,redis 的 QPS 也会被拉高,如果这样空轮询的客户端有几十来个,Redis 的慢查询可能会显著增多。 通常我们使用 sleep 来解决这个问题,让线程睡一会,睡个 1s 钟就可以了。不但客户端的 CPU 能降下来,Redis 的 QPS 也降下来了。新的问题:用上面睡眠的办法可以解决问题。但是有个小问题,那就是睡眠会导致消息的延迟增大。如果只有 1 个消费者,那么这个延迟就是 1s。如果有多个消费者,这个延迟会有所下降,因为每个消费者的睡觉时间是岔开来的。 有没有什么办法能显著降低延迟呢?你当然可以很快想到:那就把睡觉的时间缩短点。这种方式当然可以,不过有没有更好的解决方案呢?当然也有,那就是 blpop/brpop。这两个指令的前缀字符b代表的是blocking,也就是阻塞读。阻塞读在队列没有数据的时候,会立即进入休眠状态,一旦数据到来,则立刻醒过来。消息的延迟几乎为零。用blpop/brpop替代前面的lpop/rpop,就完美解决了上面的问题。问题喋喋不休:空闲连接自动断开 你以为上面的方案真的很完美么?先别急着开心,其实他还有个问题需要解决。什么问题?—— 空闲连接的问题。 如果线程一直阻塞在哪里,Redis 的客户端连接就成了闲置连接,闲置过久,服务器一般会主动断开连接,减少闲置资源占用。这个时候blpop/brpop会抛出异常来。所以编写客户端消费者的时候要小心,注意捕获异常,还要重试。消息延时队列延时队列可以通过 Redis 的 zset(有序列表) 来实现。我们将消息序列化成一个字符串作为 zset 的value,这个消息的到期处理时间作为score,然后用多个线程轮询 zset 获取到期的任务进行处理,多个线程是为了保障可用性,万一挂了一个线程还有其它线程可以继续处理。因为有多个线程,所以需要考虑并发争抢任务,确保任务不能被多次执行。 Redis 的 zrem 方法是多线程多进程争抢任务的关键,它的返回值决定了当前实例有没有抢到任务,因为 loop 方法可能会被多个线程、多个进程调用,同一个任务可能会被多个进程线程抢到,通过 zrem 来决定唯一的属主。同时,我们要注意一定要对 handle_msg 进行异常捕获,避免因为个别任务处理问题导致循环异常退出。问题来了:同一个任务可能会被多个进程取到之后再使用 zrem 进行争抢,那些没抢到的进程都是白取了一次任务,这是浪费。解决办法:Lua是Redis内置脚本,执行Lua脚本时,Redis线程会依次执行脚本中的语句,对于客户端来说操作是原子性的,将 zrangebyscore 和 zrem 一同挪到服务器端进行原子化操作,这样多个进程之间争抢任务时就不会出现这种浪费了。
2021年04月11日
991 阅读
0 评论
2 点赞
2019-03-28
根据浏览器判断微信还是支付宝
<?php //判断是否微信浏览器 function isWechat(){ if(strpos($_SERVER['HTTP_USER_AGENT'],'MicroMessenger') !==false){ return true; }else{ return false; } } //判断是不是支付宝 function isAlipay() { if (strpos($_SERVER['HTTP_USER_AGENT'], 'AlipayClient') !== false) { return true; }else { return false; } } ?>
2019年03月28日
1,678 阅读
0 评论
1 点赞