terrasse(big)

What a day – barcamp shanghai june 2010

June 25th, 2010 | published by Vivian No Comments

On June 12th The NetCircle hosted the first barcamp Shanghai in 2010 and it was an exciting day.

Even though the worldcup started the night before the first participants showed up before 9am and did’ t hesitate to help us with the final preparations – thats the spirit of barcamp.

Around 10:30 we started with a bilingual moderation and an introduction round and went straight into the first session slot afterwards. In total we had around 25 presentations, touching topics from development over startup management and metrics to learning chinese.

More than 90 participants from all over the world turned the barcamp into an inspirational and fun day – I am very happy that I’ ve had the opportunity to organise “my barcamp shanghai” – as this is another dream that came true.

We would like to thank all the participants for making this barcamp shanghai such a succcessful event – every barcamp is only as good as the people who participate.

Barcamp shanghai is back @ the NetCircle

June 1st, 2010 | published by Vivian No Comments

We may proudly announce that we`ll host our second barcamp Shanghai here at the NetCircle on June 12th 2010.

barcamp shanghai

What: BarCamp Shanghai 2010
When: Saturday, June 12, 9:30am – 06:00pm + afterparty @wkshanghai
Where: The NetCircle HQ

Sign up here for barcamp Shanghai

What is a Barcamp? (Short Version: A 24-hour ad-hoc, all-play unconference where everyone who attends participates by presenting or helping out.)

I am also very glad to be one of the organisers of this barcamp Shanghai as organising these unconferences is one of my passions. Back in Germany I Co-founded the communitycamp and artcamp, co-organised barcamp Hamburg & wordcamp and helped out at many other camps.

I’m very excited as this barcamp also will be my first one outside of Europe and am looking forward to many interesting people, sessions and conversations – hope to see you there :-)

TheNetcircle at Symfony Live 2010

February 21st, 2010 | published by Arnaud "Boby" Seilles No Comments

Last week was held in Paris the second Symfony Live conference. Over 2 days, 350 (!!!) participants listened to 20 sessions; covering different subjects like usage of Symfony events, introduction to GIT and the first presentation/release of Symfony 2. It was a great gathering of the framework users but also of PHP and Open Source enthusiasts. We could exchange our experience with other developers, prepare some future collaboration and enjoy some french food.

Alvaro Videla at sflive2010

This was also the first presentation of our work to the outside world thanks to the session of one of our coworker, Alvaro Videla. His talk was about “Debugging and Profiling Symfony applications” presenting the tools developed and/or used in the company to run our main project. It also introduced some performance issue we had to deal with during our deployment of symfony 1.0 and 1.2. This was the first time the company’s work is publicized openly, due to its “special” nature, and the feedback is quite good so far, encouraging us to share more about our work.

The highlight of the conference was the first preview release of Symfony 2 (note the upper case S). This new version focused on speed and flexibility. By getting rid of the magic (magic methods, calls…) and using a few patterns (like dependency injection), the framework matures to a totally new level. Doctrine 2 was also revealed and follows the same path of speed/quality focus as well; this is very encouraging and I hope it will push for an increase of quality and reconnaissance in the PHP world. The final release is still far ahead, planned for late 2010, (beta available on github) but this already sounds very promising.

Another important point was the choice of using some Zend Framework components (logger, cache) instead of reinventing them; showing that collaboration, and not competition, is possible between the different frameworks. This is also quite interesting for the community; let’s see how it develops.

Stay tuned!

Saving pandas with nginx/memcache

August 17th, 2009 | published by Mauro Stettler 2 Comments

During the time when we were building the server environment for a new version of one of our community pages, we tested many different server applications and architectures. One thing which brought us a big speed and efficiency improvement was the combination of Nginx, Memcached and PHP-FPM which we are using and which I’m going to line out here.

First I’ll need to introduce the three main components a little.

  • Nginx is an extremely efficient high performance webserver. Actually its not only a webserver, but I call it that since its other functionalities are crap (subjective opinion). For serving HTTP it provides many things like very advanced URL rewriting and content filtering that includes subrequests to HTTP, FastCGI, Memcache and other backends.
    nginx-logo
  • Memcached is a popular and well known small, fast and simple key-value cache. Memcached
  • FPM is a patch for PHP and stands for FastCGI Process Manager. As the name says it manages processes to serve FastCGI. We first tried to use the spawn-fcgi process manager that comes with the Lighttpd package, but FPM proved to be more reliable and it has some nice features which spawn-fcgi doesn’t provide. PHP-FPM

In our setup we use Nginx as webserver in front of the environment and first entry point for user requests. For each request to non-static files it creates a FastCGI request and forwards it back to the right PHP Cluster.

Caching makes more sense on static content, so we make it static

On our site we serve a community in which each user has a profile that can be seen by other users. Those profiles are probably the most accessed part of the page, so it makes sense to think twice about how to cache them. Big parts of the profiles are more or less static, the users usually don’t change their profile data every day. So first we had to extract all the more dynamic parts, like the guestbook or the users recent forum posts from the profile by loading them via ajax. Now that we load those things on a separate request, we can start treating the profiles as almost static pages.

First steps with the new environment

In the first few months when we started serving the new version to users as a beta, all the requests to profiles arrived on the PHP cluster as FastCGI requests. To serve a request, PHP loaded the whole framework, checked if the profile was already on Memcache, and if not it generated the profile and stored it on the Memcache cluster. If the same profile got requested again, the FastCGI request went back to the PHP again and the PHP loaded the whole framework again only to check the Memcache.

blog nginx-memcache pic1

Improvement

If a profile got stored on the Memcache by PHP already, it doesn’t make much sense to load the whole, in our case really heavy, PHP framework again just to decide that it doesn’t need to regenerate the profile but read it from the cache instead. Luckily Nginx provides a really nice functionality to do subrequests to Memcache directly.

Probably you can already more or less imagine what we did. And now in detail:

Everytime when a request arrives at the Nginx, it first checks if this is a request for a static file or another subsystem like for example the forum. If not, the Nginx itself checks on the Memcache cluster if a key exists which it generates out of the URI. If it gets a hit, it totally bypasses the PHP by serving the request directly from Memcache.

To implement this, of course we needed to make sure that nothing else might accidentally store a key into the Memcache that might get hit by the Nginx and make it serve nonsense. Maybe it sounds stupid to mention this because its obvious, but honestly it actually happened.

blog nginx-memcache pic2

Enough theory

Thats where the magic happens:

1  location /{
2     if ($request_method != GET)
3     {
4       rewrite . @fallback last;
5     }
6     default_type    text/html;
7     add_header      "Content" "text/html; charset=utf8";
8     charset         utf-8;
9     set             $memcached_key nginx_prefix$uri;
10    memcached_pass  profilememcache;
11    error_page      500 404 405 = @fallback;
12 }
13 location @fallback {
15    /* pass to FastCGI */
16 }

That snippet is a part of our Nginx configuration. On top of that snippet all static requests or requests to other subsystems got catched aleady. So we can be sure that requests which reach the location / are dynamic and belong to the main system which is our PHP framework.

The location @fallback is where the requests have to go if they want to reach the PHP.

On line 2 all requests which are not of method GET get catched, of course we don’t want to have application logic on the Nginx, so they get rewritten to be handled by the @fallback location and sent to PHP.

Lines 6-8 are defining the encoding and content type. Since we don’t store any HTTP headers on the Memcache, but only the HTML output itself, the Nginx needs to know about those things on its own.

On line 9 the variable $memcached_key gets set. This variable name is defined by the Nginx Memcache module, and the variables value will be the key which gets retrieved from the Memcache backend.

Finally, on line 10 Nginx does the request to the Memcache backend. If you now think “How does it know how to reach this profilememcache?”. Profilememcache is the name of an upstream which I defined somewhere above in the config and it includes the IP and port of the entry point of the Memcache cluster.

Another really nifty things happens on Line 11. The Parameter error_page defines what the Nginx has to do in case of a certain HTTP error. If the request on line 10 doesn’t succeed and gets a miss back from Memcache, the Nginx will raise a 404 error. Thanks to line 11, the 404 error will let the Nginx fall back to the location @fallback where the request gets sent to FastCGI, and now you know where the second location got its name from.

Does that work?

Yes, it works like hell. We saved our PHP framework cluster from handling hundreds of thousands of requests to which the Memcache already knew the answer. This significantly lowered the machine load, which made the cluster suck less power and saved the pandas.

It’s feeding time!

August 14th, 2009 | published by Claude No Comments

TNC Lunch

Lunchtime at The NetCircle in one minute! Alvaro created this cool time lapse video of our team grabbing lunch in the kitchen. Fresh (and free) lunch and dinner every day, prepared by our two kitchen ninjas Xiao Hong and Xiao Guo. Check the video after the fold!