Consultez et téléchargez, notre page ressources vous facilite HHVM

N’hésitez pas a nous contacter pour toute question ou remarque !

Vous trouverez sur le github hhvm de Facebook les ressources et l’aide nécessaires à l’installation d’ HHVM.

Facebook maintient une série de paquets précompilés pour certaines distributions Linux. Ces paquets s’appuient sur les gestionnaires classiques : yum, aptitude etc…Suivant les dépendances requises il se peut que vous rencontriez quelques conflits avec les librairies déjà installées sur votre serveur, conflits que vous ne souhaiterez ou ne pourrez pas résoudre.

Nous vous proposons une méthode alternative pour tester rapidement le potentiel d’HHVM sans impacter vos arborescences systèmes.
Nous compilons très régulièrement la dernière branche LTS d’HHVM et proposons ce binaire accompagné de toutes les librairies dont il dépend (libc comprise) elles-mêmes compilées dans leur version la plus judicieuse.

Plusieurs avantages :

  • Nous pouvons relivrer chacune des librairies tierces dès que le besoin s’en fait sentir, typiquement lors de la détection d’un bug impactant hhvm…
  • La livraison va être intégralement copiée dans /usr/share/hhvm ou /opt/hhvm. Un rm de ces répertoires suffit à supprimer toute trace de l’installation.
  • Notre livrable fonctionne avec tous les linux 64 bits que nous avons eu l’occasion d’installer jusqu’à présent.
  • Nous maintenons un README d’installation (init.d, cofiguration nginx, apache…). Comme nous allons parler du même logiciel et des mêmes instructions, nous allons pouvoir vous aider rapidement si vous rencontrez des soucis.

Les binaires hhvm ci-dessous ne comprennent aucune correction nxtweb et sont compilées à partir des derniers commit des branches courantes :

Bienvenu dans le guide de configuration d’ HHVM !

Nous y présentons les principaux paramètres de configuration directement utiles à l’utilisateur standard de l’interpréteur.
Les paramètres techniques créés à l’usage exclusif des développeurs HHVM ne sont pas décrits.

Version après version, nous nous efforçons de rendre compte du fonctionnement réel des différents paramètres, c’est à dire de leur implémentation effective. 

Les écarts avec la documentation en ligne ou les fichiers de documentation fournis avec le source github sont nombreux et ne méritent pas d’être signalés. En revanche, n’hésitez pas à nous faire part de toute différence entre les fonctionnements décrits ici et les fonctionnements réellement constatés.

Sommaire

Configuration dans la commande de lancement

La commande hhvm –help donne la liste des paramètres de lancement du binaire hhvm-nxtweb.

Voici un exemple de lancement de hhvm en mode serveur :

hhvm -c fichier_de_configuration --mode server

Fichiers de configuration

Les fichiers de configuration peuvent être au format HDF (voir ci-dessous), ou au format .ini (le format utilisé par apache).

Le paramètre -c permet de préciser un ou plusieurs fichiers .hdf ou .ini à prendre en compte.

Les valeurs de configuration contenues dans les derniers fichiers cités prennent le pas sur les autres.

Si aucun paramètre -c n’est précisé, hhvm va tenter de lire :

/etc/hhvm/php.ini

puis

/etc/hhvm/config.hdf

En revanche, si un paramètre -c est défini, ces fichiers par défaut ne seront pas lus par hhvm.

Le format HDF

 

Le format HDF (Hierarchical Data Format)

Format de base

 [node] = [value]

Ou, [node] peut être une chaîne alphanumérique et [value] peut être :

  • un booléen: true, false, on, off, yes, no, 1, 0
  • un nombre
  • une chaîne de caractères non quotée

Hierarchie exprimée avec des points

 [node] {
    [subnode] = [value1]
    [subnode] {
      [subsubnode] = [value2]
    }
  }

a la même signification que :

  [node].[subnode] = [value1]
  [node].[subnode].[subsubnode] = [value2]

Ces noms à points peuvent être utilisés partout où un noeud peut l’être.

Tableaux

Utilisez ‘*’ pour remplacer des noms de noeuds quelconques

  [node] {
    * = [value1]
    * = [value2]
  }

La forme suivante est également possible, mais est plus difficile à maintenir en cas d’ajout/suppression de noeuds :

  [node] {
    0 = [value1]
    1 = [value2]
  }

Alias de noeud

  [node] : [another]

