首页
关于小站
朋友
时光之书
笔顺字帖
LayUI手册
元素周期表
Search
1
【PHP】PHPoffice/PHPSpreadsheet读取和写入Excel
2,296 阅读
2
【Layui】控制页面元素展示隐藏
2,113 阅读
3
【Git】No tracked branch configured for branch master or the branch doesn't exist.
2,027 阅读
4
【PHP】PHP实现JWT生成和验证
2,014 阅读
5
【composer】composer常用命令
1,820 阅读
默认分类
PHP
ThinkPHP
Laravel
面向对象
设计模式
算法
基础
网络安全
webman
swoole
Web
HTML
CSS
JavaScript
jQuery
Layui
VUE
uni-app
Database
MySQL
Redis
RabbitMQ
Nginx
Git
Linux
Soft Ware
Windows
网赚
Go
Docker
Elasticsearch
登录
Search
标签搜索
PHP
函数
方法
类
MySQL
ThinkPHP
JavaScript
OOP
Layui
Web
Server
Nginx
Docker
PHPSpreadsheet
PHPoffice
Array
设计模式
Git
排序算法
基础
小破孩
累计撰写
268
篇文章
累计收到
13
条评论
首页
栏目
默认分类
PHP
ThinkPHP
Laravel
面向对象
设计模式
算法
基础
网络安全
webman
swoole
Web
HTML
CSS
JavaScript
jQuery
Layui
VUE
uni-app
Database
MySQL
Redis
RabbitMQ
Nginx
Git
Linux
Soft Ware
Windows
网赚
Go
Docker
Elasticsearch
页面
关于小站
朋友
时光之书
笔顺字帖
LayUI手册
元素周期表
搜索到
7
篇与
的结果
2026-03-27
【PHP】快速掌握:SSE vs WebSocket 选型 + PHP实战SSE
一、1分钟核心选型:SSE vs WebSocket先记住一句话:单向推送用SSE,双向交互用WebSocket核心区别(开发必看)特性SSE (Server-Sent Events)WebSocket通信方向服务端 → 客户端 单向服务端 ↔ 客户端 全双工双向连接类型基于 HTTP 长连接独立协议(ws/wss)重连机制浏览器自动重连(无需写代码)必须手动实现重连数据格式纯文本(JSON/字符串)文本/二进制都支持开发成本极低(PHP原生就能写)高(需要服务端守护进程/扩展)适用场景通知、日志、实时榜单、进度条聊天、游戏、协同编辑、直播互动跨域支持(需配置header)支持什么时候必须选 SSE?只需要服务端主动推消息给前端不想折腾复杂的 WebSocket 服务需要断线自动重连技术栈是 PHP/Java/Python 这种传统 Web 语言场景:订单通知、系统公告、实时日志、数据监控、上传/导出进度条什么时候必须选 WebSocket?前端需要频繁主动发消息给服务端需要低延迟双向交互场景:在线聊天、游戏、多人协作、直播弹幕二、SSE 核心特性 & 实际开发场景SSE 核心知识点(必须掌握)Content-Type: text/event-stream:SSE 固定响应头长连接:连接保持打开,服务端持续输出数据自动重连:断开后浏览器默认3秒重连,无需前端处理消息格式:必须以 data: 内容\n\n 结尾(两个换行是协议规定)支持自定义事件、消息ID(用于断线续传)最常用的 SSE 实际业务场景实时消息通知(后台有新订单/新消息推前端)系统日志实时展示(部署日志、运行日志)数据实时刷新(监控面板、实时榜单)任务进度条(文件导出、批量处理、上传进度)公告/广播推送(全员推送系统消息)三、PHP 实现 SSE 完整代码示例环境要求PHP 5.4+ / 7.x / 8.x 均可关闭输出缓存(关键!)Nginx/Apache 默认配置即可示例1:基础版 SSE(持续推送时间)最简单、可直接运行的入门代码后端:sse_server.php<?php // 禁用缓存 header('Cache-Control: no-cache'); // SSE 核心响应头 header('Content-Type: text/event-stream'); header('Connection: keep-alive'); // 跨域配置(前端不同域名必须加) header('Access-Control-Allow-Origin: *'); // 无限循环推送消息 while (true) { $time = date('Y-m-d H:i:s'); // SSE 固定格式:data: 内容\n\n echo "data: 当前服务器时间:{$time}\n\n"; // 刷新缓冲区,把数据推送给前端 ob_flush(); flush(); // 每2秒推送一次 sleep(2); } ?>前端:index.html<!DOCTYPE html> <html> <head> <title>SSE 基础示例</title> </head> <body> <h3>实时消息:</h3> <div id="msg"></div> <script> // 创建 SSE 连接 const sse = new EventSource('sse_server.php'); // 接收消息 sse.onmessage = function (e) { document.getElementById('msg').innerHTML += e.data + '<br>'; }; // 错误监听(断网/服务挂了会自动重连) sse.onerror = function () { console.log('连接异常,浏览器自动重连中...'); }; </script> </body> </html>运行效果:前端每2秒自动收到服务端时间,断开网络重连后自动恢复。示例2:JSON 数据推送(开发真实场景)开发中90%都是推 JSON 数据(订单、通知、列表等)后端:sse_json.php<?php header('Cache-Control: no-cache'); header('Content-Type: text/event-stream'); header('Connection: keep-alive'); header('Access-Control-Allow-Origin: *'); // 模拟订单数据 $orders = [ ['id' => 1001, 'title' => '新订单', 'price' => 99.9], ['id' => 1002, 'title' => '支付成功', 'price' => 199.9] ]; while (true) { // 随机取一条订单 $order = $orders[array_rand($orders)]; $order['time'] = date('H:i:s'); // 推送 JSON 格式 echo "data: " . json_encode($order) . "\n\n"; ob_flush(); flush(); sleep(3); } ?>前端接收 JSONconst sse = new EventSource('sse_json.php'); sse.onmessage = function (e) { // 解析 JSON const data = JSON.parse(e.data); console.log('订单通知:', data); alert(`新订单:${data.title} - ${data.price}元`); };示例3:实战场景 —— 任务进度条推送最常用的业务:文件导出、批量处理、上传进度后端:sse_progress.php<?php header('Cache-Control: no-cache'); header('Content-Type: text/event-stream'); header('Connection: keep-alive'); // 模拟任务进度 0% → 100% $progress = 0; while ($progress <= 100) { // 推送进度 echo "data: {$progress}\n\n"; ob_flush(); flush(); $progress += 10; // 每次加10% sleep(1); } // 完成信号 echo "data: finish\n\n"; ob_flush(); flush(); ?>前端进度条<div style="width: 300px; background: #eee;"> <div id="bar" style="width: 0%; height: 20px; background: green;"></div> </div> <p id="text">0%</p> <script> const sse = new EventSource('sse_progress.php'); sse.onmessage = function(e) { const p = e.data; if (p === 'finish') { document.getElementById('text').innerText = '任务完成!'; sse.close(); // 关闭连接 return; } document.getElementById('bar').style.width = p + '%'; document.getElementById('text').innerText = p + '%'; }; </script>四、PHP + SSE 开发关键避坑点必须关闭输出缓存ob_flush() + flush() 必须同时写,否则消息推不出去无限循环不要占用过高资源必须加 sleep(1) 或更长间隔,避免CPU占满Nginx 环境配置如发现消息不推送,在 Nginx 配置加:proxy_buffering off;SSE 是单工通道前端不能通过 SSE 发消息给后端(要用AJAX/axios)五、最终总结(记住这3点就够)选型口诀:单向推送选SSE,双向交互选WebSocketSSE优势:基于HTTP、自动重连、PHP零成本实现、开发极快适用场景:通知、日志、实时数据、进度条、广播你现在可以直接复制上面的代码运行,马上就能体验 SSE 实时推送效果。
2026年03月27日
21 阅读
0 评论
0 点赞
2022-07-02
【composer】composer常用命令
全局配置(推荐) 所有项目都会使用该镜像地址:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/取消配置:composer config -g --unset repos.packagist若项目之前已通过其他源安装,则需要更新 composer.lock 文件,执行命令:composer update --lock1、composer list:获取帮助信息; 2、composer init:以交互方式填写composer.json文件信息; 3、composer install:从当前目录读取composer.json文件,处理依赖关系,并安装到vendor目录下; 4、composer update:获取依赖的最新版本,升级composer.lock文件; 5、composer require:添加新的依赖包到composer.json文件中并执行更新; composer remove twbs/bootstrap; 卸载依赖包 6、composer search:在当前项目中搜索依赖包; 7、composer show:列举所有可用的资源包; 8、composer validate:检测composer.json文件是否有效; 9、composer self-update:将composer工具更新到最新版本; composer self-update -r :回滚到安装的上一个版本 10、composer diagnose:执行诊断命令 11、composer clear:清除缓存 10、composer create-project:基于composer创建一个新的项目; 11、composer dump-autoload:在添加新的类和目录映射是更新autoloader 关于composer遇到的问题1.You may need to run composer update with the “–no-plugins” option.回滚到安装的上一个版本Failed to decode response: zlib_decode(): data error 更新失败提示:更换回原来的源2.composer config -g repo.packagist composer https://packagist.phpcomposer.com更新组件提示:升级自身版本composer self-update
2022年07月02日
1,820 阅读
0 评论
1 点赞
2022-06-23
【composer】composer 常用命令
1、composer安装 ------------ 官方地址:https://getcomposer.org/download/ 下载地址:https://getcomposer.org/Composer-Setup.exe 下载后直接安装即可。 2、检查是否安装完成 ---------- > composer --version > composer -V 注意这里要大写 > composer -vvv 命令查看更详细的信息,及帮助。 composer -V Composer version 2.0.9 2021-01-27 16:09:27 3、composer配置镜像 -------------- 因为composer是国外地址,访问起来特别慢,所以使用的时候很容易出现安装失败的情况,这里的解决办法就是使用镜像,使用composer config命令配置镜像地址即可。这里推荐使用阿里云composer镜像源,优点是快速稳定更新快 **3.1、全局配置(推荐)** 所有项目都会使用该镜像地址: composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 取消配置: composer config -g --unset repos.packagist **3.2、当前项目配置** 仅修改当前工程配置,仅当前工程可使用该镜像地址: composer config repo.packagist composer https://mirrors.aliyun.com/composer/ 取消配置: composer config --unset repos.packagist 4、composer使用 ------------ **4.1、install命令** > install命令可以用于项目初始化后,初次安装依赖,且会优先读取composer.lock中的版本号,以尽可能的保证协作开发中包版本的一致性。 composer install **4.2、require命令(不编辑composer.json的情况下安装库)** > 你可能会觉得每安装一个库都需要修改composer.json太麻烦,那么你可以直接使用require命令。 require > 命令,添加新的依赖包到composer.json文件中并执行更新。 composer require laravel/ui x.0.0 #下载指定版本,可指定 > 这个方法也可以用来快速地新开一个项目。init命令有–require选项,可以自动编写composer.json:(注意我们使用-n,这样就不用回答问题) $ composer init --require=foo/bar:1.0.0 -n $ cat composer.json { "require": { "foo/bar": "1.0.0" } } **4.3、update命令** > update命令无法在命令行中指定包版本号,需要手动修改composer.json文件 composer update 仅更新单个库 只想更新某个特定的库,不想更新它的所有依赖,很简单: composer update foo/bar **4.4、创建项目** > 初始化的时候,你试过create-project命令么? > 2.2.0 这会自动克隆仓库,并检出指定的版本。克隆库的时候用这个命令很方便,不需要搜寻原始的URI了。 composer create-project doctrine/orm path 2.2.0 **4.5、其他常用命令** composer list:获取帮助信息; composer init:以交互方式填写composer.json文件信息; composer search:在当前项目中搜索依赖包; composer show:列举所有可用的资源包; composer show -t:树状列举所有可用的资源包; composer show laravel/framework:这将向您显示安装的版本、它的许可证和依赖项以及它在本地安装的位置等信息。 composer outdated: 检测一下已安装的包,哪些有可以升级的; composer outdated -m:如果希望高亮显示小的升级版本,可以使用 outdated 命令,以 --minor-only 或者 -m 参数 ; composer why vlucas/phpdotenv:如果您想知道安装特定软件包的原因,可以使用 why 命令来确定哪些依赖项需要它; composer why-not laravel/framework 5.8 -t:有时,一个或多个已安装的软件包将阻止安装或更新软件包。 ; composer validate:检测composer.json文件是否有效; composer create-project:基于composer创建一个新的项目; composer dump-autoload:在添加新的类和目录映射是更新autoloader composer remove laravel/ui :删除依赖后还需要去vender文件夹里,手动删除 composer status -v:您可以使用 --verbose 或 -v 参数来查看本地修改的软件包和文件 composer licenses:用于查询许可的完整列表: 5、奇淫巧技 ------ 5.1、考虑缓存,dist包优先 > 最近一年以来的Composer会自动存档你下载的dist包。默认设置下,dist包用于加了tag的版本, > 例如"symfony/symfony":“v2.1.4”,或者是通配符或版本区间,“2.1.*“或”>=2.2,<2.3-dev”(如果你使用stable作为你的minimum-stability)。 > dist包也可以用于诸如dev-master之类的分支,Github允许你下载某个git引用的压缩包。 > 为了强制使用压缩包,而不是克隆源代码,你可以使用install和update的–prefer-dist选项 下面是一个例子(我使用了–profile选项来显示执行时间): $ composer init --require="twig/twig:1.*" -n --profile Memory usage: 3.94MB (peak: 4.08MB), time: 0s $ composer install --profile Loading composer repositories with package information Installing dependencies - Installing twig/twig (v1.12.2) Downloading: 100% Writing lock file Generating autoload files Memory usage: 10.13MB (peak: 12.65MB), time: 4.71s $ rm -rf vendor $ composer install --profile Loading composer repositories with package information Installing dependencies from lock file - Installing twig/twig (v1.12.2) Loading from cache Generating autoload files Memory usage: 4.96MB (peak: 5.57MB), time: 0.45s 这里,twig/twig:1.12.2的压缩包被保存在~/.composer/cache/files/twig/twig/1.12.2.0-v1.12.2.zip。重新安装包时直接使用。 **5.2、若要修改,源代码优先** > 当你需要修改库的时候,克隆源代码就比下载包方便了。你可以使用–prefer-source来强制选择克隆源代码。 composer update symfony/yaml --prefer-source 接下来你可以修改文件: composer status -v You have changes in the following dependencies: /path/to/app/vendor/symfony/yaml/Symfony/Component/Yaml: M Dumper.php 当你试图更新一个修改过的库的时候,Composer会提醒你,询问是否放弃修改: $ composer update Loading composer repositories with package information Updating dependencies - Updating symfony/symfony v2.2.0 (v2.2.0- => v2.2.0) The package has modified files: M Dumper.php Discard changes [y,n,v,s,?]? **5.3、为生产环境作准备** 最后提醒一下,在部署代码到生产环境的时候,别忘了优化一下自动加载: composer dump-autoload --optimize 安装包的时候可以同样使用–optimize-autoloader。不加这一选项,你可能会发现20%到25%的性能损失。 6、其它 ---- 参考文档:https://docs.phpcomposer.com/03-cli.html 参考链接:https://blog.csdn.net/jugtba/article/details/117379062
2022年06月23日
474 阅读
0 评论
0 点赞
2022-06-23
【正则】正则表达式规则
**常用元字符** | 代码 | 说明 | | -------- | -------------------------------- | | **.** | **匹配除换行符以外的任意字符** | | **\w** | **匹配字母或数字或下划线** | | **\s** | **匹配任意的空白符** | | **\d** | **匹配数字** | | **\b** | **匹配单词的开始或结束** | | **^** | **匹配字符串的开始** | | **$** | **匹配字符串的结束** | **常用限定符** | 代码/语法 | 说明 | | ----------- | ---------------------- | | ***** | **重复零次或更多次** | | **+** | **重复一次或更多次** | | **?** | **重复零次或一次** | | **{n}** | **重复n次** | | **{n,}** | **重复n次或更多次** | | **{n,m}** | **重复n到m次** | **常用反义词** | 代码/语法 | 说明 | | -------------- | ------------------------------------------------ | | **\W** | **匹配任意不是字母,数字,下划线,汉字的字符** | | **\S** | **匹配任意不是空白符的字符** | | **\D** | **匹配任意非数字的字符** | | **\B** | **匹配不是单词开头或结束的位置** | | **[^x]** | **匹配除了x以外的任意字符** | | **[^aeiou]** | **匹配除了aeiou这几个字母以外的任意字符** | **常用模式修正符** | 代码/语法 | 说明 | | ----------- | -------------------------------------------------------------------------- | | **i** | **表示在进行匹配的时候不区分大小写** | | **m** | **多行识别.即将字符串视为多行,不管是那行都能匹配** | | **s** | **将字符串视为单行,转义回车换行符作为普通字符** | | **g** | **表示全局匹配** | | **x** | **将模式中的空白忽略** | | **A** | **强制从目标字符串开头匹配** | | **D** | **强制尾部无任何内容.若使用$限制结尾字符,则不允许结尾有换行** | | **U** | **禁止贪婪匹配,只匹配最近的一个字符串(不重复匹配)** | | **e** | **配合PHP函数preg_replace()使用,可以把匹配来的字符串当作正则表达式执行** |
2022年06月23日
369 阅读
0 评论
0 点赞
2022-06-23
【API】获取根据QQ号获取头像
1.API接口:http://q1.qlogo.cn/g?b=qq&nk=QQ号码&s=6402.调用例子:http://q1.qlogo.cn/g?b=qq&nk=3584685883&s=640
2022年06月23日
421 阅读
0 评论
0 点赞
2022-06-23
【PHP】威尔逊得分(Wilson Score)排序算法
威尔逊得分(Wilson Score)排序算法:是对质量进行排序,评论中含有好评还有差评,综合考虑评论数与好评率,得分越高,质量越高。u表示正例数(好评),v表示负例数(差评),n表示实例总数(评论总数),p表示好评率,z是正态分布的分位数(参数),S表示最终的威尔逊得分。z一般取值2即可,即95%的置信度。正太分布的分位数表:算法性质:性质:得分S的范围是[0,1),效果:已经归一化,适合排序性质:当正例数u为0时,p为0,得分S为0;效果:没有好评,分数最低;性质:当负例数v为0时,p为1,退化为1/(1 + z^2 / n),得分S永远小于1;效果:分数具有永久可比性;性质:当p不变时,n越大,分子减少速度小于分母减少速度,得分S越多,反之亦然;效果:好评率p相同,实例总数n越多,得分S越多;性质:当n趋于无穷大时,退化为p,得分S由p决定;效果:当评论总数n越多时,好评率p带给得分S的提升越明显;性质:当分位数z越大时,总数n越重要,好评率p越不重要,反之亦然;效果:z越大,评论总数n越重要,区分度低;z越小,好评率p越重要;PHP实现: <?php echo wilsonScore_2(300, 13/300, 2); function wilsonScore_2($n, $p, $z){ $a_1 = ((1 / (2 * $n)) * ( pow($z,2))); $b_1 = $z * sqrt(($p * (1 - $p) / $n) + ( pow($z,2) / (4 * (pow($n,2))))); $c_1 = 1 + ((1 / $n) * ( pow($z,2))); $numerator = $p + $a_1 - $b_1; $res = $numerator/$c_1; return $res; }参考引用:https://www.fujieace.com/php/algorithm/score.html
2022年06月23日
506 阅读
0 评论
0 点赞
2022-06-21
【Linux】crontab定时任务
启用 crontab: crontab -e 查看 crontab -l 删除 crontab -r 进入Vi输入i进入编辑模式 编辑一个定时 00 */1 * * * curl http://we7.yoby123.cn/xxx.php 退出esc 输入**:wq** * 表示可能的值 , 表示取值 1,2,34,5 - 表示范围 1-5 / 表示频率 /10 每十分钟 按分钟
2022年06月21日
304 阅读
0 评论
0 点赞