Table of Contents
How is ReactJS and PHP compatibility in game development?
Can I use PHP for game logic in ReactJS games?
What are the benefits of using ReactJS for game development?
What are the advantages of using PHP for game development?
How to start developing games with ReactJS and PHP?
What resources or libraries are there to help with game development using ReactJS and PHP?
Can I build multiplayer games using ReactJS and PHP?
What type of game can I build using ReactJS and PHP?
How to process data in a game developed using ReactJS and PHP?
How to process user input in a game developed using ReactJS?
Home Backend Development PHP Tutorial Game Development with React and PHP: How Compatible Are They?

Game Development with React and PHP: How Compatible Are They?

Feb 09, 2025 am 11:42 AM

Game Development with React and PHP: How Compatible Are They?

Core points

  • Use React and PHP to jointly develop games. React is responsible for the front-end user interface, and PHP manages the back-end and game logic.
  • The setup process of game development includes setting up an asynchronous PHP server, using Laravel Mix in non-Laravel projects, and using WebSockets to connect backends and frontends.
  • Aerys library can be used in the HTTP and WebSocket portions of an application, supporting high concurrency and WebSockets.
  • Laravel Mix can be used to build ReactJS files, even in non-Laravel projects, and it provides an easy way to configure and extend the build chain.
  • WebSockets can be used to connect backends and frontends, allowing real-time communication between servers and clients.

I started thinking about this from the moment I decided to try building a game with PHP and React. "I want to make a multiplayer economic game, similar to Stardew Valley, but without dating content and have a player-driven economic system." The question is, my dynamics of multiplayer games, or how Thinking about and implementing a player-based economic system is ignorant.

Game Development with React and PHP: How Compatible Are They?

I'm not even sure I know enough React knowledge to justify using it. I mean, my initial interface—I was very focused on the economics of servers and games—is perfect for React. But what when I start making the farming/interactive aspect of things? I like the idea of ​​building isometric interfaces around economic systems.

I have watched a speech by dead_lugosi, who described the process of building a medieval game with PHP. Margaret inspired me, and that speech was one of the reasons why I wrote a book about JS game development. I am determined to write down my experience. Maybe others can learn from my mistakes, too.


(The code for this part can be found at: github.com/assertchris-tutorials/sitepoint-making-games/tree/part-1. I have matched it in PHP 7.1 and the latest version of Google Chrome It was tested. )


Back-end settings

I first searched for guidance on building a multi-person economic system. I found an excellent Stack Overflow post where people explain various things to consider. I've been halfway through before I realize I might have started in the wrong place. "First: I need a PHP server. I'll have a bunch of React clients, so I want something that can handle high concurrency (and maybe even WebSockets). It needs to be persistent: things have to be even if the player is not online. Occurs. ”

I started setting up an asynchronous PHP server - to handle high concurrency and support WebSockets. I added my recent work with PHP preprocessor to make things clearer and created the first few endpoints.

Fromconfig.pre:

$host = new Aerys\Host();
$host->expose("*", 8080);

$host->use($router = Aerys\router());
$host->use($root = Aerys\root(.."/public"));

$web = process .."/routes/web.pre";
$web($router);

$api = process .."/routes/api.pre";
$api($router);
Copy after login
Copy after login

I decided to use Aerys for the HTTP and WebSocket parts of the application. This code looks very different from the Aerys documentation, but that's because I have a good understanding of what I need.

The usual process of running an Aerys application is to use a command like this:

vendor/bin/aerys -d -c config.php
Copy after login
Copy after login

There is a lot of code to be repeated, and it doesn't handle the fact that I want to preprocess using PHP. I created a loader file.

Fromloader.php:

return Pre\processAndRequire(__DIR__ . "/config.pre");
Copy after login
Copy after login

Then I installed my dependencies. This is from composer.json:

"require": {
  "amphp/aerys": "dev-amp_v2",
  "amphp/parallel": "dev-master",
  "league/container": "^2.2",
  "league/plates": "^3.3",
  "pre/short-closures": "^0.4.0"
},
"require-dev": {
  "phpunit/phpunit": "^6.0"
},
Copy after login
Copy after login

I want to use amphp/parallel to move the blocking code out of the asynchronous server, but it cannot be installed with the stable tag of amphp/aerys. This is why I use the dev-amp_v2 branch.

