Polling data from server - most effecient and practical way/setup - php

I've been reading a few posts on here regarding polling and even had a look at Pusher although i don't want to go down that route and need some advice in regards of making an efficent notification system. How do facebook, twitter and other websites do this? are they using web sockets?

Polling
> Polling data from server - most
> efficient and practical way/setup
You should avoid polling because it is not efficient and also not real-time at all. Let's say you poll every 30 seconds and your server can handle the load without any problems. The problem then is that your data is not real-time. You could shorten the poll-interval (every second), but then you will have a very difficult time trying to scale your server.
But sometimes polling (smart) is also very nice, because it is easy to implement. Some tips I have for you are:
Don't use the database, but retrieve data from in-memory database like redis, memcached because they are much faster. That is the secret ingredient for most popular big players(websites) to run smoothly. Facebook has special purpose servers that use a lot of memory using memcached (5 TB in 2008 => Facebook has grown a lot since ;)).
If you can't install (probably should!) Memcached or Redis on your server you could consider using the hosted http://redistogo.com which is free for small sites.
The other thing to do is increment the poll interval using github's library to prevent server overloading.
> How do facebook, twitter and other
> websites do this? are they using web sockets?
Web-sockets
Some of these sites are using websockets, but that is only one of the many transports that they support because websockets aren't available in all browsers. In the future when all browsers support websockets that will be the only transport used (probably). Below I will give you a list of all the popular transports with a quick description:
websockets:
WebSocket is a technology providing
for bi-directional, full-duplex
communications channels, over a single
Transmission Control Protocol (TCP)
socket. It is designed to be
implemented in web browsers and web
servers, but it can be used by any
client or server application.
For the client side, WebSocket was to
be implemented in Firefox 4, Google
Chrome 4, Opera 11, and Safari 5, as
well as the mobile version of Safari
in iOS 4.2. However, although
present, support is now disabled by
default in Firefox and Opera because
of concerns over security
vulnerabilities.
xhr long-polling:
For the most part, XMLHttpRequest long
polling works like any standard use of
XHR. The browser makes an asynchronous
request of the server, which may wait
for data to be available before
responding.
This transport is available in every browser.
json-p long-polling:
A long-polling Comet transport can be
created by dynamically creating script
elements, and setting their source to
the location of the Comet server,
which then sends back JavaScript (or
JSONP) with some event as its payload.
Each time the script request is
completed, the browser opens a new
one, just as in the XHR long polling
case. This method has the advantage of
being cross-browser while still
allowing cross-domain implementations.
htmlfile:
provide a usable streaming transport
in Internet Explorer
flashsocket
XMLSocket is a class in ActionScript
which allows Adobe Flash content to
use socket communication, via TCP
stream sockets. It can be used for
plain text, although, as the name
implies, it was made for XML. It is
often used in chat applications and
multiplayer games.
Facebook
As you probably know Facebook does use PHP for there active development, but actually don't use it for any of there real-time elements on there site, because PHP is not designed to handle this properly (yet?). A lot of people get mad at me for saying this, but I can't help that it is the truth (even Facebook agrees). In PHP almost all function calls (C) are using blocking I/O which makes scaling real-time systems almost impossible. I read a blog post over here using non-blocking IO with PHP (quality?). In the past Facebook created the chat using Erlang which is also pretty popular for doing non-blocking IO. I myself find the Erlang code looking strange, but I still would like to learn it. Here are some links about Facebook using Erlang:
https://www.facebook.com/note.php?note_id=91351698919
https://www.facebook.com/note.php?note_id=51412338919
http://www.infoq.com/news/2008/05/facebookchatarchitecture
Also Facebook bought Friendfeed in the past and open-sourced there Tornado framework which is written in Python to do non-blocking IO.
It is no longer just the traditional
Linux, Apache, MySQL, and PHP stack
that make a site like Facebook or
FriendFeed possible, but new
infrastructure tools like Tornado,
Cassandra, Hive (built on top of
Hadoop), memcache, Scribe, Thrift, and
others are essential. We believe in
releasing generically useful
infrastructure components as open
source (see Facebook Open Source) as a
way to increase innovation across the
Web.
I assume they are also using tornado for some parts of there system now.
Other sites
Below I will try to list some popular frameworks(open-source) to do non-blocking IO:
Socket.io (Node.js): Socket.io is becoming a pretty popular non-blocking framework for node.js (1722 people are watching this project on Github right now). I really like Socket.io
Netty (Java): The Netty project is an effort to provide an asynchronous event-driven network application framework and tools for rapid development of maintainable high performance & high scalability protocol servers & clients.
tornado (Python): Tornado is an open source version of the scalable, non-blocking web server and tools that power FriendFeed.
> even had a look at Pusher although I
> don't want to go down that route
I don't understand your dislike for pusher because it is a pretty popular hosted solution. With this hosted solution you could started building scalable real-time service without any hassle with pretty good pricing (free if small and pretty affordable for middle range websites).

