This contains some helpful hints and frequently asked questions about HHVM.


What is the history of HHVM?

For a history of what is now HHVM, please visit our Wikipedia page.

How does Facebook use and run HHVM?

Facebook's entire site runs on HHVM (desktop, API and mobile), both in development and production.

What platforms is HHVM supported on?

  • Linux: HHVM has Linux support on flavors of Ubuntu and Debian.
  • Mac OS X: HHVM has MacOS support via Homebrew.


How do I install HHVM? Where are the binaries?

New users may want to try our high-level overview getting started guide.

You can find more detailed installation information here.

When does HHVM release a new version?

Every week; each release is supported for 6 weeks.

Why is HHVM released every week?

This allows users to choose between many small updates, or fewer, larger updates.

What code does HHVM currently run?

The following sites use Hack and HHVM:

There is also a wiki listing HHVM users.

What do I do if I run into a problem (e.g., an error, fatal or segfault)?

If you believe you may have found a security issue, please see HHVM's SECURITY.md; otherwise, please submit an issue.

For real-time discussion, the team tends to hang out in #hhvm on IRC during working hours US Pacific time (and knowledgeable community members are often around at other times too).

Should I use Proxygen or FastCGI?

Proxygen is strongly recommended, and used in production by Facebook.

FastCGI is not recommended, but available for legacy or niche use cases.

When will HHVM support Apache or Nginx?

HHVM can be used either with mod_proxy and the Proxygen server, or FastCGI.

Proxygen is recommended, but care is needed to forward headers appropriately.

Configuration and Deployment

Why is my code slow at startup?

The HHVM JIT needs time to warm up. The warmup usually occurs somewhere on the order of 10-11 requests, at which point the JIT has performed its optimizations and off we go at peak speed.

So, in HHVM server mode, you start out by running the first couple requests in interp mode to get things primed. You don't really want to be optimizing the first few requests since that is when initialization is occurring, caches are being loaded, etc. Those code paths are generally cold later on.

After the first few requests, the JIT is on its way to optimizing.

It is advisable, but not required, if you are running an HHVM server to send the server some explicit requests that are representative of what user requests will be coming through. You can use curl, for example, to send these requests. This way the JIT has the information necessary to make the best optimizations for your code before any requests are actually served.