You can develop such a service on any technology, including using PHP. By placing several servers nearby, you can almost infinitely scale read operations due to replication (both at the DBMS level and at the NoSQL solution level). Problems begin when you have a lot of simultaneous connections, even if you can select a separate request stream for each of them. There are just so many of them that switching the processor between them starts to lose too much time.
Since you work for mobile applications, you may have a very unimportant connection with the client, which means a lot of slow clients. What is terrible slow client for a classic server? Let your server hold 1000 simultaneous requests, 500 EDGE clients connect to you and start waiting for a response within 10 minutes. And here you already server serves not 1000, but 500 simultaneous requests. Since 500 hung in anticipation of a response from customers. The remaining connections start not to cope, to send requests more slowly, and now your server can serve only 250 requests. And after a while and generally crashes. This may not be so important for the Web, where the customers are more crowded, but in mobile development this is a more frequent phenomenon - coverage is different everywhere, the connection depends on it great.
When they talk about NodeJS or Ruby servers, there’s nothing magic there, just servers are newer and designed a little differently. Instead of waiting for each connection, a single request is organized by a separate request, which polls the connections in non-blocking mode. The answer came from the client - he is processing it, no - he went to the next connection. This kills two hares. You do not switch between threads / processes (save time), you solve the problem of slow clients - the thread does not wait for you, it constantly works. The only problem is that your server-side does not slow down, since the polling thread is one. This is an Event driven architecture, you can find solutions for PHP. Just in the case of NodeJS or Ruby, they almost go out of the box, in the case of PHP you have to look for a solution. However, whatever language you choose, it’s important to deal with it.
The Event Driven architecture allows you to use WebSockets, persistent connections from clients — you can allow them as many as you like, since a connection in pending mode consumes almost no resources (neither memory nor processor).
And here we smoothly approach how you will write. Even if you do not use EventDriven solutions, but put a lot of classic fork servers alongside, replicated data at the database level, you still have a problem with the record, since it does not scale with replication. You need to write very quickly so that the client does not wait for a response from the server, does not keep the connection, but goes about his business. The faster you will serve them - so it will be easier for you. Writing directly to the database is not an option. Classic DBMS is very slow and unhurried, they strive to do everything in transactions, and this is also an overhead. There are two ways - a fast NoSQL solution fully deployed in RAM (redis, MongoDB). Quickly recorded in the memory, released the client, in the background understand, write. Queues - we dropped everything into the queue; in the background, slowly, events from the queue are processed. It would be great if some of the information was transformed, aggregated directly in RAM, and only then entered into a slow bulk database.
What is good about modern NoSQL solutions are that they are almost all written for non-blocking connections and can hold thousands of simultaneous connections. What is bad is not a classic DBMS, it’s difficult to organize connections and associations, in general you need to work a little differently. They are bad with transactions. However, they are located in RAM and are well clustered. Accepting data in them is a pleasure - it is not a surrogate of 100 tables, followed by merging into a DBMS, in order to write data it was easier, and not a hemorrhoid ring architecture in replication.
In general, in practice, everything that you mentioned is usually used, you can write a part in PHP, with WebSockets you may be more comfortable working through the NodeJS server, queues and PubSub solutions may be easier organized through Redis or RabbitMQ, raw data put in the same Reids or MongoDB, and use a classical DBMS as a long-term reserved storage (although you can do without a classical DBMS). If you bring your API to the stated loads, you will most likely have to try, if not all, then almost everything :)