基于 Hyperf+ SQL Server 实现的一个简单数据库 curd

介绍

基于Hyperf+ SQL Server 实现的一个简单数据库curd,

思路

第一次用这个框架操作SQL Server,不太熟悉,只能告诉大家大概的思路。

首先要装一个SQL Server 的驱动ODBC

然后要装一个php SQL Server扩展 pdo_sqlsrv

还有一个扩展叫sqlsrv(操作函数),可装可不装,如果你直接用pdo是可以不装的。

最后一步就是要利用hyperf task机制去投递到task进程去处理这个任务。

ODBC驱动

pdo_sqlsrv扩展

sqlsrv 的使用示例

检查扩展 [php -m]

安装Task [config/autoload/server.php]

composer require hyperf/task
<?php

declare(strict_types=1);

use Hyperf\Server\SwooleEvent;

return [
    // 这里省略了其它不相关的配置项
    'settings' => [
        // Task Worker 数量,根据您的服务器配置而配置适当的数量
        'task_worker_num' => 8,
        // 因为 `Task` 主要处理无法协程化的方法,所以这里推荐设为 `false`,避免协程下出现数据混淆的情况
        'task_enable_coroutine' => false,
    ],
    'callbacks' => [
        // Task callbacks
        SwooleEvent::ON_TASK => [Hyperf\Framework\Bootstrap\TaskCallback::class, 'onTask'],
        SwooleEvent::ON_FINISH => [Hyperf\Framework\Bootstrap\FinishCallback::class, 'onFinish'],
    ],
];

Task相关代码

<?php
namespace App\Task;

use Hyperf\Utils\Coroutine;

class SqlSrvTask
{
    public function handle($cid)
    {
        $serverName = "127.0.0.1";
        $connectionInfo = array(
            "Database" => "test",
            "UID" => "test",
            "PWD" => "123456"
        );

        $conn = sqlsrv_connect($serverName, $connectionInfo);
        if ($conn === false) {
           //日志
        }

        $sql  =  "INSERT INTO Table_1 (id, data) VALUES (?, ?)" ;
        $params  = array( 1 ,  "some data" );

        $stmt = sqlsrv_query($conn, $sql, $params);
        if ($stmt === false) {
           //日志
        }
        return [
            'worker.cid' => $cid,
            // task_enable_coroutine 为 false 时返回 -1,反之 返回对应的协程 ID
            'task.cid' => Coroutine::id(),
        ];
    }
}

控制器代码

<?php
namespace App\Controller;

use Hyperf\Utils\Coroutine;
use Hyperf\Utils\ApplicationContext;
use App\Task\SqlSrvTask;

class IndexController extends Controller
{
    /**
     * test投递
     */
    public function test()
    {
        $client = ApplicationContext::getContainer()->get(SqlSrvTask::class);
        $res=$client->handle(Coroutine::id());
        var_dump($res);

    }
}

结果

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 3

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!