面包屑思维模型实战模型错题集结构手册流程手册自我检测专题模块
-
微信小程序前端微信小程序前端易错点收集查看
-
css/less/sass样式控制在开发过程中的一些样式控制bug规避查看
-
tp5开发小程序tp5开发小程序时错误积累查看
-
PHP错题集PHP在实际开发过程中遇到的问题查看
-
MySql数据库使用MySql在实际开发中遇到的错误总结查看
-
TP5错题集积累tp5框架在实际开发过程中遇到的问题查看
-
uni-app爬坑主要用于uni-app项目中遇到的一些问题查看
-
Vue.js易错收集vue.js项目常见错误收集整理查看
-
uni-app开发微信小程序uni-app开发微信小程序的一些爬坑积累查看
-
LinuxLinux在部署、开发、运维时遇见的错误积累查看
-
安全设计常见安全设计查看
-
Redis项目中使用redis的相关错误积累查看
-
前端特效前端特效相关错题集查看
最新博文
-
Thinkphp6集成QQ登录
thinkphp首先,去QQ互联申请账号并建立自己的应用地址是:https://connect.qq.com/index.html
一.创建自己的应用
创建时注意点:
(1)事先写好回调地址
(2)网站使用介绍一定和备案内容一致,网站名称一定和网站备案时名称一致
(3)创建后记录App Id和App Key
(4)网站一定要放好QQ登录图标,且点击登录能拉起授权页面(也就是登录接口和回调接口已经写好)
二.获得配置文件inc.php
官方下载php版本的SDK
将整个包重新命名,例如qqlogin,将其放入到网站根目录中进行访问
将之前获取的App ID和App Key ,以及回调地址填入,点击配置,即可在SDK目录API/comm中生成配置文件inc.php
三.封装第三方类
整个SDK是不能拿来放到tp框架中直接用的,同时composer得到的类库似乎也有问题,所以只有自行封装
在tp框架中extend目录下新建类库目录,例如qqlogin。然后将SDK中API/class文件中的几个类复制到封装的类库目录中,同时将上步生成的inc.php也放到封装的类库目录中
接下来就要对这个第三方类库进行一些修改
1.修改SDK复制过来5类的名称
复制过来的ErrorCase.class.php、Oauth.class.php、QC.class.php、Recorder.class.php、URL.class.php全部去掉.class。不然接口调用时提示class not found
2.修改各类引入关系(加命名空间以及去掉require_once)
ErrorCase.php
Oauth.php
QC.php
Recorder.php
3.修改类中一些不适合tp框架的方法
Oauth.php中的qq_login()方法
Recorder.php中的construct()方法
Recorder.php中的destruct()方法
四.在控制器中调用
控制器中的方法路由,及qq_login和qq_callback前期先设置为GET,便于审核。审核通过后,视项目需求更改
阅读更多风口下的猪2021-12-15【thinkphp】
-
ThinkPHP6+Redis List(列表)操作
Redis//在列表头部插入一个值one,当列表不存在时自动创建一个列表,key1为列表名
$redis->lpush("key1", "one");
//在列表尾部插入一个值two,当列表不存在时自动创建一个列表,key1为列表名
$redis->rPush("key1","two");
//将一个插入已存在的列表头部,列表不存在时操作无效
$redis->rPushx("key1","1");
//删除列表的第一个元素并返回列表和列表的第一个元素,当key1不存在或不是列表则返回false
$redis->lPop('key1');
//删除列表的最后一个元素并返回列表和列表的最后一个元素,当key1不存在或不是列表则返回false
$redis->rPop('key1');
//删除并或取列表的第一个元素,如果没有元素则会阻塞直到等待超时
$redis->blPop('asd', 10);
//删除并或取列表的最后一个元素,如果没有元素则会阻塞直到等待超时
$ret = $redis->brPop('asd', 10);
//移除列表key1中最后一个元素,将其插入另一个列表asd头部,并返回这个元素。若源列表没有元素则返回false
$redis->rpoplpush('key1', 'asd');
//移除列表key1中最后一个元素,将其插入另一个列表asd头部,并返回这个元素。如果列表没有元素则会阻塞列表直到超时,超时返回false。
$ret = $redis->brpoplpush('key1', 'asd', 10);
//根据KEY返回该KEY代表的LIST的长度,如果这个LIST不存在或者为空,那么ISIZE返回0
//如果指定的KEY的数据类型不是LIST或者不为空,那么返回FALSE。
//所以在这里多说一句,当用ISize返回判断值的时候,===就有用处了,这里FLASE和0是两个概念了。
$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->rPush('key1', 'C'); /* key1 => [ 'A', 'B', 'C' ] */
$redis->lSize('key1');/* 3 */
$redis->rPop('key1');
$redis->lSize('key1');/* 2 */
//通过索引修改列表中元素的值,如果没有该索引,则返回false。
$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->rPush('key1', 'C'); /* key1 => [ 'A', 'B', 'C' ] */
$redis->lGet('key1', 0); /* 'A' */
$redis->lSet('key1', 0, 'X');
$redis->lGet('key1', 0); /* 'X' */
//根据索引值返回指定KEY LIST中的元素。0为第一个元素,1为第二个元素。
//-1为倒数第一个元素,-2为倒数第二个元素。如果指定了一个不存在的索引值,则返回FLASE。
$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->rPush('key1', 'C'); /* key1 => [ 'A', 'B', 'C' ] */
$redis->lGet('key1', 0); /* 'A' */
$redis->lGet('key1', -1); /* 'C' */
$redis->lGet('key1', 10); /* `FALSE` */
//取得指定索引值范围内的所有元素。
$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->rPush('key1', 'C');
$redis->lRange('key1', 0, -1); /* array('A', 'B', 'C') */
//它将截取LIST中指定范围内的元素组成一个新的LIST并指向KEY。简短解说就是截取LIST。
//这个可不是JS,或者PHP中清空空格的意思。
$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->rPush('key1', 'C');
$redis->lRange('key1', 0, -1); /* array('A', 'B', 'C') */
$redis->lTrim('key1', 0, 1);
$redis->lRange('key1', 0, -1); /* array('A', 'B') */
//IRem,IRemove函数,首先要去判断count参数,如果count参数为0,那么所有符合删除条件的元素都将被移除。
//如果count参数为整数,将从左至右删除count个符合条件的元素,如果为负数则从右至左删除count个符合条件的元素。
$redis->lPush('key1', 'A');
$redis->lPush('key1', 'B');
$redis->lPush('key1', 'C');
$redis->lPush('key1', 'A');
$redis->lPush('key1', 'A');
$redis->lRange('key1', 0, -1); /* array('A', 'A', 'C', 'B', 'A') */
$redis->lRem('key1', 'A', 2); /* 2 */
$redis->lRange('key1', 0, -1); /* array('C', 'B', 'A') */
//返回列表长度
$redis->lLen('key1');
//通过索引 (也就是下标key) 获取列表中的元素,如果没有该索引,则返回false。
$redis->lindex('key1', 0);
//在列表key1中指定元素six前面或后面插入元素。若指定元素不在列表中,或列表不存在时,不执行任何操作
//Redis::AFTER插入元素后面 Redis::BEFORE插入元素前面
//返回值:插入成功返回插入后列表元素个数,若key1不存在返回0,若key1不是列表返回false
$redis->lInsert('key1', Redis::BEFORE, 'one', '1');
$redis->del('key1');
$redis->lInsert('key1', Redis::AFTER, 'A', 'X'); /* 0 */
$redis->lPush('key1', 'A');
$redis->lPush('key1', 'B');
$redis->lPush('key1', 'C');
$redis->lInsert('key1', Redis::BEFORE, 'C', 'X'); /* 4 */
$redis->lRange('key1', 0, -1); /* array('A', 'B', 'X', 'C') */
$redis->lInsert('key1', Redis::AFTER, 'C', 'Y'); /* 5 */
$redis->lRange('key1', 0, -1); /* array('A', 'B', 'X', 'C', 'Y') */
$redis->lInsert('key1', Redis::AFTER, 'W', 'value'); /* -1 */
//根据第三个参数(count),删除掉相对的value
//count > 0 : 从表头开始向表尾搜索,移除与value相等的元素,数量为count。
//count < 0 : 从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值。
//count = 0 : 移除表中所有与value相等的值。
//返回实际删除元素个数
$redis->lrem('key1', '1', -2);
// 获取存储的数据并输出列表下标0到5的数据
// 0为开始查询的列表里的第一个元素,-1则为最后一个元素
// 5代表查询5条数据,当5为-1时则查看所有数据,
$redis->lrange("key1", 0 ,5);
阅读更多风口下的猪2021-12-14【Redis】
-
REDIS如何开启AOF进行持久化?
RedisAOF是什么
其实就是记录日志。
以日志的形式来记录每个写操作,将Redis执行过的所有指令记录下来(读操作不记录),只许追加文件,但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
默认是不开启的,我们需要手动进行配置!
aof保存的是 appendonly.aof 文件
开启:
1、先打开xshell,进入到redis
[root@iZ2ze5s090y2d3q50krshoZ ~]# redis-cli -a 密码
2、进入bin目录下
[root@iZ2ze5s090y2d3q50krshoZ ~]# cd /usr/local/redis/bin/
[root@iZ2ze5s090y2d3q50krshoZ bin]# ll
total 40732
-rw-r--r-- 1 root root 1236 Jun 9 18:27 dump.rdb
-rwxr-xr-x 1 root root 4366576 Jun 8 15:28 redis-benchmark
-rwxr-xr-x 1 root root 8111824 Jun 8 15:28 redis-check-aof
-rwxr-xr-x 1 root root 8111824 Jun 8 15:28 redis-check-rdb
-rwxr-xr-x 1 root root 4806800 Jun 8 15:28 redis-cli
-rw-r--r-- 1 root root 61787 Jun 8 16:14 redis.conf
-rwxr-xr-x 1 root root 8111824 Jun 8 15:28 redis-sentinel
-rwxr-xr-x 1 root root 8111824 Jun 8 15:28 redis-server
-rwxr-xr-x 1 root root 3600 Jun 8 15:28 redis-trib.rb3、输入vim redis.conf:进行修改
[root@iZ2ze5s090y2d3q50krshoZ bin]# vim redis.conf
4、修改appendonly为yes
查找aof,直接输入/aof回车就能定位到那里,回车之后,摁键盘N,进行一个一个查找,找到之后,将“appendonly no”改为“appendonly yes”
查看
1、先关闭之前的,是关闭bin里的redis,是关闭bin里的redis,切记不要关闭外面的,否则系统会出现问题的:
[root@iZ2ze5s090y2d3q50krshoZ bin]# shutdown
2、重新启动
3、就会看到aof,说明aof启动了
宝塔
当然,最简单的方式还是直接在宝塔面板进行设置,即可
阅读更多风口下的猪2021-12-09【Redis】
-
vi字符串检索(查找)命令
Linuxvi 编辑器提供简单的字符串检索功能。在末行模式下,用户可以使用不同的命令对需要的字符串进行查找。查找命令有 5 种。
1. / 命令
/命令的格式为:
/string
/命令从光标处开始向后寻找字符串 string。
2. ? 命令
? 命令的格式为:
?string
? 命令从光标处开始向前寻找字符串 string。
3. n 命令
n 命令重复上一条检索命令。
4. N 命令
N 命令重复上一条检索命令,但检索方向改变。例如上次的检索命令是向前检索,那么此次检索的方向是向后;如果上次的检索命令是向后检索,那么此次检索的方向是向前。
5. g/ 命令
g/ 命令的格式是为:
g/string
检索 string。g/命令使光标停止在第一个检索到的 string 串的行首。下面实例演示了g/命令的用法。
1) 在 vi 编辑器中编辑以下代码:
#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
int main(void)
{
int i, sum;
for (i = 0; i < 3; i++){
sum = add(i, i + 1);
printf("%d\n", sum);
}
}2) 在末行模式下输入 g/main,显示如下:
#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
int main(void)
{
int i, sum;
for (i = 0; i < 3 ; i++){
sum = add(i, i + 1);
printf("%d\n", sum);
}
}
~
~
~
~
~
:g/main
int main(void)请按 ENTER 或其它命令继续
按下回车键,光标将移动到int main(void)的行首。
阅读更多风口下的猪2021-12-09【Linux】
-
vi/vim保存指令
Linux:w保存文件但不退出vi 编辑
:w! 强制保存,不退出vi 编辑
:w file将修改另存到file中,不退出vi 编辑
:wq保存文件并退出vi 编辑
:wq!强制保存文件并退出vi 编辑
q:不保存文件并退出vi 编辑
:q!不保存文件并强制退出vi 编辑
:e!放弃所有修改,从上次保存文件开始在编辑
阅读更多风口下的猪2021-12-09【Linux】
-
vi/vim光标移动
Linuxvi/vim简单的光标移动,是通过命令模式下按上下左右键 或者 h(左) j(上) k(下) L(右)实现移动
阅读更多风口下的猪2021-12-09【Linux】
-
canal-php实现mysql与redis数据同步 (四)canal客户端执行--命令行+进程守护
Redis实际项目中,将canal-php客户端连接及redis更新逻辑(或数据复制逻辑)等,写到命令行文件中执行。
最后通过supervisor进程管理器将命令加入守护命令,并将supervisor设置开机自启即可实现canal-php客户端与服务器端的socket长连
阅读更多风口下的猪2021-12-09【Redis】
-
Thinkphp6定时执行 tp6如何使用定时执行脚本
thinkphpThinkphp6如何定时执行代码,tp6如何使用定时执行脚本,composer支持tinkphp6定时组件框架有哪些,在项目中经常会使用到定时脚本执行,但是相比较于laravel框架而言,thinkphp6还需待完善,没有继承定时执行的相关代码,需要自行扩展,以下是thinkphp可使用的定时任务框架,大家可以尝试使用使用.
队列、任务
- PHP常驻内存定时器 easy-task/easy-task
- 消息队列 topthink/think-queue
- 计划任务 yunxuxin/think-cron
- thinkphp 任务调度 yzh52521/schedule
以上框架由于各种问题部分还待完善,如果你使用的是linux服务器,那么推荐使用命令行+宝塔定时任务执行定时脚本任务.
1.编写相应的commands命令,
1.输入php think make:command Hello hello
2.修改app\command\Hello 中execute函数自己的逻辑代码
3.在config/console.php注册命令.
<?php
return [
'commands' => [
'hello' => 'app\command\Hello',
]
];4.输入php think hello 执行脚本
2.在宝塔终端配置下定时任务
在宝塔面板创建一个定时任务,写入一段简单的定时shell脚本(注意修改成自己tp6网站根目录)
Path=/www/wwwroot/xxx.com
cd $Path
php think joke_update完成.这里推荐使用宝塔,宝塔可以看到任务执行结果!
注意
若没有安装宝塔,可以自己写个shell脚本,存为shell文件
#!/bin/bash
Path=/www/wwwroot/xxx.com
cd $Path
php think joke_update然后在crontab,编写定时表达式,并执行上面的脚本内容即刻,操作上还是宝塔便捷.
阅读更多风口下的猪2021-12-09【thinkphp】
-
linux下执行tp内的方法如何实现---命令行
thinkphp项目经常会遇到定时任务、进程守护等需求,另外通过tp编写的一些方法不希望被外部URL调用,仅linux执行。
此时就会用到命令行,命令行的作用就是拿来linux通过php 指令进行执行。
它的好处是不像linux直接执行类->方法有时会出现第三方类库not found的情况。
第一步,创建一个自定义命令类文件
cd到项目文件根目录,运行指令
php think make:command Hello hello
会生成一个app\command\Hello命令行指令类,我们修改内容如下:
<?php
namespace app\command;
use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;
class Hello extends Command
{
protected function configure()
{
$this->setName('hello')
->addArgument('name', Argument::OPTIONAL, "your name")
->addOption('city', null, Option::VALUE_REQUIRED, 'city name')
->setDescription('Say Hello');
}
protected function execute(Input $input, Output $output)
{
$name = trim($input->getArgument('name'));
$name = $name ?: 'thinkphp';
if ($input->hasOption('city')) {
$city = PHP_EOL . 'From ' . $input->getOption('city');
} else {
$city = '';
}
$output->writeln("Hello," . $name . '!' . $city);
}
}这个文件定义了一个叫hello的命令,并设置了一个name参数和一个city选项。
第二步,配置config/console.php文件
<?php
return [
'commands' => [
'hello' => 'app\command\Hello',
]
];第三步,测试-命令帮助-命令行下运行
php think
输出
Think Console version 0.1
Usage:
command [options] [arguments]
Options:
-h, --help Display this help message
-V, --version Display this console version
-q, --quiet Do not output any message
--ansi Force ANSI output
--no-ansi Disable ANSI output
-n, --no-interaction Do not ask any interactive question
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
Available commands:
build Build Application Dirs
clear Clear runtime file
hello Say Hello
help Displays help for a command
list Lists commands
make
make:controller Create a new resource controller class
make:model Create a new model class
optimize
optimize:autoload Optimizes PSR0 and PSR4 packages to be loaded with classmaps too, good for production.
optimize:config Build config and common file cache.
optimize:schema Build database schema cache.第四步,运行hello命令
cd到项目根目录
php think hello
输出
Hello thinkphp!
添加命令参数
php think hello kancloud
输出
Hello kancloud!
添加city选项
php think hello kancloud --city shanghai
输出
Hello kancloud!
From shanghai
阅读更多风口下的猪2021-12-09【thinkphp】
-
运行composer 报错:PHP Deprecated: Directive 'track_errors' is deprecated in Unknown on line 0
PHP修改 php.ini track_errors=On 为 track_errors=Off 即可
阅读更多风口下的猪2021-12-09【PHP】
-
vi/vim命令模式和编辑模式
Linuxvi/vim命令模式和编辑模式是esc进行退出切换
"i" / “o” / "r" / "a" 指令在命令模式下,可进入编辑模式
esc退回命令模式
阅读更多风口下的猪2021-12-07【Linux】