PHP
文章平均质量分 50
php相关知识
西直门三太子
知是行之始,行是知之成
展开
-
php 实现websocket服务
之前使用的都是封装好的websocket,现在使用php提供的相关函数实现一个websocket服务。原创 2022-09-18 17:00:34 · 3375 阅读 · 3 评论 -
Redis 分布式锁
假设A线程任务执行完,判断锁确实是A的锁。准备删除前锁刚好过期,这时B线程上了锁,这时候A线程的删锁操作直接就把B刚上的锁kill了。这就是不使用lua导致判断和删除之间插入了其它操作。通过 expire 设置超时解锁,防止意外退出导致的死锁。让后面的任务无法得到锁,阻塞后续任务执行。这个脚本判断锁的值是否和当前线程的unqiueId相等,相等就调用del删除锁。setnx是不存在才会设置成功。具备判断锁是否存在和上锁的功能。不使用lua,可能造成删除掉其它线程的锁。需要使用lua脚本,因为要保证原子性。.原创 2022-08-15 22:36:48 · 161 阅读 · 0 评论 -
使用Docker搭建Swoole环境
使用docker搭建swoole环境原创 2022-06-09 17:21:59 · 683 阅读 · 0 评论 -
Thinkphp6的日志
文章目录日志级别设置日志记录级别单一日志独立日志日志的写入时机日志通道日志级别debug, info, notice, warning, error, critical, alert, emergency其中有一个特别的级别:sql,专门用来记录sql语句的设置日志记录级别对于程序比较重要的业务模块可以进行埋点(进行日志记录)可以通过设置日志记录级别来开启和关闭记录有助于排除错误(比每次出现错误去代码里增加记录日志好多了) # 修改 config/log.php原创 2022-05-02 16:04:23 · 5455 阅读 · 0 评论 -
php发送邮件
文章目录fsockopen发送邮件fsockopen这里使用fsockopen和邮件服务器建立连接fsockopen用于打开网络的Socket链接示例 # fsockopen ($hostname, $port = null, &$errno = null, &$errstr = null, $timeout = null) # $hostname 连接地址 # $port 连接端口 # $errno 错误行原创 2022-05-01 22:40:54 · 305 阅读 · 0 评论 -
Thinkphp的Session
文章目录前言session开启设置session属性判断session属性是否存在删除session属性获取session属性session配置前言thinkphp的session也不是php的内置session也是改造过的session开启在中间件中开启这里我在admin应用的中间件中开启# app/admin/middleware.phpreturn [ \think\middleware\SessionInit::class];设置session属性原创 2022-04-30 14:47:59 · 1185 阅读 · 0 评论 -
为什么推荐优先使用模型(二)
文章目录提供了时间戳的自动写入提供了搜索器提供了模型关联模型的select返回的是think\model\Collection 对象提供了类型转换提供了时间戳的自动写入使用模型可以自动填充时间戳如果不使用model,改用Db类需要手动填写提供了搜索器将常用查询条件封装到模型中去减少查询代码的重复假设订单(order)可以通过状态(status),订单号(order_numer),总价进行查询(total)创建搜索器 # Order模型中 添加搜索器 # 命名规则原创 2022-04-29 22:08:09 · 256 阅读 · 0 评论 -
为什么推荐优先使用模型(一)
文章目录为什么推荐优先使用模型(一)模型提供一些事件提供修改器和获取器提供了假删除提供了查询作用域为什么推荐优先使用模型(一)模型提供一些事件如果我给所有表都添加了创建者字段(creator)创建时应该写入该字段使用模型类添加数据 # user 模型中重写onBeforeInsert # 在插入前添加creator 属性 public static function onBeforeInsert(Model $model) { $model-&g原创 2022-04-29 16:49:39 · 95 阅读 · 0 评论 -
php二维数组排序
文章目录测试数据通过usort排序通过array_multisort排序测试数据 $arr = [ 'a' => ['a' => 11, 'b' => 12, 'c' => 13], 'b' => ['a' => 10, 'b' => 13, 'c' => 12], 'c' => ['a' => 12, 'b' => 11, 'c' => 10],原创 2022-04-27 15:33:35 · 6717 阅读 · 0 评论 -
Thinkphp快速入门(五)
文章目录数据库字段缓存模型查询where条件执行查询限制要查询的字段模型关联一对一关联关系定义关联数据获取hasWhere 以关联限制查询一对多关联关联定义关联数据获取hasWher | has 以关联限制查询数据库字段缓存由于tp进行数据查询,新增,修改,删除等都会进行(SHOW FULL COLUMNS FROM )获取数据表字段及其数据类型对应关系每次都进行查询有点浪费资源提供两种解决方式# 第一种# tp config/database.php 中提供了开启数据库字段缓存# 将 f原创 2022-04-27 14:48:58 · 1322 阅读 · 0 评论 -
Thinkphp快速入门(四)
文章目录操作数据库配置连接信息模型创建模型相关属性说明模型表名模型主键设置模型自动写入时间软删除数据插入通过create 插入通过save方法保存数据更新通过save更新通过update更新通过静态update更新通过saveAll更新数据删除通过先查找到model对象后删除通过静态destroy删除通过where + delete 删除模型使用软删除的场景下进行物理删除操作数据库配置连接信息config/database.phpreturn [ // 默认使用的数据库连接配置原创 2022-04-24 18:17:32 · 902 阅读 · 0 评论 -
Thinkphp快速入门(三)
文章目录中间件中间件创建全局中间件应用中间件路由中间件控制器中间件视图引入视图组件渲染视图模版传参viwe 辅助函数中间件在执行主要逻辑之前进行某些操作或之后进行某些操作常用来登录验证,csrf验证等中间件创建 # 中间件可以通过 php think make:middleware <middlewareName> 创建 # 不过这是创建在 app/middleware 下的 php think make:middleware stop原创 2022-04-20 15:35:28 · 374 阅读 · 0 评论 -
Thinkphp快速入门(二)
文章目录前言请求Request请求对象获取请求参数Request其他常用方法响应前言这节讲请求和响应请求Request请求对象现在框架都有依赖注入在方法中声明参数类型即可如果继承了app/BaseController.php可以使用$this->request(这个在构造函数中注入的)namespace app\admin\controller\base;use app\BaseController;use app\Request;class Home extend原创 2022-04-19 18:47:05 · 418 阅读 · 0 评论 -
Thinkphp快速入门(一)
前言使用的是tp6 版本安装# 通过composer安装,目录名thinkphp# 我在 /Users/xieruixiang/php 目录下执行composer create-project topthink/think thinkphp# 得到 /Users/xieruixiang/php/thinkphp省略index.php# 这里我使用nginx + php-fpm# 省略index.php,配置nginxif (!-e $request_filename) { rew原创 2022-04-18 18:04:12 · 1355 阅读 · 0 评论 -
php + redis 实现延迟队列
文章目录实现原理代码消费者生产者执行结果实现原理# redis 的zset是有序集合,可以通过分数进行排序# 将分数设置成任务执行时间# 通过 ZRANGEBYSCORE key min max 获取任务时间小于当前时间的任务# 通过 ZREMRANGEBYRANK key 0 0 来移除 执行完的任务# ZRANGEBYSCORE,ZREMRANGEBYRANK 都是按照分数从小到大排代码redisMangerclass RedisManger{ private $red原创 2022-04-16 23:31:36 · 1278 阅读 · 0 评论 -
Linux 下php增加redis扩展
文章目录下载源文件编译php.ini 开启 redis最后下载源文件# 下载地址:https://pecl.php.net/package/redis# 我在download下载并解压cd /downloadwget https://pecl.php.net/get/redis-5.3.6.tgztar -zxvf redis-5.3.6.tgz编译cd /download/redis-5.3.6# 看看有没有configure# 没有的话使用phpize生成(在安装的php/bin目原创 2022-04-15 14:39:13 · 862 阅读 · 0 评论 -
无限级分类处理成树形结构
文章目录前言待处理数据处理前言看到组员处理无限级分类还有使用递归处理的不是说递归不行,只是觉得有点low待处理数据[ { "id": 1, "name": "向彬", "pid": 0 }, { "id": 2, "name": "唐春梅", "pid": 0 }, { "id": 3, "name": "卫秀芳", "pid": 0 }, { "id": 4, "name":原创 2022-04-14 21:11:39 · 754 阅读 · 0 评论 -
Composer update | install Undefined index: name
文章目录解决出问题的原因解决以Laravel6.x为例修改 vendor/laravel/framework/src/Illuminate/Foundation/PackageManifest.php中的build方法 /** * Build the manifest and write it to disk. * * @return void */ public function build() { $packages原创 2022-03-30 10:20:03 · 190 阅读 · 0 评论 -
canal在php下的简单使用
文章目录canal简介安装配置启动安装php与canal连接的组件简单示例结果展示canal简介由阿里巴巴开源 github地址:https://github.com/alibaba/canal伪装成mysql从服务器,解析mysql的binlog文件我主要是用来做redis缓存的更新&以及商品订阅降价的通知安装# 这玩意依赖java# java8以后版本的jdk根据 stdout.log 中的报错对 startup.sh 中的执行参数进行更改# 我的下载canal位置为 /dow原创 2022-03-10 15:31:46 · 1838 阅读 · 2 评论 -
swoole http server 的request中有哪些东西呢?
$http = new Swoole\Http\Server('0.0.0.0', 9501);$http->on('Request', function ($request, $response) use ($app_path, $http) { /** * swoole http 服务的 request 中 有那些东西 * fd 客户端口唯一标识 * header 请求头信息 * server 对应 php $_SERVER *.原创 2021-07-28 11:28:56 · 384 阅读 · 0 评论 -
php array_merge() 和 array_replace() 的区别
/** * Symfony\Component\HttpFoundation\ParameterBag * add 使用 了 array_replace() 方法 * Adds parameters. */ public function add(array $parameters = []) { $this->parameters = array_replace($this->parameters, $param...原创 2020-12-03 15:24:51 · 311 阅读 · 0 评论 -
PHP IteratorAggregate,Countable接口
namespace Symfony\Component\HttpFoundation;/** * ParameterBag is a container for key/value pairs. * ParameterBag 继承实现这两个接口 * @author Fabien Potencier <fabien@symfony.com> */class ParameterBag implements \IteratorAggregate, \Countable{/**原创 2020-12-03 14:59:55 · 168 阅读 · 0 评论