Download the PHP package erikwang2013/poster-php without Composer
On this page you can find all versions of the php package erikwang2013/poster-php. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download erikwang2013/poster-php
More information about erikwang2013/poster-php
Files in erikwang2013/poster-php
Package poster-php
Short Description PHP captcha (click/rotate/slider) and poster generation — framework-agnostic with adapters for Laravel, ThinkPHP, Webman, Hyperf, Yii2, Yii3.
License MIT
Homepage https://package.erik.xyz/poster/
Informations about the package poster-php
poster-php
PHP 图片验证码与海报生成工具包 —— 框架无关核心 + Laravel / ThinkPHP / Webman / Hyperf / Yii2 / Yii3 适配。
全部语言
中文 | Bahasa Indonesia
项目简介
poster-php 是一个 PHP 图像工具包,只做两件事,并且做到够用:
| 能力 | 说明 |
|---|---|
| 验证码 | 点击 / 旋转 / 滑块三种人机校验 + 随机切换,纯 PHP 生成图片与答案,不依赖第三方服务 |
| 海报生成 | 链式 Builder API,14 种元素覆盖文字、图片、二维码、表格、图表、日历等排版需求 |
| 框架无关 | 核心只依赖 PHP ≥ 8.0 + GD,可作为普通 Composer 包使用,无需框架 |
| 开箱即用 | 3 个全局辅助函数 + 6 种框架适配(Laravel / ThinkPHP / Webman / Hyperf / Yii2 / Yii3) |
| 可替换 | 图像驱动(GD / ImageMagick)、存储后端(File / Session / Redis)均为接口实现,按需替换 |
项目宠物 Posty —— 一只由海报本体、二维码卡片与滑块拼图组成的吉祥物,正好对应这个包的两大能力:出图与验证。它随包分发(
assets/pet.svg/assets/pet.png),可用->addPet()画进海报,也可配置为缺图占位图。
项目结构
架构与设计
系统架构设计
分层依赖:上层只调用下层接口,替换驱动或存储实现时业务代码零改动。
功能设计
两大模块的功能拆解:验证码的四种交互与安全特性、海报的 14 种元素与模板系统。
生命周期
一次验证码校验(创建 → 生成 → 存储 → 下发 → 校验 → 通过 / 失败 / 过期)与一张海报生成(初始化 → 背景 → 元素 → 模板 → 渲染 → 输出)的完整链路。
功能
验证码(三种方式 + 随机切换)
| 类型 | 说明 |
|---|---|
点击验证 click |
用户按顺序点击图片上的目标文字 |
旋转验证 rotate |
用户拖动滑块将图片旋转回正确角度 |
滑块验证 slider |
用户拖动拼图块到缺口位置 |
随机切换 random |
随机选取以上三种验证码之一 |
海报生成
链式 Builder API,支持 14 种元素:
| 元素 | 方法 | 说明 |
|---|---|---|
| 文字 | addText() |
自动换行,对齐,多行 |
| 图片 | addImage() |
缩放裁剪,圆角,阴影 |
| 头像 | addAvatar() |
圆形裁剪,边框 |
| 二维码 | addQrcode() |
纯 PHP 生成,中心 Logo,底部文案 |
| 形状 | addShape() |
矩形/圆形/圆角,填充/描边 |
| 分割线 | addLine() |
颜色,宽度 |
| 水印 | addWatermark() |
平铺文字,角度,间距 |
| 表格 | addTable() |
表头,斑马纹,列宽 |
| 图表 | addChart() |
柱状图 / 折线图 / 饼图 |
| 日历 | addCalendar() |
月历,高亮日期,标注 |
| 艺术字体 | addArtisticText() |
描边 / 阴影 / 渐变 / 霓虹 |
| Emoji | addEmoji() |
彩色 emoji 表情渲染 |
| 字体图标 | addIcon() |
FontAwesome 图标渲染 |
| 颜文字 | addEmoticon() |
日式颜文字 / 自定义表情 |
安装
系统要求:PHP >= 8.0,GD 扩展。
可选扩展:
ext-imagick:ImageMagick 图像驱动(性能更好,功能更强)ext-redis:Redis 验证码存储(分布式部署)
不用 Composer(原生 PHP)
把 poster-php/ 整个目录放进项目,直接引入 native.php 即可:它会注册 PSR-4 自动加载并载入全局函数,不需要 Composer、也不需要任何框架。
native.php 可重复引入,也能与 Composer 或项目自带的自动加载器共存(重复安装时优先用 vendor/autoload.php 即可)。
使用说明
一、验证码
1. 点击验证码 (ClickCaptcha)
用户需要按顺序点击图片上的目标文字(如"树""鸟""花"),验证人类操作。
setTargetType('icon') 可把目标文字换成程序化生成的矢量图形(11 种,用 GD 图元绘制,无需图片素材):
extra['texts'] 每项会多一个 thumb(该图形的 base64 小图),供前端展示点击提示;校验仍是坐标比对。
2. 旋转验证码 (RotateCaptcha)
系统随机旋转图片 30°~330°,用户拖动滑块将图片旋转回正。
3. 滑块验证码 (SliderCaptcha)
系统从背景切出拼图块并偏移,用户拖动拼图到缺口位置。
拼图形状(shape)支持两种,默认 square:
shape |
效果 |
|---|---|
square(默认) |
矩形缺口,与历史版本一致 |
jigsaw |
凹凸拼图:四边各自随机半圆凸/凹(16 种组合),缺口与拼图块共用同一轮廓 |
4. 随机切换 (RandomCaptcha)
系统随机从 click / rotate / slider 中选取一种验证码,增加破解难度。
验证安全特性
| 特性 | 说明 |
|---|---|
| 一次性 | 验证成功/超过最大次数后 key 删除 |
| 防暴力 | 默认最多验证 3 次(可配置) |
| 有效期 | 默认 300 秒(可配置) |
| 随机性 | 每次生成的背景颜色、噪声、目标位置均随机;点击目标逐目标随机色相与旋转角度 |
| 会话级限流 | 跨 key 生效的窗口限流(默认 60 秒内 30 次),堵住「每次换新 key 再猜一次」的盲猜 |
| 行为轨迹 | 可选(默认关闭):校验拖动轨迹的点数/耗时/线性度,脚本直接 POST 答案会被拒 |
| 背景美化 | 程序化渐变背景,三种风格(简约/活泼/自然)随机切换,支持配置默认背景图目录 |
| 画布下限 | 背景过小时直接报错而不是退化(点击验证码最小 120×120,滑块最小需容纳 4×2 拼图块) |
行为轨迹校验(可选)
默认关闭(避免误伤触屏与无障碍设备)。开启后 slider / rotate 需要前端提交拖动轨迹,服务端校验点数、耗时与轨迹线性度:
背景图片配置
验证码背景支持三级优先级:
- 单张图片 — 通过
setBackground('/path/to/bg.jpg')指定 - 图片目录 — 配置
captcha.background_dir指向图片目录,默认指向assets/backgrounds/(内置 6 张精美渐变背景图) - 程序化生成 — 设
background_dir为null时启用,三种风格随机切换
默认背景图:assets/backgrounds/ 自带 6 张 400×250 PNG 渐变背景,风格包括蓝紫、日落、清新绿、暗黑、粉彩、海洋蓝。
三种程序化风格:
| 风格 | 说明 |
|---|---|
minimal 简约 |
柔和渐变 + 大尺寸低透明度圆形 + 几何线条 + 稀疏细点 |
vibrant 活泼 |
明亮渐变 + 多种大小彩色圆形 + 中等密度噪点 |
natural 自然 |
暖色渐变 + 不规则色块模拟纸张纹理 + 细微密点 |
二、海报生成
基础用法
文字 addText()
图片 addImage()
头像 addAvatar()
二维码 addQrcode()
容量超出该版本上限时(例如 H 级约 1273 字节以上)会抛 InvalidArgumentException,不再静默产出扫不出来的码。
形状 addShape()
分割线 addLine()
水印 addWatermark()
表格 addTable()
图表 addChart()
日历 addCalendar()
艺术字体 addArtisticText()
Emoji addEmoji()
系统会自动检测 macOS / Linux / Windows 上的 emoji 字体路径。
注意:能否画出 emoji 取决于字体本身。Linux 上常见的
NotoColorEmoji.ttf是 CBDT 位图彩色字体,GD 的 FreeType 通道无法加载(imagettftext()直接失败),此时 emoji 不会被绘制;请改用系统内可被 FreeType 正常加载的 emoji 字体。
字体图标 addIcon()
颜文字 addEmoticon()
项目宠物 addPet()
内置吉祥物 Posty(assets/pet.png,由 assets/pet.svg 栅格化)可直接画进海报,等价于 addImage(PosterBuilder::petPath(), $options):
缺图占位图:addImage() / addAvatar() 遇到不存在的文件时默认跳过不绘制。把 poster.placeholder 指向吉祥物,缺图位置就会画出 Posty,一眼看出哪张图漏了:
三、模板系统
useTemplate() 默认替换此前的 addXxx() 元素(保持原有语义);要「模板打底 + 再叠手写元素」用第二个参数:
注意:
AbstractElement::toArray()自本版本起返回「短类型名 + 拍平选项」(此前是['type' => 类名, 'options' => [...]]),以便与模板结构往返一致。
框架集成
Laravel
ThinkPHP
config/web.php:
Webman
config/bootstrap.php:
Hyperf
通过 ConfigProvider 自动注册。
Yii2
config/web.php:
可选:把 Erikwang2013\Poster\Adapters\Yii2\Bootstrap::class 加进 'bootstrap',控制器即可构造注入 CaptchaManager。
builder每次访问返回新实例(它有状态,width()/add()会累积);captcha无状态。配置读应用的config/poster.php,经@app别名定位 —— 不用 cwd,因为 php-fpm 下 cwd 常是web/,会让配置静默失效。
Yii3
composer require 后由 yiisoft/config 自动装配(extra.config-plugin 已声明,无需手工接线):
覆盖默认值走应用的 config/params.php:
容器里只放无状态的东西:
StorageInterface和两个工厂。图像驱动 /CaptchaManager/PosterBuilder都不进容器 ——yiisoft/di只管理共享实例,而它们持有当前画布(GdDriver::$resource、ImagickDriver::$imagick),共享后在 RoadRunner / Swoole 常驻进程下会跨请求串状态。
配置
composer require 后自动将 config/poster.php 复制到项目 config/ 目录(已存在则跳过)。兼容 Laravel / ThinkPHP / Webman / Yii2(config/poster.php)和 Hyperf(config/autoload/poster.php)。Yii3 用 config/params.php 的 erikwang2013/poster-php 命名空间覆盖,见上。
主要配置项:
| 配置项 | 默认值 | 说明 |
|---|---|---|
captcha.default_type |
random |
默认验证码类型:click / rotate / slider / random |
captcha.default_difficulty |
medium |
默认难度:easy / medium / hard |
captcha.slider_shape |
square |
滑块拼图形状:square 矩形缺口 / jigsaw 凹凸拼图(四边凸凹随机) |
captcha.click_words |
[合,家,欢,...] |
click 验证码文字池,可自定义 |
captcha.background_dir |
assets/backgrounds/ |
背景图目录,null 则程序化生成 |
captcha.ttl |
300 |
验证码有效期(秒) |
captcha.max_attempts |
3 |
最大验证次数 |
captcha.tolerance |
{click:18,rotate:5,slider:4} |
各类型容差 |
image.driver |
auto |
图像驱动:auto / gd / imagick |
poster.placeholder |
null |
缺失图片的占位图路径,null 跳过不绘制;设为吉祥物路径可在缺图处绘制 Posty |
captcha.rate_limit |
{max:30,window:60} |
会话/账号级窗口限流;身份默认取 session_id,无会话时取客户端 IP |
captcha.trajectory |
{enabled:false,…} |
行为轨迹校验(默认关闭) |
captcha.cache.pool |
null |
PSR-16 池对象(storage=cache 时用),也可运行时 StorageFactory::setPsr16Pool() |
captcha.route |
{enabled:false,path:'/captcha'} |
Laravel 适配器:注册图片端点 GET {path}/{key} 直接返回 PNG |
开源不易,欢迎支持
| 微信 | 支付宝 |
|---|---|
License
MIT License — Copyright (c) 2026 erik https://erik.xyz
项目宠物表情形态 · Posty
愤怒 :emoji-angry: |
吐舌头 :emoji-tongue: |
12 种彩色动态形态:笑 / 欢乐 / 哭 / 沮丧 / 惊恐 / 愤怒 / 撒娇 / 卖萌 / 讨好 / 敲打 / 捂脸 / 吐舌头。每个 SVG 自带表情、情绪特效与整体动效,并遵循
prefers-reduced-motion。
视觉资产授权 / Visual Assets License
本项目的项目宠物、图片、图标、表情(包括 docs/pet-expressions/ 等目录下的
SVG / PNG)不是开源资产,版权归作者所有。未经书面许可不得复制、修改、再分发或
用于商业用途;商业使用需取得商业授权,联系 [email protected]。详见
ASSETS-LICENSE.md。
代码部分仍遵循仓库原有
LICENSE;第三方素材(如明确标注的 Go Gopher 等)仍遵循其原许可证。
All versions of poster-php with dependencies
ext-gd Version *
ext-mbstring Version *