PHP code example of sparkinzy / cap_php_server
1. Go to this page and download the library: Download sparkinzy/cap_php_server library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
sparkinzy / cap_php_server example snippets
use Sparkinzy\CapPhpServer\Cap;
use Sparkinzy\CapPhpServer\Storage\FileStorage;
use Sparkinzy\CapPhpServer\Storage\MemoryStorage;
// Redis配置
$redisConfig = [
'redis' => [
'host' => '127.0.0.1',
'port' => 6379,
'password' => null,
'database' => 0
]
];
// 文件存储配置
$fileStorage = new FileStorage(__DIR__ . '/data/cap_storage.json');
// 内存存储配置
$memoryStorage = new MemoryStorage(300); // 5分钟清理
// 企业级配置
$advancedConfig = [
'storage' => $fileStorage, // 自定义存储
'challengeCount' => 5, // 更高安全性
'challengeDifficulty' => 3, // 更高难度
'challengeExpires' => 900, // 15分钟过期
'tokenExpires' => 1800, // 30分钟令牌
'rateLimitRps' => 5, // 更严格限流
'rateLimitBurst' => 20, // 更小突发
'tokenVerifyOnce' => true, // 强制一次性
'autoCleanupInterval' => 180 // 3分钟清理
];
$cap = new Cap($advancedConfig);
Sparkinzy\CapPhpServer\Cap;
use Sparkinzy\CapPhpServer\Storage\MemoryStorage;
// 现代化初始化 - 优化配置
$cap = new Cap([
// 高性能配置(优化后 90%+ 提升)
'challengeCount' => 3, // 3个挑战(1-3秒解决)
'challengeSize' => 16, // 16字节盐值
'challengeDifficulty' => 2, // 难度2(优化平衡)
// 企业级安全
'rateLimitRps' => 10, // 10次/秒 限流
'rateLimitBurst' => 50, // 50次突发容量
'tokenVerifyOnce' => true, // 一次性验证
// 灵活存储(可选)
'storage' => new MemoryStorage(300), // 5分钟自动清理
]);
// 1. 创建挑战(支持限流)
$challenge = $cap->createChallenge(null, $_SERVER['REMOTE_ADDR']);
echo "\u2705 挑战创建成功\n";
echo "挑战数量: " . count($challenge['challenge']) . "\n";
echo "令牌: " . substr($challenge['token'], 0, 20) . "...\n";
// 2. 客户端计算(在实际应用中由 cap.js 自动处理)
// cap.js 0.1.26 会自动:
// - 获取挑战
// - 使用 Web Worker 进行工作量证明计算
// - 提交解决方案到 /redeem 端点
// - 返回验证令牌(触发 solve 事件)
// 以下是手动模拟流程(仅供测试用)
$solutions = [];
foreach ($challenge['challenge'] as $challengeData) {
$salt = $challengeData[0];
$target = $challengeData[1];
// 模拟解决过程
for ($nonce = 0; $nonce < 50000; $nonce++) {
if (strpos(hash('sha256', $salt . $nonce), $target) === 0) {
$solutions[] = [$salt, $target, $nonce]; // cap.js 0.1.25/0.1.26 格式
break;
}
}
}
// 3. 验证解决方案(在实际应用中由 cap.js 自动处理)
$result = $cap->redeemChallenge([
'token' => $challenge['token'],
'solutions' => $solutions
], $_SERVER['REMOTE_ADDR']);
echo "\u2705 解决方案验证成功\n";
echo "验证令牌: " . substr($result['token'], 0, 20) . "...\n";
// 4. 验证令牌(一次性)
$validation = $cap->validateToken($result['token'], null, $_SERVER['REMOTE_ADDR']);
if ($validation['success']) {
echo "\u2705 令牌验证成功\uff01\n";
} else {
echo "\u274c 令牌验证失败!\n";
}
// 5. 查看统计信息
$stats = $cap->getStats();
echo "\n📊 系统统计:\n";
echo "- 存储类型: " . $stats['storage_type'] . "\n";
echo "- 限流器: " . ($stats['rate_limiter_enabled'] ? '开启' : '关闭') . "\n";
echo "- 挑战参数: {$stats['config']['challengeCount']}/{$stats['config']['challengeSize']}/{$stats['config']['challengeDifficulty']}\n";
use Sparkinzy\CapPhpServer\Cap;
// 传统方式(仍然支持,但建议使用优化版)
$cap = new Cap();
// 创建挑战
$challenge = $cap->createChallenge();
// 验证解决方案
$result = $cap->redeemChallenge($solutions);
if ($result['success']) {
echo "验证成功!";
} else {
echo "验证失败!";
}
use Sparkinzy\CapPhpServer\Cap;
use Sparkinzy\CapPhpServer\Storage\FileStorage;
use Sparkinzy\CapPhpServer\Storage\MemoryStorage;
// Redis 配置
$redisConfig = [
'redis' => [
'host' => '127.0.0.1',
'port' => 6379,
'password' => null,
'database' => 0
]
];
// 文件存储配置
$fileStorage = new FileStorage(__DIR__ . '/data/cap_storage.json');
// 内存存储配置
$memoryStorage = new MemoryStorage(300); // 5分钟清理
// 高级配置
$advancedConfig = [
'storage' => $fileStorage, // 自定义存储
'challengeCount' => 5, // 更高安全性
'challengeDifficulty' => 3, // 更高难度
'challengeExpires' => 900, // 15分钟过期
'tokenExpires' => 1800, // 30分钟令牌
'rateLimitRps' => 5, // 更严格限流
'rateLimitBurst' => 20, // 更小突发
'tokenVerifyOnce' => true, // 强制一次性
'autoCleanupInterval' => 180 // 3分钟清理
];
$cap = new Cap($advancedConfig);
// ...其他所需文件
// simple_server.php
r\Cap;
use Sparkinzy\CapPhpServer\Exceptions\CapException;
// CORS 支持
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
header('Content-Type: application/json');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
exit(0);
}
// 初始化 Cap
$cap = new Cap([
'challengeCount' => 3,
'challengeSize' => 16,
'challengeDifficulty' => 2,
'rateLimitRps' => 10,
'rateLimitBurst' => 50
]);
$method = $_SERVER['REQUEST_METHOD'];
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$clientIP = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
try {
switch ("$method:$path") {
case 'POST:/challenge':
$challenge = $cap->createChallenge(null, $clientIP);
echo json_encode($challenge);
break;
case 'POST:/redeem':
$input = json_decode(file_get_contents('php://input'), true);
$result = $cap->redeemChallenge($input, $clientIP);
echo json_encode($result);
break;
case 'POST:/validate':
$input = json_decode(file_get_contents('php://input'), true);
$result = $cap->validateToken($input['token'], null, $clientIP);
echo json_encode($result);
break;
case 'GET:/stats':
$stats = $cap->getStats();
echo json_encode($stats, JSON_PRETTY_PRINT);
break;
default:
http_response_code(404);
echo json_encode(['error' => 'Not found']);
}
} catch (CapException $e) {
http_response_code(400);
echo json_encode([
'success' => false,
'error' => $e->getMessage(),
'code' => $e->getCode()
]);
}
$config = [
'challengeCount' => 3,
'challengeSize' => 16,
'challengeDifficulty' => 2,
'challengeExpires' => 600,
'tokenExpires' => 1200,
'tokenVerifyOnce' => true
];
$config = [
'rateLimitRps' => 5, // 更严格的限流
'rateLimitBurst' => 20, // 更小的突发容量
'autoCleanupInterval' => 180 // 3分钟清理一次
];
$config = [
'redis' => [
'host' => '127.0.0.1',
'port' => 6379,
'password' => 'your_password',
'database' => 0,
'timeout' => 3.0,
'prefix' => 'cap:'
]
];
// 获取系统统计
$stats = $cap->getStats();
/*
返回示例:
{
"storage_type": "Sparkinzy\\CapPhpServer\\Storage\\MemoryStorage",
"rate_limiter_enabled": true,
"config": {
"challengeCount": 3,
"challengeSize": 16,
"challengeDifficulty": 2
},
"performance": {
"total_challenges_created": 1250,
"total_solutions_verified": 1180,
"success_rate": "94.4%",
"average_solve_time": "2.3s"
}
}
$config = [
'challengeCount' => 3,
'challengeSize' => 16,
'challengeDifficulty' => 2,
'challengeExpires' => 600,
'tokenExpires' => 1200,
'tokenVerifyOnce' => true
];
$config = [
'rateLimitRps' => 5, // 更严格的限流
'rateLimitBurst' => 20, // 更小的突发容量
'autoCleanupInterval' => 180 // 3分钟清理一次
];
$config = [
'redis' => [
'host' => '127.0.0.1',
'port' => 6379,
'password' => 'your_password',
'database' => 0,
'timeout' => 3.0,
'prefix' => 'cap:'
]
];
bash
composer bash
# 启动开发服务器
cd /home/sparkinzy/php-work/agreement/cap_php_server && php -S localhost:8080 index.php
# 访问地址
# - 主页: http://localhost:8080/
# - Demo: http://localhost:8080/test
# - API: http://localhost:8080/challenge, /redeem, /validate
bash
# 克隆项目
git clone https://github.com/sparkinzy/cap_php_server.git
cd cap_php_server
# 安装依赖(如果有)
composer install --dev
# 运行测试
./vendor/bin/phpunit
# 启动开发服务器
php -S localhost:8080 index.php