File: //proc/self/root/usr/bin/hhvm-repo-mode
#!/bin/sh
set -e
INI="/etc/hhvm/server.ini"
usage() {
echo "Usage: $0 enable root-dir"
echo " $0 disable"
echo
echo "Enables HHVM's \"repo authoritative\" mode. In this mode, HHVM"
echo "uses a pre-built and pre-optimized version of your PHP or Hack"
echo "source code. These ahead-of-time optimizations mean that code run"
echo "in repo mode can be significantly faster. Keep in mind that after"
echo "this mode is enabled, source code is no longer consulted, so"
echo "changes there will not be reflected unless this command is re-run"
echo "to either rebuild the repo or disable repo authoritative mode."
echo
echo "This command changes HHVM configuration; you will probably need"
echo "to be root."
echo
echo
echo "$0 enable root-dir"
echo
echo "Enables repo authoritative mode. Finds PHP or Hack source code"
echo "under \"root-dir\" and computes an optimized repo where that code"
echo "(and only that code) is available. If repo mode is already"
echo "enabled, the repo will be recomputed and replaced."
echo
echo
echo "$0 disable"
echo
echo "Disables repo authoritative mode. HHVM will return to its default"
echo "configuration of reading and executing code directly from disk."
exit 1
}
set_hhbc() {
HHBC=`grep hhvm.repo.central.path "$INI" | sed 's/[^=]*=\s*\(.*\)/\1/'`
if [ "x$HHBC" = "x" ]; then
mkdir -p /var/cache/hhvm
USER=`stat -c "%U" "/var/run/hhvm"`
chown -R "$USER" "/var/cache/hhvm"
echo "hhvm.repo.central.path = /var/cache/hhvm/hhvm.hhbc" >> "$INI"
HHBC="/var/cache/hhvm/hhvm.hhbc"
fi
}
repo_enable() {
FILE_LIST=`mktemp`
find "$1" -type f > "$FILE_LIST"
OUT_DIR=`dirname "$HHBC"`
hhvm --hphp --target hhbc --output-dir "$OUT_DIR" --input-list "$FILE_LIST" -l3 -v AllVolatile=true
OUT_DIR_USER=`stat -c "%U" "$OUT_DIR"`
HHBC_USER=`stat -c "%U" "$HHBC"`
if [ "$OUT_DIR_USER" != "$HHBC_USER" ]; then
chown "$OUT_DIR_USER" "$HHBC"
fi
echo "hhvm.repo.authoritative = true" >> "$INI"
}
repo_disable() {
rm -f "$HHBC"
sed -i '/hhvm.repo.authoritative/d' "$INI"
}
case "$1" in
enable)
if [ "$#" -ne 2 ] || ! [ -d "$2" ]; then
echo "Invalid root-dir"
usage
fi
service hhvm stop
set_hhbc
repo_disable
repo_enable "$2"
service hhvm start
;;
disable)
service hhvm stop
set_hhbc
repo_disable
service hhvm start
;;
*)
usage
;;
esac
echo
echo "Success!"