I think it's a good idea to include some kind of template engine and service locator. I chose each version of PHP League. Finally, I added pre/short-closures, which is used both to handle the custom syntax in config.pre, and also to the short closures I plan to use later...

Then I started creating the routing file. From routes/web.pre:

use Aerys\Router;
use App\Action\HomeAction;

return (Router $router) => {
  $router->route(
    "GET", "/", new HomeAction
  );
};
Copy after login
Copy after login

and from routes/api.pre:

use Aerys\Router;
use App\Action\Api\HomeAction;

return (Router $router) => {
  $router->route(
    "GET", "/api", new HomeAction
  );
};
Copy after login
Copy after login

Although it is a simple route, this helps me test the code in config.pre. I decided to have these routing files return to closures so I could pass them a typed $router to which they can add their own routes. Finally, I created two (similar) operations.

Fromapp/Actions/HomeAction.pre:

namespace App\Action;

use Aerys\Request;
use Aerys\Response;

class HomeAction
{
  public function __invoke(Request $request,
    Response $response)
  {
    $response->end("hello world");
  }
}
Copy after login
Copy after login

The final touch is to add shortcut scripts to start the development and production version of the Aerys server.

Fromcomposer.json:

"scripts": {
  "dev": "vendor/bin/aerys -d -c loader.php",
  "prod": "vendor/bin/aerys -c loader.php"
},
"config": {
  "process-timeout": 0
},
Copy after login
Copy after login

After all this I can start a new server and access http://127.0.0.1:8080 by typing the following command:

composer dev
Copy after login

Front-end settings

"Okay, now that I've made things relatively stable on the PHP side; how do I build a ReactJS file? Maybe I can use Laravel Mix…?"

I don't really want to create a brand new build chain, and Mix has also been rebuilt to work well in non-Laravel projects. While configuration and extensions are relatively easy, it is more VueJS-oriented by default.

The first thing I have to do is install some NPM dependencies. From package.json:

"devDependencies": {
  "babel-preset-react": "^6.23.0",
  "bootstrap-sass": "^3.3.7",
  "jquery": "^3.1.1",
  "laravel-mix": "^0.7.5",
  "react": "^15.4.2",
  "react-dom": "^15.4.2",
  "webpack": "^2.2.1"
},
Copy after login

Mix uses Webpack to preprocess and bundle JS and CSS files. I also need to install React and related Babel libraries to build jsx files. Finally, I added the Bootstrap file to get some default styles.

Mix automatically loads custom configuration files, so I added the following. From webpack.mix.js:

let mix = require("laravel-mix")

// load babel presets for jsx files

mix.webpackConfig({
  "module": {
    "rules": [
      {
        "test": /jsx$/,
        "exclude": /(node_modules)/,
        "loader": "babel-loader" + mix.config.babelConfig(),
        "query": {
          "presets": [
            "react",
            "es2015",
          ],
        },
      },
    ],
  },
})

// set up front-end assets

mix.setPublicPath("public")

mix.js("assets/js/app.jsx", "public/js/app.js")
mix.sass("assets/scss/app.scss", "public/css/app.css")
mix.version()
Copy after login

I need to tell Mix how to handle jsx files, so I added the same configuration as the ones that are usually placed in .babelrc. I plan to get a single JS and CSS entry point into various parts of the application.

Note: Future versions of Mix will have built-in support for building ReactJS assets. At that time, the mix.webpackConfig code can be deleted.

Once again, I created some shortcut scripts to save a lot of typing work. From package.json:

$host = new Aerys\Host();
$host->expose("*", 8080);

$host->use($router = Aerys\router());
$host->use($root = Aerys\root(.."/public"));

$web = process .."/routes/web.pre";
$web($router);

$api = process .."/routes/api.pre";
$api($router);
Copy after login
Copy after login

All three scripts use Webpack variable commands, but they differ in their operations other than that. devBuild debug versions of JS and CSS files. The -w switch starts the Webpack monitor (so that the bundle can be partially rebuilt). The -p switch enables a streamlined production version of the bundle.

Since I use bundled version control, I need a way to reference a file like /js/app.60795d5b3951178abba1.js without knowing the hash value. I noticed that Mix likes to create manifest files, so I made a helper function to query it. From helpers.pre:

