In this post, we are going to build a simple PHP and Mysql Chat Application using PHP Web Socket Ratchet. If you are looking for How to create Live or Real time chat Application in PHP then you have come on the right place, because in this post we have share you how to create Live Chat Application PHP with WebSockets. In this post, we will create Chat Application in which multiple user can chat with other users.
This is very interesting post on How to create chat App in PHP without using Ajax. In one of our previous post, we have already published tutorial on Chat application in PHP using ajax. But As we have know in Chat system, Ajax based Chat application in PHP is not best solution, this is because Ajax will increases the load on the server. So for this here we have use Ratchet PHP WebSockets for build real-time live chat application in PHP and in this chat app we will store chat data in Mysql database when one user has post chat under this system.
From this tutorial you can learn not only how to make group chat or multi user chat application using Ratchet WebSocket library but also you can also find this solution of one to one or single user or private chat application also. This is because under this post we will combine source code of group chat system and one to one chat application tutorial source code also. So from this single tutorial you can find solution for how to make group chat system and how to build real time one to one chat application also.
Feature of Group Chat Application
Under this Group Chat application using Ratchet Web socket you can get following feature under this tutorial.
- Once single user has send chat message then other connected other user can received chat message using Ratchet client server.
- User online or Offline status will be change after page refresh
Feature of One to One Chat Application
Under this One to one or Single User or Private chat application with Ratchet WebSocket library you can find following feature under this tutorial.
- Send One to One Chat Message in Real-time using Ratchet WebSocket Library
- Display or Hide Unread Message Notification in Real-time using Ratchet WebSocket Library
- Display User Online or Offline Status in Real-time using Ratchet WebSocket Library
What is WebSockets?
WebSockets is a bi-directional and full-duplex which has provide persistent connection from a web browser to our server. So when WebSocket connection has been established in our browser, then it will open connection until client or server has decides to close this connection. So by with this open connection, the user or our server can send or receive chat data at any given time to the each other and it will makes our web programming completely on event driven and not just user started off. The other benefits of this websockets is that, at the same time on single running server, it will connect all connection and it will allowing us to communicate with any number of live connection at the any given time. So this are all benefits of this WebSockets in this Web programming.
Based on this benefits, we have use PHP WebSockets like Ratchet for build Chat Application in PHP and Mysql. Under this post, we will learn you step by step how to build Chat Application in PHP using WebSocket from scratch. Under this PHP Web Development tutorial, you can learn how can we quickly build at Chat App with RatChet using PHP script and Mysql Database.
Database of Chat Application
Before learning chat application, first you need to make tables for store chat application data in Mysql database. So first you need to create tables by run following Sql script you can create chat application tables in you mysql database.
Database of Chat Application
Before learning chat application, first you need to make tables for store chat application data in Mysql database. So first you need to create tables by run following Sql script you can create chat application tables in you mysql database.
--
-- 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;
Source Code of PHP Chat Application
Below you can find PHP Chat Application Source code file.
database/Database_connection.php
This file we will use for make database connection under this chat application.
<?php
//Database_connection.php
class Database_connection
{
function connect()
{
$connect = new PDO("mysql:host=localhost; dbname=chat", "root", "");
return $connect;
}
}
?>
database/ChatUser.php
This ChatUser.php class file we have use for process user data at server side. Under this class file we have make set and get method for user data and after this we have make method for check user already register or not and lastly we have make insert user data in mysql table.
<?php
//ChatUser.php
class ChatUser
{
private $user_id;
private $user_name;
private $user_email;
private $user_password;
private $user_profile;
private $user_status;
private $user_created_on;
private $user_verification_code;
private $user_login_status;
public $connect;
public function __construct()
{
require_once('Database_connection.php');
$database_object = new Database_connection;
$this->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;
}
}
?>
database/ChatRooms.php
This class we will use for database operation of chat message data. Under this class we will make set and get function for process chat data form database related operation. By using this class we will insert or store chat message in Mysql database and fetch chat data from Mysql database for display on web page.
<?php
class ChatRooms
{
private $chat_id;
private $user_id;
private $message;
private $created_on;
protected $connect;
public function setChatId($chat_id)
{
$this->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);
}
}
?>
register.php
This file we have use for get Chat application user registration. User can register from this web page.
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php';
$error = '';
$success_message = '';
if(isset($_POST["register"]))
{
session_start();
if(isset($_SESSION['user_data']))
{
header('location:chatroom.php');
}
require_once('database/ChatUser.php');
$user_object = new ChatUser;
$user_object->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('tutorial@webslesson.info', 'Webslesson');
$mail->addAddress($user_object->getUserEmail());
$mail->isHTML(true);
$mail->Subject = 'Registration Verification for Chat Application Demo';
$mail->Body = '
<p>Thank you for registering for Chat Application Demo.</p>
<p>This is a verification email, please click the link to verify your email address.</p>
<p><a href="http://localhost/tutorial/chat_application/verify.php?code='.$user_object->getUserVerificationCode().'">Click to Verify</a></p>
<p>Thank you...</p>
';
$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';
}
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">
<title>Register | PHP Chat Application using Websocket</title>
<!-- Bootstrap core CSS -->
<link href="vendor-front/bootstrap/bootstrap.min.css" rel="stylesheet">
<link href="vendor-front/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="vendor-front/parsley/parsley.css"/>
<!-- Bootstrap core JavaScript -->
<script src="vendor-front/jquery/jquery.min.js"></script>
<script src="vendor-front/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- Core plugin JavaScript-->
<script src="vendor-front/jquery-easing/jquery.easing.min.js"></script>
<script type="text/javascript" src="vendor-front/parsley/dist/parsley.min.js"></script>
</head>
<body>
<div class="containter">
<br />
<br />
<h1 class="text-center">Chat Application in PHP & MySql using WebSocket - Email Verification</h1>
<div class="row justify-content-md-center">
<div class="col col-md-4 mt-5">
<?php
if($error != '')
{
echo '
<div class="alert alert-warning alert-dismissible fade show" role="alert">
'.$error.'
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
';
}
if($success_message != '')
{
echo '
<div class="alert alert-success">
'.$success_message.'
</div>
';
}
?>
<div class="card">
<div class="card-header">Register</div>
<div class="card-body">
<form method="post" id="register_form">
<div class="form-group">
<label>Enter Your Name</label>
<input type="text" name="user_name" id="user_name" class="form-control" data-parsley-pattern="/^[a-zA-Z\s]+$/" required />
</div>
<div class="form-group">
<label>Enter Your Email</label>
<input type="text" name="user_email" id="user_email" class="form-control" data-parsley-type="email" required />
</div>
<div class="form-group">
<label>Enter Your Password</label>
<input type="password" name="user_password" id="user_password" class="form-control" data-parsley-minlength="6" data-parsley-maxlength="12" data-parsley-pattern="^[a-zA-Z]+$" required />
</div>
<div class="form-group text-center">
<input type="submit" name="register" class="btn btn-success" value="Register" />
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
<script>
$(document).ready(function(){
$('#register_form').parsley();
});
</script>
index.php
Under this file we will make login page for this chat application.
<?php
session_start();
$error = '';
if(isset($_SESSION['user_data']))
{
header('location:chatroom.php');
}
if(isset($_POST['login']))
{
require_once('database/ChatUser.php');
$user_object = new ChatUser;
$user_object->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';
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">
<title>Login | PHP Chat Application using Websocket</title>
<!-- Bootstrap core CSS -->
<link href="vendor-front/bootstrap/bootstrap.min.css" rel="stylesheet">
<link href="vendor-front/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="vendor-front/parsley/parsley.css"/>
<!-- Bootstrap core JavaScript -->
<script src="vendor-front/jquery/jquery.min.js"></script>
<script src="vendor-front/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- Core plugin JavaScript-->
<script src="vendor-front/jquery-easing/jquery.easing.min.js"></script>
<script type="text/javascript" src="vendor-front/parsley/dist/parsley.min.js"></script>
</head>
<body>
<div class="containter">
<br />
<br />
<h1 class="text-center">Chat Application in PHP & MySql using WebSocket - Login</h1>
<div class="row justify-content-md-center mt-5">
<div class="col-md-4">
<?php
if(isset($_SESSION['success_message']))
{
echo '
<div class="alert alert-success">
'.$_SESSION["success_message"] .'
</div>
';
unset($_SESSION['success_message']);
}
if($error != '')
{
echo '
<div class="alert alert-danger">
'.$error.'
</div>
';
}
?>
<div class="card">
<div class="card-header">Login</div>
<div class="card-body">
<form method="post" id="login_form">
<div class="form-group">
<label>Enter Your Email Address</label>
<input type="text" name="user_email" id="user_email" class="form-control" data-parsley-type="email" required />
</div>
<div class="form-group">
<label>Enter Your Password</label>
<input type="password" name="user_password" id="user_password" class="form-control" required />
</div>
<div class="form-group text-center">
<input type="submit" name="login" id="login" class="btn btn-primary" value="Login" />
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
<script>
$(document).ready(function(){
$('#login_form').parsley();
});
</script>
verify.php
This file source code will verify user email address and it will enable user account for login into chat system.
<?php
//verify.php
$error = '';
session_start();
if(isset($_GET['code']))
{
require_once('database/ChatUser.php');
$user_object = new ChatUser;
$user_object->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....';
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">
<title>Email Verify | PHP Chat Application using Websocket</title>
<!-- Bootstrap core CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<!-- Bootstrap core JavaScript -->
<script src="https://code.jquery.com/jquery-3.5.1.js" integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
</head>
<body>
<div class="containter">
<br />
<br />
<h1 class="text-center">PHP Chat Application using Websocket</h1>
<div class="row justify-content-md-center">
<div class="col col-md-4 mt-5">
<div class="alert alert-danger">
<h2><?php echo $error; ?></h2>
</div>
</div>
</div>
</div>
</body>
</html>
chatroom.php
This chatroom.php will be only access by login user, so once user has been login into this chat application, then system will redirect page to this chatroom.php file and under this file we will make chat room, so each user can chat with each other. Under this page, user can see their profile picture with edit profile and logout button link also.
<?php
session_start();
if(!isset($_SESSION['user_data']))
{
header('location:index.php');
}
require('database/ChatUser.php');
require('database/ChatRooms.php');
$chat_object = new ChatRooms;
$chat_data = $chat_object->get_all_chat_data();
$user_object = new ChatUser;
$user_data = $user_object->get_user_all_data();
?>
<!DOCTYPE html>
<html>
<head>
<title>Chat application in php using web scocket programming</title>
<!-- Bootstrap core CSS -->
<link href="vendor-front/bootstrap/bootstrap.min.css" rel="stylesheet">
<link href="vendor-front/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="vendor-front/parsley/parsley.css"/>
<!-- Bootstrap core JavaScript -->
<script src="vendor-front/jquery/jquery.min.js"></script>
<script src="vendor-front/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- Core plugin JavaScript-->
<script src="vendor-front/jquery-easing/jquery.easing.min.js"></script>
<script type="text/javascript" src="vendor-front/parsley/dist/parsley.min.js"></script>
<style type="text/css">
html,
body {
height: 100%;
width: 100%;
margin: 0;
}
#wrapper
{
display: flex;
flex-flow: column;
height: 100%;
}
#remaining
{
flex-grow : 1;
}
#messages {
height: 200px;
background: whitesmoke;
overflow: auto;
}
#chat-room-frm {
margin-top: 10px;
}
#user_list
{
height:450px;
overflow-y: auto;
}
#messages_area
{
height: 650px;
overflow-y: auto;
background-color:#e6e6e6;
}
</style>
</head>
<body>
<div class="container">
<br />
<h3 class="text-center">PHP Chat Application using Websocket - Display User with Online or Offline Status</h3>
<br />
<div class="row">
<div class="col-lg-8">
<div class="card">
<div class="card-header"><h3>Chat Room</h3></div>
<div class="card-body" id="messages_area">
<?php
foreach($chat_data as $chat)
{
if(isset($_SESSION['user_data'][$chat['userid']]))
{
$from = 'Me';
$row_class = 'row justify-content-start';
$background_class = 'text-dark alert-light';
}
else
{
$from = $chat['user_name'];
$row_class = 'row justify-content-end';
$background_class = 'alert-success';
}
echo '
<div class="'.$row_class.'">
<div class="col-sm-10">
<div class="shadow-sm alert '.$background_class.'">
<b>'.$from.' - </b>'.$chat["msg"].'
<br />
<div class="text-right">
<small><i>'.$chat["created_on"].'</i></small>
</div>
</div>
</div>
</div>
';
}
?>
</div>
</div>
<form method="post" id="chat_form" data-parsley-errors-container="#validation_error">
<div class="input-group mb-3">
<textarea class="form-control" id="chat_message" name="chat_message" placeholder="Type Message Here" data-parsley-maxlength="1000" data-parsley-pattern="/^[a-zA-Z0-9\s]+$/" required></textarea>
<div class="input-group-append">
<button type="submit" name="send" id="send" class="btn btn-primary"><i class="fa fa-paper-plane"></i></button>
</div>
</div>
<div id="validation_error"></div>
</form>
</div>
<div class="col-lg-4">
<?php
$login_user_id = '';
foreach($_SESSION['user_data'] as $key => $value)
{
$login_user_id = $value['id'];
?>
<input type="hidden" name="login_user_id" id="login_user_id" value="<?php echo $login_user_id; ?>" />
<div class="mt-3 mb-3 text-center">
<img src="<?php echo $value['profile']; ?>" width="150" class="img-fluid rounded-circle img-thumbnail" />
<h3 class="mt-2"><?php echo $value['name']; ?></h3>
<a href="profile.php" class="btn btn-secondary mt-2 mb-2">Edit</a>
<input type="button" class="btn btn-primary mt-2 mb-2" name="logout" id="logout" value="Logout" />
</div>
<?php
}
?>
<div class="card mt-3">
<div class="card-header">User List</div>
<div class="card-body" id="user_list">
<div class="list-group list-group-flush">
<?php
if(count($user_data) > 0)
{
foreach($user_data as $key => $user)
{
$icon = '<i class="fa fa-circle text-danger"></i>';
if($user['user_login_status'] == 'Login')
{
$icon = '<i class="fa fa-circle text-success"></i>';
}
if($user['user_id'] != $login_user_id)
{
echo '
<a class="list-group-item list-group-item-action">
<img src="'.$user["user_profile"].'" class="img-fluid rounded-circle img-thumbnail" width="50" />
<span class="ml-1"><strong>'.$user["user_name"].'</strong></span>
<span class="mt-2 float-right">'.$icon.'</span>
</a>
';
}
}
}
?>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
<script type="text/javascript">
$(document).ready(function(){
var conn = new WebSocket('ws://localhost:8080');
conn.onopen = function(e) {
console.log("Connection established!");
};
conn.onmessage = function(e) {
console.log(e.data);
var data = JSON.parse(e.data);
var row_class = '';
var background_class = '';
if(data.from == 'Me')
{
row_class = 'row justify-content-start';
background_class = 'text-dark alert-light';
}
else
{
row_class = 'row justify-content-end';
background_class = 'alert-success';
}
var html_data = "<div class='"+row_class+"'><div class='col-sm-10'><div class='shadow-sm alert "+background_class+"'><b>"+data.from+" - </b>"+data.msg+"<br /><div class='text-right'><small><i>"+data.dt+"</i></small></div></div></div></div>";
$('#messages_area').append(html_data);
$("#chat_message").val("");
};
$('#chat_form').parsley();
$('#messages_area').scrollTop($('#messages_area')[0].scrollHeight);
$('#chat_form').on('submit', function(event){
event.preventDefault();
if($('#chat_form').parsley().isValid())
{
var user_id = $('#login_user_id').val();
var message = $('#chat_message').val();
var data = {
userId : user_id,
msg : message
};
conn.send(JSON.stringify(data));
$('#messages_area').scrollTop($('#messages_area')[0].scrollHeight);
}
});
$('#logout').click(function(){
user_id = $('#login_user_id').val();
$.ajax({
url:"action.php",
method:"POST",
data:{user_id:user_id, action:'leave'},
success:function(data)
{
var response = JSON.parse(data);
if(response.status == 1)
{
conn.close();
location = 'index.php';
}
}
})
});
});
</script>
</html>
action.php
This file has received ajax request for user logout from chat user application. Under this file, first we have remove session variable value and then after we have remove all session variable and give status value to ajax request in json format.
<?php
//action.php
session_start();
if(isset($_POST['action']) && $_POST['action'] == 'leave')
{
require('database/ChatUser.php');
$user_object = new ChatUser;
$user_object->setUserId($_POST['user_id']);
$user_object->setUserLoginStatus('Logout');
if($user_object->update_user_login_data())
{
unset($_SESSION['user_data']);
session_destroy();
echo json_encode(['status'=>1]);
}
}
?>
src/Chat.php
<?php
//Chat.php
namespace MyApp;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
require dirname(__DIR__) . "/database/ChatUser.php";
require dirname(__DIR__) . "/database/ChatRooms.php";
class Chat implements MessageComponentInterface {
protected $clients;
public function __construct() {
$this->clients = new \SplObjectStorage;
echo 'Server Started';
}
public function onOpen(ConnectionInterface $conn) {
// Store the new connection to send messages to later
echo 'Server Started';
$this->clients->attach($conn);
echo "New connection! ({$conn->resourceId})\n";
}
public function onMessage(ConnectionInterface $from, $msg) {
$numRecv = count($this->clients) - 1;
echo sprintf('Connection %d sending message "%s" to %d other connection%s' . "\n"
, $from->resourceId, $msg, $numRecv, $numRecv == 1 ? '' : 's');
$data = json_decode($msg, true);
$chat_object = new \ChatRooms;
$chat_object->setUserId($data['userId']);
$chat_object->setMessage($data['msg']);
$chat_object->setCreatedOn(date("Y-m-d h:i:s"));
$chat_object->save_chat();
$user_object = new \ChatUser;
$user_object->setUserId($data['userId']);
$user_data = $user_object->get_user_data_by_id();
$user_name = $user_data['user_name'];
$data['dt'] = date("d-m-Y h:i:s");
foreach ($this->clients as $client) {
/*if ($from !== $client) {
// The sender is not the receiver, send to each client connected
$client->send($msg);
}*/
if($from == $client)
{
$data['from'] = 'Me';
}
else
{
$data['from'] = $user_name;
}
$client->send(json_encode($data));
}
}
public function onClose(ConnectionInterface $conn) {
// The connection is closed, remove it, as we can no longer send it messages
$this->clients->detach($conn);
echo "Connection {$conn->resourceId} has disconnected\n";
}
public function onError(ConnectionInterface $conn, \Exception $e) {
echo "An error has occurred: {$e->getMessage()}\n";
$conn->close();
}
}
?>
bin/server.php
<?php
//server.php
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat;
require dirname(__DIR__) . '/vendor/autoload.php';
$server = IoServer::factory(
new HttpServer(
new WsServer(
new Chat()
)
),
8080
);
$server->run();
?>
composer.json
{
"autoload": {
"psr-4": {
"MyApp\\": "src"
}
},
"require": {
"phpmailer/phpmailer": "^6.2",
"cboden/ratchet": "v0.4"
}
}
where is the code?
ReplyDeleteWe will published video tutorial of this Chat application tutorial series very soon, so on every published of video part, we will add that part source code under this web page, so wait it.
Deletethank you so much sir/ma'am for all kind of tutorials and source code
DeleteHi, we have add source code link under this post, so download complete source code from this post, so check it.
DeleteThe register is not working
ReplyDeleteneed source code
ReplyDeleteWe will published video tutorial of this Chat application tutorial series very soon, so on every published of video part, we will add that part source code under this web page, so wait it.
DeleteHi, we have add source code link under this post, so check it.
DeleteWhat is the password?
DeleteHello friend, will you post the code?
ReplyDeleteWe will published video tutorial of this Chat application tutorial series very soon, so on every published of video part, we will add that part source code under this web page, so wait it.
DeleteHi we have add source code download link, so check it.
Deletewhere is the code
ReplyDeleteWe will published video tutorial of this Chat application tutorial series very soon, so on every published of video part, we will add that part source code under this web page, so wait it.
DeleteAwesome waiting for source code
ReplyDeleteHi, we have add source code link, so check it...
DeleteAwesome waiting for source code
ReplyDeleteHi, we have add source code link under this post, so check it.
DeleteWaste of time. Absolutely no excuse not to provide the source code on Gitbub (or somewhere)!
ReplyDeletesame to you
Deletedo better
DeleteHi we have update source code link check it.
DeleteStill can not extract download file because it ask for Password will share it?
Deletenice but not working demo
ReplyDeleteHey, is working...but needs some more details...anyway thank you.
ReplyDeletefor everybody, after copying the provided files in a directory (mine was "webchat"), you need to:
1) install composer in your server https://getcomposer.org/download/
2) go to the directory where you copy the files, and in the bin dir (in mycase /var/www/html/webchat/bin) and run "php chat-server.php" (without hyphens) ... now your server is listening.
3) at this point you have to edit the chatroom.php file and in particular at line 116 you have to change "ws://localhost:8080" with "ws://www.yourserver.com:8080
4) make sure that the port 8080 is open
5) change the smtp server in the register.php file on line 58 to :
$mail->Host = 'yourSMTPShost';
$mail->SMTPAuth = true;
$mail->Username = 'yourUsername'; // Here enter your SMTP Username
$mail->Password = 'yourPassword'; //Here enter your SMTP Password
$mail->SMTPSecure = 'tls'; //this line depends of your smtp's auth method in my case tls.
//$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587; // if TLS
That's all, enjoy! and thanks again
I edited as you told me to do in
Delete5) change the smtp server in the register.php file on line 58 to :
$mail->Host = 'yourSMTPShost';
$mail->SMTPAuth = true;
$mail->Username = 'yourUsername'; // Here enter your SMTP Username
$mail->Password = 'yourPassword'; //Here enter your SMTP Password
$mail->SMTPSecure = 'tls'; //this line depends of your smtp's auth method in my case tls.
//$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587; // if TLS
but it appears
Fatal error: Uncaught exception 'phpmailerException' with message 'SMTP Error: Could not authenticate.' in C:\xampp\htdocs\lib\phpmailer\class.phpmailer.php:1697 Stack trace: #0 C:\xampp\htdocs\lib\phpmailer\class.phpmailer.php(1540): PHPMailer->smtpConnect(Array) #1 C:\xampp\htdocs\lib\phpmailer\class.phpmailer.php(1335): PHPMailer->smtpSend('Date: Mon, 19 A...', '\n postSend() #3 C:\xampp\htdocs\webdev\chat_application\register.php(105): PHPMailer->send() #4 {main} thrown in C:\xampp\htdocs\lib\phpmailer\class.phpmailer.php on line 1697
How to fix this?
Topic 2) 2) go to the directory where you copy the files, and in the bin dir (in mycase /var/www/html/webchat/bin) and run "php chat-server.php" (without hyphens) ... now your server is listening.
DeleteI go to my bin: webdev/chat_application/bin (which has only 1 file server.php) and in the terminal i run as you mentioned: php server.php but error occurs "PHP Fatal error: Class 'Ratchet\Server\IoServer' not found in C:\xampp\htdocs\webdev\chat_application\bin\server.php on line 12" How to fix it please?
Sending message to a specific connected user?
ReplyDeleteThis feature we will add in upcoming part.
Deleteteacher, why not register section?
ReplyDeletehello thanks
ReplyDeletewhy not register section?
not unzip file
ReplyDeleteNot Unzip File
ReplyDeleteSir if I want to contribute and add some posts, how can i officially contact you?
ReplyDeleteThanks for the lesson
ReplyDeleteI would be very happy if you can do it as Laravel
i work server but error. "Uncaught DOMException: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state."
ReplyDeletewhat is the password?
ReplyDeletewhat is the password of archive Zip?
ReplyDeletedid you ever get the password to zip file?
DeleteSecond last line of video description is the password for zip file source code. So check it again.
DeleteHow do you get a guest login
ReplyDeletePrivate chat not working for me... I don't have users listing and missing sql table from MySQL config file.
ReplyDeletesolved
DeleteHi, if you solved it where can I find missing SQL?
DeleteBugs for One to One Chat App : no auto-refresh conv, no autoscroll and sql table reports with errors....
ReplyDeletei solved this problem ^^
DeleteCan i know how you solve the auto-refresh conv prob?
DeleteHello, following the PHP chat tutorial with socket.io, I propose to put the following features :
ReplyDeleteStatus seen/unseen,
To emit a sound at the time of a new notification like Messenger,
The one to one chat, update live messages,
Typing feature,
Take this opportunity to add the possibility to insert emojis, to edit a message and update it everywhere, to insert files and link preview system like Facebook Messenger.
If you can answer me please to know when it will be released.
Thanks
Hi, the authentication is not working because you provide the SQL with missing fields... like user_token for example
ReplyDeleteplease i need to work with websocket in cpanel how its works
ReplyDeleteWhat is the password to get access to the zip source code? i've watched the video, and did not get the password...
ReplyDeleteSecond last line of video description is the password for zip file source code. So check it again.
DeleteGot it. Thank you.
DeleteI cant find, what is it?
DeleteHi, the sql query to create the db is not complete, It lacks parameters such as the user token, and the table of private chats. Thank you very much for taking the time to teach us.
ReplyDeleteIt requires a password to unzip the folder:
ReplyDeleteEmail:oluwatobiisaiah0409@gmail.com.
Hello, i got this error : WebSocket connection to 'ws://localhost:8080/' failed: chatroom.php:178 WebSocket is already in CLOSING or CLOSED state.
ReplyDeletePlease help what to do now.
Run server.php in bin folder
Deletewhere is 'chat_message' table sql, for private chat?
ReplyDeleteWhen I change the database name, the messages no longer get saved. I can still create new accounts though. Please why is this?
ReplyDeleteunable to login i am using PHP 7.4 (ea-php74)
ReplyDeleteHi! I got an error while creating an user image. How can I fix or delete this function?
ReplyDeletewhere is 'chat_message' table sql, for private chat?
ReplyDeleteIntegrate smileys / emojis into the chat
ReplyDeleteso that you can upload smileys / emojis
--
--
--
DROP TABLE IF EXISTS ###prefix###smileys;
-- limit --
CREATE TABLE ###prefix###smileys (
smileys_id int(5) NOT NULL auto_increment,
smileys_sign varchar(20) NOT NULL,
smileys_kat varchar(25) DEFAULT NULL,
smileys_img varchar(100) NOT NULL,
PRIMARY KEY (etchat_smileys_id)
);
-- limit --
where is example of One to One chat ?
ReplyDeletei need source code of that
There is a password request to open files. How to get it?
ReplyDeletePls send me "chat_message" table fields.
ReplyDeleteHi, thank you for the scource, i am using it to build my own chat app. Could you please show me a data example in the SQL table "user_profile"? I dont need the verification and registration feature, but now i cant automatically create a user so i dont know what kind of data is there. But to edit the profile i need the data, otherwise i have errors.
ReplyDeleteThank you in advance!
Please how can i host this app to the network ?
ReplyDeleteIam getting the error Uncaught DOMException: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state."
ReplyDeletehow you deploy it on real host ?
ReplyDeleteHello Sir When I unzip source code it asks for password to unzip file will you guide me how I should have to proceed.
ReplyDeletewhat is the password of zip folder?
ReplyDelete