Attention, ces deux noeuds sont liés symboliquement, toute modification de l’un modifiera l’autre.
La configuration suivante modifie également le noeud [another] :

  [node] : [another]
  [node] {
    extra = value
  }

Copie de noeud

On peut éviter le problème évoqué plus haut en recopiant le contenu d’un noeud dans un autre :

  [node] := [another]
  [node] {
    extra = value
  }

A présent, [node] et [another] sont deux noeuds différents et la modification précédente n’impacte pas [another]

Héritage de noeud

  [node] {
    @[another]
    extra = value
  }

à le même effet que :

  [node] := [another]
  [node] {
    extra = value
  }

Il est parfois plus simple et plus clair d’utiliser cette notation pour effectuer des copies de noeuds :

  [node] {
    @[another1]
    @[another2]
    extra = value
  }

Commandes shell

  [node] != [command]

Cette notation va exécuter la commande shell [command] et stocker son résultat dans le noeud [node].

Directive Include

  #include "another.hdf"

Commentaires

# Seul un format de commentaire est autorisé
# Le commentaire doit commencer au premier caractère de la ligne

Attention, ceci n’est pas un commentaire :

  [node] = [value]   #  ceci est considéré comme faisant partie de la définition de [node]

Valeurs multi-lignes

  [node] << EOM
  1st line
  2nd line
  ...
  EOM

Voici la liste des paramètres de configuration HDF pris en compte par hhvm-nxtweb :

Configurer les logs applicatives : balise Log

Log {
 Level = None (par défaut) | Error | Warning | Info | Verbose
 NoSilencer = false
 AlwaysLogUnhandledExceptions = true
 RuntimeErrorReportingLevel = 8191
 ForceErrorReportingLevel = 0
 Header = false
 HeaderMangle = 0
 MaxMessagesPerRequest = -1
}

Level (None)

NoSilencer (false)

On ignore l’opérateur ‘@’ : @ma_fonction() produira les mêmes logs que ma_fonction();

AlwaysLogUnhandledExceptions (false)

même si un handler d’erreur a été spécifié, les exceptions non capturées seront tout de même logguées.

RuntimeErrorReportingLevel

pour compatibilité avec PHP zend.

ForceErrorReportingLevel

bitmask, un OU logique est effectué avec RuntimeErrorReportingLevel pour déterminer le niveau efectif de log à appliquer.

Header (false)

Si positionné à ‘true’, crée en début de chaque ligne de log, un header comprenant un timestamp, le pid, un thread id, un identifiant de requête (égal au numéro d’ordre de la requête depuis le démarrage du process), un identifiant de message (numéro d’ordre depuis le début de la requête), un texte supplémentaire fourni en ligne de commande.

Debug.NativeStackTrace(false)

Il y a deux sortes de trace de pile d’appel :

* Les piles d’appel PHP. Le code C++ issu du code PHP intègre les informations nécessaires à leur édition.

* Les piles d’appel C++. Elles apparaissent en hexascii après le header, entre [ ]. On peut lire leur contenu en utilisant le paramètre de ligne de commande « -m translate ». Elles sont activées en positionnant (sous la balise Debug) NativeStackTrace = true;

Debug {
NativeStackTrace = true
}

Exemple : Pour lire la trace suivante, on copie la partie stack trace telle qu’elle apparait entre les deuxièmes [].

[Mon Dec 22 16:11:26 2014] [hphp] [24244:7ff77abd6b40:0:000001] [924987:924b19:925389:925813:93821e:93a0af:7d0ffd:7ff7718ec995:7cde19]

Et on les ajoute à la ligne de commande :

hhvm -m translate 924987:924b19:92538......:7cde19

HeaderMangle

Ce paramètre permet de contrôler la log de headers potentiellement malveillants. S’il vaut n plus grand que 0, alors hhvm tracera une requête avec collision de header sur n. Les collisions de ce type indiquent presque surement une tentative malveillante de positionner des headers potentiellement ajoutés ou filtrés par un proxy.

MaxMessagesPerRequest

Nombre maximum de messages de log par requête. Evite le bourrage de la log par certaines requêtes.

UseLogFile (true) et File = chemin_du_fichier_de_log

Utilisation et chemin du fichier de log
Si le premier caractère du paramètre File est | (pipe), la commande suivant le pipe est prise en compte.

UseSyslog (false)

