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

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

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.

Using WebSocket on Apache server

With all the buzz around WebSockets, it's pretty hard to find a good walkthrough on how to use them with an Apache server on Google.
We're developing a plugin, in PHP (symfony2), which will run from time to time kind of a chat instance. And we find WebSockets more interesting, standard and quick than AJAX for this matter. The thing is, we don't have much sysadmin ressources in our group and we find hard to gather good informations on the following matters:
Can we run a WebSocket instance on a traditional Apache, dedicated server, and if yes, do you have useful links for us?
If we need to mod the server, what kind of tools would you recommend knowing that we are not too skilled in sysadmin so we can't afford to have a high maintenance b*** on this.
Thank you very much,
ps: we'll link back to your blog/site as we'll make a technical/informational post on our devblog about this part of our app.
Thank you again!
As #zaf states you are more likely to find a standalone PHP solution - not something that runs within Apache. That said there is a apache WebSocket module.
However, the fundamental problem is that Apache wasn't built with maintaining many persistent connections in mind. It, along with PHP, is built on the idea that requests are made and responses are quickly sent back. This means that resources can very quickly be used up if you are holding requests open and you're going to need to look into horizontal scaling pretty quickly.
Personally I think you have two options:
Use an alternative realtime web technology solution and communicate between your web application and realtime web infrastructure using queues or short-lived requests (web services).
Off load the handling of persistent connections and scaling of the realtime web infrastructure to a realtime web hosted service. I work for Pusher and we fall into this category.
For both self-hosted and hosted options you can check out my realtime web tech guide.
One path is to use an independent installed web sockets server.
For PHP you can try:
http://code.google.com/p/phpwebsocket/ or http://github.com/Devristo/phpws/
There are some other projects which you can try as well.
Basically, you need to upload, unpack and start running the process.
On the frontend, you'll have javascript connecting to the server on the specific port.
Most websocket servers have a demo which echoes back whatever it hears, so this is a good place to write some test code. You may even find a rudimentary chat implementation.
The tricky part is to monitor the web socket server and to make sure it runs smoothly and continuously.
Try to test on as many browsers/devices as possible as this will decide on which websocket server implementation you choose. There are old and new protocols you have to watch out for.
I introduced another websocket server: PHP Ratchet (Github).
This is better and complete list of client & server side codes and browser support.
Please check this link.
Another Path is to use a dedicated websocket server.
Try Achex Websocket Server at www.achex.ca and checkout the tutorials.
OR
If you really want Apache, check out Apache Camel. (but you have to set it up and its a bit more complicated than achex server)
http://camel.apache.org/websocket.html

socket.io + php + is this a realistic solution at this point in time

I have been reading about websockets and also about socket.io.
I understand websockets are not support but enough browsers yet to be realistically used.
socket.io has browser support but appears to need node.js. With my hosting solution I have some space on a shared server, very limited control over the server and have access to php but there is no node.js.
I have read that people can get socket.io to work with PHP.
Question: seeing I have very limited server access, not control over ports, command line etc is it realistic that I could get socket.io working with PHP or should I just stick with the AJAX calls (I'm currently using)?
Note: I've developed a chat solution and it appears it would be much more light weight if it was running with a socket solution.
Also - is there good security with Sockets.io?
thx
Trying to make PHP talk to socket.io I suspect will be a big task.
Certainly it's not a great idea to run websockets via a pre-fork or threaded apache. Any event based server should be OK if you can handle the number of PHP processes. A better approach would be to write an event based server in php. Like this one
i researched a few websocket server implementations. i read, that there is a way to use node.js in production. using apache many years, i also searched for a module to handle websockets within apache, but found only half-hearted stuff. nothing which seemed solid.
i stumbled upon yaws, which is a websocket capable server written in erlang, which has the advantages of beeing the right language for a highly parallel application such as the chat thing, and also because websockets should be well integrated within the main server.
now, i'm developing a php chat server, which uses a framework called ratchet. -> google for 'ratchet php'. they got a good tutorial.
i start it via the commandline, and although for you it should be possible to also start the ratchet server via a browser call, i would not recommend that.
so in your constrained hosting environment, i would stick to ajax.

Help creating a streaming (or push) API with PHP and Apache

I'd like to create an API for a project I'm working on, allowing developers to create desktop and mobile applications built around its functionality. One thing I've always wanted to learn how to do is create a stateless, push notification system, similar to Twitter's Streaming API.
Basically, I want to be able to notify users of any changes to the data in real time, or as close to it as possible. I know that this might be difficult on mobile devices, which is why mobile applications will probably be built to check for updates periodically, to save battery. However, desktop applications won't have that limitation. I'd like to avoid making the application ask the server if there is new information, and instead let the server tell the application that there is new data.
My programming language is PHP and my server is Apache. If I absolutely had to I could switch to Lighttpd or nginx, but that's an absolute last resort since it would require a lot of changes to all of my existing code.
I've read this article:
http://www.zeitoun.net/articles/comet_and_php/start
And tested it out, but unfortunately all that happens is my browser keeps attempting to load the page and never actually displays the time. I suspect this is because, for whatever reason, I've never been able to get output buffering to work on my server, unless I send 64kb (or more) of data. I heard that I had to disable gzip, which I did, and it still didn't work, so I don't know.
Have a look at some existing technologies to help you do this:
Tornado
Tornado is an open source version of the scalable, non-blocking web server and tools that power FriendFeed. The FriendFeed application is written using a web framework that looks a bit like web.py or Google's webapp, but with additional tools and optimizations to take advantage of the underlying non-blocking infrastructure.
Pusher
Pusher is a hosted API for quickly, easily and securely adding scalable realtime functionality via WebSockets to web and mobile apps.
Both are extremely fast and scalable, and I have setup both relatively easily.
Well you could do this in several ways, you could build in a poller at the client side, or you could use something like NodeJS. (http://nodejs.org/) or web sockets.
Yeah another good piece is
http://socket.io/
and
http://elephant.io/
some tuorials like this might also be useful.
http://www.phpbuilder.com/articles/application-architecture/optimization/creating-real-time-applications-with-php-and-websockets.html

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

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

Categories