CFSDN nhấn mạnh vào việc tạo ra giá trị thông qua mã nguồn mở. Chúng tôi cam kết xây dựng một nền tảng chia sẻ tài nguyên để mọi người làm CNTT có thể tìm thấy thế giới tuyệt vời của riêng mình tại đây.
Bài đăng trên blog CFSDN này sử dụng tiện ích mở rộng SWOOLE để đồng bộ hóa MySQL thường xuyên. Dữ liệu được thu thập và sắp xếp theo tác giả. Nếu bạn quan tâm đến bài viết này, vui lòng thích nó.
Công ty Nam Ninh và một số chi nhánh sử dụng hệ thống gọi điện, hiện tại chúng tôi cần phân tích dữ liệu cuộc gọi. Vì máy chủ cuộc gọi của chi nhánh nằm trong mạng nội bộ nên được ánh xạ thông qua các phương tiện kỹ thuật. Mạng giữa chi nhánh và Nam Ninh không ổn định nên chúng tôi cần đồng bộ hóa dữ liệu cuộc gọi của chi nhánh với Nam Ninh.
Cách đơn giản nhất là cấu hình trực tiếp chức năng đồng bộ hóa chủ-tớ của MySQL để đồng bộ dữ liệu tới Nam Ninh. Nhưng công ty ở hệ thống bán hàng đó không cấp cho chúng tôi quyền mysql. Vì vậy, phương pháp này đã phải bị loại bỏ.
Vì vậy, chúng tôi chỉ nghĩ đến việc sử dụng PHP để triển khai một công cụ đồng bộ hóa thời gian PHP đơn giản, sau đó tiến trình PHP chạy ở chế độ nền, vì vậy trước tiên chúng tôi đã đưa ra một thành phần PHP: Swoole. Sau khi thảo luận, lượng dữ liệu tối đa mà công ty chi nhánh tạo ra trong nửa ngày là khoảng 5.000, vì vậy giải pháp này khả thi, vì vậy chúng ta hãy thực hiện.
Chúng tôi sử dụng PHP Swoole để tạo hệ thống tác vụ theo thời gian không đồng bộ.
Đồng bộ hóa chủ-tớ của cơ sở dữ liệu MySQL là đồng bộ dữ liệu với cơ sở dữ liệu tớ bằng cách phân tích cú pháp nhật ký nhị phân trong cơ sở dữ liệu chủ. Tuy nhiên, khi sử dụng PHP để đồng bộ hóa dữ liệu, chúng ta chỉ có thể truy vấn dữ liệu từ cơ sở dữ liệu chính theo từng đợt rồi chèn vào cơ sở dữ liệu phụ ở Nam Ninh.
Framework chúng tôi sử dụng ở đây là thinkphp 3.2.
Đầu tiên cài đặt tiện ích mở rộng PHP: swoole. Vì không sử dụng hàm đặc biệt nào nên chúng tôi sử dụng pecl để cài đặt nhanh tại đây.
Sau khi cài đặt hoàn tất, thêm extension="swoole.so" vào php.ini. Sau khi cài đặt hoàn tất, chúng ta sử dụng phpinfo() để kiểm tra xem cài đặt có thành công không.

