Webbased chat in php without using database or file

前端 未结 14 1008
失恋的感觉
失恋的感觉 2021-02-02 14:49

I am trying to implement a realtime chat application using PHP . Is it possible to do it without using a persistent data storage like database or file . Basically what I need is

相关标签:
14条回答
  • 2021-02-02 15:32

    PHP is not a good fit for your requirements (in a normal setup like apache-php, fastcgi etc.), because the PHP script gets executed from top to bottom for every request and cannot maintain any state between the requests without the use of external services or databases/files (Except e.g. http://php.net/manual/de/book.apc.php, but it is not intended for implementing a chat and will not scale to multiple servers.)

    You should definitely look at Node.js and especially the Node.js module Socket.IO (A Websocket library). It's incredibly easy to use and rocks. Socket.IO can also scale to multiple chat servers with an optional redis backend, which means it's easier to scale.

    Trying to use $_SESSION with a static session id as communication channel is not a solution by the way, because PHP saves the session data into files.

    0 讨论(0)
  • 2021-02-02 15:33

    When I tried to solve the same problem, I went with Nginx's Push Module. I chose to go this way since I had to support older browsers (that usually won't support WebSockets) and had no confidence in setting up an appropriate solution like Socket.io behind a TCP proxy.

    The workflow went like this:

    1. The clients connect through long-polling to my /subscriber location, which is open to all.
    2. The /publisher location only accepts connections from my own server
    3. When a client subscribes and talks, it basically just asks a PHP script to handle whatever data is sent.
    4. This script can do validation, authorization, and such, and then forwards (via curl) the message in a JSON format to the /publisher.
    5. Nginx's Push Module handles sending the message back to the subscribers and the client establishes a new long-polling connection.

    If I had to do this all over again, then I would definitely go the Socket.io route, as it has proper fallbacks to Comet-style long-polling and has great docs for both Client and Server scripts.

    Hope this helps.

    0 讨论(0)
  • 2021-02-02 15:35

    You should check out Web Sockets of html5. It uses two way connection so you will not need any database or file. Any chat message comes to the server will directly sent to the other users browser without any Ajax call. But you need also to setup web socket server.

    Web sockets are used in many real time applications as well. I am shortly planing to write full tutorial on that. I will notify you.

    0 讨论(0)
  • 2021-02-02 15:36

    If You need to use just PHP, then You can store chat messages in session variables, session could be like object, storing a lot of information. If You can use jQuery then You could just append paragraph to a div after message has been sent, but then if site is refreshed, messages will be gone. Or combining, store messages in session and update that with jQuery and ajax.

    0 讨论(0)
  • 2021-02-02 15:37

    Try looking into socket libraries like ZeroMQ they allow for instant transport of the message, and are quicker than TCP, and is realtime. Their infrastructure allows for instant data send between points A and B, without the data being stored anywhere first (although you can still choose to). Here's a tutorial for a chat client in ZeroMQ

    0 讨论(0)
  • 2021-02-02 15:38

    If you have a business need for PHP, then adding another language to the mix just means you then have two problems.

    It is perfectly possible to run a permanent, constantly-running daemonised PHP IRCd server: I know, because I've done it, to make an online game which ran for years.

    The IRC server part I used is a modified version of WaveIRCd: http://sourceforge.net/projects/waveircd/

    I daemonised it using code I made available here: http://www.thudgame.com/node/254

    That code might be overkill: I wrote it to be as rugged as I could, so it tries to daemonise using PHP's pcntl_fork(), then falls back to calling itself recursively in the background, then falls back to perl, and so on: it also handles the security restrictions of PHP's safe mode in case someone turns that on, and the security restrictions imposed by being called through cron.

    You could probably strip it down to just a few lines: the bits with the comments "Daemon Rule..." - follow those rules, and you'll daemonize your process just fine.

    In order to handle any unexpected daemon deaths, etc, I then ran that daemoniser every minute through cron, where it checked to see if the daemon was already running, and if so either quietly died, or if the daemon was nonresponsive, killed it and took its place.

    Because of the whole distributed nature of IRC, it was nicely rugged, and gave me a multiplayer browser game with no downtime for a good few years until bit-rot ate the site a few months back. I should try to rewrite the front end in Flash and get it back up again someday, when I have time...

    (I then ran another daemonizer for a PHP bot to manage the game itself, then had my game connect to it as a java applet, and talk to the bot to play the game, but that's irrelevant here).

    Since WaveIRCd is no longer maintained, it's probably worth having a hunt around to find if anyone else has forked the project and is supporting it.

    [2012 edit: that said, if you want your front end to be HTML5/Javascript, or if you want to connect through the same port that HTTP connects through, then your options are more limited than when using Flash or Java. In that case, take the advice of others, and use "WebSockets" (poor support in most current browsers) or the "Socket.io" project (which uses WebSockets, but falls back to Flash, or various other methods, depending what the browser has available).

    The above is for situations where your host allows you to run a service on another port. In particular, many have explicit rules in their ToS against running an IRCd.]

    [2019 edit: WebSockets are now widely supported, you should be fine using them. As a relevant case study, Slack is written in PHP (per https://slack.engineering/taking-php-seriously-cf7a60065329), and for some time supported the IRC protocol, though I believe that that has since been retired. As its main protocol, it uses an API based on JSON over WebSockets (https://api.slack.com/rtm). This all shows that a PHP IRCd can deliver enterprise-level performance and quality, even where the IRC protocol is translated to/from another one, which you'd expect to give poorer performance.]

    0 讨论(0)
提交回复
热议问题