HHVM 4.122 is released! This release marks the end of support for 4.116; HHVM 4.117–4.121 remain supported, as do the 4.80 and 4.102 LTS releases.


  • Improved JIT performance of non-async generators.
  • Separately improved the JIT performance of async generators.
  • HSL IO’s `BufferedReader::readByteAsync’ now operates correctly if a read happens with an empty buffer (usually at the 8kb boundary).
  • Fixed bug leading to crash when INI files reference environment variables.

Breaking Changes

  • == no longer converts types or warns by default; false is now returned. For example, var_dump(1 == '1') prints bool(false).
  • comparison operators (e.g. <) now throw in cases where they would previously coerce types, such as 1 < '2'.
  • hh_single_compile is no longer included in our packages. HackC is now embedded in HHVM as a library. If you want to view the generated bytecode (e.g. for debugging), use hhvm -d hhvm.dump_hhas=1 foo.hack.
  • gettype() will no longer ever return array - vec, dict, or keyset will be returned instead. If you need to distinguish between arrays marked as legacy and other arrays, use HH\\is_array_marked_legacy($x).
  • Removed curl_copy_handle and CurlPool due to thread safety issues. If similar behavior is required, we recommend using CurlShareHandle instead.