# Hướng dẫn deploy rabbit đối với Module: InnoMKTAuto

### 1) Giới Thiệu

RabbitMQ là một hệ thống xử lý thông điệp mã nguồn mở (open-source message broker) được sử dụng để truyền và xử lý thông điệp giữa các ứng dụng và dịch vụ. Đây là một giải pháp mạnh mẽ cho việc xây dựng các hệ thống phân tán, các ứng dụng liên quan đến xử lý thông điệp và nhiều tình huống khác.

Trong tài liệu này, chúng ta sẽ hướng dẫn cách triển khai RabbitMQ trên môi trường máy chủ Linux sử dụng gói cài đặt chính thống và tích hợp cơ bản với PHP

### 2) Triển khai RabbitMQ

### 2.1) Cài đặt RabbitMQ trên CentOS sử dụng yum

***Bước 1: Cài đặt EPEL Repository***

EPEL (Extra Packages for Enterprise Linux) là một kho lưu trữ chứa các gói bổ sung cho hệ điều hành dựa trên RHEL (Red Hat Enterprise Linux) như CentOS.

```
sudo yum install epel-release
```

**Bước 2: Cài đặt Erlang**

RabbitMQ yêu cầu Erlang để hoạt động, vì vậy bạn cần cài đặt Erlang trước.

```
sudo yum install erlang
```

#### Bước 3: Cài đặt RabbitMQ

Cài đặt RabbitMQ bằng yum:

```
sudo yum install rabbitmq-server
```

#### Bước 4: Khởi động và kích hoạt rabbitMQ

```
sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server
```

* Thêm người dùng mới:

  ```bash
  rabbitmqctl add_user <username> <password>

  username: tên đăng nhập
  password: mật khẩu đăng nhập
  ```
* Gán quyền cho người dùng:

  ```bash
  rabbitmqctl set_user_tags <username> administrator
  ```
* Gán quyền cho người dùng trên virtual host cụ thể :

  ```bash
  rabbitmqctl set_permissions -p "/" <username> ".*" ".*" ".*"
  ```

#### Bước 5: Tích hợp thư viện PHP amqp trên CentOS

```
sudo yum install php-amqp
```

### 2.2) Cài đặt RabbitMQ trên Ubutu

**Bước 1: Cập nhật hệ thống:**

```
sudo apt update 
sudo apt upgrade -y
```

**Bước 2: Cài đặt Erlang**

RabbitMQ chạy trên nền tảng Erlang, do đó bạn cần cài đặt Erlang trước.

```bash
sudo apt install erlang -y
```

**Bước 3: Cài đặt RabbitMQ**

```bash
sudo apt install rabbitmq-server -y
```

**Bước 4: Quản lý RabbitMQ** \
&#x20;Dưới đây là một số lệnh quản lý cơ bản:

* Khởi động rabbitmq:

  ```bash
  sudo systemctl start rabbitmq-server
  ```
* Dừng rabbitmq:

  ```bash
  sudo systemctl stop rabbitmq-server
  ```
* Khởi động cùng hệ thống:

  ```bash
  sudo systemctl enable rabbitmq-server
  ```

### 2.3) Cấu hình trên Server Tùy Chỉnh (Ví dụ: Server 214)

**Bước 1: Chuẩn bị môi trường**

**Cài đặt Web Server và PHP**

* Hệ điều hành: CentOS&#x20;
* Cài đặt Apache và PHP: \
  `sudo yum install httpd php`

```
sudo yum install php php-mysql
```

**Bước 2: Cài đặt MySQL Server:**\
Chạy lệnh sau để cài đặt MySQL Server trên CentOS:

```bash
sudo yum install mariadb-server

sudo yum install mariadb-server mariadb
```

**Bước 3: Khởi động và Kích hoạt dịch vụ MySQL**

```bash
sudo systemctl start mariadb
sudo systemctl enable mariadb
```

Sau khi khởi động dịch vụ, hãy chạy lệnh bảo mật để đặt mật khẩu cho tài khoản root của MySQL:

```
sudo mysql_secure_installation
```

**Bước 4: Tạo cơ sở dữ liệu và người dùng**\
\
Đăng nhập vào MySQL với tài khoản root:

```
sudo mysql -u root -p
```

Tạo cơ sở dữ liệu:

```
CREATE DATABASE your_db_name;
```

