我想用Laravel制作离线在线Web应用程序。当用户有互联网连接时,它需要自动同步MySql数据库,否则我会做一个同步按钮。我尝试了解决方案,但不幸的是我没有找到任何解决方案。
或者我可以进行进出口吗? 我也试过这个
https://github.com/MidwesternInteractive/laravel-db-sync
REMOTE_SYNC_URL=
REMOTE_SYNC_DB_NAME=
REMOTE_SYNC_SSH_USERNAME=
REMOTE_SYNC_SSH_PASSWORD=
您不需要任何额外的软件包。
为两个数据库(本地和实时(提供单独的凭据,以database.php
连接数组中的配置文件。
例:
'my-local-db' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
],
'my-live-db' => [
'driver' => 'mysql',
'host' => env('DB_LIVE_HOST', '103.149.104.68'), // Put your live server database host here
'port' => env('DB_LIVE_PORT', '3306'),
'database' => env('DB_LIVE_DATABASE', 'forge'),
'username' => env('DB_LIVE_USERNAME', 'forge'),
'password' => env('DB_LIVE_PASSWORD', ''),
],
并在环境中设置这些可验证内容
现在,例如,您希望将表从实时同步到本地
public function sync() {
// Connect to live database
$live_database = DB::connection('my-live-db');
// Get table data from production
foreach($live_database->table('table_name')->get() as $data){
// Save data to staging database - default db connection
DB::table('table_name')->insert((array) $data);
}
// Get table_2 data from production
foreach($live_database->table('table_2_name')->get() as $data){
// Save data to staging database - default db connection
DB::table('table_2_name')->insert((array) $data);
}
}
希望这能给你一个关于两个数据库同步的基本概念
'my-local-db' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
],
'my-live-db' => [
'driver' => 'mysql',
'host' => env('DB_LIVE_HOST', '103.149.104.68'), // Put your live server
database host here
'port' => env('DB_LIVE_PORT', '3306'),
'database' => env('DB_LIVE_DATABASE', 'forge'),
'username' => env('DB_LIVE_USERNAME', 'forge'),
'password' => env('DB_LIVE_PASSWORD', ''),
],
public function sync() {
// Connect to live database
$live_database = DB::connection('my-live-db');
// Get table data from production
foreach($live_database->table('table_name')->get() as $data){
// Save data to staging database - default db connection
DB::table('table_name')->insert((array) $data);
// This query can do only one time for multiple time we have to do
DB::table('table_name')->insertOrUpdate((array) $data);
// This query also update column only, if you do some changes in
//previous data it will not sync for that i dont know this query is
//correct or not but it worked.
DB::table('table_name')->delete((array) $data);
DB::table('table_name')->insertOrIgnore((array) $data);
}
}
使用 Laravel创建一个离线在线 Web 应用程序,在互联网连接可用时将数据与 MySQL 数据库同步可能是一项复杂的任务。没有一刀切的解决方案,但我可以为您提供有关如何解决此问题的一些指导。
实现这一目标的一种方法是实现一个基于队列的系统,结合 Laravel 的任务调度和数据库同步。以下是有关如何解决此问题的一般概述:
队列系统:使用Laravel的内置队列系统来管理同步任务。当应用程序联机且互联网连接可用时,将任务排队以将数据与远程 MySQL 数据库同步。您可以使用 Redis 或 Laravel 支持的其他队列驱动程序。
任务计划:使用Laravel的任务计划程序(工匠计划(设置计划任务。这些任务可以定期检查是否有可用的互联网连接,并在检测到连接时处理同步队列。如果没有连接,可以将任务安排为稍后重试。
数据库同步逻辑:在队列作业中实现数据库同步逻辑。Laravel提供像Eloquent这样的数据库工具来与您的数据库进行交互。需要编写代码来比较本地和远程数据库并相应地同步数据。
离线模式:当应用程序离线时,您仍然可以允许用户在本地与数据进行交互。使用本地 SQLite 数据库或其他存储机制在脱机时存储数据。互联网连接恢复后,将本地数据与远程 MySQL 数据库同步。
用户启动的同步:实现一个按钮或选项,允许用户在有互联网连接时手动触发数据同步。这可以是自动同步遇到问题时的回退机制。
处理失败:准备好妥善处理同步失败。如果同步作业失败,请记录错误,并尝试稍后根据您的计划逻辑重试。
关于你提到的包(laravel-db-sync(,它似乎是一个用于数据库迁移的工具,而不是本地和远程数据库之间的同步。您可能需要如上所述构建自定义同步解决方案。
请记住,构建强大的脱机-联机同步系统可能很复杂,您需要在实现中考虑数据冲突、数据一致性和错误处理。必须在各种方案中全面测试解决方案,以确保其可靠运行。
我希望上述指南会有所帮助。
问候 伊姆兰