Trò chuyện ổ cắm PHP

Trong bài đăng này, chúng tôi sẽ xây dựng một Ứng dụng trò chuyện PHP và Mysql đơn giản bằng cách sử dụng PHP Web Socket Ratchet. Nếu bạn đang tìm kiếm Cách tạo Ứng dụng trò chuyện trực tiếp hoặc thời gian thực bằng PHP thì bạn đã đến đúng nơi, vì trong bài đăng này, chúng tôi đã chia sẻ cho bạn cách tạo Ứng dụng trò chuyện trực tiếp PHP bằng WebSockets. Trong bài đăng này, chúng tôi sẽ tạo Ứng dụng trò chuyện trong đó nhiều người dùng có thể trò chuyện với những người dùng khác

Đây là bài đăng rất thú vị về Cách tạo Ứng dụng trò chuyện bằng PHP mà không cần sử dụng Ajax. Trong một bài viết trước của chúng tôi, chúng tôi đã xuất bản hướng dẫn về ứng dụng Trò chuyện trong PHP bằng cách sử dụng ajax. Nhưng như chúng ta đã biết trong hệ thống Chat, ứng dụng Chat dựa trên Ajax trong PHP không phải là giải pháp tốt nhất, điều này là do Ajax sẽ tăng tải cho máy chủ. Vì vậy, ở đây, chúng tôi đã sử dụng Ratchet PHP WebSockets để xây dựng ứng dụng trò chuyện trực tiếp theo thời gian thực bằng PHP và trong ứng dụng trò chuyện này, chúng tôi sẽ lưu trữ dữ liệu trò chuyện trong cơ sở dữ liệu Mysql khi một người dùng đăng trò chuyện trong hệ thống này

Từ hướng dẫn này, bạn không chỉ có thể tìm hiểu cách tạo ứng dụng trò chuyện nhóm hoặc trò chuyện nhiều người dùng bằng thư viện Ratchet WebSocket mà còn có thể tìm thấy giải pháp này cho từng người dùng hoặc ứng dụng trò chuyện riêng tư. Điều này là do dưới bài đăng này, chúng tôi sẽ kết hợp mã nguồn của hệ thống trò chuyện nhóm và mã nguồn hướng dẫn ứng dụng trò chuyện 1-1. Vì vậy, từ hướng dẫn duy nhất này, bạn có thể tìm ra giải pháp về cách tạo hệ thống trò chuyện nhóm và cách xây dựng ứng dụng trò chuyện 1-1 thời gian thực.

Tính năng của ứng dụng trò chuyện nhóm


Trong ứng dụng Trò chuyện nhóm này bằng cách sử dụng ổ cắm Web Ratchet, bạn có thể nhận được tính năng sau trong hướng dẫn này

  1. Khi một người dùng đã gửi tin nhắn trò chuyện thì người dùng khác được kết nối khác có thể nhận được tin nhắn trò chuyện bằng máy chủ máy khách Ratchet
  2. Trạng thái trực tuyến hoặc ngoại tuyến của người dùng sẽ được thay đổi sau khi làm mới trang

Tính năng của ứng dụng trò chuyện một đối một


Trong ứng dụng trò chuyện Một đối một hoặc Một người dùng hoặc Trò chuyện riêng tư này với thư viện Ratchet WebSocket, bạn có thể tìm thấy tính năng sau trong hướng dẫn này

  1. Gửi tin nhắn trò chuyện 1-1 trong thời gian thực bằng Thư viện Ratchet WebSocket
  2. Hiển thị hoặc ẩn Thông báo tin nhắn chưa đọc trong thời gian thực bằng Thư viện Ratchet WebSocket
  3. Hiển thị Trạng thái Trực tuyến hoặc Ngoại tuyến của Người dùng trong thời gian thực bằng Thư viện Ratchet WebSocket





WebSockets là gì?


WebSockets là một công cụ hai chiều và song công hoàn toàn, cung cấp kết nối liên tục từ trình duyệt web đến máy chủ của chúng tôi. Vì vậy, khi kết nối WebSocket đã được thiết lập trong trình duyệt của chúng tôi, thì nó sẽ mở kết nối cho đến khi máy khách hoặc máy chủ quyết định đóng kết nối này. Vì vậy, với kết nối mở này, người dùng hoặc máy chủ của chúng tôi có thể gửi hoặc nhận dữ liệu trò chuyện với nhau vào bất kỳ thời điểm nào và điều đó sẽ giúp lập trình web của chúng tôi hoàn toàn dựa trên sự kiện và không chỉ người dùng bắt đầu. Các lợi ích khác của ổ cắm web này là đồng thời trên một máy chủ đang chạy, nó sẽ kết nối tất cả các kết nối và nó sẽ cho phép chúng tôi giao tiếp với bất kỳ số lượng kết nối trực tiếp nào tại bất kỳ thời điểm nào. Vì vậy, đây là tất cả các lợi ích của WebSockets này trong lập trình Web này