Tạo người dùng và cấp quyền cho cơ sở dữ liệu:

```
CREATE USER 'your_db_user'@'localhost' IDENTIFIED BY 'your_db_password';
GRANT ALL PRIVILEGES ON your_db_name.* TO 'your_db_user'@'localhost';
FLUSH PRIVILEGES;
```

**Sử dụng `mysqli_connect` trong PHP**

Tạo tệp `config.php` hoặc tệp cấu hình tương tự để cấu hình kết nối đến cơ sở dữ liệu:

```
<?php 

define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASSWORD', '');
define('DB_NAME', 'demo');

?>

```

**Sử dụng Kết nối trong ứng dụng PHP**

Sau khi đã cấu hình `config.php` và kết nối MySQL trong tệp cấu hình, bạn có thể sử dụng biến `$conn` để thực hiện các truy vấn và thao tác với cơ sở dữ liệu.\
\
Tạo index.php

```
<?php
// Include tệp cấu hình
require_once('config.php');

$conn = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

if (!$conn) {
    die("Kết nối thất bại: " . mysqli_connect_error());
}

// Thực hiện truy vấn
$sql = "SELECT * FROM abmsco_innomktauto";
$result = mysqli_query($conn, $sql);

// Kiểm tra và xử lý kết quả
if (mysqli_num_rows($result) > 0) {
    while ($row = mysqli_fetch_assoc($result)) {
        echo "ID: " . $row['innomktautoid'] . " - Tên: " . $row['mkt_status'] . "<br>";
    }
} else {
    echo "Không có dữ liệu.";
}

// Đóng kết nối
mysqli_close($conn);
?>

```

**Để tạo một cơ sở dữ liệu và bảng trong MySQL**\
\
Tạo 1 file demo.php

```
<?php
require_once('config.php');

$conn = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

if (!$conn) {
    die("Kết nối thất bại: " . mysqli_connect_error());
}

// Bắt đầu giao dịch
mysqli_begin_transaction($conn);

// Tạo cơ sở dữ liệu
$createDbQuery = "CREATE DATABASE IF NOT EXISTS your_database_name";
if (!mysqli_query($conn, $createDbQuery)) {
    mysqli_rollback($conn);
    echo "Lỗi trong quá trình tạo cơ sở dữ liệu: " . mysqli_error($conn);
    exit;
}

// Chọn cơ sở dữ liệu để sử dụng
mysqli_select_db($conn, 'your_database_name');

// Tạo bảng trong cơ sở dữ liệu
$createTableQuery = "CREATE TABLE IF NOT EXISTS `your_table_name` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `column1` varchar(255) DEFAULT NULL,
    `column2` text,
    PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8";
if (!mysqli_query($conn, $createTableQuery)) {
    mysqli_rollback($conn);
    echo "Lỗi trong quá trình tạo bảng: " . mysqli_error($conn);
    exit;
}

// Nếu tất cả các truy vấn thành công, thực hiện giao dịch
mysqli_commit($conn);
echo "Tạo cơ sở dữ liệu và bảng thành công.";

mysqli_close($conn);
?>

```

### Ứng dụng Navicat

Navicat là một ứng dụng quản lý và quản lý cơ sở dữ liệu rất phổ biến.

1. Mở Navicat.
2. Chọn "Connection" hoặc "Kết nối" từ thanh công cụ hoặc trong menu "File".
3. Điền các thông tin kết nối như tên miền hoặc địa chỉ IP của máy chủ cơ sở dữ liệu, cổng, tên người dùng và mật khẩu.
4. Chọn "Test Connection" hoặc "Kiểm tra kết nối" để kiểm tra xem kết nối có thành công hay không.
5. Sau khi kết nối thành công, đặt tên cho kết nối và nhấn OK.<br>

**Query (Truy vấn) dữ liệu Navicat:**

1. Trong cửa sổ chính của Navicat, chọn "Query" hoặc "Truy vấn" từ thanh công cụ hoặc trong menu "Database".
2. Viết truy vấn SQL vào khung trống.
3. Nhấn nút "Execute" hoặc "Thực hiện" để thực thi truy vấn và xem kết quả.

**Query SQL nhiều bảng và nhiều cột:**

