Build A Polling System With WebSockets in PHP

We will build a voting system using WebSockets in PHP in this tutorial. Following are the features this application will have.

1. Admin page: A page to push questions to the voters

2. Voter page: A page for the voters

3. Results page: This is where we will show the results of the poll, usually for the admin

Admin Page

We will build the following admin page

Source code:

This is a simple HTML form that publishes a question (JSON object) on the voter side. We have created the following PHP function to publish the question to the PieSocket Server.

The above function is called when a user submits the form, using the code below:

Voter Page

Below is how the voter page looks at the beginning while it waits for questions to be pushed from the admin.php page. In the code example, we have used VueJS to build the UI.

Source code:

And this is how questions appear when they are pushed from the admin page. It shows a queue of all the questions that have been pushed and shows the latest question at the top with a button to publish answers.

When a question is published to the “question” channel from the admin page using the code snippet given above, we need to listen to the message events on the “question” channel from the voter page to receive the question.

We can do that using the code given below

First, include PieSocketJS in your HTML page using the script tag below

Now add the following javascript to listen to the events on the “question” channel.

You can find the complete source code on the GitHub repository linked at the end of this tutorial.

Result Page

Following is how the result page looks. When voters submit answers to a question we use the PHP “sendMessage” function written above to send the response to the results page and the UI is constructed with VueJS accordingly.

We will use a new channel “answer” to publish and subscribe to the polling responses.

Source code:

See it all in action in one place, we have uploaded the source code for the screens and functionalities discussed above in the following Github repository.

Feel free to leave a comment or ask anything!