经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » PHP » 查看文章
Laravel数据库读写分离配置的方法
来源:jb51  时间:2019/10/14 9:38:49  对本文有异议

配置范例

  1. 'mysql' => [
  2. 'driver' => 'mysql',
  3. 'write' => [
  4. 'host' => '192.168.1.180',
  5. ],
  6. 'read' => [
  7. ['host' => '192.168.1.182'],
  8. ['host' => '192.168.1.179'],
  9. ],
  10. ...
  11. ]

  1. 'mysql' => [
  2. 'driver' => 'mysql',
  3. 'write' => [
  4. 'host' => '192.168.1.180',
  5. ],
  6. 'read' => [
  7. 'host' =>
  8. '192.168.1.182',
  9. '192.168.1.179'
  10. ],
  11. ],
  12. ...
  13. ]

扩展配置范例

  1. 'mysql' => [
  2. 'driver' => 'mysql',
  3. 'write' => [
  4. 'host' => '192.168.1.180',
  5. 'username' => 'write',
  6. 'password' => 'write',
  7. ],
  8. 'read' => [
  9. [
  10. 'host' => '192.168.1.182',
  11. 'username' => 'read1',
  12. 'password' => 'read1',
  13. ],
  14. [
  15. 'host' => '192.168.1.179',
  16. 'username' => 'read2',
  17. 'password' => 'read2',
  18. ],
  19. ],
  20. ...
  21. ]

或者

  1. 'mysql' => [
  2. 'driver' => 'mysql',
  3. 'write' => [
  4. 'host' => '192.168.1.180',
  5. 'username' => 'write',
  6. 'password' => 'write',
  7. ],
  8. 'read' => [
  9. 'host' =>
  10. '192.168.1.179',
  11. '192.168.1.182',
  12. ],
  13. 'username' => 'read',
  14. 'password' => 'read',
  15. ],
  16. ...
  17. ]

公司数据库架构为一主多从,从库访问地址为唯一地址,该处方便负载均衡及扩展从库。所以最终线上采用的配置

  1. 'mysql' => [
  2. 'driver' => 'mysql',
  3. 'write' => [
  4. 'host' => '192.168.1.180',
  5. 'username' => 'write',
  6. 'password' => 'write',
  7. ],
  8. 'read' => [
  9. 'host' => '192.168.1.179'
  10. 'username' => 'read',
  11. 'password' => 'read',
  12. ],
  13. ...
  14. ]

代码分析

授人以鱼不如授人以渔,之所以配置如此灵活的原因,以及如何查找到这些配置方式。主要通过查找代码,分析代码;相关代码都在下面粘出,这里就不做解释了,代码能说明一切;

路径:vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php

代码:

  1. class ConnectionFactory
  2. {
  3. ...
  4.  
  5. /**
  6. * Get the read configuration for a read / write connection.
  7. *
  8. * @param array $config
  9. * @return array
  10. */
  11. protected function getReadConfig(array $config)
  12. {
  13. $readConfig = $this->getReadWriteConfig($config, 'read');
  14.  
  15. if (isset($readConfig['host']) && is_array($readConfig['host'])) {
  16. $readConfig['host'] = count($readConfig['host']) > 1
  17. ? $readConfig['host'][array_rand($readConfig['host'])]
  18. : $readConfig['host'][0];
  19. }
  20.  
  21. return $this->mergeReadWriteConfig($config, $readConfig);
  22. }
  23. ...
  24. /**
  25. * Get a read / write level configuration.
  26. *
  27. * @param array $config
  28. * @param string $type
  29. * @return array
  30. */
  31. protected function getReadWriteConfig(array $config, $type)
  32. {
  33. if (isset($config[$type][0])) {
  34. return $config[$type][array_rand($config[$type])];
  35. }
  36.  
  37. return $config[$type];
  38. }
  39. ...
  40. /**
  41. * Merge a configuration for a read / write connection.
  42. *
  43. * @param array $config
  44. * @param array $merge
  45. * @return array
  46. */
  47. protected function mergeReadWriteConfig(array $config, array $merge)
  48. {
  49. return Arr::except(array_merge($config, $merge), ['read', 'write']);
  50. }
  51. ...
  52. }
  53. class Arr
  54. {
  55. ...
  56. /**
  57. * Get all of the given array except for a specified array of items.
  58. *
  59. * @param array $array
  60. * @param array|string $keys
  61. * @return array
  62. */
  63. public static function except($array, $keys)
  64. {
  65. static::forget($array, $keys);
  66. return $array;
  67. }
  68. ...
  69. /**
  70. * Remove one or many array items from a given array using "dot" notation.
  71. *
  72. * @param array $array
  73. * @param array|string $keys
  74. * @return void
  75. */
  76. public static function forget(&$array, $keys)
  77. {
  78. $original = &$array;
  79. $keys = (array) $keys;
  80. if (count($keys) === 0) {
  81. return;
  82. }
  83. foreach ($keys as $key) {
  84. $parts = explode('.', $key);
  85. while (count($parts) > 1) {
  86. $part = array_shift($parts);
  87. if (isset($array[$part]) && is_array($array[$part])) {
  88. $array = &$array[$part];
  89. } else {
  90. $parts = [];
  91. }
  92. }
  93. unset($array[array_shift($parts)]);
  94. // clean up after each pass
  95. $array = &$original;
  96. }
  97. }
  98. ...
  99. }

以上这篇Laravel数据库读写分离配置的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号