```
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for abmsco_common_config
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_common_config`;
CREATE TABLE `abmsco_common_config` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `option_name` varchar(255) DEFAULT NULL,
  `option_value` text,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2240 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for abmsco_crmentity
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_crmentity`;
CREATE TABLE `abmsco_crmentity` (
  `crmid` int(19) NOT NULL,
  `smcreatorid` int(19) NOT NULL DEFAULT '0',
  `smownerid` int(19) NOT NULL DEFAULT '0',
  `modifiedby` int(19) NOT NULL DEFAULT '0',
  `setype` varchar(100) DEFAULT NULL,
  `description` mediumtext,
  `createdtime` datetime NOT NULL,
  `modifiedtime` datetime NOT NULL,
  `viewedtime` datetime DEFAULT NULL,
  `status` varchar(50) DEFAULT NULL,
  `version` int(19) NOT NULL DEFAULT '0',
  `presence` int(1) DEFAULT '1',
  `deleted` int(1) NOT NULL DEFAULT '0',
  `smgroupid` int(19) DEFAULT NULL,
  `source` varchar(100) DEFAULT NULL,
  `label` varchar(255) DEFAULT NULL,
  `recordno` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`crmid`) USING BTREE,
  KEY `crmentity_smcreatorid_idx` (`smcreatorid`) USING BTREE,
  KEY `crmentity_modifiedby_idx` (`modifiedby`) USING BTREE,
  KEY `crmentity_deleted_idx` (`deleted`) USING BTREE,
  KEY `crm_ownerid_del_setype_idx` (`smownerid`,`deleted`,`setype`) USING BTREE,
  KEY `abmsco_crmentity_labelidx` (`label`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for abmsco_innomktauto
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_innomktauto`;
CREATE TABLE `abmsco_innomktauto` (
  `innomktautoid` int(11) NOT NULL DEFAULT '0',
  `mkt_campain_name` varchar(128) DEFAULT NULL,
  `mkt_from_name` varchar(128) DEFAULT NULL,
  `mkt_sender` varchar(128) DEFAULT NULL,
  `mkt_schedule` timestamp NULL DEFAULT NULL,
  `mkt_batch_delivery` varchar(128) DEFAULT NULL,
  `mkt_status` varchar(128) DEFAULT NULL,
  `mkt_total_list` varchar(128) DEFAULT NULL,
  `mkt_sent` varchar(128) DEFAULT NULL,
  `mkt_unopened` varchar(128) DEFAULT NULL,
  `mtk_unique_open` varchar(128) DEFAULT NULL,
  `mkt_unsubcribed` varchar(128) DEFAULT NULL,
  `mkt_failed_to_send` varchar(128) DEFAULT NULL,
  `mkt_cvid` varchar(128) DEFAULT NULL,
  `mkt_relmodule` varchar(128) DEFAULT NULL,
  `mkt_fromserverid` varchar(128) DEFAULT NULL,
  `tags` varchar(1) DEFAULT NULL,
  `loai_chien_dich` varchar(255) DEFAULT '',
  `file_ghi_am_autocall` varchar(100) DEFAULT '',
  PRIMARY KEY (`innomktautoid`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for abmsco_innomktauto_action
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_innomktauto_action`;
CREATE TABLE `abmsco_innomktauto_action` (
  `actionid` int(11) NOT NULL,
  `set_field` text,
  `next_stage` varchar(255) DEFAULT NULL,
  `function` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`actionid`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for abmsco_innomktauto_campaign
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_innomktauto_campaign`;
CREATE TABLE `abmsco_innomktauto_campaign` (
  `innomktautoid` int(11) DEFAULT NULL,
  `mkt_campain_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `mkt_from_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `mkt_sender` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `mkt_schedule` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `mkt_batch_delivery` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `mkt_status` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `mkt_total_list` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `mkt_sent` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `mkt_unopened` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `mtk_unique_open` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `mkt_unsubcribed` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `mkt_failed_to_send` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `mkt_cvid` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `mkt_relmodule` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `mkt_fromserverid` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `tags` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `loai_chien_dich` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `file_ghi_am_autocall` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `crmid` int(19) DEFAULT NULL,
  `smcreatorid` int(19) DEFAULT NULL,
  `smownerid` int(19) DEFAULT NULL,
  `modifiedby` int(19) DEFAULT NULL,
  `setype` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `description` mediumtext COLLATE utf8_unicode_ci,
  `createdtime` datetime DEFAULT NULL,
  `modifiedtime` datetime DEFAULT NULL,
  `viewedtime` datetime DEFAULT NULL,
  `status` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `version` int(19) DEFAULT NULL,
  `presence` int(1) DEFAULT NULL,
  `deleted` int(1) DEFAULT NULL,
  `smgroupid` int(1) DEFAULT NULL,
  `source` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `label` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `recordno` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- ----------------------------
-- Table structure for abmsco_innomktauto_client_activity
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_innomktauto_client_activity`;
CREATE TABLE `abmsco_innomktauto_client_activity` (
  `activityid` int(11) NOT NULL AUTO_INCREMENT,
  `innomktautoid` int(11) DEFAULT NULL,
  `client_id` int(11) DEFAULT NULL,
  `result` varchar(255) DEFAULT NULL,
  `time` datetime DEFAULT NULL,
  `content_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`activityid`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=109804 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT;

-- ----------------------------
-- Table structure for abmsco_innomktauto_client_list
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_innomktauto_client_list`;
CREATE TABLE `abmsco_innomktauto_client_list` (
  `client_id` int(11) NOT NULL AUTO_INCREMENT,
  `module` varchar(255) DEFAULT NULL,
  `innomktautoid` int(11) DEFAULT NULL,
  `crmid` int(19) DEFAULT NULL,
  `current_stage` varchar(255) DEFAULT NULL,
  `init_report` tinyint(4) DEFAULT NULL,
  PRIMARY KEY (`client_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=936260 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for abmsco_innomktauto_client_report_v2
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_innomktauto_client_report_v2`;
CREATE TABLE `abmsco_innomktauto_client_report_v2` (
  `result_id` int(11) NOT NULL AUTO_INCREMENT,
  `client_id` int(11) DEFAULT NULL,
  `innomktautoid` int(11) DEFAULT NULL,
  `content_type` varchar(50) DEFAULT NULL,
  `content_id` int(11) DEFAULT NULL,
  `stage_id` int(11) DEFAULT NULL,
  `status` varchar(50) DEFAULT NULL,
  `stage_result` varchar(255) DEFAULT NULL,
  `last_update_result` datetime DEFAULT NULL,
  `phase` int(11) DEFAULT NULL,
  `first_run` datetime DEFAULT NULL,
  `last_run` datetime DEFAULT NULL,
  `satiation_time` datetime DEFAULT NULL,
  `label` varchar(255) DEFAULT NULL,
  `object` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`result_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=110000 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT;

-- ----------------------------
-- Table structure for abmsco_innomktauto_content
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_innomktauto_content`;
CREATE TABLE `abmsco_innomktauto_content` (
  `contentid` int(11) NOT NULL,
  `content` longtext,
  `content_type` varchar(255) DEFAULT NULL,
  `content_title` varchar(255) DEFAULT NULL,
  `content_fields` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`contentid`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for abmsco_innomktauto_pause_send_queue
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_innomktauto_pause_send_queue`;
CREATE TABLE `abmsco_innomktauto_pause_send_queue` (
  `send_queue_id` int(11) NOT NULL AUTO_INCREMENT,
  `type` varchar(255) DEFAULT NULL,
  `status` varchar(255) DEFAULT NULL,
  `innomktautoid` int(11) NOT NULL,
  `client_id` int(11) NOT NULL,
  `content_id` int(11) DEFAULT NULL,
  `current_stage` varchar(255) DEFAULT NULL,
  `last_run` datetime DEFAULT NULL,
  PRIMARY KEY (`send_queue_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

-- ----------------------------
-- Table structure for abmsco_innomktauto_queue
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_innomktauto_queue`;
CREATE TABLE `abmsco_innomktauto_queue` (
  `queue_id` int(11) NOT NULL AUTO_INCREMENT,
  `last_run` datetime DEFAULT NULL,
  `function` varchar(255) DEFAULT NULL,
  `client_id` int(11) NOT NULL,
  `innomktautoid` int(11) DEFAULT NULL,
  `current_stage` int(11) DEFAULT NULL,
  `stage_status` varchar(255) DEFAULT NULL,
  `action_id` int(11) DEFAULT NULL,
  `trigger_id` int(11) DEFAULT NULL,
  `content_id` int(11) DEFAULT NULL,
  `batch` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`queue_id`) USING BTREE,
  KEY `batch` (`batch`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1341281 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for abmsco_innomktauto_report_autocall
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_innomktauto_report_autocall`;
CREATE TABLE `abmsco_innomktauto_report_autocall` (
  `result_id` int(11) NOT NULL,
  `client_id` int(11) DEFAULT NULL,
  `innomktautoid` int(11) DEFAULT NULL,
  `digit` int(11) DEFAULT NULL,
  `callstatus` varchar(255) DEFAULT NULL,
  `pbxmanagerid` int(11) DEFAULT NULL,
  PRIMARY KEY (`result_id`) USING BTREE,
  CONSTRAINT `abmsco_innomktauto_report_autocall` FOREIGN KEY (`result_id`) REFERENCES `abmsco_innomktauto_client_report_v2` (`result_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT;

-- ----------------------------
-- Table structure for abmsco_innomktauto_report_email
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_innomktauto_report_email`;
CREATE TABLE `abmsco_innomktauto_report_email` (
  `result_id` int(11) NOT NULL,
  `client_id` int(11) DEFAULT NULL,
  `innomktautoid` int(11) DEFAULT NULL,
  `count_opened` int(11) DEFAULT '0',
  `first_opened` datetime DEFAULT NULL,
  `count_clicked` int(11) DEFAULT '0',
  `first_clicked` datetime DEFAULT NULL,
  `activityid` int(11) DEFAULT NULL,
  `detail_error` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`result_id`) USING BTREE,
  CONSTRAINT `abmsco_innomktauto_report_email` FOREIGN KEY (`result_id`) REFERENCES `abmsco_innomktauto_client_report_v2` (`result_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT;

-- ----------------------------
-- Table structure for abmsco_innomktauto_report_global
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_innomktauto_report_global`;
CREATE TABLE `abmsco_innomktauto_report_global` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `client_id` int(11) DEFAULT NULL,
  `innomktautoid` int(11) DEFAULT NULL,
  `last_update_result` datetime DEFAULT NULL,
  `total_clicked` int(11) DEFAULT '0',
  `total_opened` int(11) DEFAULT '0',
  `total_pressed` int(11) DEFAULT '0',
  `total_sent_mail` int(11) DEFAULT '0',
  `total_autocall` int(11) DEFAULT '0',
  `total_sent_sms` int(11) DEFAULT '0',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `abmsco_innomktauto_report_global` (`innomktautoid`) USING BTREE,
  CONSTRAINT `abmsco_innomktauto_report_global` FOREIGN KEY (`innomktautoid`) REFERENCES `abmsco_innomktauto` (`innomktautoid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=109984 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT;

-- ----------------------------
-- Table structure for abmsco_innomktauto_report_setfield
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_innomktauto_report_setfield`;
CREATE TABLE `abmsco_innomktauto_report_setfield` (
  `result_id` int(11) NOT NULL,
  `client_id` int(11) DEFAULT NULL,
  `innomktautoid` int(11) DEFAULT NULL,
  PRIMARY KEY (`result_id`) USING BTREE,
  CONSTRAINT `abmsco_innomktauto_report_setfield` FOREIGN KEY (`result_id`) REFERENCES `abmsco_innomktauto_client_report_v2` (`result_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT;

-- ----------------------------
-- Table structure for abmsco_innomktauto_report_setfield_copy1
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_innomktauto_report_setfield_copy1`;
CREATE TABLE `abmsco_innomktauto_report_setfield_copy1` (
  `result_id` int(11) NOT NULL,
  `client_id` int(11) DEFAULT NULL,
  `innomktautoid` int(11) DEFAULT NULL,
  PRIMARY KEY (`result_id`) USING BTREE,
  CONSTRAINT `abmsco_innomktauto_report_setfield_copy1_ibfk_1` FOREIGN KEY (`result_id`) REFERENCES `abmsco_innomktauto_client_report_v2` (`result_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT;

-- ----------------------------
-- Table structure for abmsco_innomktauto_report_wf
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_innomktauto_report_wf`;
CREATE TABLE `abmsco_innomktauto_report_wf` (
  `result_id` int(11) NOT NULL,
  `client_id` int(11) DEFAULT NULL,
  `innomktautoid` int(11) DEFAULT NULL,
  `stage_result` varchar(255) DEFAULT NULL,
  `last_update_result` datetime DEFAULT NULL,
  PRIMARY KEY (`result_id`) USING BTREE,
  CONSTRAINT `abmsco_innnomktauto_report_wf` FOREIGN KEY (`result_id`) REFERENCES `abmsco_innomktauto_client_report_v2` (`result_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT;

-- ----------------------------
-- Table structure for abmsco_innomktauto_send_queue
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_innomktauto_send_queue`;
CREATE TABLE `abmsco_innomktauto_send_queue` (
  `send_queue_id` int(11) NOT NULL AUTO_INCREMENT,
  `type` varchar(255) DEFAULT NULL,
  `status` varchar(255) DEFAULT NULL,
  `innomktautoid` int(11) NOT NULL,
  `client_id` int(11) NOT NULL,
  `content_id` int(11) DEFAULT NULL,
  `current_stage` varchar(255) DEFAULT NULL,
  `last_run` datetime DEFAULT NULL,
  PRIMARY KEY (`send_queue_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for abmsco_innomktauto_sendbulk_email
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_innomktauto_sendbulk_email`;
CREATE TABLE `abmsco_innomktauto_sendbulk_email` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `innomktautoid` int(11) DEFAULT NULL,
  `clientid` int(11) DEFAULT NULL,
  `current_stage` int(11) DEFAULT NULL,
  `module` varchar(255) DEFAULT NULL,
  `fromname` varchar(255) DEFAULT NULL,
  `fromemail` varchar(255) DEFAULT NULL,
  `toemail` varchar(255) DEFAULT NULL,
  `content` longtext,
  `subject` varchar(255) DEFAULT NULL,
  `batch` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=5540 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for abmsco_innomktauto_sendbulk_email_checkerror
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_innomktauto_sendbulk_email_checkerror`;
CREATE TABLE `abmsco_innomktauto_sendbulk_email_checkerror` (
  `email` varchar(255) NOT NULL,
  `client_id` int(11) DEFAULT NULL,
  `innomktautoid` int(11) DEFAULT NULL,
  `timesend` datetime DEFAULT NULL,
  `contentid` varchar(255) DEFAULT NULL,
  KEY `innomktauto_sendbulk_emailerror` (`email`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

-- ----------------------------
-- Table structure for abmsco_innomktauto_sendemail_smtp
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_innomktauto_sendemail_smtp`;
CREATE TABLE `abmsco_innomktauto_sendemail_smtp` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `batch` varchar(255) DEFAULT NULL,
  `innomktautoid` int(11) DEFAULT NULL,
  `client_id` int(11) DEFAULT NULL,
  `module` varchar(255) DEFAULT NULL,
  `content_id` int(11) DEFAULT NULL,
  `from_name` varchar(255) DEFAULT NULL,
  `sender` varchar(255) DEFAULT NULL,
  `to_email` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=10780 DEFAULT CHARSET=utf8mb4;

-- ----------------------------
-- Table structure for abmsco_innomktauto_stage
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_innomktauto_stage`;
CREATE TABLE `abmsco_innomktauto_stage` (
  `stageid` int(11) NOT NULL,
  `stage_type` varchar(50) NOT NULL,
  `stage_name` varchar(255) NOT NULL,
  `innomktautoid` int(11) NOT NULL,
  `triggerid` int(11) NOT NULL,
  `actionid` int(11) NOT NULL,
  `contentid` int(11) NOT NULL,
  `stage_label` varchar(255) NOT NULL,
  `stage_presence` int(11) DEFAULT NULL,
  `stage_limit_time` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`stageid`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for abmsco_innomktauto_stage_result
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_innomktauto_stage_result`;
CREATE TABLE `abmsco_innomktauto_stage_result` (
  `stage_result` varchar(255) DEFAULT NULL,
  `content_type` varchar(255) DEFAULT NULL,
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT;

-- ----------------------------
-- Table structure for abmsco_innomktauto_trigger
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_innomktauto_trigger`;
CREATE TABLE `abmsco_innomktauto_trigger` (
  `triggerid` int(11) NOT NULL,
  `stage_result_condition` varchar(255) DEFAULT NULL,
  `condition` text,
  `delaytime` varchar(255) DEFAULT NULL,
  `delaytimetype` varchar(255) DEFAULT NULL,
  `last_run` datetime DEFAULT NULL,
  `function` varchar(255) DEFAULT NULL,
  `ready_time` datetime DEFAULT NULL,
  PRIMARY KEY (`triggerid`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for abmsco_innomktauto_unsubcribes
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_innomktauto_unsubcribes`;
CREATE TABLE `abmsco_innomktauto_unsubcribes` (
  `crmid` int(11) NOT NULL,
  `key` text,
  `status` int(11) DEFAULT NULL,
  `innomktautoid` int(11) NOT NULL,
  PRIMARY KEY (`crmid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

-- ----------------------------
-- Table structure for abmsco_innomktautocf
-- ----------------------------
DROP TABLE IF EXISTS `abmsco_innomktautocf`;
CREATE TABLE `abmsco_innomktautocf` (
  `innomktautoid` int(11) NOT NULL,
  `unsubcribes` int(10) DEFAULT NULL,
  PRIMARY KEY (`innomktautoid`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

SET FOREIGN_KEY_CHECKS = 1;
```

Sau khi chạy xong SQL ở trên ( chạy trong ứng dụng Navicat ) thì kết quả như hình dưới

<figure><img src="/files/4ErYeH6EWPaigizKVziL" alt=""><figcaption></figcaption></figure>

**Bước 6: Chạy thực nghiệm RabbitMQ ( Cả 2 server )**

1. **Tạo một tập tin PHP mới**:\
   Tạo một tập tin PHP mới trong project, ví dụ `index.php`.
2. **Thêm phần thư viện AMQP vào composer.json**

Mở tệp `composer.json` bằng trình chỉnh sửa văn bản và thêm phần `"require"` với thư viện `php-amqp`:<br>

```json
{
  "require": {
    "maximebf/debugbar": "^1.15",
    "firebase/php-jwt": "^5.4",
    "google/apiclient": "^2.11",
    "phpoffice/phpspreadsheet": "1.22",
    "alhimik1986/php-excel-templator": "^1.0",
    "phpoffice/phpword": "^0.18.2",
    "cmixin/business-time": "^1.11",
    "ezyang/htmlpurifier": "4.13",
    "google/cloud-storage": "^1.30",
    "elasticsearch/elasticsearch": "^7.16.2",
    "guzzlehttp/guzzle": "^7.4",
    "slim/psr7": "^1.5",
    "php-amqplib/php-amqplib": "^3.5",
    "egulias/email-validator": "^2.1"
  }
}

```

\
\
Mở terminal chạy lệnh:\
composer update

3. **Demo code:**

```
<?php
require_once 'vendor/autoload.php';
 
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
 
$connection = new AMQPStreamConnection('10.0.1', 5672, 'demo', 'demo');
$channel = $connection->channel();
 
$queueName = 'hello';
 
$channel->queue_delete($queueName);
 
$channel->queue_declare($queueName, false, false, false, false);
 
$messageBody = 'Hello, RabbitMQ!';
$message = new AMQPMessage($messageBody);
 
$channel->basic_publish($message, '', $queueName);
 
echo " [x] Sent '$messageBody'\n";
 
$channel->close();
$connection->close();
?>
```

**2.4) Chạy thực nghiệm RabbitMQ đối với nhiều khách hàng**\
\
**A) Ở server 212**\
Mở terminal chạy lệnh:\
php modules/InnoMKTAuto/cron/rabbitmq/portal\_data.php 3vgLMFtlivmpAnEIfsmOgPvtZ2nI287ttc67iphH database\_demo\
\
Trong đó\
**unique\_com\_id tương ứng với mỗi khách hàng khác nhau** \
Ví dụ:\
vgLMFtlivmpAnEIfsmOgPvtZ2nI287ttc67iphH\
\
**Tên database cần truyền vào ở server 212:**\
database\_demo\
\
**B) Ở server 214:**\
Mở terminal chạy lệnh:

| php email/queue\_fifo.php 3vgLMFtlivmpAnEIfsmOgPvtZ2nI287ttc67iphH database\_demo\_rabbitmq |
| ------------------------------------------------------------------------------------------- |
| php email/sendgrid.php 3vgLMFtlivmpAnEIfsmOgPvtZ2nI287ttc67iphH database\_demo\_rabbitmq    |
| php email/smtp.php 3vgLMFtlivmpAnEIfsmOgPvtZ2nI287ttc67iphH database\_demo\_rabbitmq        |

\
\ <br>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://doc.abms.co/cac-chuc-nang-marketing/mkt-automation/huong-dan-deploy-rabbit-doi-voi-module-innomktauto.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
