php
文章平均质量分 75
北桥苏
专注后端实战技术分享,不限于PHP,Python,JavaScript, Java等语言,致力于给猿友们提供有价值,有能量的内容
展开
-
如何开发视频上传和播放功能时,既省钱又体验好?
现如今,大部分带内容的网站或应用都有视频区了,不说是大厂平台,就连个人开发者也相继在自己网站或小程序上迭代出视频板块。那既然有了视频模块,除个性化推荐,智能审核等这种费钱又耗时的功能外(个人开发者暂缓)。最基本的视频上传,视频播放自然必不可少吧。既然要强调省钱,我当前不会对接点播服务了。毕竟为了有一定的审核和推荐功能,我打算做人工审核。那剩下的关于播放有一定的体验度,还得要用一下OSS了(还是要花一点嘛)。因为上传有现成的分片上传,播放有HLS流,以下着重讲关于视频播放的优化,上传部分就说一下思路哦。原创 2023-06-05 11:35:14 · 983 阅读 · 0 评论 -
ElasticSearch中文分词和模糊查询
ElasticSearch是一个一个分布式的实时文档存储,每一个字段都可以被索引与搜索,并且能支持PB级别的结构化或者非结构化数据。早期我们应用的全局搜索是简单的SQL模糊查询,为了分担数据库压力所以用了ES,选择他的原因除了以上几点外,还有其提供的API方式简单,于任何对接的编程语言都适用。以下将以PHP的业务场景完善搜索功能。最开始的ES取代方法解决了搜索速度问题,后来新增的ik分词器,解决了搜索词条单一问题。单也正是中文分词原因,对每句话都是拆解成指定粒度的词。原创 2023-05-09 10:55:26 · 1215 阅读 · 1 评论 -
用 tensorflow.js 做了一个动漫分类的功能(一)
内容和资源的采集,反手就是某虫了。在网络上,经过近几年的营销渲染,可能首选是用 Python 做脚本。而这次是用 PHP 的 QueryList 来做采集,下面也就是采集的编码过程和踩坑解决方法,最后再对采集图片进行标注和训练。原创 2023-02-21 14:23:33 · 941 阅读 · 0 评论 -
关于对接芝麻 GO 的几点问题
芝麻 GO 是支付宝给商家提供的一款助力商家进行拉新,促进下单的营销工具。对于用户是先享权益,后承诺任务,只需要签约一份协议就能开始一个任务。原创 2022-12-06 17:23:28 · 1380 阅读 · 0 评论 -
如何不改动 GatewayWorker 依赖包下自定义协议
GatewayWorker 是 Workerman 的一个框架,对应用层开发者更友好。GatewayWorker 多了一个网关,也就是 Gateway,负责与客户端连接,消息转发等。而自定义的协议,也就是 gateway 面向客户端提供服务的协议原创 2022-10-29 13:45:36 · 408 阅读 · 0 评论 -
workerman 自定义的协议如何解决粘包拆包
TCP 是基于流的,且因为是传输层,在上层的应用通过 socket 套接字 (理解为接口) 通信时,他不知道传递过来的数据包开头结尾在哪。只是根据 TCP 的一套拥塞算法机型粘合或拆解的发送原创 2022-10-26 14:09:00 · 1171 阅读 · 0 评论 -
ThinkPHP5.1 交互式命令
框架中背景设置可以在后面带上 --ansi,并且通过 info, error, warning 等方法。而 Tp 的样式设置是进行了封装,可以在 output/driver/Console.php 的 write 方法查看,output/formatter/Style.php 的 apply 方法就是通过 ANSI 控制码实现对控制台颜色的设置。原创 2022-09-23 20:42:00 · 861 阅读 · 0 评论 -
SocketLog 的基本使用
最近在封装一个日志类时,想借鉴一下 TP 的实现方式,特别注意了一下 TP 日志的驱动。平时常用文件形式记录日志却忽略了还有一个 Socket 方式,只需要连接一下远程服务,程序在单程运行中所打的日志就会出现在浏览器上。但是前提浏览器安装了扩展,接下来就浅谈一下 SocketLog 的简单使用吧原创 2022-09-01 18:19:30 · 263 阅读 · 0 评论 -
如何在业务代码中使用 ThinkPHP5.1 封装的容器内反射方法
invokeClass用法:可以不传命名空间实例化 (通过反射实例化)$obj = Container::getInstance()->invokeClass(InvokerTest::class);var_dump($obj->invokerNews());die;-----------------------------------------------------------------------invokeMethod用法:传入带命名空间的类和对应方法,实例化后调用该方法$method原创 2022-07-05 19:47:27 · 216 阅读 · 0 评论 -
用扩展的方式在 PHP 中使用 Kafka
由于之前在 PHP 中使用 Kafka 是通过 composer 包的方式,由于nmred/kafka-php 很久没有维护,并且网上相关问题的文章也比较少。所以我这次换成 PHP 扩展RdKafka 继续使用,主要介绍扩展安装和这种方式的基本操作。...原创 2022-06-17 10:06:16 · 672 阅读 · 0 评论 -
关于 PHP 启动 MongoDb 找不到指定模块问题
由于以前处理跨语言交互是通过消息中间件,这次本地使用 MongoDB 却弄出了几个问题。首先是本地安装了扩展,启动时报找不到模块错误,再个时 PHP 进行的实例化使用时报 MongoClient 和一些函数不存在。...原创 2022-06-14 14:56:14 · 490 阅读 · 0 评论 -
浅析网站被挂马的代码
前言: 其实我网站中马应该可以追朔到去年的八月份,当时好像是在 xx 平台有用户给我留言说网站上的游戏进不去了 (五子棋多人联机)。于是我打开一看发现首页被静态化了,为了快速能访问就重新提交了入口文件也没继续理会。 直到后来,隔一断时间就又有人留言说打不开,我才开始排查起因了。进入项目代码里,我发现有些文件被修改了。另一方面呢,网站的收录也在不断变少,甚至搜索出来的词和描述都变了,有赌博的,也有体育,迷彩之类的,我猜测应该是中马了。 但是有一点想不通,这...原创 2022-05-18 15:35:56 · 337 阅读 · 0 评论 -
由Elasticsearch7.8评分脚本引起的一个索引迁移解决方法
前言: 为了实践一下ElasticSearch的自定义相关度评分,使用了Expression脚本。但是在执行过程中却报错了,最后通过修改索引映射,添加别名和同步旧索引数据得以解决,所以以下也围绕这几项问题展开。涉及知识:索引映射修改索引别名使用重建索引相关度评分问题:1. 评分脚本执行报错。 (以下都是用Kibana的图形化开发工具测试ES的API),当前索引是一个普通的产品数据,包括产品ID,产品名称,产品别名,产品品类,价格,排序编号。下面...原创 2022-01-06 10:40:15 · 766 阅读 · 0 评论 -
Logstash同步MySQL关联表到Elasticsearch的嵌套文档中
前言: 上一篇实践了通过Logstash同步MySQL的几张关联表到Elasticsearch中。为了实现同一种业务需求,嵌套文档在资源开销和查询速度上要优于父子文档(针对少量数据的情况)。所以以下就实践一下嵌套文档的基本使用和,以及Logstash如何同步一对多关系表到ElasticSearch的嵌套文档中。RESTful模拟: 以下以博客内容和博客评论为例,从映射创建,到增,删,改,查,聚合演示嵌套文档的使用方法,索引名 “blog_new”。1.创建映...原创 2021-12-22 10:01:30 · 2166 阅读 · 0 评论 -
Logstash同步MySQL一对多关联表到Elasticsearch父子文档
目前大部分业务开发中,ElasticSearch主要还是用来做搜索。而支撑搜索功能的数据结构比较单一,不会有数据嵌套或者多种关联之类的。尽管没有,但是有些小众需求可能还会有一对多查询的场景。为了实现和MySQL的Join类似的查询方式,以下以ES的父子文档方式储存,并详细演示Logstash如何将MySQL的多张有关联的表同步到ES的父子文档。原创 2021-12-20 20:00:58 · 1885 阅读 · 0 评论 -
Logstash如何批量同步MySQL多表到ElasticSearch
前言: 上一篇文章也简单的介绍了Logstash同步MySQL到ElasticSearch。批量同步虽说就配置文件不一样,但是实际操作的时候,也还会遇到不少的问题,比如reader不允许特殊字符(0x0)等等。下面也主要以几个问题来演示批量同步的过程,以及启动命令时如何排查报错的方法。批量同步配置:input { stdin { } jdbc { # mysql 数据库链接,shop为数据库名 jdbc_connec...原创 2021-12-08 09:48:44 · 1301 阅读 · 0 评论 -
如何通过Logstash将MySQL数据同步到ElasticSearch
前言: 最近又重新在看ElasticSearch的文档,发现那些DSL语法全都忘记了,所以准备写一个用ES做储存的demo小项目。其实是用DSL代替之前项目的SQL,但是数据以及一些字段还是需要,所以就需要将以前的MySQL数据导入到ElasticSearch中。 以前的做法是写一个脚本,通过创建索引,创建文档,将MySQL数据插入到ElasticSearch中,现在想通过Elastic中的成员之一——Logstash,来完成初步的导入工作。下面就从基础简单介绍该方式的导...原创 2021-12-06 09:11:23 · 1358 阅读 · 0 评论 -
ThinkPHP5.1如何在控制器中调用自定义命令
业务项目开发过程中,如果是基于ThinkPHP框架,大部分自定义命令往往都是用于常驻内容执行一些任务,比如消费队列消息等。但是有时候,就是既想单独手动执行命令,又想在某个业务节点下触发命令。比如当项目需要迁移或者部署其他环境,所以这时候可以就需要在一些钩子或控制器中调用自定义命令了原创 2021-12-01 13:10:01 · 991 阅读 · 0 评论 -
PHP实现的7组经纬度与距离的计算函数
一.根据当前位置计算四周的经纬度/** * 根据当前位置计算四周的经纬度 * @param $lng * @param $lat * @param float $distance * @return array */function returnSquarePoint($lng, $lat, $distance = 0.5){ $earthRadius = 6378138; $dlng = 2 * asin(sin($distance / (2 * $earthRad.原创 2021-11-01 19:56:12 · 654 阅读 · 0 评论 -
【物联网篇】PHP通过Modbus Tcp实时获取设备数据
前言: 最近接触了一个关于PLC工控的小项目,大概场景是,对方一个茶叶工厂。已经通过各种设备组成了自动化的工控系统。并且也让我的一个朋友做了茶园监控和茶园天气环境等的web页面展示,但是还没有工控设备的数据显示。需求: 工控设备已经连接到了一台作为上机位的电脑上,所以要获取设备数据。需要在同一局域网上,通过modbus tcp请求对方已经开放的端口。拿到数据储存到数据库,最后web界面只用按时间顺序获取数据库的数据。 因为访问对方电脑需要他们提供...原创 2021-05-30 14:21:49 · 3714 阅读 · 5 评论 -
关于使用elascticsearch的两个小技巧
前言: 之前也有讲到过es的基本使用,主要是通过PHP代码对es索引,文档等的增删改以及搜索优化的解决方案。而现在为了进一步满足搜索的全新功能,所以就需要一个中文分词器,而为了方面查看或管理es文档,可以使用图形化面板。所以接下来主要介绍es中文分词器的安装和es的web面板。elasticsearch-analysis-ik分词: es自带分词,但是没有中文分词,在一众elasticsearch的中文分词插件中,我推荐使用analysis-ik。ik可以对中文语义...原创 2021-02-09 17:24:35 · 375 阅读 · 0 评论 -
解决easyswoole的swServer_start_check: onTask event callback must be set at报错
最近运行了一下之前用easyswoole写的一个爬虫的demo,却发现启动直接报错。swServer_start_check: onTask event callback must be set at,大致的意思是没有设置onTask事件。因为easyswoole是个框架,遇到这种问题真不好排查。 没有其他的办法,就只能找文档。翻到异步任务那里,刚好看到了一个版本强调。上面写道easyswoole3.3.0以上版本需要修改配置项,巴拉巴拉,如下图所示。 ...原创 2021-02-03 19:20:35 · 677 阅读 · 0 评论 -
解决使用宝塔安装的swoole扩展,运行项目出现的3个常见问题
前言:常常做东西的时候最不愿搭环境了,所以如果只是用于学习或者一些小项目,我都会选择在服务器上使用宝塔面板。自然swoole也是直接用BT的方式安装,但是呢,最近我写的一个双人对战的五子棋小游戏,在我本机虚拟机上能正常运行。放到之前已经装好swoole的服务器上时(宝塔面板安装的),却接连报错。问题一 :那个五子棋联机小游戏的后台使用的是easyswoole,所以我测试性的启动一下。phpeasyswoole start,却出现PHPWarning: Module '...原创 2021-01-19 14:15:14 · 4509 阅读 · 1 评论 -
浅谈一下ThinkPHP5.1实现事务嵌套的特性
前言: 在我们平时做的一个项目中,线上环境突然发现数据库被锁住。导致很多有关数据插入和修改的接口全都瘫痪,项目基于ThinkPHP5.1。报错的时候,我们发现了一条sql错误日志,如下。 根据错误信息提示,是说有一个事务回滚时没有找到savepoint 的暂存点。所以问题应该是事务嵌套导致的,目前ThinkPHP5封装的数据层方法是有对事务嵌套进行处理。而MYSQL到底支不支持事务嵌套呢?伪代码如下。 执行完后出现了操作1的数据真正写入,只有操作2的数据回...原创 2021-01-18 16:43:16 · 903 阅读 · 0 评论 -
websocket测试工具的环境搭建与使用
前言: 因为要测试自己的websocket项目,所以我决定使用jmeter进行测试联调。尽管也有在线ws调测的网站,但是jemter相对这些,他可以流程化测试,并且脚本自动运行,性能分析等等。软件:1.jmeter最新包。2.jdk包。3.JMeterWebSocketSamplers。 安装jmeter前,可以先安装一下jdk,但是当我从上面链接下载最新版本时,却发现在安装过程中一直报错误1500。提示我本地 “正在进行另一Java安装”...原创 2021-01-12 11:33:34 · 1176 阅读 · 0 评论 -
白鹭游戏引擎网络棋牌搭建步骤
前言:项目是一个游客登录型的棋牌联网游戏,前端是白鹭引擎,后端PHP开发。分为登录和获取基本信息的Http层和websocket通信的游戏层。后台需要有一个分布式网关服务器(php游戏网关)。以下为了搭建更快捷,使用宝塔进行操作,前提已经通过宝塔安装完毕了LNMP。资源:源码地址: https://gitee.com/scgywx/threecard作者说明: https://my.oschina.net/scgywx/blog/757726Fooking地址:...原创 2020-12-18 16:01:48 · 3169 阅读 · 4 评论 -
PhpOffice实现Excel表格导入的解耦方法
前言: 在业务中开发中,表格的导入导出功能很常见。但是这里主要是使用PhpOffice类库介绍实现导入表格数据的功能。冲突: 大部分的导入功能,就是通过点击按钮上传一张表格,然后后台读取表格数据根据业务整理后直接插入到数据库,最后再返回给前端。但是如果表格数据庞大,业务逻辑复杂的时候,就会导致导入那一块很臃肿不好维护。解决方法: 处理方式是把导入与业务数据插入分离,所以在二者之间添加一个队列就可以了。导入只负责将表格数据存入队...原创 2020-12-18 14:30:29 · 409 阅读 · 0 评论 -
代码实现RabbitMQ死信队列的创建
前言: 之前有写过死信队列的使用场景以及通过管控台创建死信。这次就通过代码实现死信队列的创建,同时也分享一下RabbitMQ封装的类。准备:1. 先准备一个死信队列(最后用来消费)的参数配置,包括虚拟机,交换机,队列,有效时间等,如下。2. 按照上面在RabbitMQ中创建虚拟机和交换机,死信队列。并让交换机与死信队列绑定,操作方法前面有介绍。3. 这里就直接提供rabbitMQ操作的基本封装的类,包括一个基类,生产者类,消费者类。3.1. 基类。<?...原创 2020-10-25 14:18:56 · 836 阅读 · 1 评论 -
以PHP门面模式实现简单的邮件发送
前言:门面模式属于设计模式中三大分类之一的结构类型,也叫外观模式。其作用对客户端低耦合底层功能的封装,客户端不用知道子系统间的调用。举例:门面模式就相当于电脑主机,用户要打开某个应用程序,只需要知道两步。打开开机按钮,电脑开机后再打开应用。开机按钮就相当于一个门面,里面的开机需要调用不同的模块,比如硬件自检,选择启动盘,加载引导,加载内核,OS初始化,启动指定级任务等,以下也通过发邮件的例子描述门面一模式。涉及:1. call_user_func...原创 2020-08-31 19:28:10 · 1099 阅读 · 0 评论 -
搜索接口优化方案——幂集分词表
前言:在业务开发中,有一些面向C端的搜索接口。比如根据商品名搜索,之前也提过通过ES解决,但这次主要以一种较为简单快捷的方式优化搜索速度。思路:1. 通过程序将所有商品名进行分词并幂集组合。2. 将所有商品名称幂集存入一张单独的表中。3. 每个分词对应一个商品ID。4. 搜索关键词对幂集表的分词模糊查询并取出商品ID。5. 对应的商品ID就是搜索出来的商品。编码:1. 数组元素的幂集函数。if (!function_exists('powerSe...原创 2020-08-28 15:31:41 · 159 阅读 · 0 评论 -
宝塔中极速安装的PHP如何使用AMQP连接RabbitMQ
前言:有些人为了让项目快速上线,服务器往往安装宝塔面板,然后再极速安装LNMP。尽管环境搭建的时间省了,但是宝塔上PHP中扩展包没有提供AMQP。这时候只是为了使用消息队列而对PHP大动干戈,不如使用一个PHP AMQP的库,即用即装,不对环境造成影响。简介:php-amqplib客户端库,通过composer安装,不需要在PHP中安装扩展,以下为两种不同的安装方式。1. 项目中新建composer.json,添加如下代码,然后composer install{ "r...原创 2020-07-31 19:18:14 · 1103 阅读 · 0 评论 -
phpstorm开发项目中5种常用的使用方法
前言: 有时因为各种原因重装了系统,工具有时也重装,但是又没有把软件的设置导出来。最开始的工具配置过了段时间给遗忘了,比如平时顺手的关闭窗口快捷键,composer,git等的设置。方法总结:1. 修改快捷方式点击”File”->”Settings”->”keyMap”就可以看到那些快键键的各种分类,比如我常喜欢用”ctrl+w”关闭正在打开的窗口,所以就选择”windows”分类下的Editor Tabs的”close”,邮件remove掉原来的,然后add手动添...原创 2020-07-07 14:47:37 · 778 阅读 · 0 评论 -
PHP高并发高负载下的3种实战场景解决方法
前言: 在实际开发项目中,产品一旦推广开来,总能遇到一些小问题。比如某个接口突然就请求崩掉了,某个提交接口明明做了限制为什么就多出了好多重复的记录。还有是某个记录超过限制进行修改了,以下就以这几个小问题总结一下平时采取的解决方法。场景:1. 缓存失效场景,就比如某个接口做了数据缓存,缓存过期导致突然某个时刻大量请求直接读数据库。解决方法设置redis缓存回调事件,订阅失效频道。所以这个也可以用来处理某些业务场景到期处理方式。2. 接口幂等性场景,就比如注册接口,通过手机号查询是否...原创 2020-06-24 11:03:36 · 1477 阅读 · 0 评论 -
OSS云文件列举分页功能的解决方法
前言: 目前项目开发中上传功能很多都是使用云存储,其好处太多这里就不列举了。但是在上传成功后,有些功能场景下需要对存储桶内的文件进行管理。自然把历史的文件列表展示出来就很有必要了。然后有列表就有分页,云存储又不像本地存储直接读文件夹就可以,所以我想了两种方法来解决。方法:1. 将上传的文件返回的地址都存到数据库中,取列表就分页的读表返回。2. 使用OSS文档的文件列举方法,好处是不用建表等等,所以下面以这种方式演示。说明: Oss的SDK中提供一个...原创 2020-06-04 09:52:31 · 1129 阅读 · 0 评论 -
PHP快速使用RabbitMQ实现项目中部分业务的解耦
前言: 上次介绍了RabbitMQ在windows下的安装,以及PHP的AMQP扩展的添加。这里将本地测试的代码放到了服务,所以也就是在Linux上再装一遍。但是这里就省掉直接进入使用。主要是RabbitMQ安装完毕后,管控台的使用以及在PHP中如何调用其接口实现消息的生产和消费。步骤:1.Linux安装完rabbitMQ后,没有配置文件,需要去github(https://github.com/rabbitmq/rabbitmq-server/tree/master/do...原创 2020-05-22 15:13:38 · 574 阅读 · 0 评论 -
如何搭建Rtmp服务结合uni-app开发直播APP
前言: 由于自己有一个IM类的应用,为了完善它所以决定也加上直播和短视频功能。做直播目前有两种方法,一是直接对接第三方的直播服务产品,二是自己搭服务再开发。所以这里也从这两个方法推荐简单的实现方式,阿里云和腾讯云之类的大厂产品就不安利了。(公众号回复“直播”获取源码)选型:1. 第三方,PHP+Uni-App+LiveQing2. 自己开发,PHP+Uni-app+Nginx-rtmp-module实现流程:1. 客户端采集视频流。(开摄像头,录屏等)2. 客户端...原创 2020-05-20 09:34:16 · 4506 阅读 · 2 评论 -
搜索接口优化方案——elasticsearch分布式搜索引擎的基本使用
前言: 在开发项目中一般都会有搜索功能。如果是面向C端的搜索功能,往往都特别考验性能。比如普通的商城系统中的商品搜索或者一些资源的站内搜索。 可能以前的做法就是对商品表做一个按名称或商品描述做模糊查询。更好一点的是对搜索关键字进行分词,并且专门建一个搜索词库表。不过前期需要对搜索词进行拆解然后幂集组合并于商品ID关联,搜索字与词库表的字以完全匹配的方式查询并找到商品ID。 虽然建词库表也是不错的解决方法,但是还要拆解存库建索引,相对比较麻烦。所以也是在网上查询了解到了elast...原创 2020-05-17 13:46:30 · 513 阅读 · 0 评论 -
消息队列篇——windows本地搭建RabbitMQ Server
前言:最近的PHP项目中有使用AMQP,解耦一些业务性的功能模块。因为工作使用的是线上Linux搭建,为了方便测试所以我决定本地搭建一个MQ服务。RabbitMQ简介: MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。RabbitMQ是一个在AMQP基础上完成的,是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读...原创 2020-05-12 23:25:37 · 436 阅读 · 0 评论 -
微信小程序自定义券票二维码文件流上传到OSS解决方法
前言 目前项目中有这样一下需求,通过传入的不同的参数生成不同渠道的微信小程序二维码,从而统计各大平台从小程序引流的数据。而旧系统是先通过接口生成二维码后先是保存至当前服务器上后,拿到图片路径和文件信息然后再使用OSS的SDK上传到存储桶。可能是因为生成的二维码是文件流,所以以前的人是通过file_put_contents函数做的保存再使用SDK的文件上传接口。思路...原创 2020-04-26 23:13:26 · 408 阅读 · 0 评论 -
MySQL5.5+配置主从同步并结合ThinkPHP5设置分布式数据库
前言:本文章是在同处局域网内的两台windows电脑,且MySQL是5.5以上版本下进行的一主多从同步配置,并且使用的是集成环境工具PHPStudy为例。最后就是ThinkPHP5的分布式的连接,读写分离配置,以后会用代码简单测试读写分离的效果。数据库部分:一. 主库(master)设置。方法/步骤1:phpstudy至少开启MySQL服务,并找到配置文件mysql.ini并...原创 2020-04-12 20:13:42 · 674 阅读 · 1 评论