Dựa trên những lợi ích này, chúng tôi đã sử dụng PHP WebSockets như Ratchet để xây dựng Ứng dụng trò chuyện bằng PHP và Mysql. Trong bài đăng này, chúng tôi sẽ hướng dẫn bạn từng bước cách xây dựng Ứng dụng trò chuyện bằng PHP bằng WebSocket từ đầu. Trong hướng dẫn Phát triển web PHP này, bạn có thể tìm hiểu cách chúng tôi có thể nhanh chóng xây dựng Ứng dụng trò chuyện với RatChet bằng cách sử dụng tập lệnh PHP và Cơ sở dữ liệu Mysql

Cơ sở dữ liệu của ứng dụng trò chuyện


Trước khi học ứng dụng chat, đầu tiên bạn cần tạo bảng lưu trữ dữ liệu ứng dụng chat trong cơ sở dữ liệu Mysql. Vì vậy, trước tiên bạn cần tạo các bảng bằng cách chạy tập lệnh Sql sau, bạn có thể tạo các bảng ứng dụng trò chuyện trong cơ sở dữ liệu mysql của mình



Tải xuống mã nguồn



Cơ sở dữ liệu của ứng dụng trò chuyện


Trước khi học ứng dụng chat, đầu tiên bạn cần tạo bảng lưu trữ dữ liệu ứng dụng chat trong cơ sở dữ liệu Mysql. Vì vậy, trước tiên bạn cần tạo các bảng bằng cách chạy tập lệnh Sql sau, bạn có thể tạo các bảng ứng dụng trò chuyện trong cơ sở dữ liệu mysql của mình


--
-- Database: `chat`
--

-- --------------------------------------------------------

--
-- Table structure for table `chatrooms`
--