I was researching about websockets and came to know about 'Kaazing WebSocket Gateway'. Kaazing WebSocket Gateway provides complete WebSocket emulation for all the older browsers (I.E. 5.5+, Firefox 1.5+, Safari 3.0+, and Opera 9.5+), so you can start using the HTML5 WebSocket APIs today.
Please see this link

Related

Is it possible to build real-time application using PHP , Socket.io and javascript only?

Lately, I have been doing a lot of research (of course googling :P) on building real-time application (like chat application). So far I have come across Elephant.io, Socket.io and Ratchet. And some of the terms I stumbled upon were web-sockets, bi-directional communication etc..
I am building an auction site where it involves countdown timer. I am trying to achieve something like when one user bids, the timer gets updated in all the client's browser without page refresh (something like server broadcasting the change of event to all other connected users).
The problem is, I am building the application with PHP (Pyro-cms). The server, where it will be uploaded is Apache-based server and does not support node.js. One of the most common stuff I notice was most of the real-time applications were utilizing node.js.
Is it possible to build real-time application using PHP , Socket.io and javascript only? or may be with angular.js?
I really cannot use the server that support node.js so have to completely rely on apache server. I even dont know if it is possible. If there is any resources, reference or tutorial, it will be very helpful.

Real time notifications on shared hosting (PHP, MySQL, Yii)

I'm currently developing a website that requires a push notification style system like Facebook notifications. I would like the user to be notified when an event occurs such as "X added you as a friend"...
I've been looking into my options however they seem to be extremely limited as the website will be hosted on a shared hosting platform therefore I have limited access etc.
1) Looking at long polling comet style - as I can't run Python on the server, my only option here is PHP for the server script however due to thread consumption this probably isn't a very scalable option.
2) WebSockets - these look great but with browser support limited it doesn't seem plausible just yet..
So - has anyone accomplished this on a shared hosting platform? I'd rather not have to use a service like Pusher.
Many thanks!! :)
PS - I'm using Yii framework - any solutions with that in mind would be even better
use Ratchet , it is a WebSocket for PHP.
Ratchet is a loosely coupled PHP library providing developers with
tools to create real time, bi-directional applications between clients
and servers over WebSockets. This is not your Grandfather's Internet.
here is a helloworld example.
Use html5 SSE (Server sent dom events) for chrome, firefox, opera and ie10
for older versions of IE use iframe loading as a fallback.
all those techniques should work well with any kind of shared hosting since they do not require any kind of server side setup.
https://stackoverflow.com/a/1086448/1063333 :
A common method of doing such notifications is to poll a script on the
server (using ajax) on a given interval (perhaps every few seconds),
to check if something has happened

Facebook live feed functionalty?

I am trying to make something like facebook live feeds, for example: when someone likes something or comments on something, the page updates without refreshing it! I want to know which is the proper way to do this? regards
Realtime updates in a web application is a hard problem because a single server handling many simultaneous long-lived TCP connections is a hard problem.
This is essentially impossible on a traditional web server like Apache + PHP because it allocates an entire OS thread for each incoming connection. Threads have significant overhead (like ~2 MB of RAM just for the stack space, plus whatever heap memory your application needs), so as few as a few hundred clients having your page open at the same time can bring a small server to its knees, and even an extra-large (and extra-expensive) hundred-GB-of-RAM server can only handle a few thousand concurrent connections.
Realtime communications is where Node really shines. Its single-threaded, event-driven architecture can easily support 2,000 concurrent connections on a commodity laptop, because each incoming connection is a small (a few kilobytes) heap allocation. The limiting factor actually becomes the CPU and the underlying OS's TCP stack.
My recommendation is to take a look at Node – this is exactly the kind of problem it is designed for. You already know JavaScript, so it's really just a matter of the API and mastering Node's async, event-driven nature.
You'll probably want to use Express for your HTTP server needs and use Socket.io for the realtime communications.
Socket.io is especially wonderful because its client-side library abstracts away all of the drudgery of cross-browser support:
In A-grade browsers, it connects to your server via WebSockets. This gets you a TCP socket that remains connected indefinitely, over which you can push arbitrary data at any time.
In downlevel browsers, it uses a fallback mechanism:
A Flash-based transport like WebSockets, but requires Flash player (if available)
AJAX long polling
And some more esoteric fallbacks if neither of those work
You can use long polling, yes. Or, you can start to innovate and start using HTML5's connectivity capabilities and REALTIME the sh*t out of your site. There are already several out-of-the-box solutions for that, my favourite being the xRTML Realtime Framework.
Check it out