Cài đặt thành công, chúng ta bắt đầu viết bài.
Phía máy chủ.
1. Trước tiên hãy khởi động một máy chủ nền và lắng nghe cổng 9501.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
công cộng
Chức năng
chỉ số()
{
$phục vụ
=
mới
\swoole_máy chủ(
"0.0.0.0"
, 9501);
$phục vụ
->đặt([
'worker_num'
=> 1,
'task_worker_num'
=> 8,
'biến thành quỷ dữ'
=> 1,
'yêu cầu tối đa'
=> 10000,
"task_ipc_mode"
=> 2
]);
$phục vụ
->trên(
'nhận được'
, [
$cái này
,
'nhận được'
]);
$phục vụ
->trên(
'nhiệm vụ'
, [
$cái này
,
'đang làm nhiệm vụ'
]);
$phục vụ
->trên(
'hoàn thành'
, [
$cái này
,
'hoàn thành'
]);
$phục vụ
->bắt đầu();
}
|
2. Tiếp nhận và chuyển giao nhiệm vụ.
?
1
2
3
4
5
6
7
8
9
|
công cộng
Chức năng
nhận được(
$phục vụ
,
$fd
,
$từ_id
,
$dữ liệu
)
{
$khu vực
= json_giải_giải(
$dữ liệu
,ĐÚNG VẬY);
foreach
(
$khu vực
BẰNG
$diện tích
){
$phục vụ
->nhiệm vụ(
$diện tích
);
}
}
|
3. Thực hiện tác vụ, dữ liệu được truy vấn từ cơ sở dữ liệu chính và ghi vào cơ sở dữ liệu phụ.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
hai mươi mốt
hai mươi hai
hai mươi ba
hai mươi bốn
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
công cộng
Chức năng
đang làm nhiệm vụ(
$phục vụ
,
$nhiệm_vụ
,
$từ_id
,
$nhiệm_vụ_dữ_liệu
)
{
$diện tích
=
$nhiệm_vụ_dữ_liệu
;
$hàng
= 50;
mã số......
mã số......
$slavexincrementid
= ...;
$mastermaxincrementid
= ...;
nếu như
(
$slavexincrementid
>=
$mastermaxincrementid
){
trở lại
SAI;
}
$datanumber
=
trần nhà
(
$mastermaxincrementid
-
$slavexincrementid
);
$mỗisố
=
trần nhà
(
$datanumber
/
$hàng
);
$trái
= 0;
vì
(
$tôi
= 0;
$tôi
<
$mỗisố
;
$tôi
++) {
$trái
=
$tôi
== 0 ?
$slavexincrementid
:
$trái
+
$hàng
;
$đúng
=
$trái
+
$hàng
;
$masterdata
= ...;
$slavelastinsertid
= ...;
bỏ đặt(
$masterdata
,
$slavelastinsertid
);
}
tiếng vọng
"asynctask mới[id=$task_id]"
.php_eol;
$phục vụ
->kết thúc(
"$area -> ok"
);
}
|
4. Được gọi khi nhiệm vụ hoàn thành.
?
1
2
3
4
|
công cộng
Chức năng
kết thúc(
$phục vụ
,
$nhiệm_vụ
,
$nhiệm_vụ_dữ_liệu
)
{
tiếng vọng
"asynctask[$task_id] kết thúc: $task_data"
.php_eol;
}
|
Nhiệm vụ đẩy của khách hàng.
Về cơ bản thì đã hoàn tất, phần còn lại là viết lệnh đẩy tác vụ cho máy khách.
?
1
2
3
4
5
6
7
8
9
10
11
|
công cộng
Chức năng
chỉ số()
{
$khách hàng
=
mới
\swoole_client(swoole_sock_tcp);
nếu như
(!
$khách hàng
->kết nối(
'127.0.0.1'
, 9501, 1)) {
ném
mới
ngoại lệ(
'Lỗi khi kết nối với dịch vụ swoole'
);
}
$khu vực
= mã hóa json([
'liễu châu'
,
'yulin'
,
'Bắc Hải'
,
'quế lâm'
]);
$khách hàng
->gửi(
$khu vực
);
tiếng vọng
"Nhiệm vụ đã được gửi thành công"
.php_eol;
}
|
Bây giờ về cơ bản chúng ta đã hoàn tất. Việc còn lại là viết một tập lệnh shell để thực thi nó thường xuyên: /home/wwwroot/sync_db/crontab/send.sh.
?
1
2
3
4
5
6
|
#!/thùng/bash
đường dẫn=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
đường dẫn xuất khẩu
# Lên lịch đẩy các tác vụ đồng bộ hóa dữ liệu không đồng bộ
/usr/bin/php /home/wwwroot/sync_db/server.php trang chủ/index/index
|
Sử dụng tác vụ theo lịch trình crontab, chúng tôi thêm tập lệnh vào các tác vụ theo lịch trình.
?
1
2
3
4
|
#Đặt tác vụ đồng bộ dữ liệu được thực hiện vào lúc 12:30 hàng ngày
30 12 * * * gốc /home/wwwroot/sync_db/crontab/send.sh
#Đặt tác vụ đồng bộ dữ liệu được thực hiện vào lúc 19:00 hàng ngày
0 19 * * * gốc /home/wwwroot/sync_db/crontab/send.sh
|
Mẹo: Bạn nên thêm thao tác ghi nhật ký để biết liệu tác vụ có được đẩy và thực thi thành công hay không.
Về cơ bản thì đã hoàn thành, chương trình cần được tối ưu hóa~~~, vui lòng đề xuất những phương pháp tốt hơn.
Liên kết gốc: https://cong5.net/post/php-swoole-sync-call-data-for-subsidary-to-nanning.
Cuối cùng, bài viết này về việc sử dụng tiện ích mở rộng SWOOLE trong PHP để đạt được đồng bộ hóa theo thời gian của dữ liệu MySQL kết thúc tại đây. Nếu bạn muốn biết thêm về việc sử dụng tiện ích mở rộng SWOOLE trong PHP để đạt được đồng bộ hóa theo thời gian của dữ liệu MySQL, vui lòng tìm kiếm các bài viết trên CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!