介绍
基于Hyperf+ SQL Server 实现的一个简单数据库curd,
思路
第一次用这个框架操作SQL Server,不太熟悉,只能告诉大家大概的思路。
首先要装一个SQL Server 的驱动ODBC。
然后要装一个php SQL Server扩展 pdo_sqlsrv
还有一个扩展叫sqlsrv(操作函数),可装可不装,如果你直接用pdo是可以不装的。
最后一步就是要利用hyperf task机制去投递到task进程去处理这个任务。
检查扩展 [php -m]
安装Task [config/autoload/server.php]
composer require hyperf/task
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相关代码
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(),
];
}
}
控制器代码
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 协议》,转载必须注明作者和本文链接