Web based text chat?

I'd like to develop a near real time web based chat system. Any suggestions on how to implement this via jQuery, any gotchas to look out for, and what is this Comet thing I keep reading about?
Ideally, I'd like to support up to about 5,000 concurrent chatters.
Comet, also known as Ajax Push, is often refered as "Reverse AJAX". Instead of pulling the information from the server in regular intervals, the data is pushed from the server to the browser when it is needed. That requires an open connection, for which there are several implementations.
I recommend that you use APE. Here is a demo: http://www.ape-project.org/demos/1/ape-real-time-chat.html
Advantage: It will be very responsive
and real-time.
Disadvantage: You need
to setup the APE server on your
webserver machine.
Comet is a "push" tecnology, created to avoiding the client (javascript code) to continously poll the server. This could cause bandwith problem, because you have to create (maybe) a new TCP connection, then contact the http server, he runs some server-side logic and then sends a response to the client. With comet, if the server decide that you should recive some information (e.g., new chat message) he directly send it to the client.
There are several different implementation, you can have a start here.
the simplest implementation tecnique is the hidden iframe, but I'd raccomend the long polling wich is much more controllable.
One more thing, thake a look at HTML5 websokets, wich could be an interesting solution to your problem (not very compatible with current browser, anyway)
Check out Node.js and nowjs for node.js. Node.js helps you build very efficient servers using server side JavaScript and nowjs is a library that allows you to build real time web apps. There is even a example screen cast that puts together a basic chat application in 12 lines of code.
You could also checkout Socket.io which is another node library thats helps you build real time apps by abstracting away different transport mechanisms and giving you a unified interface to code against (supports WebSockets, Flash Sockets, AJAX long polling, JSONP Polling and Forever IFrames).
I realize you tagged your question PHP but if you are seriously considering writing a scalable system with the least amount of effort (relatively speaking) then learning Node.js is worth your time (and the learning curve is not thats steep since you probably already know JS).

Real time Protocol for a web-app in PHP

I'm working on a PHP application and I'm looking for some ideas for a real-time protocol that I can use for:
1) track users status and location within the application (this should be fast!!!)
2) chat system.
I'm looking for something like FMS and its "Shared Objects" where multiple users can subscribe to pieces of information. FMS is expensive and slow for what I need, I would need a widget loaded on each page, requesting a new connection to the FMS server, etc.... slow...
I need something fast, ope source would be perfect!. Something like what Google Waves uses for syncing shared documents.
Any suggestions?
If you are willing to write this in PHP, I'd say you are looking at the wrong technology. There is 2 major problem with PHP and real-time.
When you run a PHP application, it is not persistant like Servlet with Java. It is hard and not really adapted to do communication between each connection. You have to use database storage, stream or file to send data between each instance. All of these methods are not very efficient.
It is using blocking I/O and this is where it hurts in term of performance and scalability.
You should look at non-blocking I/O technology for web server. They are all event-driven server which is something different from the PHP approach. Here are few example :
JBoss + Netty (Java)
Node.js (Javascript) - Google Tech Talk about it
Twisted (Python)
You need websockets or something similar.
http://www.orbited.org/
"Orbited allows you to write real-time web applications, such as a chat room or instant messaging client, without using external plugins like Flash or Java. It enables streaming networking for JavaScript without loading bars or page refreshes."
You can implement the chat as IRC or Jabber using Orbited.

Categories