CREATE TABLE `chatrooms` (
  `id` int(11) NOT NULL,
  `userid` int(11) NOT NULL,
  `msg` varchar(200) NOT NULL,
  `created_on` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Table structure for table `chat_user_table`
--

CREATE TABLE `chat_user_table` (
  `user_id` int(11) NOT NULL,
  `user_name` varchar(250) NOT NULL,
  `user_email` varchar(250) NOT NULL,
  `user_password` varchar(100) NOT NULL,
  `user_profile` varchar(100) NOT NULL,
  `user_status` enum('Disabled','Enable') NOT NULL,
  `user_created_on` datetime NOT NULL,
  `user_verification_code` varchar(100) NOT NULL,
  `user_login_status` enum('Logout','Login') NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

--
-- Indexes for dumped tables
--

--
-- Indexes for table `chatrooms`
--
ALTER TABLE `chatrooms`
  ADD PRIMARY KEY (`id`);

--
-- Indexes for table `chat_user_table`
--
ALTER TABLE `chat_user_table`
  ADD PRIMARY KEY (`user_id`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `chatrooms`
--
ALTER TABLE `chatrooms`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;

--
-- AUTO_INCREMENT for table `chat_user_table`
--
ALTER TABLE `chat_user_table`
  MODIFY `user_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=11;


Mã nguồn của ứng dụng trò chuyện PHP


Dưới đây bạn có thể tìm thấy tệp mã nguồn ứng dụng trò chuyện PHP

cơ sở dữ liệu/Database_connection. php


Tệp này chúng tôi sẽ sử dụng để tạo kết nối cơ sở dữ liệu trong ứng dụng trò chuyện này





cơ sở dữ liệu/Người dùng trò chuyện. php


Người dùng trò chuyện này. tệp lớp php mà chúng tôi đã sử dụng để xử lý dữ liệu người dùng ở phía máy chủ. Trong tệp lớp này, chúng tôi đã tạo phương thức set và get cho dữ liệu người dùng và sau đó, chúng tôi có phương thức tạo để kiểm tra người dùng đã đăng ký hay chưa và cuối cùng chúng tôi đã thực hiện chèn dữ liệu người dùng vào bảng mysql


connect = $database_object->connect();
	}

	function setUserId($user_id)
	{
		$this->user_id = $user_id;
	}

	function getUserId()
	{
		return $this->user_id;
	}

	function setUserName($user_name)
	{
		$this->user_name = $user_name;
	}

	function getUserName()
	{
		return $this->user_name;
	}

	function setUserEmail($user_email)
	{
		$this->user_email = $user_email;
	}

	function getUserEmail()
	{
		return $this->user_email;
	}

	function setUserPassword($user_password)
	{
		$this->user_password = $user_password;
	}

	function getUserPassword()
	{
		return $this->user_password;
	}

	function setUserProfile($user_profile)
	{
		$this->user_profile = $user_profile;
	}

	function getUserProfile()
	{
		return $this->user_profile;
	}

	function setUserStatus($user_status)
	{
		$this->user_status = $user_status;
	}

	function getUserStatus()
	{
		return $this->user_status;
	}

	function setUserCreatedOn($user_created_on)
	{
		$this->user_created_on = $user_created_on;
	}

	function getUserCreatedOn()
	{
		return $this->user_created_on;
	}

	function setUserVerificationCode($user_verification_code)
	{
		$this->user_verification_code = $user_verification_code;
	}

	function getUserVerificationCode()
	{
		return $this->user_verification_code;
	}

	function setUserLoginStatus($user_login_status)
	{
		$this->user_login_status = $user_login_status;
	}

	function getUserLoginStatus()
	{
		return $this->user_login_status;
	}

	function make_avatar($character)
	{
	    $path = "images/". time() . ".png";
		$image = imagecreate(200, 200);
		$red = rand(0, 255);
		$green = rand(0, 255);
		$blue = rand(0, 255);
	    imagecolorallocate($image, $red, $green, $blue);  
	    $textcolor = imagecolorallocate($image, 255,255,255);

	    $font = dirname(__FILE__) . '/font/arial.ttf';

	    imagettftext($image, 100, 0, 55, 150, $textcolor, $font, $character);
	    imagepng($image, $path);
	    imagedestroy($image);
	    return $path;
	}

	function get_user_data_by_email()
	{
		$query = "
		SELECT * FROM chat_user_table 
		WHERE user_email = :user_email
		";

		$statement = $this->connect->prepare($query);

		$statement->bindParam(':user_email', $this->user_email);

		if($statement->execute())
		{
			$user_data = $statement->fetch(PDO::FETCH_ASSOC);
		}
		return $user_data;
	}

	function save_data()
	{
		$query = "
		INSERT INTO chat_user_table (user_name, user_email, user_password, user_profile, user_status, user_created_on, user_verification_code) 
		VALUES (:user_name, :user_email, :user_password, :user_profile, :user_status, :user_created_on, :user_verification_code)
		";
		$statement = $this->connect->prepare($query);

		$statement->bindParam(':user_name', $this->user_name);

		$statement->bindParam(':user_email', $this->user_email);

		$statement->bindParam(':user_password', $this->user_password);

		$statement->bindParam(':user_profile', $this->user_profile);

		$statement->bindParam(':user_status', $this->user_status);

		$statement->bindParam(':user_created_on', $this->user_created_on);

		$statement->bindParam(':user_verification_code', $this->user_verification_code);

		if($statement->execute())
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	function is_valid_email_verification_code()
	{
		$query = "
		SELECT * FROM chat_user_table 
		WHERE user_verification_code = :user_verification_code
		";

		$statement = $this->connect->prepare($query);

		$statement->bindParam(':user_verification_code', $this->user_verification_code);

		$statement->execute();

		if($statement->rowCount() > 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	function enable_user_account()
	{
		$query = "
		UPDATE chat_user_table 
		SET user_status = :user_status 
		WHERE user_verification_code = :user_verification_code
		";

		$statement = $this->connect->prepare($query);

		$statement->bindParam(':user_status', $this->user_status);

		$statement->bindParam(':user_verification_code', $this->user_verification_code);

		if($statement->execute())
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	function update_user_login_data()
	{
		$query = "
		UPDATE chat_user_table 
		SET user_login_status = :user_login_status 
		WHERE user_id = :user_id
		";

		$statement = $this->connect->prepare($query);

		$statement->bindParam(':user_login_status', $this->user_login_status);

		$statement->bindParam(':user_id', $this->user_id);

		if($statement->execute())
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	function get_user_data_by_id()
	{
		$query = "
		SELECT * FROM chat_user_table 
		WHERE user_id = :user_id";

		$statement = $this->connect->prepare($query);

		$statement->bindParam(':user_id', $this->user_id);

		try
		{
			if($statement->execute())
			{
				$user_data = $statement->fetch(PDO::FETCH_ASSOC);
			}
			else
			{
				$user_data = array();
			}
		}
		catch (Exception $error)
		{
			echo $error->getMessage();
		}
		return $user_data;
	}

	function upload_image($user_profile)
	{
		$extension = explode('.', $user_profile['name']);
		$new_name = rand() . '.' . $extension[1];
		$destination = 'images/' . $new_name;
		move_uploaded_file($user_profile['tmp_name'], $destination);
		return $destination;
	}

	function update_data()
	{
		$query = "
		UPDATE chat_user_table 
		SET user_name = :user_name, 
		user_email = :user_email, 
		user_password = :user_password, 
		user_profile = :user_profile  
		WHERE user_id = :user_id
		";

		$statement = $this->connect->prepare($query);

		$statement->bindParam(':user_name', $this->user_name);

		$statement->bindParam(':user_email', $this->user_email);

		$statement->bindParam(':user_password', $this->user_password);

		$statement->bindParam(':user_profile', $this->user_profile);

		$statement->bindParam(':user_id', $this->user_id);

		if($statement->execute())
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	function get_user_all_data()
	{
		$query = "
		SELECT * FROM chat_user_table 
		";

		$statement = $this->connect->prepare($query);

		$statement->execute();

		$data = $statement->fetchAll(PDO::FETCH_ASSOC);

		return $data;
	}

}



?>




cơ sở dữ liệu/Phòng trò chuyện. php


Lớp này chúng tôi sẽ sử dụng cho hoạt động cơ sở dữ liệu của dữ liệu tin nhắn trò chuyện. Trong lớp này, chúng ta sẽ tạo hàm set và get cho quá trình thao tác liên quan đến cơ sở dữ liệu biểu mẫu dữ liệu trò chuyện. Bằng cách sử dụng lớp này, chúng tôi sẽ chèn hoặc lưu trữ tin nhắn trò chuyện trong cơ sở dữ liệu Mysql và tìm nạp dữ liệu trò chuyện từ cơ sở dữ liệu Mysql để hiển thị trên trang web


chat_id = $chat_id;
	}

	function getChatId()
	{
		return $this->chat_id;
	}

	function setUserId($user_id)
	{
		$this->user_id = $user_id;
	}

	function getUserId()
	{
		return $this->user_id;
	}

	function setMessage($message)
	{
		$this->message = $message;
	}

	function getMessage()
	{
		return $this->message;
	}

	function setCreatedOn($created_on)
	{
		$this->created_on = $created_on;
	}

	function getCreatedOn()
	{
		return $this->created_on;
	}

	public function __construct()
	{
		require_once("Database_connection.php");

		$database_object = new Database_connection;

		$this->connect = $database_object->connect();
	}

	function save_chat()
	{
		$query = "
		INSERT INTO chatrooms 
			(userid, msg, created_on) 
			VALUES (:userid, :msg, :created_on)
		";

		$statement = $this->connect->prepare($query);

		$statement->bindParam(':userid', $this->user_id);

		$statement->bindParam(':msg', $this->message);

		$statement->bindParam(':created_on', $this->created_on);

		$statement->execute();
	}

	function get_all_chat_data()
	{
		$query = "
		SELECT * FROM chatrooms 
			INNER JOIN chat_user_table 
			ON chat_user_table.user_id = chatrooms.userid 
			ORDER BY chatrooms.id ASC
		";

		$statement = $this->connect->prepare($query);

		$statement->execute();

		return $statement->fetchAll(PDO::FETCH_ASSOC);
	}
}
	
?>


đăng ký. php


Tệp này chúng tôi đã sử dụng để đăng ký người dùng ứng dụng Trò chuyện. Người dùng có thể đăng ký từ trang web này


setUserName($_POST['user_name']);

    $user_object->setUserEmail($_POST['user_email']);

    $user_object->setUserPassword($_POST['user_password']);

    $user_object->setUserProfile($user_object->make_avatar(strtoupper($_POST['user_name'][0])));

    $user_object->setUserStatus('Disabled');

    $user_object->setUserCreatedOn(date('Y-m-d H:i:s'));

    $user_object->setUserVerificationCode(md5(uniqid()));

    $user_data = $user_object->get_user_data_by_email();

    if(is_array($user_data) && count($user_data) > 0)
    {
        $error = 'This Email Already Register';
    }
    else
    {
        if($user_object->save_data())
        {

            $mail = new PHPMailer(true);

            $mail->isSMTP();

            $mail->Host = 'smtpout.secureserver.net';

            $mail->SMTPAuth = true;

            $mail->Username   = 'xxxxx';                     // SMTP username
            $mail->Password   = 'xxxxxx';

            $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;

            $mail->Port = 80;

            $mail->setFrom('[email protected]', 'Webslesson');

            $mail->addAddress($user_object->getUserEmail());

            $mail->isHTML(true);

            $mail->Subject = 'Registration Verification for Chat Application Demo';

            $mail->Body = '
            

Thank you for registering for Chat Application Demo.

This is a verification email, please click the link to verify your email address.

Click to Verify

Thank you...

'; $mail->send(); $success_message = 'Verification Email sent to ' . $user_object->getUserEmail() . ', so before login first verify your email'; } else { $error = 'Something went wrong try again'; } } } ?> Register | PHP Chat Application using Websocket


Chat Application in PHP & MySql using WebSocket - Email Verification

'.$error.'
'; } if($success_message != '') { echo '
'.$success_message.'
'; } ?>
Register

chỉ mục. php


Dưới tệp này, chúng tôi sẽ tạo trang đăng nhập cho ứng dụng trò chuyện này



setUserEmail($_POST['user_email']);

    $user_data = $user_object->get_user_data_by_email();

    if(is_array($user_data) && count($user_data) > 0)
    {
        if($user_data['user_status'] == 'Enable')
        {
            if($user_data['user_password'] == $_POST['user_password'])
            {
                $user_object->setUserId($user_data['user_id']);
                $user_object->setUserLoginStatus('Login');

                if($user_object->update_user_login_data())
                {
                    $_SESSION['user_data'][$user_data['user_id']] = [
                        'id'    =>  $user_data['user_id'],
                        'name'  =>  $user_data['user_name'],
                        'profile'   =>  $user_data['user_profile']
                    ];

                    header('location:chatroom.php');

                }
            }
            else
            {
                $error = 'Wrong Password';
            }
        }
        else
        {
            $error = 'Please Verify Your Email Address';
        }
    }
    else
    {
        $error = 'Wrong Email Address';
    }
}

?>






    
    
    
    

    Login | PHP Chat Application using Websocket

    
    

    

    

    
    
    

    
    

    




    


Chat Application in PHP & MySql using WebSocket - Login

'.$_SESSION["success_message"] .'
'; unset($_SESSION['success_message']); } if($error != '') { echo '
'.$error.'
'; } ?>
Login

xác minh. php


Mã nguồn tệp này sẽ xác minh địa chỉ email của người dùng và nó sẽ cho phép tài khoản người dùng đăng nhập vào hệ thống trò chuyện


setUserVerificationCode($_GET['code']);

    if($user_object->is_valid_email_verification_code())
    {
        $user_object->setUserStatus('Enable');

        if($user_object->enable_user_account())
        {
            $_SESSION['success_message'] = 'Your Email Successfully verify, now you can login into this chat Application';

            header('location:index.php');
        }
        else
        {
            $error = 'Something went wrong try again....';
        }
    }
    else
    {
        $error = 'Something went wrong try again....';
    }
}

?>






    
    
    
    

    Email Verify | PHP Chat Application using Websocket

    
    

    
    
    
    





    


PHP Chat Application using Websocket


phòng trò chuyện. php


phòng chat này. php sẽ chỉ được truy cập bởi người dùng đăng nhập, vì vậy khi người dùng đã đăng nhập vào ứng dụng trò chuyện này, thì hệ thống sẽ chuyển hướng trang đến phòng trò chuyện này. php và dưới tệp này, chúng tôi sẽ tạo phòng trò chuyện để mỗi người dùng có thể trò chuyện với nhau. Trong trang này, người dùng có thể xem ảnh hồ sơ của họ với liên kết chỉnh sửa hồ sơ và nút đăng xuất


get_all_chat_data();

$user_object = new ChatUser;

$user_data = $user_object->get_user_all_data();

?>




	Chat application in php using web scocket programming
	
    

    

    

    
    
    

    
    

    
	


	

PHP Chat Application using Websocket - Display User with Online or Offline Status


Chat Room

'.$from.' - '.$chat["msg"].'
'.$chat["created_on"].'
'; } ?>
$value) { $login_user_id = $value['id']; ?>
User List
0) { foreach($user_data as $key => $user) { $icon = ''; if($user['user_login_status'] == 'Login') { $icon = ''; } if($user['user_id'] != $login_user_id) { echo ' '.$user["user_name"].' '.$icon.' '; } } } ?>


Trò chuyện ổ cắm PHP





hoạt động. php


Tệp này đã nhận được yêu cầu ajax để người dùng đăng xuất khỏi ứng dụng người dùng trò chuyện. Trong tệp này, đầu tiên chúng tôi xóa giá trị biến phiên và sau đó chúng tôi xóa tất cả biến phiên và cung cấp giá trị trạng thái cho yêu cầu ajax ở định dạng json