Before even starting to think about code layout, there's a phase we don't know what else to call but "getting things together." This is the intermediate step between the idea and the specs/code layout stagefiguring out the inner workings and on what to base them.
To make it clearer, let's go back to the very beginning:
What do we want to create?
How are we going to create it?
Are there any existing implementations of our idea already?
Do similar systems exist that perform almost the same task?
If so, can we reuse anything from that design?
Can we reuse foreign techniques, maybe add up to our system with them?
Questions over questions.
The first is easy to answer. We want to create a chat system. How? Well, with PHP, and somehow server-sidewe don't know much more about it at this time.
Are there already any chat systems or something similar out there? Indeed there are. It starts right at your shellthe "talk" command allows you to chat with other people that you can reach via a valid network link (or local link), as shown in Figure 3.1.
Figure 3.1. The traditional "talk" command.
Of course, this isn't as powerful as we'd want it to be, but it's a start. Next, we could surf the Web to look for pages that have one of the (nowadays almost obligatory) chat links. Although they differ widely in look and feel/implementation, most of them can be boiled down to the following:
Java for fancy interfaces, although some use plain HTML.
A proprietary protocol with a single server (or simply database-backed).
Few predefined rooms.
Few predefined commands.
Apart from these chat setups, there are chat applications and networks such as Mirabilis' ICQ or the diverse Instant Messaging Systemssystems that don't always provide real-time services and generally require additional proprietary client software to be installed on every participating system.
However, one system stands out from the list. IRC (Internet Relay Chat) is a widely-known and long-used chat protocol used by many networks, some of which carry hundreds of thousands of users simultaneously. The IRC protocol is text-baseda drawback when operating under high load (long string commands generate much more traffic than single binary characters), but this also makes it significantly easier to process. Most current IRC servers support compressed backbone links, which greatly reduce traffic.
Although IRC requires special client software on every participating system, we can "tweak" this requirement to our advantage: Why not provide the client software ourselves server-side, and abstract it by using an HTML interface and allowing each user access to the network through an HTML client? This would give us control over what the user can do (each user is required to use our HTML client). Additionally, we have all the advantages of an existing network system: reliable client software, proven concept, hundreds of tools, etc. We could even allow users to use their own client softwarean option to be avoided in most cases, however, as we want to create a "closed" chat network. On a closed network, you know every way that each client can access your network. By limiting the access points to specific setups, you greatly reduce the risk of being attacked.
This directly leads to the question, do we need a real protocol such as IRC? Or would it be sufficient to simply use a database-driven protocol, with a remote synchronization feature to provide the requested networking abilities?
Questions such as this will arise every time you plan an application, and they'll arise often. Make sure that you've got all of them covered, and make sure that no questions will arise at a later stage during development. This is the point where you can still address these questions; later on you might be unable to resolve them (and eventually get your project kicked into the trash). A good project is a project without doubts, without uncertainties, without inconsistencies, and without unforeseen eventualities. Make sure that after your planning phase you can assure a stable, fully evaluated situation!
So let's get back to answering the question: Do we need an open (and perhaps too complex) protocol such as IRC, or should we stick with a conventional database approach? The simplest method to find an answer is also the most logical onecompare pros and cons and choose the option with the best results.
Implementing IRC as a protocol into the chat system will introduce a significant amount of complication because of protocol processingprocessing network protocols requires nonlinear coding, something that isn't really supported by PHP. (To react to network messages, we need an event-based system.) On top of that problem, we'd need a way to handle message exchange efficiently; that is, dealing with messages from a user and for a user (which, unfortunately, may not always be handled in the same way). This problem exists in the database-backed solution, too, of course, but the database-backed solution doesn't require protocol handling. A lot of databases are supported natively by PHP, and those that aren't are most likely supported indirectly by ODBC. To gain the ability of networkable chat boxes, we'd only need to create a tool that can synchronize between chat boxes. (Unless you only want to run one central database server that's accessed by all boxes simultaneously.)
What would you choose?
Spoiler: phpChat is based on IRC, and this is why:
Using a database, we'd introduce some kind of "proprietary," private protocol that wouldn't be able to interface to other standard systems. In times of interoperability and interconnectivity, this is a bad thing.
An IRC library that functions well (namely phpIRC, see http://www.phpwizard.net/phpIRC) abstracts access to IRC networks into a set of easy-to-use API functionsand makes IRC handling equal to database handling in terms of code complexity.
Existing IRC server software handles all the itsy-bitsy teenie-weenie problems of user management, reliable traffic forwarding, routing, etc., across networks. The software has been around for a long time and is proven to work, plus it's available for all types of systems.
IRC is extremely scalable. If you run into load problems on server A at peak times or due to unforeseen events, simply fire up server B and dynamically establish a server connection into the existing chat (IRC allows you to do so, and is fully automated)and you now have another server with enough free capacity for additional users.