allamovec Posted September 25, 2012 Share Posted September 25, 2012 Iam working on a multi-users online game and the scenario is :- 1- I fork a new process for each connection 2- first i stared with making a shared object with (unix sockets) , this object was containing the shared data among the process (ie: this object was the responsible for intercommunication between the processes 3-But i notice that there is al ot of errors on the data returned from the shared objects (unexpected data). 4- so i separated my code and start to depend only on memcache(with 1024 storage capacity) to transfer objects among the processes. 5- the users can play with each other in a specific room. 5-each user has on object(instance of player class) in the memcache 6-each room has an object(instance of room class) in the memcache The problem is : - all is ok if there is a few number of players in the server but If there is a lot of players in the server the memcache produce an error Memcache::get(): Server localhost (tcp 11211) failed with: Malformed VALUE header (0) Memcache::replace(): Server localhost (tcp 11211) failed with: Received malformed response (0) Memcache::get(): Server localhost (tcp 11211) failed with: Failed reading line from stream (0) and some times the memcache return to me an object of player instead of object of room ex: $memcache->get("player1") should return an object for a player class but it sometime return an object for a room class $memcache->get("room1") should return an object for a room class but it sometime return an object for a player class i did not know what is the problem Quote Link to comment Share on other sites More sharing options...
requinix Posted September 25, 2012 Share Posted September 25, 2012 I've dabbled with this kind of thing in PHP and I'll tell you: it's not easy. The best method I know is IPC (inter-process communication) such as with streams (essentially sockets but they're easier to deal with in PHP than sets of sockets). Shared memory is only worthwhile if one process ever writes to it and all the other processes read. Not to mention how the whole Unix forking model is such a hassle compared to Windows' threading model. Want a second thread? Fork the whole damn process and clean up memory you don't need to use. If you're really serious about this then don't use PHP for it. Or at least not all of it. It just doesn't support multithreading that well. Quote Link to comment Share on other sites More sharing options...
allamovec Posted September 26, 2012 Author Share Posted September 26, 2012 yes i know that php do not support multithreading but i tried to work around this problem by making multiprocess with shared object (using stream_socket_pair ) . 1- the master(mp) process is the parent for all forked process (p1,p2,p3,p4,p5,p6...... etc) 2- if p1 want to communicate with p2 it should leave a message for p2 at the master process . (ie: the master process will act as the container which all processess read and write from it ), the communication between the processes is indirect (it will be via the master process). but the master process sometime returned invalid data (may be because the load on the server). finally i decided to use java for the backend not php Quote Link to comment Share on other sites More sharing options...
requinix Posted September 26, 2012 Share Posted September 26, 2012 Do you actually need p1 to communicate with p2? Literally? Or is it more like you need p1 to broadcast a message and p2 cares about receiving those specific messages? Quote Link to comment Share on other sites More sharing options...
allamovec Posted September 29, 2012 Author Share Posted September 29, 2012 Yes it is exactly as you said , p1 need to broadcast a message for p2,p3,p4 ( for example player1 play so the other 3 players need to know what did the player1 play ? Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.