vendor/bin/aerys -d -c config.php
Copy after login
Copy after login

Aerys knows how to handle promises when they appear in the form of $val = yield $promise, so I used Amp's Promise implementation. After reading and decoding the file, I can find the matching file path. I adjusted HomeAction. From app/Actions/HomeAction.pre:

return Pre\processAndRequire(__DIR__ . "/config.pre");
Copy after login
Copy after login

I realized that I could continue to create functions that return promises and use them in this way to keep the code asynchronous. This is my JS code from assets/js/component.jsx:

"require": {
  "amphp/aerys": "dev-amp_v2",
  "amphp/parallel": "dev-master",
  "league/container": "^2.2",
  "league/plates": "^3.3",
  "pre/short-closures": "^0.4.0"
},
"require-dev": {
  "phpunit/phpunit": "^6.0"
},
Copy after login
Copy after login

…and from assets/js/app.jsx:

use Aerys\Router;
use App\Action\HomeAction;

return (Router $router) => {
  $router->route(
    "GET", "/", new HomeAction
  );
};
Copy after login
Copy after login

After all, I just want to see if Mix will compile my jsx files and if I can find them again using the async mix function. It turns out to work!

Note: Using the mix function every time is expensive, especially if we are loading the same file. Instead, we can load all templates during the server boot phase and reference them from inside the operation if needed. The configuration file we start Aerys can return a promise (such as the one given to us by Amp\all), so we can parse all templates before the server starts.

Connect using WebSockets

I've almost set it up. The last thing to do is to connect the backend and frontend through WebSockets. I found this relatively simple, using a new class. From app/Socket/GameSocket.pre:

use Aerys\Router;
use App\Action\Api\HomeAction;

return (Router $router) => {
  $router->route(
    "GET", "/api", new HomeAction
  );
};
Copy after login
Copy after login

…and minor modifications to web routing (from routes/web.pre):

namespace App\Action;

use Aerys\Request;
use Aerys\Response;

class HomeAction
{
  public function __invoke(Request $request,
    Response $response)
  {
    $response->end("hello world");
  }
}
Copy after login
Copy after login

Now I can change the JS to connect to this WebSocket and send the message to everyone connected to it. From assets/js/component.jsx:

"scripts": {
  "dev": "vendor/bin/aerys -d -c loader.php",
  "prod": "vendor/bin/aerys -c loader.php"
},
"config": {
  "process-timeout": 0
},
Copy after login
Copy after login

When I create a new Component object, it connects to the WebSocket server and adds an event listener for the new message. I added some debugging code - to make sure it connects correctly and sends new messages.

We will go into more detail on PHP and WebSockets later, don't worry.

Summary

In this section, we looked at how to set up a simple asynchronous PHP web server, how to use Laravel Mix in non-Laravel projects, and even how to connect the backend and frontend together using WebSockets.

Wow! It covers a lot of content and we haven't written a line of game code yet. Join me in the second part and we will start building the game logic and React interface.

(This article was peer reviewed by Niklas Keller. Thanks to all the peer reviewers of SitePoint to get the content of SitePoint to its best!)

FAQ for Game Development with ReactJS and PHP

How is ReactJS and PHP compatibility in game development?

ReactJS and PHP are highly compatible in game development. ReactJS is a JavaScript library that is ideal for building user interfaces, especially for single-page applications. It allows for fast and responsive web design. On the other hand, PHP is a server-side scripting language that is very suitable for back-end development. It can handle database, user authentication, and server-side logic. When used together, ReactJS can handle the front-end, create dynamic and interactive user interfaces, while PHP manages the back-end.

Can I use PHP for game logic in ReactJS games?

Yes, you can use PHP for game logic in ReactJS games. Although ReactJS handles the user interface, PHP can manage game logic on the server side. This includes processing data, managing user sessions, and controlling game rules. This separation of concerns allows for a more orderly and efficient development process.

What are the benefits of using ReactJS for game development?

ReactJS provides many benefits for game development. Its virtual DOM allows efficient updates and rendering, making the game run smoother. It also supports reusable components, which can greatly speed up development time. Additionally, ReactJS has a huge community and rich resources to make it easier to find solutions to problems or learn new technologies.

