U8DatabaseServerService.php 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <?php
  2. namespace App\Service;
  3. use Illuminate\Support\Facades\Config;
  4. use Illuminate\Support\Facades\DB;
  5. class U8DatabaseServerService extends Service
  6. {
  7. public $db = null;
  8. public $error = null; // 错误信息
  9. private $database = "";
  10. public function __construct($loginUser = [])
  11. {
  12. $this->database = $loginUser['zt_database'] ?? "";
  13. $this->createConnection();
  14. }
  15. private function createConnection()
  16. {
  17. // 主数据库连接
  18. $mainConnName = 'sqlsrv_main_' . uniqid();
  19. $mainConfig = [
  20. 'driver' => 'sqlsrv',
  21. 'host' => env('SQLSRV_HOST'),
  22. 'port' => env('SQLSRV_PORT'),
  23. 'database' => $this->database,
  24. 'username' => env('SQLSRV_USERNAME'),
  25. 'password' => env('SQLSRV_PASSWORD'),
  26. 'options' => [
  27. \PDO::SQLSRV_ATTR_QUERY_TIMEOUT => 30, // SQL Server专用超时
  28. \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
  29. ],
  30. ];
  31. Config::set("database.connections.{$mainConnName}", $mainConfig);
  32. $this->db = DB::connection($mainConnName);
  33. // 测试连接有效性
  34. $this->validateConnection($this->db);
  35. }
  36. private function validateConnection($connection)
  37. {
  38. try {
  39. $pdo = $connection->getPdo();
  40. $stmt = $pdo->prepare("SELECT 1 AS connection_test");
  41. $stmt->execute();
  42. $result = $stmt->fetch(\PDO::FETCH_ASSOC);
  43. if (empty($result) || $result['connection_test'] != 1) {
  44. $this->error = "T+数据库连接失败";
  45. }
  46. } catch (\Throwable $e) {
  47. $this->error = "T+数据库连接验证失败: " . $e->getMessage();
  48. }
  49. }
  50. public function __destruct()
  51. {
  52. // 主动关闭连接
  53. $this->safeDisconnect($this->db);
  54. }
  55. private function safeDisconnect(&$connection)
  56. {
  57. try {
  58. if ($connection instanceof \Illuminate\Database\Connection) {
  59. // 物理断开连接
  60. $connection->disconnect();
  61. // 清除连接引用
  62. $connection = null;
  63. // Log::info("动作", [
  64. // 'param' => "执行了析构",
  65. // ]);
  66. }
  67. } catch (\Throwable $e) {
  68. // 静默处理断开错误
  69. // Log::info("错误", [
  70. // 'param' => $e->getMessage(),
  71. // ]);
  72. }
  73. }
  74. }