Thinkphp+workman+redis实现多进程异步任务处理
以下是一个使用ThinkPHP和Workerman结合实现异步任务处理的简化示例:
首先,确保你已经安装了Workerman和ThinkPHP框架。
- 在你的ThinkPHP项目中创建一个Worker类,例如
application/worker/Task.php
:
<?php
namespace app\worker;
use Workerman\Worker;
use think\facade\Log;
class Task extends Worker
{
protected $socket = 'websocket://your_domain:port'; // 替换为你的域名和端口
public function onMessage($connection, $data)
{
// 处理接收到的数据
// 例如,将任务存储到Redis队列中
try {
// 假设你已经设置了Redis连接
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
$redis->lPush('your_task_queue', json_encode(['data' => $data, 'connection' => $connection->id]));
} catch (\Exception $e) {
Log::error('Task push to redis failed: ' . $e->getMessage());
$connection->send('Failed to process task');
return;
}
$connection->send('Task queued successfully');
}
}
- 在你的Workerman配置文件
start.php
中启动Worker类(通常位于项目根目录):
<?php
require_once 'vendor/autoload.php';
$worker = new app\worker\Task();
// 其他Workerman配置...
$worker->count = 4; // 根据CPU核心数调整进程数
$worker->name = 'YourTaskWorker';
Worker::runAll();
- 确保你的
config/cache.php
配置了Redis作为缓存驱动,如果没有,请添加:
// 缓存配置
return [
// default 缓存驱动
'default' => [
'type' => 'Redis',
'host' => '127.0.0.1',
'port' => 6379,
'password' => '',
// 其他缓存配置...
],
// 更多的缓存配置...
];
- 创建一个新的命令行脚本来处理Redis队列中的任务,例如
application/command/Process.php
:
<?php
namespace app\command;
use think\console\Command;
use think\console\Input;
use think\console\Output;
use Workerman\Lib\Timer;
class Process extends Command
{
protected function configure()
{
// 命令的配置
}
protected function execute(Input $input, Output $output)
{
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
Timer::add(1, function() use ($redis) {
$task = $redis->rPop('your_task_queue');
if ($task) {
$taskData = js
评论已关闭