What are the advantages of using PHP for game development?

PHP has many advantages in game development. It is a server-side language, which means it can handle data management, user authentication, and server-side game logic. PHP is also easy to learn, has simple syntax, and has a huge developer community. It is also highly scalable, making it suitable for games that may require handling a large number of users.

How to start developing games with ReactJS and PHP?

To start developing games with ReactJS and PHP, you first need to learn the basics of both languages. There are many online resources and tutorials available. Once you are familiar with these languages, you can start by building a simple game. This can be a basic text game or a simple puzzle game. As you gain more experience, you can start building more complex games.

What resources or libraries are there to help with game development using ReactJS and PHP?

Yes, there are several resources and libraries that can help with game development using ReactJS and PHP. For ReactJS, libraries like React Game Kit and React Game Engine are very useful. For PHP, you may find libraries like PHP-SDL or Wyvern useful. In addition, there are many tutorials, guides and forums online where you can learn more and get help.

Can I build multiplayer games using ReactJS and PHP?

Yes, you can build multiplayer games using ReactJS and PHP. ReactJS can handle user interfaces, while PHP can manage server-side logic, including managing player sessions and synchronizing game state across multiple clients.

What type of game can I build using ReactJS and PHP?

With ReactJS and PHP, you can build a wide variety of games. This includes simple text games, puzzle games, platform games, role-playing games, and even multiplayer online games. The possibilities are huge, and the limit is actually your imagination and skill level.

How to process data in a game developed using ReactJS and PHP?

In a game developed using ReactJS and PHP, server-side PHP can be used to process data. This can include player data, game status, scores, and so on. This data can be stored in a database and can be interacted with this database using PHP to retrieve and update the data as needed.

How to process user input in a game developed using ReactJS?

In a game developed using ReactJS, the user input can be processed using React's event processing system. This can include mouse clicks, keyboard keys, and touch events. React's event processing system is powerful and flexible, allowing you to easily control how the game responds to user input.

The above is the detailed content of Game Development with React and PHP: How Compatible Are They?. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

How does session hijacking work and how can you mitigate it in PHP? How does session hijacking work and how can you mitigate it in PHP? Apr 06, 2025 am 12:02 AM

Session hijacking can be achieved through the following steps: 1. Obtain the session ID, 2. Use the session ID, 3. Keep the session active. The methods to prevent session hijacking in PHP include: 1. Use the session_regenerate_id() function to regenerate the session ID, 2. Store session data through the database, 3. Ensure that all session data is transmitted through HTTPS.

Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Apr 05, 2025 am 12:04 AM

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

Describe the SOLID principles and how they apply to PHP development. Describe the SOLID principles and how they apply to PHP development. Apr 03, 2025 am 12:04 AM

The application of SOLID principle in PHP development includes: 1. Single responsibility principle (SRP): Each class is responsible for only one function. 2. Open and close principle (OCP): Changes are achieved through extension rather than modification. 3. Lisch's Substitution Principle (LSP): Subclasses can replace base classes without affecting program accuracy. 4. Interface isolation principle (ISP): Use fine-grained interfaces to avoid dependencies and unused methods. 5. Dependency inversion principle (DIP): High and low-level modules rely on abstraction and are implemented through dependency injection.

How to automatically set permissions of unixsocket after system restart? How to automatically set permissions of unixsocket after system restart? Mar 31, 2025 pm 11:54 PM

How to automatically set the permissions of unixsocket after the system restarts. Every time the system restarts, we need to execute the following command to modify the permissions of unixsocket: sudo...

How to debug CLI mode in PHPStorm? How to debug CLI mode in PHPStorm? Apr 01, 2025 pm 02:57 PM

How to debug CLI mode in PHPStorm? When developing with PHPStorm, sometimes we need to debug PHP in command line interface (CLI) mode...

Explain late static binding in PHP (static::). Explain late static binding in PHP (static::). Apr 03, 2025 am 12:04 AM

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

How to send a POST request containing JSON data using PHP's cURL library? How to send a POST request containing JSON data using PHP's cURL library? Apr 01, 2025 pm 03:12 PM

Sending JSON data using PHP's cURL library In PHP development, it is often necessary to interact with external APIs. One of the common ways is to use cURL library to send POST�...

See all articles