基於 Hyperf+ SQL Server 實現的一個簡單資料庫 curd

ccflow發表於2019-11-13

基於Hyperf+ SQL Server 實現的一個簡單資料庫curd,

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

首先要裝一個SQL Server 的驅動ODBC

然後要裝一個php SQL Server擴充套件 pdo_sqlsrv

還有一個擴充套件叫sqlsrv(操作函式),可裝可不裝,如果你直接用pdo是可以不裝的。

最後一步就是要利用hyperf task機制去投遞到task程式去處理這個任務。

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'],
    ],
];
<?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) {
            die(print_r(sqlsrv_errors(), true));
        }

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

        $stmt = sqlsrv_query($conn, $sql, $params);
        if ($stmt === false) {
            die(print_r(sqlsrv_errors(), true));
        }
        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);

    }
}

相關文章