利用swoole与redis实现股票和区块链服务,具体包含以下几个步骤。
1. 环境准备
需要安装、配置以下软件。
- swoole
- redis
- PHP版本 >= 7.0
在安装完以上软件后,需要在php.ini中开启swoole和redis扩展。
2. 实现股票服务
2.1 设计数据结构
在redis中,我们可以使用HashTable(Hash)类型来保存每一个股票的信息,以股票代码作为键名,股票相关的信息作为键值。
# 举个例子(swoole股票小程序)
# 上证指数的编号为000001
# HK股票海底捞的编号为06862
hset stock 000001 "{\"name\":\"上证指数\",\"price\":\"3400.00\",\"rate\":\"1.23%\"}"
hset stock 06862 "{\"name\":\"香港海底捞\",\"price\":\"64.50\",\"rate\":\"3.50%\"}"
2.2 创建服务端
我们使用swoole的Server类来创建服务端,然后监听客户端请求,进行数据处理。
$server = new Swoole\Server('0.0.0.0', 9502, SWOOLE_BASE);
$server->on('Connect', function ($serv, $fd) {
echo "Client: Connect.\n";
});
$server->on('Receive', function ($serv, $fd, $from_id, $data) {
$params = unserialize($data);
if ($params['action'] === 'getStockInfo') {
$stockCode = $params['param'];
$stockInfo = redis_client->hget('stock', $stockCode);
$serv->send($fd, $stockInfo);
}
});
$server->on('Close', function ($serv, $fd) {
echo "Client: Close.\n";
});
$server->start();
2.3 创建客户端
在客户端使用swoole的Client类,可以通过send向服务端发送数据,然后接收服务端处理后的响应结果。
$client = new Swoole\Client(SWOOLE_SOCK_TCP);
if (!$client->connect('127.0.0.1', 9502, -1)) {
exit("connect failed. Error: {$client->errCode}\n");
}
$client->send(serialize(['action' => 'getStockInfo', 'param' => '000001']));
$response = $client->recv();
echo $response;
$client->close();
2.4 示例
如下所示,我们可以使用上面的客户端代码获取股票代码为“000001”的信息。
$client = new Swoole\Client(SWOOLE_SOCK_TCP);
if (!$client->connect('127.0.0.1', 9502, -1)) {
exit("connect failed. Error: {$client->errCode}\n");
}
$client->send(serialize(['action' => 'getStockInfo', 'param' => '000001']));
$response = $client->recv();
echo $response;
$client->close();
3. 实现区块链服务
3.1 设计数据结构
在redis中,我们可以使用List类型来保存每一块区块链信息,以块号作为键名,块中相关的信息作为键值。
# 举个例子
# 区块1
rpush blockchain 1 "{\"from\":\"user1\",\"to\":\"user2\",\"owner\":\"github\",\"value\":\"100\"}"
# 区块2
rpush blockchain 2 "{\"from\":\"user3\",\"to\":\"user4\",\"owner\":\"github\",\"value\":\"200\"}"
# 区块3
rpush blockchain 3 "{\"from\":\"user4\",\"to\":\"user2\",\"owner\":\"alipay\",\"value\":\"300\"}"
3.2 创建服务端
服务端也是使用swoole的Server类来创建服务端,然后监听客户端请求,进行数据处理。
$server = new Swoole\Server('0.0.0.0', 9503, SWOOLE_BASE);
$server->on('Connect', function ($serv, $fd) {
echo "Client: Connect.\n";
});
$server->on('Receive', function ($serv, $fd, $from_id, $data) {
$params = unserialize($data);
if ($params['action'] === 'addBlock') {
$blockInfo = $params['param'];
$blockchainLength = redis_client->llen('blockchain');
$lastBlock = redis_client->lindex('blockchain', $blockchainLength - 1);
$lastBlockHash = hash('sha256', $lastBlock);
$newBlock = [
'index' => $blockchainLength + 1,
'hash' => hash('sha256', json_encode($blockInfo).$lastBlockHash),
'timestamp' => time(),
'data' => $blockInfo,
];
redis_client->rpush('blockchain', json_encode($newBlock));
$serv->send($fd, json_encode($newBlock));
}
});
$server->on('Close', function ($serv, $fd) {
echo "Client: Close.\n";
});
$server->start();
3.3 创建客户端
在客户端使用swoole的Coroutine\Http\Client类,可以通过post向服务端发送数据,然后接收服务端处理后的响应结果。
Coroutine\run(function () {
$cli = new Coroutine\Http\Client('127.0.0.1', 9503);
$cli->set(['timeout' => 2]);
$cli->post('/', [
'action' => 'addBlock',
'param' => [
'from' => 'user1',
'to' => 'user2',
'owner' => 'github',
'value' => '100',
]
]);
$response = $cli->body;
echo $response;
});
3.4 示例
如下所示,我们可以使用上面的客户端代码向区块链中增加一个区块,其中包含了转账信息。
Coroutine\run(function () {
$cli = new Coroutine\Http\Client('127.0.0.1', 9503);
$cli->set(['timeout' => 2]);
$cli->post('/', [
'action' => 'addBlock',
'param' => [
'from' => 'user1',
'to' => 'user2',
'owner' => 'github',
'value' => '100',
]
]);
$response = $cli->body;
echo $response;
});
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:利用swoole+redis实现股票和区块链服务 - Python技术站