Produit une log système consignée p
ar syslogd. Le niveau de la fonction C syslog est déduit de la valeur du paramètre Log { Level = }

AccessLogDefaultFormat = %h %l %u %t \ »%r\ » %>s %b

Format par défaut de la log d’acces.

Les caractères suivants sont remplacés par les valeurs suivantes :

  • ‘b’ ou ‘B’ : taille de la réponse
  • ‘C’ : contenu du cookie donné en argument (si cookie il y a)
  • ‘D’ : durée de la transaction (temps horloge)
  • ‘d’ : durée de la transaction (temps cpu)
  • ‘h’ : hôte distant
  • ‘i': valeur du header dont le nom est passé en argument. Si ce nom est « Referer », qu’il y a un virtual host et q’un filtre de log est positionné sur les virtual hosts, la log est potentiellement inhibée.
  •  ‘I': taille de la requete
  • ‘n’ : valeur de la server note dont le nom est passé en argument.
  • ‘o’ : information « request.memory_exceeded.non_psp » du serveur de stats
  • ‘O': information request.memory_exceeded.psp du serveur de stats
  • ‘p': information « request.timed_out.non_psp »
  • ‘P': « request.timed_out.psp »
  • ‘r': nom de la methode GET/POST + version HTTP
  • ‘s’ : code retour de la réponse.
  • ‘S’ : transport->getResponseInfo()
  • ‘t’ : timestamp (on peut préciser le format en argument, sinon, par défaut : [%d/%b/%Y:%H:%M:%S %z]
  • ‘T': durée depuis le début du thread
  • ‘U': url
  • ‘v': valeur du nom de serveur associé au header Host, si ce nom est vide ou si RuntimeOption::ForceServerNameToHeader est positionné, valeur du header Host.
  • ‘Y': nombre d’instructions machine utilisées pour traiter la requête
  • ‘y': information « page.inst.psp » du serveur de stats
  • ‘Z': information « page.wall.psp » du serveur de stats
  • ‘z': information « page.cpu.psp » du serveur de stats

Il est possible de filtrer les accès pour générer autant de fichiers de logs spécialisés que nécessaire :

Access {
  * {
     File = chemin du fichier de log souhaité
     Format = un format apache d'access log
    }
  * {
     File = un autre chemin
     Format = un format apache d'access log
    }
 }

Les logs ADMINISTRATIVES : balise ADMINLog

balise AdminLog

Permet de logguer les accès au serveur d’administration.

AdminLog {
    File = nom du fichier
    Format = %h %t %s %U
 }

GESTION d’erreur : balise errorhandling

ErrorHandling {
 # Bitmask of error constants to upgrade to E_USER_ERROR. Only E_WARNING,
 # E_USER_WARNING, E_NOTICE, and E_USER_NOTICE are supported.
}

UpgradeLevel (0)

bitmask de constantes de définition de typage d’erreur. Permet de transformer les erreurs de type E_WARNING, E_USER_WARNING, E_NOTICE, et E_USER_NOTICE en E_USER_ERROR.

CallUserHandlerOnFatals (true)

Comme son nom l’indique

NoInfiniteRecursionDetection (false)

Comme son nom l’indique

WarnTooManyArguments (false)

Emet un warning quand un nombre excessif d’arguments est passé à une fonction/méthode.

 EnableHipHopErrors = true
 NoticeFrequency = 1 # 1 out of these many notices to log
 WarningFrequency = 1 # 1 out of these many warnings to log
 AssertActive = false
 AssertWarning = false

UpgradeLevel

CallUserHandlerOnFatals (true)

NoInfiniteRecursionDetection (false)

Comme son nom l’indique

NoticeFrequency (1)

Une notice sur NoticeFrequency sera logguée.

WarningFrequency (1)

Un warning sur WarningFrequency warnings sera loggué

AssertActive (false)

Comme son nom l’indique. Active les assert du code.

AssertWarning (false)

Traite les echec d’assert du code comme des warnings.

Accès au ressources : balise ResourceLimit

ResourceLimit {
   CoreFileSize = 0 # in bytes
   MaxSocket = 0
   SocketDefaultTimeout = 5 # in seconds
   MaxRSS = 0
   MaxRSSPollingCycle = 0 # in seconds, how often to check max memory
   DropCacheCycle = 0 # in seconds, how often to drop disk cache
   MaxSQLRowCount = 0
   SerializationSizeLimit = 0
   StringOffsetLimit = 10 * 1024 * 1024
 }

CoreFileSize (0)

Taille des fichiers core dump (en octets) (voir RLIMIT_CORE)

MaxSocket (0 )

Numero maximum donné à un descripteur de fichier par le process. Limite le nombre de descripteurs ouverts à un instant t. (voir RLIMIT_NOFILE)

SocketDefaultTimeout (5)

En secondes. Alimente CURLOPT_TIMEOUT de l’implémention via curl du client HTTP de hhvm.

MaxRSS (0)

En octect. Si différent de 0, consommation mémoire maximum du process.

MaxRSSPollingCycle (0)

En seconde. Intervalle de surveillance de la consommation mémoire via MaxRSS.

DropCacheCycle (0)

En seconde. Si différent de 0, durée de vie du cache disque.

MaxSQLRowCount (0)

Limit le nombre d’enregistrements renvoyés par une requête mysql. O indique qu’il n’y a pas de limite à ce nombre.

SerializationSizeLimit (0)

Taille maximale du résultat d’un sérialisation.

Paramètres sans balise

PidFile (www.pid)

chemin du fichier qui contiendra le pid du process hhvm.

Variables de type $_SERVER : balise Servervariables

La configuration suivante

ServerVariables {
   nom = valeur
 }

met $_SERVER[‘nom’] a disposition du php, avec la valeur ‘valeur’.

Variables de type $_ENV : balise ENVvariables

La configuration suivante

EnvVariables {
   nom = valeur
 }

met $_ENV[‘nom’] a disposition du php, avec la valeur ‘valeur’.

SERVEUR HTTP : balise SERVER

Server {

IP (chaine vide)

adresse IP du serveur. remplacée par localhost si non renseignée.

Port (80)

Port d’écoute HTTP

Type (libevent)

peut contenir fastcgi ou libevent.

ThreadCount (deux fois le nombre de CPU)

Nombre de threads de travail (workers).

ThreadRoundRobin (false)

Répartition de charge entre thread. False = Le dernier thread actif sert la requete qui arrive.

SourceRoot

Chemin des fichiers sources et des fichiers statiques.

On peut définir plusieurs chemins de recherche :

IncludeSearchPaths {
 * = un chemin
 * = un autre chemin
 }

# Recommend to turn this on when all the file paths in the file invoke
# table are relative for faster dynamic file inclusion.

AlwaysUseRelativePath (false )

Il est conseillé de passer ce paramètre à true quand tous les chemins des fichiers inclus sont relatifs, cela accélére le traitement de l’inclusion dynamique de fichiers.

RequestTimeoutSeconds (-1)

Durée maximale du traitement d’une requête.

RequestMemoryMaxBytes (0)

Mémoire maximale utilisée pour le traitement d’un requête.

# maximum POST Content-Length

MaxPostSize (10MB)

Content-Length maximal d’une requete POST

ImageMemoryMaxBytes (Upload.UploadMaxFileSize * 2)

Taille maximale d’une image à traiter

DefaultServerNameSuffix (default_domain.com)

Si ServerName n’est pas précisé pour un virtual host, on compose un libellé avec un prefixe + ce paramètre de configuration.
Le préfixe est obtenu en utilisant le paramètre « Pattern » du virtual host.
Si ce dernier est entre parenthèse la première concordance sera utilisée sinon ce sera le motif tout entier qui servira de préfixe.

# Forcing $_SERVER[‘SERVER_NAME’] to come from request header

ForceServerNameToHeader (false)

Force le contenu de $_SERVER[‘SERVER_NAME’] avec ServerName.

PathDebug(false)

Imprime les chemins tentés en cas d’erreur 404.

# startup options

# for port takeover between server instances

DefaultDocument(index.php)

StartupDocument

= filename
Source à exécuter au démarrage du serveur.
Ex : startup.php

RequestInitDocument

Fichier source à éxécuter en début de traitement de requête.

RequestInitFunction

Nom d’une fonction à exécuter en début de traitement de requête.
Exécuté après RequestInitDocument si ce dernier est positionné.

ErrorDocument404

Exemple : 404.php.
Source à exécuter en cas d’erreur 404.

ErrorDocument500

Exemple : 500.php.
Source à exécuter en cas d’erreur 500.

FatalErrorMessage

Message à envoyer au client lors d’une erreur 500.

# shutdown options

GracefulShutdownWait(0)

Temporisation avant arrêt du serveur (en seconde).

HarshShutdown (true)

Au lancement de hhvm, autorise à exécuter un kill sur un éventuel serveur hhvm préexistant écoutant sur le même port.

EvilShutdown (true)

Au lancement de hhvm, autorise à exécuter un kill sur tout process écoutant sur le même port.

EnableSSL(false)

Active SSL.

SSLPort(443)

Précise le port du serveur SSL.

SSLCertificateFile(identique à la configuration apache)

Chemin complet du certificat.

SSLCertificateKeyFile(identique à la configuration apache)

Chemin complet de la clef de chiffrement.

GzipCompressionLevel(3)

 

ImplicitFlush

Provoque un flush automatique de la sortie PHP en fin de traitement de requête.

STATISTIQUES SERVEUR : BALISE Stats

Il est possible d’obtenir de nombreuses statistiques sur le fonctionnement du serveur hhvm-nxtweb. Par défaut, aucune statistique n’est produte, il faut configurer explicitement le serveur avec la balise Stats pour pouvoir les consulter.

Stats {

Enable (false)

APC (false)

Web (false)

Memory (false)

Memcache (false)

MemcacheKey (false)

SQL (false)

Malheureusement, ne porte que sur l’extension php mysql d’origine. Les extensions mysqli et PDO mysql ne sont pas tracées (évol nxtweb ?)

SQLTable (false)

NetworkIO (false)

XSL (false)

Nom d’une feuille xsl à inclure dans le fichier stats.xml.
Ajoute une balise

XSLProxy (false)

Url d’une feuille xsl à inclure dans le fichier stats.xml.
Ajoute une balise

Le contenu de cette url est retourné par la commande administrateur stats.xsl.

SlotDuration (en seconde, par defaut : 10 * 60 = 10 minutes)

MaxSlot (en nombre de SlotsDuration, par defaut 12 * 6 = 12 heures)

EnableHotProfiler (true)

ProfilerTraceBuffer (2000000)

ProfilerTraceExpansion (1.2)

ProfilerMaxTraceBuffer (0)

Configuration diverse, balise Eval

EnableHipHopSyntax

(par defaut : false)

Active les extensions hhvm au langage php : yield, typage des paramètres de fonction (int, boolean, string…), nouveaux types tableau (vector, map, set)…

Exemple:
Le source suivant n’est valide qu’avec Eval.EnableHipHopSyntax=true :

<?php
function salutations(string $a)
 {
 echo $a;
 }
salutations("Bonjour tout le monde !");
?>

EnableHipHopExperimentalSyntax

(par defaut : false)

Active les extensions experimentales de hhvm au langage php. Notamment, le typage des variables locales et globales.

EnableShortTags

(par defaut : true)

Autorise l’utilisation de <? dans le code PHP.

EnableAspTags

(par defaut : false)

Autorise l’utilisation des balise ASP <% %> dans le code PHP.

EnableXHP

(par defaut : false)

https://www.facebook.com/notes/facebook-engineering/xhp-a-new-way-to-write-php/294003943919

EnableZendCompat

(par defaut : false)

Active les extensions php conservées par hhvm pour assurer la compatibilité avec le PHP zend.
Par exemple, l’extension ftp n’est plus disponible par défaut (hhvm utilisant l’extension curl pour les mêmes besoins).

EnableZendSorting

(par defaut : false)

hhvm et zend ont deux implementations differentes de la fonction usort, comme l’illustre le script suivant :

 class T {
   public function __construct($v)
   {
     $this->v = $v;
   }
   public function __toString()
   {
     return 'a';
   }
 }
 
 $list = [new T(1), new T(2)];
 usort($list, function($a, $b) {
   return strcmp($a, $b);
 });
 
 // PHP reverses $list but HHVM doesn't touch it
 print_r($list);
 ?>

EnableZendSorting à true indique à hhvm d’utiliser l’algorithme zend.

TimeoutsUseWallTime

(par defaut : true)

La limite set_time_limit est exprimé en temps réel. Si ce paramètre est renseigné avec ‘false’, c’est le temps cpu qui est mesuré.

CheckFlushOnUserClose

(par defaut : true)
La commande close() sur des streams utilisateurs doit-elle prendre en compte le resultat de la commande flush() implicite qui l’accompagne pour déterminer son propre code retour ?

EnableObjDestructCall

(par defaut : true)

Appel ou non des destructeurs de tous les objets non libérés en fin de traitement.

MaxUserFunctionId

(par defaut : 2 * 65536)

Non utilisé ?

CheckSymLink

(par defaut : true)

Determine s’il faut ou pas suivre les liens symboliques (avec cet impact sur les performances qu’il faut procéder à des appels à realpath le cas échéant) lors de la résolutions des directives includes/requires. La valeur par défaut (vrai) est compatible avec l’implémentation zend.

EnableAlternative

(par defaut : 0)

Non utilisé ?

EnableEmitSwitch

(par defaut : true)

Pour compatibilité avec zend sur le traitement des switch/case. A préciser.

EnableEmitterStats

(par defaut : true)

Maintient des statistiques au niveau de l’emetteur d’opcode.

RecordCodeCoverage

(par defaut : false)
Incompatible avec Eval.Jit=true. Permet d’obtenir un graphe d’utilisation du code PHP, la sortie se trouvant dans le fichier CodeCoverageOutputFile.

CodeCoverageOutputFile

Configuration de l’extension Apache

Apache {
   EnableInCLI = true
 }

Va autoriser l’utilisation des fonctions de cette extension (à savoir : apache_note,apache_request_headers,apache_response_headers,apache_setenv,getallheaders,apache_get_config) lors d’une utilisation en mode client de hhvm-nxtweb.

Configuration de l’extension APC

L’extension APC est active par défaut.
La configuration de ce module est définie sous la balise

Server {
   APC {
     ...
   }
 }

Elle est constituée des paramètres suivants :

EnableApc

(par defaut : true)

EnableConstLoad

(par defaut : false)

ForceConstLoadToAPC

(par defaut : true)

PrimeLibrary

(par defaut : chaine vide)

Ce paramètre permet de charger une liste de clf/valeurs dans apc , dès le démarrage de hhvm-nxtweb. Le chargement est très rapide, la liste ayant été au préalable codée en C++ et compilée dans une librairie dynamique (fichier .so).
Le paramètre PrimeLibrary doit contenir le nom de cette librairie.

Un exemple de construction d’une telle librairie est disponible ici.

Malheureusement, ce script php fait appel à la classe CacheArchiveSerializer, non définie dans l’arborescence hhvm.
En supprimant la référence à cette classe, on parvient à produire du code c++ avec un source de ce genre :

<?php
 include "apc_sample_serializer.php";
 $data = array(
   "un_nom_de_chaine" => "une_chaine",
   "un_nom_dentier"=> 123,
   "un_nom_de_tableau"=>array(1,2,3)
 );
 $cachar = new CacheArchiveHphpSerializer("essai");
 echo $cachar->serialize($data);
?>

Helas, ce code inclut apc_prime.h qui n’est trouvable nulle part.

Problème remonté à facebook : https://github.com/facebook/hhvm/issues/4734

Réponse : La fonctionnalité « Primed library »(et les paramètres associés : PrimeLibrary, LoadThread, CompletionKeys) est à usage interne facebook et une mise à jour de la doc est nécessaire…

LoadThread

(par defaut : 2)

Le chargement de la librairie .so en question peut se faire en monothread (paramètre LoadThread <= 1) ou en utilisant LoadThread threads différents.

CompletionKeys

TableType

(par defaut : « concurrent »)

« Concurrent » est la seule valeur implémentée à ce jour. Tout autre libellé provoque une exception.

EnableApcSerialize

(par defaut : true)

Utilise le format APC de sérialisation.

ExpireOnSets

(par defaut : false)

Si ‘true’ purge le cache APC toutes les PurgeFrequency mises en cache (apc_store).

PurgeFrequency

(par defaut : 4096)

PurgeRate

(par defaut : -1)

Si <0, toutes les entrées arrivant à expiration seront supprimées. Sinon, seules les PurgeRate plus anciennes le seront.

AllowObject

(par defaut : false)

TTLLimit

(par defaut : -1) Time To Live : durée de vie d’une entrée dans le cache APC
Valeur maximale de la durée de vie d’une entrée APC. Le cas échéant,prend le pas sur le paramètre ttl de la fonction apc_store.

Les trois paramètres suivants sont décrits comme « expérimentaux et très peu utilisés »…

KeyMaturityThreshold

(par defaut : 20)

MaximumCapacity

(par defaut : 0)

KeyFrequencyUpdatePeriod

(par defaut : 1000)

NoTTLPrefix

Liste des préfixes de clefs pour lesquelles TTLLimit ne s’applique pas.

MemModelTreadmill

(par defaut : false)

FileStorage {

Enable

(par defaut : false)

ChunkSize

(par defaut : 1LL << 29 )

MaxSize

(par defaut : 1LL << 32 )

Prefix

(par defaut : « /tmp/apc_store »)

FlagKey

(par defaut : « _madvise_out »)

AdviseOutPeriod

(par defaut : 1800)

KeepFileLinked

(par defaut : false)

Configuration de l’extension simplexml

Sous la balise :

Eval {
Libxml {

ExtEntityWhitelist

(defaut : chaine vide)

Liste des labels acceptés comme « xml external entities » séparés par des virgules. Par défaut aucune inclusion de fichier xml dans un fichier xml n’est autorisée.

Eval.Libxml.ExtEntityWhitelist=file,http,https,...

Dans un fichier de configuration .ini, la syntaxe sera differente :

hhvm.libxml.ext_entity_whitelist=file,http,https,...

Configuration de l’extension MySQL

Les paramètres de configuration de MySQL sont réunis sous la balise MySQL. Leurs noms sont relativement explicites :

MySQL {
   ReadOnly = false
   ConnectTimeout = 1000 # en ms
   ReadTimeout = 1000 # en ms
   WaitTimeout = -1 # en ms, -1 = pas de limite
   SlowQueryThreshold = 1000 # en ms, les requetes depassant cette durée sont logguées en erreur
   KillOnTimeout = false
   Socket = # chemin par defaut de mysql.sock
   TypedResults = true
 }

KillOnTimeout

(par defaut : false)

Laisse au client mysql la possibilité de mettre fin aux requetes trop lentes, ceci afin de soulager le serveur.

– TypedResults

Zend ne renvoit que des strings et NULL comme résultat de requêtes MySQL. Par défaut, HHVM renvoit aussi des int et des double.

surveillance HTTP

Http {
   DefaultTimeout = 30 # en secondes
   SlowQueryThreshold = 5000 # en ms, les requetes depassant ce seuil sont logguées en erreur
 }

DefaultTimeout alimente CURLOPT_TIMEOUT et CURLOPT_CONNECTIMEOUT dans la configuration curl de l’objet HHVM client HTTP.
Plus précisement, un min() est réalisé avec le temps restant à la requête web générant la connection HTTP cliente pour s’exécuter.

Configuration nxtweb

Les paramètres suivants sont à positionner sous la balise

EnvVariables
{

HTTPCLIENT_TRACE_ON

(par defaut : false)

Trace les accès à la librairie curl utilisée par hhvm pour construire son object client http.

EnvVariables {
  HTTPCLIENT_TRACE_ON=true
}

HTTPCLIENT_AUTOMATIC_SSL_VERSION

(par defaut : false)

En cas d’échec de la connexion pour incompatibilité de version SSL avec le serveur, on retente de se connecter en essayant toutes les versions disponibles pour la librairie curl utilisée.

UNSET_LD_LIBRARY_PATH

(par defaut : false)

Paramètre « historique ». Les premières installations de hhvm-nxtweb ont nécessité l’ajout de LD_LIBRARY_PATH=repertoire de livraison devant l’appel au binaire hhvm, cela pour permettre une livraison « tout en un » (cad : toutes les librairies utilisées par hhvm livrées par nxtweb). Ce positionnement peut faire échouer les appels depuis le binaire hhvm à des executables extérieurs (commandes shell etc…) linkés avec d’autres librairies que les librairies livrées par nxtweb.

En positionnant UNSET_LD_LIBRARY_PATH a true, on force la suppression de la variable d’environnement LD_LIBRARY_PATH en tout début d’exécution de hhvm : les appels aux binaires extérieurs font appel aux librairies du système et réussissent.

hhvm.curl.cainfo

Ce paramètre positionne CURLOPT_CAINFO dans le handler curl.

1) Lors d’un curl_init d’un objet php curl
2) Sur toute connexion HTTPS (Ex : SoapCLi)
3) Dans l’extension OAuth

Si une redéfinition du paramètre (stream context, curl_set_opt, …) est demandée par le code php, cette dernière est bien entendu prioritaire.