Copyright @ 1997 - 2012 par le PHP Documentation Group. Ce document ne peut être redistribué qu'aux termes et aux conditions mentionnés dans la licence Open Publication License, version 1.0 ou plus récente. Une copie de la licence Creative Commons Attribution 3.0 est distribuée avec ce manuel ; la dernière version est disponible à » http://creativecommons.org/licenses/by/3.0/.
Dans le cas où vous seriez intéressés par la distribution partielle ou totale de ce document (modifié ou non) ou auriez des questions, merci de contacter les propriétaires du Copyright à » doc-license@lists.php.net. Notez que cette adresse courriel est directement redirigée vers une liste de diffusion publique et archivée.
PHP est un acronyme récursif, qui signifie "PHP: Hypertext Preprocessor" : c'est un langage de script HTML, exécuté côté serveur. Sa syntaxe est empruntée aux langages C, Java et Perl, et est facile à apprendre. Le but de ce langage est de permettre aux développeurs web d'écrire des pages dynamiques rapidement, mais vous pouvez faire beaucoup plus avec PHP.
Ce manuel est essentiellement une référence des fonctions, mais il contient aussi des informations de référence sur le langage, des explications sur les fonctionnalités principales de PHP et diverses informations supplémentaires.
Vous pouvez télécharger ce manuel sous divers formats, sur » http://www.php.net/download-docs.php. Plus d'informations sur ce manuel sont disponibles dans l'appendice À propos du manuel. Si vous voulez découvrir l'histoire de PHP.
Nous mettons en avant les personnes les plus actives dans la préface du manuel mais il y a bien plus de contributeurs qui nous aident actuellement dans notre travail ou qui ont fournis une aide précieuse au projet dans le passé. Il y a beaucoup d'inconnus qui nous ont aidés à travers leurs notes concernant les pages du manuel qui sont continuellement incluses dans le manuel, travail dont nous sommes très reconnaissants. La liste fournie ci-dessous est classée par ordre alphabétique.
Les contributeurs suivants ont eu un impact énorme en ajoutant du contenu dans le manuel : Bill Abt, Jouni Ahto, Alexander Aulbach, Daniel Beckham, Stig Bakken, Nilgün Belma Bugüner, Jesus M. Castagnetto, Ron Chmara, Sean Coates, John Coggeshall, Simone Cortesi, Peter Cowburn, Daniel Egeberg, Markus Fischer, Wez Furlong, Sara Golemon, Rui Hirokawa, Brad House, Pierre-Alain Joye, Etienne Kneuss, Moriyoshi Koizumi, Rasmus Lerdorf, Andrew Lindeman, Stanislav Malyshev, Justin Martin, Rafael Martinez, Rick McGuire, Moacir de Oliveira Miranda Júnior, Kalle Sommer Nielsen, Yasuo Ohgaki, Richard Quadling, Derick Rethans, Rob Richards, Sander Roobol, Egon Schmid, Thomas Schoefbeck, Sascha Schumann, Dan Scott, Masahiro Takagi, Yannick Torres, Michael Wallner, Lars Torben Wilson, Jim Winstead, Jeroen van Wolffelaar et Andrei Zmievski.
Les contributeurs suivants ont énormément aidé dans l'édition du manuel : Stig Bakken, Gabor Hojtsy, Hartmut Holzgraefe et Egon Schmid.
Les mainteneurs actuellement les plus actifs sont : Daniel Brown, Nuno Lopes, Felipe Pena, Thiago Pojda et Maciek Sokolewicz.
Ces personnes ont également déployé énormément d'efforts dans le maintien des notes utilisateurs : Mehdi Achour, Daniel Beckham, Friedhelm Betz, Victor Boivie, Jesus M. Castagnetto, Nicolas Chaillan, Ron Chmara, Sean Coates, James Cox, Vincent Gevers, Sara Golemon, Zak Greant, Szabolcs Heilig, Oliver Hinckel, Hartmut Holzgraefe, Etienne Kneuss, Rasmus Lerdorf, Matthew Li, Andrew Lindeman, Aidan Lister, Hannes Magnusson, Maxim Maletsky, Bobby Matthis, James Moore, Philip Olson, Sebastian Picklum, Derick Rethans, Sander Roobol, Damien Seguy, Jason Sheets, Tom Sommer, Jani Taskinen, Yasuo Ohgaki, Jakub Vrana, Lars Torben Wilson, Jim Winstead, Jared Wyles et Jeroen van Wolffelaar.
PHP (officiellement, ce sigle est un acronyme récursif pour PHP: Hypertext Preprocessor) est un langage de scripts généraliste et Open Source, spécialement conçu pour le développement d'applications web. Il peut être intégré facilement au HTML.
Bien... mais qu'est ce que cela veut dire ? Un exemple :
Exemple #1 Exemple d'introduction
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Exemple</title>
</head>
<body>
<?php
echo "Bonjour, je suis un script PHP !";
?>
</body>
</html>
Au lieu d'utiliser des tonnes de commandes afin d'afficher du HTML (comme en
C ou en Perl), les pages PHP contiennent des fragments HTML dont du code
qui fait "quelque chose" (dans ce cas, il va afficher
"Bonjour, je suis un script PHP !").
Le code PHP est inclus entre
une balise de début
<?php et une balise de fin ?>
qui permettent au serveur web de passer en mode PHP.
Ce qui distingue PHP des langages de script comme le Javascript, est que le code est exécuté sur le serveur, générant ainsi le HTML, qui sera ensuite envoyé au client. Le client ne reçoit que le résultat du script, sans aucun moyen d'avoir accès au code qui a produit ce résultat. Vous pouvez configurer votre serveur web afin qu'il analyse tous vos fichiers HTML comme des fichiers PHP. Ainsi, il n'y a aucun moyen de distinguer les pages qui sont produites dynamiquement des pages statiques.
Le grand avantage de PHP est qu'il est extrêmement simple pour les néophytes, mais offre des fonctionnalités avancées pour les experts. Ne craignez pas de lire la longue liste de fonctionnalités PHP. Vous pouvez vous plonger dans le code, et en quelques instants, écrire des scripts simples.
Bien que le développement de PHP soit orienté vers la programmation pour les sites web, vous pouvez en faire bien d'autres usages. Lisez donc la section Que peut faire PHP ? ou bien le tutoriel d'introduction si vous êtes uniquement intéressé dans la programmation web.
Tout. PHP est principalement conçu pour servir de langage de script coté serveur, ce qui fait qu'il est capable de réaliser tout ce qu'un script CGI quelconque peut faire, comme collecter des données de formulaire, générer du contenu dynamique, ou gérer des cookies. Mais PHP peut en faire bien plus.
Il y a trois domaines différents où PHP peut s'illustrer.
PHP est utilisable sur la majorité des systèmes d'exploitation, comme Linux, de nombreuses variantes Unix (incluant HP-UX, Solaris et OpenBSD), Microsoft Windows, Mac OS X, RISC OS et d'autres encore. PHP supporte aussi la plupart des serveurs web actuels dont Apache, IIS et bien d'autres. Et ceci inclut tous les serveurs web qui peuvent utiliser le binaire PHP FastCGI, comme lighttpd et nginx. PHP fonctionne sous forme de module, ou comme processeur CGI.
Avec PHP vous avez le choix de votre système d'exploitation et de votre serveur web. De plus, vous avez aussi le choix d'utiliser la programmation procédurale ou objet (OOP), ou encore un mélange des deux.
Avec PHP, vous n'êtes pas limité à la production de code HTML. Les capacités de PHP lui permettent de générer aussi bien des images, des fichiers PDF, des animations Flash (avec l'aide des bibliothèques libswf et Ming) à la volée. Vous pouvez aussi générer facilement du texte, du code XML ou XHTML. PHP génère tous ces fichiers et les sauve dans le système de fichiers, ou bien les envoie directement au navigateur web.
Une des forces les plus significatives de PHP est qu'il supporte énormément de bases de données. Écrire une page web faisant appel à une base de données devient terriblement simple, en utilisant une des extensions spécifiques aux bases de données (i.e., pour mysql), ou utilisant une classe d'abstraction comme PDO, ou une connexion à n'importe quelle base de données supportant la connexion standard ouvert via l'extension ODBC. Les autres bases de données peuvent utiliser l'extension cURL ou sockets comme CouchDB.
PHP supporte de nombreux protocoles comme LDAP, IMAP, SNMP, NNTP, POP3, HTTP, COM (sous Windows) et encore d'autres. Vous pouvez ouvrir des sockets réseau, et interagir avec n'importe quel autre protocole. PHP supporte le format complexe WDDX, qui permet de communiquer entre tous les langages web. En terme d'interconnexion, PHP supporte aussi les objets Java, et les utilise de manière transparente comme objets intégrés.
PHP possède des fonctionnalités utiles dans le traitement de texte, incluant les expressions rationnelles compatibles Perl (PCRE), ainsi que de nombres extensions et utilitaires pour analyser et accéder aux documents XML. PHP standardise toutes les extensions XML sur la solide base de libxml2, et étend le jeu de fonctionnalités en ajoutant le support de SimpleXML, XMLReader et XMLWriter.
Beaucoup d'autres extensions existent, catégorisées alphabétiquement et par catégorie. Et enfin, il existe des extensions PECL qui peuvent (ou pas) être documentées dans le manuel PHP, comme » XDebug.
Comme vous le voyez, cette page n'est pas assez grande pour lister toutes les puissantes fonctionnalités de PHP. Lisez la section sur l'installation de PHP et étudiez la liste de fonctions pour avoir plus de détails sur toutes ces technologies.
Dans cette section, nous voulons illustrer les principes de base de PHP dans une courte introduction. Ce chapitre traite uniquement de création de pages web dynamiques avec PHP, laissant de coté temporairement les autres possibilités de PHP. Voyez la section Ce que peut faire PHP pour plus d'informations.
Les pages web qui exploitent PHP sont traitées comme des pages HTML standards, et vous pouvez les créer, éditer et effacer tout comme vous le faites normalement avec des pages HTML classiques.
Dans ce tutoriel, nous présumons que vous avez un serveur web avec le support PHP activé, et que les fichiers terminés par l'extension .php sont traités par PHP. Sur la plupart des serveurs, c'est la configuration par défaut, mais n'hésitez pas à interroger votre administrateur système en cas de doute. Si votre serveur web supporte PHP, vous n'avez rien à faire. Simplement, créez un dossier, puis créez un fichier texte, avec l'extension .php : le serveur va automatiquement l'exécuter avec PHP. Il n'y a pas de compilation, ou d'installation compliquée. Gardez en tête que les fichiers sont comparables à des fichiers HTML, dans lesquels vous allez utiliser des balises magiques, qui feront beaucoup de choses pour vous. Beaucoup d'hébergeurs web proposent PHP mais si ce n'est pas le cas, lisez la section des » liens PHP pour trouver un hébergeur web le proposant.
Supposons que vous souhaitiez économiser du temps en ligne et travailler localement. Dans ce cas, vous devez installer un serveur web comme » Apache, et bien sur » PHP. Vous souhaiterez aussi installer une base de données comme » MySQL.
Vous pouvez soit installer ces logiciels individuellement ou bien d'une manière simplifiée. Notre manuel contient les instructions d'installation de PHP (en supposant que vous avez déjà un serveur web d'installé). Si vous rencontrez des problèmes dans l'installation de PHP, nous vous suggérons de poser vos questions sur notre » liste de diffusions réservée à cet usage. Si vous choisissez une version simplifiée, vous pouvez utiliser des » des installeurs qui prennent en charge l'ensemble de l'installation en quelques clics. Il est facile de configurer un serveur web avec le support de PHP sur n'importe quel système d'exploitation, y compris MacOs, Linux et Windows. Sous Linux, vous pouvez aussi trouver des commandes comme » rpmfind et » PBone très pratiques pour rechercher les paquets pré-compilés. Vous pouvez aussi visiter » apt-get, pour des paquets Debian.
Créez un fichier appelé bonjour.php dans votre dossier web racine (DOCUMENT_ROOT) avec le contenu suivant :
Exemple #1 Notre premier script PHP : bonjour.php
<html>
<head>
<title>Test PHP</title>
</head>
<body>
<?php echo '<p>Bonjour le monde</p>'; ?>
</body>
</html>
Utilisez votre navigateur pour accéder au fichier via votre serveur web, en ajoutant le nom de fichier /bonjour.php. Si vous développez localement, votre URL ressemblera à http://localhost/bonjour.php ou encore http://127.0.0.1/bonjour.php mais cela dépend de la configuration de votre serveur web. Si celui-ci est configuré correctement, le fichier sera analysé par PHP et le résultat suivant affiché :
<html> <head> <title>Test PHP</title> </head> <body> <p>Bonjour le monde</p> </body> </html>
Ce programme est extrêmement simple et vous n'avez pas besoin de PHP pour créer une page web comme ceci. Elle ne fait qu'afficher Bonjour le monde, grâce à la fonction echo de PHP. Notez que ce fichier n'a pas besoin d'être exécutable ou autre, dans aucun cas. Le serveur sait que ce fichier a besoin d'être interprété par PHP car vous utilisez l'extension ".php", et le serveur est configuré pour les passer à PHP. Voyez cela comme une page HTML normale qui contient une série de balises spéciales qui vont vous permettre de réaliser beaucoup de choses intéressantes.
Si vous avez essayé cet exemple et qu'il n'a rien affiché de spécial, ou même qu'une boîte de dialogue a surgi pour vous proposer de le télécharger, ou encore vous avez vu le code tel que nous l'avons écrit dans le fichier, alors votre serveur web ne supporte probablement pas PHP ou est mal configuré. Demandez à votre administrateur de l'activer pour vous, en utilisant le chapitre Installation. Si vous développez localement, lisez également le chapitre d'installation afin de vous assurer que tout est configuré correctement. Assurez-vous que vous tentez d'accéder au fichier via http et que le serveur web vous fournit la sortie. Si vous appelez votre fichier depuis votre gestionnaire de fichiers, il ne sera pas analysé par PHP. Si le problème persiste malgré cela, n'hésitez pas à utiliser une » des options de support de PHP.
Le point important de cet exemple était de montrer le format des balises spéciales PHP. Nous avons utilisé ici <?php pour indiquer le début de la balise PHP. Puis, nous avons introduit les commandes PHP et refermé les balises PHP avec ?>. Vous pouvez passer du mode PHP au mode HTML et vice-versa, de cette manière, et à votre guise. Pour plus d'informations, lisez la section du manuel sur la syntaxe basique de PHP.
Note: Une note sur les retours à la ligne
Les retours à la ligne ont une signification minime en HTML, cependant, c'est toujours une bonne idée de rendre votre HTML aussi joli et proche que possible en y ajoutant des retours à la ligne. Un retour à la ligne suivant immédiatement une balise de fermeture PHP (?>) sera supprimé par PHP. Ceci peut être vraiment très utile lorsque vous insérez plusieurs blocs PHP ou fichiers inclus contenant du PHP qui n'est pas supposé afficher quoi que ce soit. En même temps, ce peut être confus. Vous pouvez ajouter un espace après la balise fermante PHP (?>) pour forcer l'espace et un retour à la ligne à afficher, ou vous pouvez ajouter explicitement un retour à la ligne dans le dernier echo/print de votre bloc PHP.
Note: Une note sur les éditeurs de texte
Il existe de nombreux éditeurs de texte et environnements de développement (IDE) que vous pouvez utiliser pour créer, éditer et gérer vos applications PHP. Une liste partielle de ces outils est entretenue à l'adresse » PHP Editor's List. Si vous voulez recommander un éditeur particulier, rendez donc une visite à cette page, et demandez au webmestre d'ajouter votre éditeur. Avoir au minimum un éditeur de texte avec la coloration syntaxique est vivement recommandé.
Note: Une note sur les traitements de texte
Les traitements de texte tels que StarOffice Writer, Microsoft Word et Abiword sont de très mauvais choix pour éditer des scripts PHP. Si vous voulez utiliser l'un d'entre eux, malgré tout, pour tester vos scripts, vous devez vous assurer que vous sauvez les fichiers au format texte seul (plain text) : sinon, PHP ne sera pas capable de lire et d'exécuter ces scripts.
Note: Une note sur le Notepad de Windows
Si vous écrivez vos scripts PHP avec Windows Notepad, vous devez vous assurer que vos fichiers sont sauvés avec l'extension .php (Notepad ajoute automatiquement une extension .txt à vos fichiers, à moins que vous ne preniez l'une des mesures suivantes). Lorsque vous sauvez un fichier, et que vous êtes invité à lui donner un nom, placez le nom du fichier entre doubles guillemets (i.e. "hello.php"). Vous pouvez également cliquer dans le menu 'Documents texte' du dialogue de sauvegarde, et choisir l'option 'Tous les fichiers'. Vous pourrez alors saisir le nom de votre fichier sans les doubles guillemets.
Maintenant vous avez créé un script PHP qui fonctionne, c'est le moment de créer le meilleur script PHP ! Faites un appel à la fonction phpinfo() et vous verrez beaucoup d'informations intéressantes sur votre système et sa configuration comme les variables pré-définies disponibles, les modules PHP chargés ainsi que la configuration. Prenez du temps pour revoir ces informations importantes.
Exemple #2 Récupération des informations du système depuis PHP
<?php phpinfo(); ?>
Réalisons maintenant quelque chose de plus puissant. Nous allons vérifier le type de navigateur que le visiteur de notre site utilise. Pour cela, nous allons accéder aux informations que le navigateur du visiteur nous envoie, lors de sa requête HTTP. Cette information est stockée dans une variable. Les variables sont faciles à repérer, car elles commencent toutes par un signe dollar. La variable qui nous intéresse ici est $_SERVER['HTTP_USER_AGENT'].
Note:
$_SERVER est une variable spéciale de PHP, qui contient toutes les informations relatives au serveur web. C'est une variable réservée de PHP, et une superglobale. Reportez-vous aux pages du manuel traitant des Auto-globales (aussi connues sous le nom de super-globales). Ces variables spéciales ont été introduites en » PHP 4.1.0. Auparavant, il fallait utiliser les variables $HTTP_*_VARS, comme $HTTP_SERVER_VARS. Bien qu'obsolètes, ces variables existent toujours. (Voir aussi la note sur l'ancien code.)
Pour afficher cette variable, nous pouvons simplement faire :
Exemple #1 Afficher le contenu d'une variable (élément de tableau)
<?php
echo $_SERVER['HTTP_USER_AGENT'];
?>
Un résultat possible du script pourra alors être :
Il y a de nombreux types de variables disponibles en PHP. Dans l'exemple ci-dessus, nous avons affiché un élément de Tableau (Array). Les tableaux peuvent être très utiles.
$_SERVER est juste une variable qui est automatiquement disponible dans votre script. Une liste de toutes les variables qui sont rendues disponibles est fournie dans la section Variables réservées ou vous pouvez aussi en obtenir une liste complète en lisant l'affichage de la fonction phpinfo() utilisée dans l'exemple de la section précédente.
Vous pouvez ajouter plusieurs commandes PHP dans une balise PHP, et créer de petits blocs de code qui réalisent des opérations plus complexes qu'un simple affichage. Par exemple, si nous voulons vérifier que le navigateur est bien de la famille des Internet Explorer, nous pouvons faire cela :
Exemple #2 Exemple utilisant les structures de contrôle et les fonctions
<?php
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) {
echo 'Vous utilisez Internet Explorer<br />';
}
?>
Le résultat de ce script, si vous utilisez Internet Explorer, sera :
Vous utilisez Internet Explorer<br />
Ici, nous introduisons plusieurs nouveaux concepts. Nous avons une structure if. Si vous êtes familier avec les syntaxes de base du langage C, cela ne vous surprendra pas. Si vous ne connaissez pas assez le langage C ou un autre langage dont la syntaxe est similaire à celle ci-dessus, il vaudrait mieux que vous lisiez une introduction à PHP, et assimiliez les premiers chapitres, ou bien lisez le chapitre consacré à la référence du langage.
Le second concept que nous avons introduit est la fonction strpos().
strpos() est une fonction intégrée à PHP, qui recherche
la présence d'une chaîne dans une autre. Dans notre cas, nous
avons recherché la chaîne "MSIE" dans la chaîne
$_SERVER['HTTP_USER_AGENT']. Si cette
chaîne est trouvée, la fonction retourne sa position dans la chaîne et, sinon, FALSE.
Si elle ne retourne pas FALSE, la structure if
reçoit TRUE et le code entre accolades {} est exécuté. Sinon, le code n'est pas
exécuté. N'hésitez pas à
expérimenter d'autres exemples, à l'aide de
if,
else, et d'autres
fonctions comme strtoupper() et
strlen(). Chaque page de la documentation contient aussi
des exemples. Si vous n'êtes pas sûr de l'utilisation de ces fonctions, vous devez lire
la page du manuel
"comment lire une définition de fonction"
ainsi que la section sur les fonctions PHP.
Nous pouvons maintenant progresser et vous montrer comment utiliser le mode PHP, au milieu du code HTML :
Exemple #3 Passer du mode PHP au mode HTML et vice-versa
<?php
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) {
?>
<h3>strpos() n'a pas retourné FALSE</h3>
<p>Vous utilisez Internet Explorer</p>
<?php
} else {
?>
<h3>strpos() a retourné FALSE</h3>
<p>Vous n'utilisez pas Internet Explorer</p>
<?php
}
?>
Un exemple de résultat obtenu dans ce script est :
<h3>strpos() n'a pas retourné FALSE</h3> <p>Vous utilisez Internet Explorer</p>
Au lieu d'utiliser une commande echo, pour afficher du texte, vous pouvez utiliser du code HTML pur. Le point important à noter ici et que la logique de programmation est conservée. Seul un des deux blocs HTML sera affiché, suivant le résultat de la fonction strpos(). En d'autres termes, cela dépend si la chaîne MSIE a été trouvée ou non.
L'un des points forts de PHP est sa capacité à gérer les formulaires. Le concept de base qui est important à comprendre est que tous les champs d'un formulaire seront automatiquement disponibles dans le script PHP d'action. Lisez le chapitre du manuel concernant les variables depuis des sources externes à PHP pour plus d'informations et d'exemples sur la façon d'utiliser les formulaires. Voici un exemple de formulaire HTML :
Exemple #1 Un simple formulaire HTML
<form action="action.php" method="post"> <p>Votre nom : <input type="text" name="nom" /></p> <p>Votre âge : <input type="text" name="age" /></p> <p><input type="submit" value="OK"></p> </form>
Il n'y rien de particulier dans ce formulaire. Il est en HTML pur, sans aucune configuration particulière. Lorsque le visiteur remplit le formulaire, et clique sur le bouton OK, le fichier action.php est appelé. Dans ce fichier, vous pouvez écrire le script suivant :
Exemple #2 Afficher des données issues d'un formulaire
Bonjour, <?php echo htmlspecialchars($_POST['nom']); ?>.
Tu as <?php echo (int)$_POST['age']; ?> ans.
Voici le résultat que vous pourriez obtenir, selon les valeurs que vous avez saisies :
Bonjour Jean. Tu as 29 ans.
Mise à part les parties htmlspecialchars() et (int), ce script ne fait que des choses évidentes. htmlspecialchars() s'assure que tous les caractères spéciaux HTML sont proprement encodés afin d'éviter des injections de balises HTML et de Javascript dans vos pages. Pour l'âge, vu que nous savons que c'est un entier, vous pouvez le convertir en un entier. Vous pouvez également demander à PHP de le faire automatiquement à votre place en utilisant l'extension filter. Les variables $_POST['nom'] et $_POST['age'] sont automatiquement créées par PHP. Un peu plus tôt dans ce tutoriel, nous avons utilisé la variable $_SERVER, une superglobale. Maintenant, nous avons introduit une autre superglobale $_POST qui contient toutes les données envoyées par la méthode POST. Notez que dans notre formulaire, nous avons choisi la méthode POST. Si vous avions utilisé la méthode GET alors notre formulaire aurait placé ces informations dans la variable $_GET, une autre superglobale. Vous pouvez aussi utiliser la variable $_REQUEST, si vous ne souhaitez pas vous embarrasser de la méthode utilisée. Elle contient un mélange des données de GET, POST, COOKIE et FILE. Voyez aussi la fonction import_request_variables().
Vous pouvez également utiliser des champs XForms dans PHP, même si vous vous sentez bien avec l'utilisation des formulaires HTML. Bien que le travail avec XForms ne soit pas fait pour les débutants, vous pourriez être intéressé par cette technologie. Nous avons également une courte introduction sur le traitement des données reçues par XForms dans notre section sur les fonctionnalités.
Maintenant que PHP est devenu un langage de script populaire, il existe de nombreuses ressources qui vous proposent des portions de code que vous pouvez réutiliser dans vos codes. Pour la plupart, les développeurs de PHP ont tâché d'assurer la compatibilité ascendante, ce qui fait que de nombreux scripts écrits pour les anciennes versions sont aussi valables pour les nouvelles versions de PHP, idéalement sans modification. En pratique, certaines modifications doivent être apportées.
Les deux modifications récentes les plus importantes qui affectent les anciens codes sont :
Avec ce que vous savez, vous êtes maintenant capable de comprendre l'essentiel de la documentation PHP, et les différents scripts d'exemples disponibles dans les archives. Vous pouvez aussi trouver d'autres exemples dans la section liens ("links", en anglais) du site » http://www.php.net/links.php.
Différentes présentations des capacités de PHP sont disponibles sur le site des conférences PHP : » http://talks.php.net/.
Avant d'installer PHP, vous devez savoir ce que vous voulez faire avec PHP. Il y a trois cas d'utilisation que vous a décrit la section Que peut faire PHP ? :
Pour la première tâche, qui est de loin la plus répandue, vous avez besoin de trois choses : PHP lui-même, un serveur Web et un navigateur. Vous avez probablement un navigateur, et en fonction de votre système d'exploitation, vous pouvez aussi disposer d'un serveur Web (i.e. Apache sous Linux ou IIS sous Windows). Vous pouvez aussi louer un espace à une société. De cette façon, vous n'aurez pas à mettre en place PHP, mais uniquement à écrire vos scripts, les charger sur le serveur et voir le résultat sur votre navigateur.
Si vous installez PHP et le serveur par vous-même, vous avez deux choix. Soit sous la forme d'un module du serveur Web (via une interface directe appelée SAPI). Les serveurs qui supportent cette solution comptent notamment Apache, Microsoft Internet Information Server, Netscape et iPlanet. D'autres serveurs ont aussi le support ISAPI, l'interface de module Microsoft (OmniHTTPd par exemple). Si PHP ne supporte pas l'interface de module de votre serveur Web, vous pouvez toujours l'utiliser comme processeur CGI ou FastCGI. Cela signifie que vous devez configurer votre serveur pour qu'il utilise l'exécutable CGI de PHP, pour qu'il traite les fichiers PHP sur le serveur.
Si vous souhaitez aussi utiliser PHP en ligne de commande (écrire des scripts de génération d'image hors ligne, par exemple, ou bien traiter des textes en fonctions d'informations que vous leur fourniriez), vous aurez besoin d'un exécutable PHP. Pour plus de détails, lisez la section écrire des applications PHP en ligne de commande. Dans ce cas, vous n'aurez pas besoin de serveur Web, ni de navigateur.
Avec PHP, vous pouvez aussi écrire des interfaces graphiques clientes, en utilisant l'extension PHP-GTK. C'est une approche complètement différente de l'écriture des pages web, car vous ne générerez pas de fichiers HTML, mais vous aurez à gérer des fenêtres et des objets. Pour plus de détails sur PHP-GTK, voyez le » site officiel. PHP-GTK n'est pas inclus dans la distribution officielle de PHP.
À partir de maintenant, cette section décrit l'installation de PHP avec un serveur Web sous Unix et Windows, sous forme de module ou d'exécutables CGI.
Les codes source et les exécutables compilés pour certains OS (y compris Windows), sont disponibles à » http://www.php.net/downloads.php. Nous recommandons l'utilisation du » miroir le plus proche pour télécharger les distributions.
Cette section va vous guider lors du processus d'installation et de configuration de PHP sous Unix. Commencez par étudier les sections spécifiques à votre plate-forme ou à votre serveur Web avant de passer à l'installation.
Comme ce que nous avons écrit dans le manuel dans la section Considérations générales sur l'installation, nous traiterons de l'installation de PHP sur des serveurs Web dans cette section, bien que nous couvrirons également la configuration de PHP pour l'utilisation en ligne de commande.
Il y a plusieurs manières d'installer PHP sur des plates-formes Unix : soit avec un processus de compilation/configuration, soit avec des paquets précompilés. Cette documentation est particulièrement focalisée sur le processus de compilation/configuration. Beaucoup de systèmes basés sur Unix ont plusieurs sortes de paquets d'installation pour leur système. Ils permettent de vous assister dans une configuration standard, mais si vous avez besoin d'avoir des fonctionnalités différentes (comme un serveur sécurisé ou un driver différent de bases de données), vous aurez besoin de construire PHP et/ou votre serveur Web. Si vous n'êtes pas familiarisé avec la construction et la compilation de vos propres logiciels, il sera plus simple de vérifier si quelque part, personne n'a déjà construit une version de paquet de PHP avec les fonctionnalités dont vous avez besoin.
Pré-requis :
Lors de la compilation depuis SVN directement, ou après une modification des sources personnalisée, vous pourriez avoir aussi besoin de :
La configuration initiale de PHP et le processus de configuration sont contrôlés par l'utilisation du fichier configure et de ces options en lignes de commande. Vous pouvez récupérer une liste de toutes les options disponibles accompagnées d'une courte description en exécutant la commande ./configure --help. Notre manuel documente les différentes options séparément. Vous pouvez trouver les options internes en annexe, bien que les différentes options spécifiques à chaque extension sont décrites sur les pages de référence.
Lorsque PHP est configuré, vous êtes prêt à construire le module et/ou l'exécutable. La commande make devrait s'occuper de cela. Si elle échoue et que vous ne savez pas pourquoi, lisez la section Problèmes.
Cette section contient des notes spécifiques pour l'installation de PHP avec Apache sur les systèmes Unix. Des notes spécifiques pour Apache 2 sont aussi disponibles sur une page séparée.
Vous pouvez sélectionner des options à ajouter au fichier configure à la ligne 10 depuis la liste complète des options de configuration. Les numéros de versions ont été omis ici afin de s'assurer que les instructions ne soient pas incorrectes. Vous devrez donc remplacer les 'xxx' par les versions correctes de vos fichiers.
Exemple #1 Instructions d'installation de PHP (en module Apache)
1. gunzip apache_xxx.tar.gz
2. tar -xvf apache_xxx.tar
3. gunzip php-xxx.tar.gz
4. tar -xvf php-xxx.tar
5. cd apache_xxx
6. ./configure --prefix=/www --enable-module=so
7. make
8. make install
9. cd ../php-xxx
10. Maintenant, configurez votre PHP. C'est le moment où vous configurez PHP
avec diverses options, comme les extensions qui seront activées. Lancez
./configure --help pour une liste des options disponibles. Dans notre exemple,
nous ferons un ./configure assez simple avec uniquement le support Apache et MySQL.
Votre chemin vers apxs peut être différent de notre exemple.
./configure --with-mysql --with-apxs=/www/bin/apxs
11. make
12. make install
Si vous décidez de changer vos options de configuration après l'installation,
vous aurez juste besoin de répéter les trois dernières étapes. Vous aurez aussi besoin
de redémarrer apache pour que le nouveau module soit chargé. Une recompilation de
Apache n'est pas nécessaire.
Notez que, à moins de l'avoir explicitement désactivé, 'make install' installera aussi PEAR,
et des outils PHP tels que phpize, installera le CLI PHP, etc.
13. Configurez votre fichier php.ini :
cp php.ini-development /usr/local/lib/php.ini
Vous pouvez éditer votre fichier .ini pour régler certaines options PHP. Si vous souhaitez
votre php.ini à un autre endroit, utilisez --with-config-file-path=/votre/chemin lors de
l'étape 10.
Si vous utilisez plutôt php.ini-production, assurez-vous de lire l'ensemble des changements
qui y sont contenus, car ils modifient le fonctionnement de PHP.
14. Éditez votre httpd.conf afin de charger le module PHP. Le chemin dans la partie droite de la
directive LoadModule doit pointer vers l'endroit où se trouve le module PHP sur votre système.
Le make install lancé plus haut l'y aura certainement déjà déposé pour vous,
mais assurez vous en.
LoadModule php5_module libexec/libphp5.so
15. Et dans la section AddModule de httpd.conf, quelque part en dessous de
ClearModuleList, ajoutez ceci :
AddModule mod_php5.c
16. Dites à Apache de faire analyser certaines extensions par PHP. Par exemple,
faites analyser l'extension .php par PHP. Vous pouvez ajouter n'importe quelle(s)
extension(s) à analyser juste en l'(les)ajoutant à la suite, séparée(s) par un espace.
Nous ajouterons .phtml dans notre exemple.
AddType application/x-httpd-php .php .phtml
Il est assez fréquent de configurer l'extension .phps comme code source PHP colorisé,
ce qui peut être fait ainsi :
AddType application/x-httpd-php-source .phps
17. Utilisez votre méthode habituelle pour démarrer le serveur Apache.
(vous devez l'éteindre et le redémarrer, pas seulement lui envoyer
un signal HUP ou USR1.)
Alternativement, pour installer PHP en tant qu'objet statique :
Exemple #2 Instructions d'installation (installation en tant que module statique d'Apache) de PHP
1. gunzip -c apache_1.3.x.tar.gz | tar xf -
2. cd apache_1.3.x
3. ./configure
4. cd ..
5. gunzip -c php-5.x.y.tar.gz | tar xf -
6. cd php-5.x.y
7. ./configure --with-mysql --with-apache=../apache_1.3.x
8. make
9. make install
10. cd ../apache_1.3.x
11. ./configure --prefix=/www --activate-module=src/modules/php5/libphp5.a
(La ligne ci-dessus est correcte ! Oui, nous savons que libphp5.a n'existe pas à
ce moment. On ne le suppose pas non plus. Il sera créé.)
12. make
(vous devriez avoir maintenant un binaire httpd que vous pouvez copier dans votre
dossier de binaire Apache ; si c'est votre première installation, vous devez exécuter la
commande "make install")
13. cd ../php-5.x.y
14. cp php.ini-development /usr/local/lib/php.ini
15. Vous pouvez éditer le fichier /usr/local/lib/php.ini pour définir les options de PHP.
Éditez votre fichier httpd.conf ou srm.conf et ajoutez :
AddType application/x-httpd-php .php
Suivant votre installation d'Apache et votre variante d'Unix, il existe de nombreuses façons d'arrêter et redémarrer Apache. Voici une liste des commandes typiques, pour différentes installations. Remplacez /path/to/ par le chemin d'accès à vos applications sur votre système.
Exemple #3 Exemples de commandes pour le redémarrage d'apache
1. Nombreuses variantes Linux SysV : /etc/rc.d/init.d/httpd restart 2. Avec les scripts apachectl : /path/to/apachectl stop /path/to/apachectl start 3. httpdctl et httpsdctl (utilisant OpenSSL), similaires à apachectl : /path/to/httpsdctl stop /path/to/httpsdctl start 4. En utilisant mod_ssl, ou un autre serveur SSL, vous pouvez vouloir l'arrêter et le démarrer manuellement : /path/to/apachectl stop /path/to/apachectl startssl
L'emplacement des exécutables apachectl et http(s)dctl peut varier. Si votre système est pourvu des commandes locate, whereis ou which, elles peuvent vous aider à retrouver vos programmes.
Différents exemples de compilation PHP pour Apache suivent :
./configure --with-apxs --with-pgsql
Cette commande va créer une bibliothèque partagée libphp5.so qui sera chargée par Apache avec une ligne LoadModule dans le fichier httpd.conf. Le support PostgreSQL est aussi inclus dans cette bibliothèque.
./configure --with-apxs --with-pgsql=shared
Cette commande va créer une bibliothèque partagée libphp5.so pour Apache, mais va aussi créer la bibliothèque partagée pgsql.so qui sera chargée dans PHP avec une directive du fichier php.ini ou en la chargeant explicitement dans le script avec la fonction dl().
./configure --with-apache=/path/to/apache_source --with-pgsql
Cette commande va créer une autre bibliothèque partagée libmodphp5.a, un fichier mod_php5.c et quelques fichiers associés dans le dossier src/modules/php4 du dossier source Apache. Puis, vous devez compiler Apache avec --activate-module=src/modules/php5/libphp5.a et le système de compilation d'Apache va créer un fichier libphp5.a et le lier statiquement avec httpd. Le support PostgreSQL est alors inclus directement dans l'exécutable httpd, ce qui fait que le résultat final est un fichier unique httpd, qui inclut Apache et PHP.
./configure --with-apache=/path/to/apache_source --with-pgsql=shared
Comme précédemment, mais au lieu d'inclure le support PostgreSQL directement dans l'exécutable httpd final, vous allez obtenir une bibliothèque partagée pgsql.so que vous pouvez charger dans PHP soit grâce au fichier de configuration php.ini ou dynamiquement avec dl().
Lorsque vous faites votre choix entre les différents modes de compilation de PHP, vous devez prendre en compte leurs avantages et inconvénients respectifs. Les objets partagés permettent de compiler PHP et Apache de manière séparée, et vous n'aurez pas à compiler l'ensemble pour faire évoluer PHP. La compilation statique permet de charger et d'exécuter plus rapidement PHP. Pour plus d'informations, voyez la page web sur le » support des DSO.
Note:
Le httpd.conf par défaut d'Apache est fourni avec une section qui ressemble à ceci :
À moins que vous ne changiez cette valeur par "Group nogroup" ou quelque chose comme ça ("Group daemon" est aussi classique), PHP ne sera pas capable d'ouvrir des fichiers.User nobody Group "#-1"
Note:
Assurez-vous que vous spécifiez la version installée de apxs avec l'option --with-apxs=/path/to/apxs . Vous NE devez PAS utiliser la version d'apxs qui est dans les sources d'Apache, mais celle qui est réellement installée sur votre système.
Cette section contient les notes et conseils d'installation de PHP avec le serveur Apache 2.x sur les systèmes Unix.
Nous ne recommandons pas l'utilisation de PHP dans un environnement threadé MPM, avec Apache 2. Utilisez le mode prefork MPM, qui est le MPM par défaut pour Apache 2.0 et 2.2. Pour savoir pourquoi, lisez l'entrée de la FAQ correspondante à l'utilisation d'Apache 2 dans un environnement threadé MPM.
La » Documentation Apache est la meilleure source d'informations sur le serveur Apache 2.x. La plupart des informations sur les options d'installation d'Apache peut y être trouvée.
La version la plus récente du serveur HTTP Apache peut être obtenue depuis la » page de téléchargement d'Apache, et une version adaptée de PHP depuis les liens ci-dessus. Ce guide couvre uniquement les bases de fonctionnement d'Apache 2.x avec PHP. Pour plus d'informations, lisez la » documentation Apache. Les numéros de version sont omis ici, pour s'assurer que les instructions ne soient pas incorrectes. Dans les exemples ci-dessous, 'NN' devra être remplacé par la version spécifique d'Apache à utiliser.
Il y a actuellement 2 versions d'Apache 2.x - 2.0 et 2.2. Il y a plusieurs raisons de choisir l'une plutôt que l'autre ; néanmoins, la version 2.2 est actuellement la dernière versions disponible et c'est aussi celle que nous vous recommandons. Cependant, les instructions contenues dans ce guide devraient fonctionner pour la version 2.2 comme pour la version 2.0.
Téléchargez le serveur HTTP Apache depuis le site ci-dessus et décompressez-le :
gzip -d httpd-2_x_NN.tar.gz tar -xf httpd-2_x_NN.tar
De la même façon, téléchargez et décompressez les sources de PHP :
gunzip php-NN.tar.gz tar -xf php-NN.tar
Compilez et installez Apache. Consultez la documentation sur l'installation d'Apache pour plus de détails quant à la compilation de ce logiciel.
cd httpd-2_x_NN ./configure --enable-so make make install
Maintenant que vous avez Apache 2.x.NN de disponible sous /usr/local/apache2, configurez-le avec le support pour le chargement de modules, ainsi que le MPM prefork standard. Pour tester votre installation, utilisez la procédure normale pour démarrer le serveur Apache, i.e. :
/usr/local/apache2/bin/apachectl start
/usr/local/apache2/bin/apachectl stop
Maintenant, configurez et compilez PHP. Ce sera à ce moment là où vous pourrez personnaliser PHP avec les diverses options disponibles, comme la liste des extensions à activer. Dans notre exemple, nous effectuerons une configuration simple, avec Apache 2 et le support MySQL.
Si vous voulez construire Apache depuis les sources, tel que décrit ci-dessus, l'exemple suivant devrait être correct concernant les chemins vers les apxs, mais si vous avez installez Apache d'une autre façon, vous devrez prendre en compte vos spécificités et ajustez les chemins apxs en conséquent. Notez que suivants les distributions, vous pourriez être amené à renommer apxs en apxs2.
cd ../php-NN ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql make make install
Si vous décidez de modifier les options de configuration après l'installation, vous devrez exécuter de nouveau les étapes "configure", "make" et "make install". Vous n'aurez alors qu'à redémarrer Apache pour que le nouveau module prenne effet. Une re-compilation d'Apache n'est pas nécessaire.
Notez que, sauf indications contraires, l'étape "make install" installera également PEAR, mais aussi divers outils PHP comme phpsize, PHP CLI et bien plus encore.
Setup your php.ini
cp php.ini-development /usr/local/lib/php.ini
Vous devez éditer le fichier .ini pour définir les options PHP. Si vous préférez bouger ce fichier dans un autre répertoire, utilisez l'option --with-config-file-path=/some/path à l'étape 5.
Si vous choisissez le fichier php.ini-production, assurez-vous de lire la liste des modifications correspondante car il peut affecter considérablement la façon dont PHP fonctionnera.
Éditez le fichier httpd.conf pour charger le module PHP. Le chemin spécifié à droite de la chaîne LoadModule, doit correspondre au chemin système du module PHP. L'étape "make install" ci-dessus devrait avoir réalisé cette opération à votre place, mais une simple vérification permettra de s'en assurer.
LoadModule php5_module modules/libphp5.so
Dîtes à Apache d'analyser certaines extensions comme étant des scripts PHP. Par exemple, laissez Apache passer à PHP les fichiers dont l'extension est .php. Au lieu d'utiliser seulement la directive AddType d'Apache, nous souhaitons éviter tout risque potentiellement dangereux, lors d'un téléchargement de de la création de fichier comme exploit.php.jpg, d'exécution PHP. En utilisant cette exemple, vous pouvez avoir n'importe quelle extension d'analyser par PHP. Nous avons ajouté .php pour l'exemple.
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
Ou, si vous voulez autoriser les fichiers .php, .php2, .php3, .php4, .php5, .php6, et .phtml à être analysés par PHP, mais rien d'autre, nous utiliserons ceci :
<FilesMatch "\.ph(p[2-6]?|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
Et pour autoriser les fichiers .phps à être gérer par le filtre du code source de PHP, et ains, être affichés comme code source avec la coloration syntaxique, utilisez ceci :
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>
mod_rewrite peut être utilisé pour permettre à n'importe quel fichier .php d'être affiché comme code source avec coloration syntaxique, sans pour autant avoir besoin de le renommer ou de le copier avec une extension .phps. :
RewriteEngine On RewriteRule (.*\.php)s$ $1 [H=application/x-httpd-php-source]
Le filtre de code source PHP ne devrait pas être actif sur des systèmes de production, car il peut exposer du code confidentielle ou des informations sensibles contenues dans le code source.
Utilisez la procédure normale pour démarrer le serveur Apache, i.e. :
/usr/local/apache2/bin/apachectl start
Ou
service httpd restart
Si vous avez suivi les étapes précédentes, vous avez maintenant un serveur web Apache2 fonctionnel avec le support PHP comme module SAPI. Bien sûr, il y a une multitude d'autres options de configuration de disponibles avec Apache et PHP. Pour plus d'informations, entrez la commande ./configure --help dans l'arbre source correspondant.
Apache peut être compilé en mode multi-threadé, en sélectionnant le MPM worker, plutôt que le standard MPM prefork. Ceci est fait en ajoutant l'option suivante à l'argument de la commande "./configure", à l'étape 3 ci-dessus :
Cela ne devrait pas être entreprise sans être conscients des conséquences, et ayant au moins une juste compréhension de ce que cela implique. La documentation Apache concernant » MPM-Modules vous apportera d'importantes informations qui vous permettra de prendre votre décision.
Note:
La FAQ Apache MultiViews traite de l'utilisation MultiViews avec PHP.
Note:
Pour compilez une version multi-threadée d'Apache, le système cible doit supporter les threads. Dans ce cas, PHP doit également être construit avec l'expérimental Zend Thread Safety (ZTS). Sous cette configuration, toutes les extensions ne seront pas disponibles. Nous vous recommandons de compiler Apache avec le prefork MPM-Module.
Cette section contient des informations spécifiques sur l'installation de PHP avec Lighttpd 1.4 sur les systèmes Unix.
Reportez-vous à » Lighttpd pour une installation correcte de Lighttpd avant de continuer.
Fastcgi est le SAPI préféré pour connecter PHP et Lighttpd. Fastcgi active automatiquement php-cgi depuis PHP 5.3.0, mais pour les versions antérieures, vous devez configurer PHP avec l'option de compilation --enable-fastcgi. Pour vous assurez de l'activation de fastcgi, le résultat de la commande php -v doit contenir PHP 5.2.5 (cgi-fcgi). Avant PHP 5.2.3, fastcgi était activé dans le binaire PHP (php-cgi n'existait pas).
Pour configurer Lighttpd afin qu'il se connecte à PHP et appelle le processus fastcgi, vous devez éditez le fichier lighttpd.conf. Une connexion par sockets est la solution préférée pour les systèmes locaux.
Exemple #1 Portion du fichier lighttpd.conf
server.modules += ( "mod_fastcgi" )
fastcgi.server = ( ".php" =>
((
"socket" => "/tmp/php.socket",
"bin-path" => "/usr/local/bin/php-cgi",
"bin-environment" => (
"PHP_FCGI_CHILDREN" => "16",
"PHP_FCGI_MAX_REQUESTS" => "10000"
),
"min-procs" => 1,
"max-procs" => 1,
"idle-timeout" => 20
))
)
La directive bin-path permet à lighttpd d'appeler le processus fastcgi dynamiquement. PHP appellera les fils suivant la variable d'environnement PHP_FCGI_CHILDREN. La directive "bin-environment" définit l'environnement pour les processus appelés. PHP terminera un processus fils lorsque le nombre de requêtes spécifié par PHP_FCGI_MAX_REQUESTS a été atteint. Les directives "min-procs" et "max-procs" peuvent généralement être ignorées avec PHP. PHP gère ces propres fils et caches opcode comme APC qui partage uniquement les fils gérés par PHP. Si "min-procs" est défini à quelque chose de supérieur à 1, le nombre total de réponses PHP sera multiplié par PHP_FCGI_CHILDREN (2 min-procs * 16 fils, donne 32 réponses).
Lighttpd fournit un programme appelé spawn-fcgi afin de rendre plus facile les appels des processus fastcgi.
Il est possible d'appeler des processus sans spawn-fcgi, avec un minimum de configuration. La variable d'environnement PHP_FCGI_CHILDREN contrôle le nombre de fils que PHP appelle pour gérer les demandes. La variable d'environnement PHP_FCGI_MAX_REQUESTS détermine la durée de vie, en nombre de requêtes, de chaque fils. Voici un script bash simple qui permet d'aider les appels aux répondeurs PHP.
Exemple #2 Appel des répondeurs FastCGI
#!/bin/sh
# Localisation du binaire php-cgi
PHP=/usr/local/bin/php-cgi
# Localisation du fichier PID
PHP_PID=/tmp/php.pid
# Liaison à une adresse
#FCGI_BIND_ADDRESS=10.0.1.1:10000
# Liaison à un socket du domaine
FCGI_BIND_ADDRESS=/tmp/php.sock
PHP_FCGI_CHILDREN=16
PHP_FCGI_MAX_REQUESTS=10000
env -i PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN \
PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS \
$PHP -b $FCGI_BIND_ADDRESS &
echo $! > "$PHP_PID"
Les instances Fastcgi peuvent être appelées sur plusieurs machines distantes afin de répartir les applications.
Exemple #3 Connexion à des instances distantes de php-fastcgi
fastcgi.server = ( ".php" =>
(( "host" => "10.0.0.2", "port" => 1030 ),
( "host" => "10.0.0.3", "port" => 1030 ))
)
Cette section contient les notes et détails spécifiques à l'installation de PHP sur les serveurs Web Sun Java System Web Server, Sun ONE Web Server, iPlanet et Netscape server sur les systèmes Sun Solaris.
Depuis PHP 4.3.3, vous pouvez utiliser les scripts PHP avec le module NSAPI pour gérer des listes de dossiers et des pages d'erreurs personnalisées. Des fonctions supplémentaires sont disponibles pour assurer la compatibilité avec Apache. Pour du support sur les serverus courants, voyez la note sur les sous-requêtes.
Vous pouvez trouver plus d'informations sur la configuration de PHP avec Netscape Enterprise Server : » http://benoit.noss.free.fr/php/install-php4.html
Pour construire PHP avec les serveurs Web Sun JSWS/Sun ONE WS/iPlanet/Netscape, entrez le répertoire valide d'installation pour l'option --with-nsapi=[DIR]. Le répertoire par défaut est habituellement /opt/netscape/suitespot/. Lisez également le fichier /php-xxx-version/sapi/nsapi/nsapi-readme.txt.
Installez les packages suivants depuis le serveur » http://www.sunfreeware.com/ ou un miroir ad hoc :
export PATH.
gunzip php-x.x.x.tar.gz
(si vous avez une distribution .gz, ou bien allez en 4).
tar xvf php-x.x.x.tar
cd ../php-x.x.x
Pour les étapes suivantes, assurez-vous que /opt/netscape/suitespot/ correspond bien à votre installation du serveur netscape. Sinon, indiquez le chemin correct :
./configure --with-mysql=/usr/local/mysql \ --with-nsapi=/opt/netscape/suitespot/ \ --enable-libgcc
Après avoir fait l'installation de base et lu les fichiers readme.txt, vous pouvez avoir besoin de faire des configurations supplémentaires.
Tout d'abord, vous aurez besoin d'ajouter des chemins dans la variable LD_LIBRARY_PATH pour que Netscape trouve son bonheur. Il est préférable de le faire dans le script de démarrage du serveur Netscape. Les utilisateurs Windows peuvent ignorer cette étape. Le script de démarrage est souvent situé dans : /path/to/server/https-servername/start. Vous aurez peut être à éditer le fichier de configuration situé dans /path/to/server/https-servername/config/.
Ajoutez les lignes suivantes dans mime.types en tant qu'administrateur :
type=magnus-internal/x-httpd-php exts=php
Éditez le fichier magnus.conf (pour les serveurs >= 6) ou le fichier obj.conf (pour les serveurs < 6) et ajoutez-y les lignes suivantes. shlib peut varier en fonction de votre OS. Pour Unix, c'est quelque chose comme /opt/netscape/suitespot/bin/libphp4.so. Il est conseillé de placer les lignes suivantes après les lignes de mime types init.
Init fn="load-modules" funcs="php4_init,php4_execute,php4_auth_trans" shlib="/opt/netscape/suitespot/bin/libphp4.so" Init fn="php4_init" LateInit="yes" errorString="Failed to initialize PHP!" [php_ini="/path/to/php.ini"]
Configurez l'objet par défaut dans le fichier obj.conf (pour les classes de serveur virtuel [version 6.0+] dans leur fichier vserver.obj.conf) :
<Object name="default"> . . . .#NOTE this next line should happen after all 'ObjectType' and before all 'AddLog' lines Service fn="php4_execute" type="magnus-internal/x-httpd-php" [inikey=value inikey=value ...] . . </Object>
Cela est nécessaire uniquement si vous voulez configurer un répertoire pour accueillir des scripts PHP tout comme un répertoire cgi-bin :
<Object name="x-httpd-php"> ObjectType fn="force-type" type="magnus-internal/x-httpd-php" Service fn=php4_execute [inikey=value inikey=value ...] </Object>
Configuration de l'identification : les identifications PHP ne peuvent être utilisées avec aucune autre identification. TOUTES LES IDENTIFICATIONS SONT PASSEES À VOS SCRIPTS PHP. Pour configurer l'identification PHP pour tout le serveur web, ajoutez la ligne suivante à votre objet par défaut :
<Object name="default"> AuthTrans fn=php4_auth_trans . . . </Object>
Pour utiliser l'identification PHP dans un seul répertoire, ajoutez ce qui suit :
<Object ppath="d:\path\to\authenticated\dir\*"> AuthTrans fn=php4_auth_trans </Object>
Note:
La taille de la pile que PHP utilise dépend de la configuration du serveur Web. Si vous rencontrez des crashs avec les grands scripts PHP, il est recommandé d'augmenter la taille de la pile avec la console d'administration : dans la section "MAGNUS EDITOR".
Il est important de garder en tête que iPlanet/SunONE/Netscape est un serveur Web multi-threadé. Comme toutes les requêtes se situent dans le même contexte (c'est le contexte sur serveur Web), et que ce contexte est unique, si vous voulez accéder à des variables comme PATH_INFO, HTTP_HOST etc., il n'est pas recommandé d'y accéder à l'ancienne manière de PHP, avec la fonction getenv() ou une autre méthode (register globals, $_ENV). De cette manière, vous n'aurez que des valeurs d'environnement du serveur, et non pas des valeurs correctes pour le CGI.
Note:
Pourquoi est-ce que les variables CGI sont invalides ?
C'est lié au fait que le processus du serveur Web est lancé par l'administrateur du serveur, qui utilise le script de lancement au démarrage. En fait, il aurait fallu que vous lanciez vous-même le processus. C'est pour cela que l'environnement du serveur Web contient des variables d'environnement CGI. Vous pouvez vérifier cela en lançant le serveur Web depuis un autre endroit que l'administrateur du serveur : utilisez la ligne de commande Unix en tant que root : vous verrez alors qu'il n'y a pas de variables d'environnement.
Changez simplement vos scripts pour lire les variables CGI, en utilisant le tableau superglobal $_SERVER. Si vous avez d'autres scripts qui utilisent encore $HTTP_HOST et compagnie, il est recommandé d'activer l'option register_globals dans le php.ini et de changer l'ordre des variables. IMPORTANT : supprimez le "E" dans cette option, car vous n'en avez pas besoin pour cet environnement.
variables_order = "GPCS" register_globals = On
Vous pouvez utiliser PHP pour générer des pages d'erreurs de type "404 Not Found" ou apparentée. Ajoutez la ligne suivante dans le fichier obj.conf pour chaque page d'erreur que vous souhaitez remplacer :
Error fn="php4_execute" code=XXX script="/chemin/vers/script.php" [inikey=value inikey=value...]
Une autre possibilité est de générer une liste de dossiers personnalisée. Créez simplement un script PHP qui affiche le contenu du dossier, et remplacez la ligne Service par défaut par type="magnus-internal/directory" dans obj.conf avec ceci :
Service fn="php4_execute" type="magnus-internal/directory" script="/chemin/vers/script.php" [inikey=value inikey=value...]
Le module NSAPI supporte désormais la fonction nsapi_virtual() (alias : virtual()), pour réaliser des sous requêtes au serveur Web, et inclure le résultat dans une page. Le problème est que cette fonction utilise une fonctionnalité non documentée de la bibliothèque NSAPI. Sous Unix, ce n'est pas un problème, car le module va automatiquement rechercher les fonctions nécessaires, et les utiliser si elles sont disponibles. Sinon, nsapi_virtual() sera désactivée.
Note:
Soyez prévenu : le support de nsapi_virtual() est EXPERIMENTAL !
Par default, PHP est construit comme programmes à la fois CLI et CGI, pouvant être utilisé comme processeur CGI. Si vous utilisez un serveur qui supporte le module PHP, vous devriez en général utiliser cette solution pour des raisons de performances. Cependant, la version CGI permet aux utilisateurs de lancer des pages PHP sous différent id utilisateurs (Unix).
En utilisant le mode CGI, votre serveur est ouvert à de possibles attaques sérieuses. Lisez attentivement notre section sur la sécurité en mode CGI pour apprendre comment vous défendre contre ces attaques.
Si vous avez compilé PHP comme programme CGI, vous pouvez tester votre produit en tapant : make test. C'est toujours une bonne chose de tester le résultat d'une compilation. Cela vous permet de repérer des problèmes entre PHP et votre plate-forme, plutôt que d'attendre qu'ils surviennent.
Certaines variables d'environnement fournies par les serveurs Web ne sont pas disponibles dans les » spécifications CGI/1.1 actuelles. Seules les variables suivantes sont définies, et les autres doivent être considérées comme spécifiques aux serveurs Web : AUTH_TYPE, CONTENT_LENGTH, CONTENT_TYPE, GATEWAY_INTERFACE, PATH_INFO, PATH_TRANSLATED, QUERY_STRING, REMOTE_ADDR, REMOTE_HOST, REMOTE_IDENT, REMOTE_USER, REQUEST_METHOD, SCRIPT_NAME, SERVER_NAME, SERVER_PORT, SERVER_PROTOCOL et SERVER_SOFTWARE.
Cette section contient les notes et conseils d'installation de PHP sur les distributions HP-UX.
Il y a deux façons d'installer PHP sur les systèmes HP-UX. Soit en le compilant, soit en installant des binaires précompilés.
Les paquets pré-compilés officiels sont disponibles ici : » http://software.hp.com/
En attendant que cette section du manuel soit réécrite, la documentation concernant la compilation de PHP (ainsi que les extensions associées) sur les systèmes HP-UX a été effacée. Pour le moment, veuillez-vous référer à cette ressource externe : » Mise en place d'Apache et de PHP sous HP-UX 11.11
Cette section contient les notes spécifiques à l'installation de PHP sous » OpenBSD 3.6.
Cette méthode est la méthode recommandée pour installer PHP sur OpenBSD. C'est aussi la méthode la plus simple. Le paquet core a été séparé des modules et chacun d'entre eux peut être installé et supprimé indépendamment des autres. Les fichiers dont vous avez besoin sont sur le CD OpenBSD ou sur le site FTP.
Le paquet principal que vous devez installer est php4-core-4.3.8.tgz, qui contient le moteur de base, plus gettext et iconv). Puis, jetez un oeil aux paquets de module, comme php4-mysql-4.3.8.tgz ou php4-imap-4.3.8.tgz. Vous devez utiliser la commande phpxs pour activer et désactiver ces modules dans votre php.ini.
Exemple #1 Exemple d'installation de PHP sous OpenBSD avec Ports
# pkg_add php4-core-4.3.8.tgz # /usr/local/sbin/phpxs -s # cp /usr/local/share/doc/php4/php.ini-recommended /var/www/conf/php.ini (add in mysql) # pkg_add php4-mysql-4.3.8.tgz # /usr/local/sbin/phpxs -a mysql (add in imap) # pkg_add php4-imap-4.3.8.tgz # /usr/local/sbin/phpxs -a imap (remove mysql as a test) # pkg_delete php4-mysql-4.3.8 # /usr/local/sbin/phpxs -r mysql (install the PEAR libraries) # pkg_add php4-pear-4.3.8.tgz
Lisez la page de manuel Unix » packages(7) pour plus de détails sur les packages binaires d'OpenBSD.
Vous pouvez aussi compiler PHP en utilisant » l'arbre des ports. Cette méthode est recommandée aux utilisateurs expérimentés de OpenBSD. Le port PHP4 est scindé en deux sous-dossiers : core et extensions. Le dossier extensions génère les sous paquets de tous les modules PHP. Si vous souhaitez ne pas créer ces modules, vous pouvez utiliser la commande en ligne no_* FLAVOR. Par exemple, pour ne pas compiler le module imap, utilisez FLAVOR avec la valeur no_imap.
Les anciennes versions de OpenBSD utilisaient le système des FLAVORS pour compiler statiquement PHP. Comme il est trop difficile de générer des packages binaires avec cette méthode, elle est considérée comme obsolète. Vous pouvez toujours utiliser les anciennes versions stables, mais sachez qu'elles ne sont plus supportées par l'équipe d'OpenBSD. Si vous avez des commentaires sur le sujet, le responsable actuel est Anil Madhavapeddy (avsm_arobase_openbsd_point_org).
Cette section contient les notes et conseils d'installation de PHP sur les distributions Solaris.
L'installation Solaris oublie généralement les compilateurs C, et leurs utilitaires. Lisez cette FAQ pour savoir pourquoi est-ce que les versions GNU de certains de ces outils sont nécessaires.
Pour décompresser la distribution PHP, vous avez besoin de
Pour compiler PHP, vous avez besoin de
Pour construire les extensions additionnelles ou modifier le code de PHP, vous pouvez également avoir besoin de
Vous pouvez simplifier l'installation Solaris en utilisant pkgadd pour installer la plupart des composants. Le système de paquets des images (IPS) pour Solaris 11 Express contient également les composants nécessaires pour l'installation utilisant la commande pkg.
Cette section contient des notes et des astuces spécifiques à l'installation de PHP sous » Debian GNU/Linux.
Les compilations non officielles de sources tierces ne sont pas supportées ici. Tout bogue devrait être reporté à l'équipe Debian sauf s'il peut être reproduit en utilisant les dernières compilations de notre » section téléchargements .
Bien que les instructions pour compiler PHP sous Unix s'appliquent aussi à Debian, cette page de manuel contient des informations spécifiques pour les autres manières d'installer PHP, telles que l'utilisation de apt-get ou aptitude. Cette page de manuel utilise indifféremment l'une ou l'autre.
Tout d'abord, veuillez noter que d'autres paquets peuvent être souhaitables, comme libapache2-mod-php5 pour l'intégration avec Apache 2, et php-pear pour PEAR.
Ensuite, avant d'installer un paquet, il est sage de s'assurer que la liste des paquets est à jour. D'habitude, on le fait en utilisant la commande apt-get update.
Exemple #1 Exemple d'installation sous Debian avec Apache 2
# apt-get install php5-common libapache2-mod-php5 php5-cli
APT installera et activera automatiquement le module PHP 5 pour Apache 2, ainsi que toutes ses dépendances. Apache devra être relancé pour que les changements soient effectifs. Par exemple :
Exemple #2 Stopper et démarrer Apache une fois PHP installé
# /etc/init.d/apache2 stop # /etc/init.d/apache2 start
Dans l'exemple précédent, PHP a été installé avec juste les composants principaux. Il y a fort à parier que des modules supplémentaires soient nécessaires, tels que MySQL, cURL, GD, etc. Ils peuvent aussi être installés via la commande apt-get.
Exemple #3 Méthodes pour lister les paquets PHP 5 supplémentaires
# apt-cache search php5 # aptitude search php5 # aptitude search php5 |grep -i mysql
Ces exemples montreront de nombreux paquets, donc beaucoup spécifiques à PHP, comme php5-cgi, php5-cli et php5-dev. Déterminez ceux qui sont nécessaires et installez les comme n'importe quel autre en utilisant apt-get ou aptitude. Et vu que Debian effectue une vérification des dépendances, on vous avertira de ces dernières, comme pour installer MySQL et cURL :
Exemple #4 Installer PHP avec MySQL et cURL
# apt-get install php5-mysql php5-curl
APT ajoutera automatiquement les bonnes lignes aux fichiers connexes à php.ini, comme /etc/php5/apache2/php.ini, /etc/php5/conf.d/pdo.ini, etc. et selon l'extension, il ajoutera des entrées semblables à extension=foo.so. De plus, redémarrer le serveur web (Apache, par exemple) est nécessaire pour que ces changements soient effectifs.
Cette section contient les notes et conseils pour installer PHP sur un système Mac OS X. PHP est inclus avec les Macs, et pour compiler, la procédure est identique à l'installation sous Unix.
Il existe quelques versions pré-packagées et pré-compilées de PHP pour Mac OS X. Cela peut être utile pour mettre en place une configuration standard, mais si vous avez besoin d'accéder à des fonctionnalités spécifiques (comme un serveur sécurisé, ou un pilote de bases de données exotiques), vous aurez à compiler PHP et/ou votre serveur Web vous-même. Si vous n'êtes pas familier avec la compilation et la mise en place d'applications, il est bon de vérifier si personne d'autre n'a pas déjà réalisé un paquet contenant les fonctionnalités que vous désirez.
Les ressources suivantes offrent la possibilité d'installer des paquets et des binaires précompilés pour PHP sous Mac OS :
PHP est fourni en standard avec Macs depuis OS X version 10.0.0. Activer PHP avec le serveur Web par défaut nécessite de décommenter quelques lignes dans le fichier de configuration d'Apache httpd.conf tandis que le mode CGI et/ou CLI sont activés par défaut (accès simple via le terminal).
L'activation de PHP en suivant ces instructions permet de configurer rapidement un environnement local de développement. Il est vivement recommandé de toujours mettre à jour PHP à sa version la plus récente. Comme la plupart des programmes, les nouvelles versions sont créées pour corriger les bogues et ajouter des fonctionnalités et c'est le cas de PHP. Reportez-vous à la documentation de l'installation de MAC OS X pour plus de détails. Les instructions suivantes sont destinées au débutant, en fournissant juste assez de détails pour mettre en place une configuration par défaut pour travailler. Tous les utilisateurs sont vivement encouragés à compiler et installer une version récente du paquet.
Le type d'installation standard utilise mod_php, et active le mod_php embarqué sur Mac OS X pour le serveur Web Apache (le serveur Web par défaut qui est accessible via les préférences systèmes), en quelques étapes :
Note: Une façon de l'ouvrir est d'utiliser un éditeur de texte Unix dans un terminal, par exemple, nano, et sachant que le fichier est la propriété de l'utilisateur root, vous devrez utiliser la commande sudo pour l'ouvrir (en tant que root) ; aussi, vous devrez entrer la commande suivante dans votre Terminal (votre mot de passe vous sera demandé) : sudo nano /private/etc/apache2/httpd.conf Quelques commandes nano : ^w (recherche), ^o (sauvegarde), et ^x (sortie) où ^ représente la touche Ctrl.
Note: Les versions de Mac OS X antérieures à 10.5 fournissent d'anciennes versions de PHP et d'Apache. Aussi, le fichier de configuration d'Apache sur les machines originales peut être /etc/httpd/httpd.conf.
Avec un éditeur de texte, décommentez les lignes (en effaçant le caractère #) qui ressemblent aux lignes suivantes (ces 2 lignes ne se trouvent pas au même endroit) :
# LoadModule php5_module libexec/httpd/libphp5.so # AddModule mod_php5.c
Assurez-vous que les extensions désirées soient analysées par PHP (exemples : .php .html et .inc)
Sachant que ce comportement a déjà été activé dans votre fichier httpd.conf (depuis Mac Panther), une fois PHP activé, les fichiers .php seront automatiquement analysés par PHP.
<IfModule mod_php5.c>
# If php is turned on, we respect .php and .phps files.
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
# Since most users will want index.php to work we
# also automatically enable index.php
<IfModule mod_dir.c>
DirectoryIndex index.html index.php
</IfModule>
</IfModule>
Note:
Avant OS X 10.5 (Leopard), PHP 4 était livré par défaut plutôt que PHP 5. Ainsi, les instructions ci-dessus diffèreront juste en changeant 5 en 4. 5's to 4's.
La fonction phpinfo() affiche les informations sur PHP. Créez un fichier dans le DocumentRoot avec le code PHP suivant :
<?php phpinfo(); ?>
CLI (ou CGI dans les anciennes versions) est nommé php et réside normalement dans /usr/bin/php. Ouvrez un terminal, lisez la section sur la ligne de commande du manuel PHP, et exécutez la commande php -v pour vérifier la version PHP de ce binaire. Un appel à la fonction phpinfo() pourra également vous révéler cette information.
Référez-vous au guide d'installation sous Unix pour compiler PHP sur Mac OS X.
Cette section est applicable à Windows 98/Me et Windows NT/2000/XP/2003. PHP devrait fonctionner sur les plates-formes 16 bits comme Windows 3.1 et parfois, on décrira les plates-formes supportées sous le nom de Win32.
Note:
Windows 98/Me/NT4 n'est plus supporté depuis PHP 5.3.0.
Note:
Windows 95 n'est plus supporté depuis PHP 4.3.0.
Il y a deux méthodes principales pour installer PHP sous Windows : soit manuellement, soit avec l'installeur.
Si vous avez un environnement de développement comme Microsoft Visual Studio, vous pouvez aussi compiler PHP à partir des sources.
Une fois que PHP est installé sur votre Windows, vous pouvez aussi ajouter diverses extensions.
Il y a beaucoup d'installeurs "tout en un" sur Internet, mais aucun n'est approuvé par Php.net, car nous pensons que l'utilisation d'un des paquets officiels pour Windows depuis » http://www.php.net/downloads.php reste le meilleur choix et vous assurera d'avoir un système sécurisé et optimisé.
L'installeur Windows de PHP disponible depuis les pages de » http://www.php.net/downloads.php, installe la version CGI de PHP, et configure les serveurs web IIS, PWS, et Xitami. L'installeur n'inclut aucune extension externe supplémentaire de PHP (php_*.dll), vous les trouverez uniquement dans le paquet zippé Windows et dans les téléchargements PECL.
Note:
Notez bien que bien que l'installeur soit une méthode simple pour installer PHP, il est limité dans plusieurs aspects : par exemple, la configuration automatique des extensions n'est pas prise en compte. Utiliser l'installateur n'est pas la méthode préférée pour installer PHP.
Tout d'abord, installez votre serveur HTTP favori sur votre système et assurez-vous qu'il fonctionne.
Exécutez l'installeur et suivez les instructions fournies par l'assistant. Deux types d'installation sont fournis : standard, qui utilise toutes les configurations par défaut les plus pratiques, et avancée, qui pose un maximum de questions pour paramétrer le plus finement.
L'assistant d'installation rassemble suffisamment d'informations pour configurer php.ini ainsi que certains serveurs web pour utiliser PHP. Un des serveurs web pour lequel l'installeur PHP n'effectue pas de configuration automatique est Apache, vous devez donc le configurer manuellement.
Une fois l'installation terminée, l'installeur vous informera que vous devez redémarrer. Suivez ce conseil, ou commencez à utiliser PHP immédiatement.
Gardez bien à l'esprit que cette installation de PHP n'est pas sécurisée. Si vous voulez avoir une installation sécurisée de PHP, vous devriez commencer par lire la documentation, et choisir toutes vos options avec soin. Cet installeur automatique vous permet de réaliser l'installation en un tour de main, mais n'est pas destiné à l'utilisation sur des serveurs de production.
L'installeur PHP pour Windows pour les versions suivantes de PHP est construit en utilisant la technologie MSI via le kit d'outils Wix (» http://wix.sourceforge.net/). Il installe et configure PHP ainsi que toutes les extensions internes et PECL, mais aussi, configure les serveurs web les plus populaires comme IIS, Apache, et Xitami.
Tout d'abord, installez votre serveur HTTP (web) sur votre système et assurez-vous qu'il fonctionne correctement. Puis, utilisez l'un des types d'installation de PHP suivants.
Exécutez l'installeur MSI et suivez les instructions fournies par l'assistant d'installation. Il vous sera demandé de sélectionner le serveur Web que vous voulez configurer en premier, ainsi que tous les détails de configuration nécessaires.
Ensuite, il vous sera demandé de sélectionner quelles fonctionnalités et extensions vous voulez installer et activer. En sélectionnant "Will be installed on local hard drive" dans le menu pour chaque élément, vous pouvez contrôler l'installation ou non de la fonctionnalité. En sélectionnant "Entire feature will be installed on local hard drive", vous pourrez installer toutes les sous-fonctionnalités de la fonctionnalité principale (par exemple, en sélectionnant la fonctionnalité "PDO", vous installerez également tous les drivers PDO).
Il n'est pas recommandé d'installer toutes les extensions par défaut, sachant que la plupart nécessite des dépendances externes à PHP afin de fonctionner correctement. Préférez l'utilisation du mode de réparation qui est accessible via le panneau de contrôle "Ajout/Suppression de programmes" pour activer ou désactiver les extensions ou fonctionnalités, après l'installation.
L'installeur configurera donc PHP pour l'utiliser sous Windows, le fichier php.ini ainsi que certains serveurs Web. L'installeur configure actuellement IIS, Apache, Xitami et Sambar ; si vous utilisez un serveur web différent de ceux-ci, vous devrez le configurer manuellement.
L'installeur supporte également un mode silencieux, qui est utile pour les administrateurs systèmes pour déployer PHP facilement. Pour utiliser le mode silencieux, entrez la commande suivante :
msiexec.exe /i php-VERSION-win32-install.msi /q
Vous pouvez contrôler le dossier d'installation en le passant comme paramètre à l'installeur. Par exemple, pour installer PHP dans le dossier e:\php :
msiexec.exe /i php-VERSION-win32-install.msi /q INSTALLDIR=e:\php
Vous pouvez également spécifier quelles fonctionnalités devront être installées. Par exemple, pour installer l'extension mysqli et l'exécutable CGI :
msiexec.exe /i php-VERSION-win32-install.msi /q ADDLOCAL=cgi,ext_php_mysqli
Voici la liste courante des fonctionnalités à installer :
MainExecutable - exécutable php.exe ScriptExecutable - exécutable php-win.exe ( N'est plus disponible depuis PHP 5.2.10/5.3.0; il est maintenant inclut par défaut ) ext_php_* - les diverses extensions ( par exemple : ext_php_mysql for MySQL ) apache13 - module Apache 1.3 apache20 - module Apache 2.0 apache22 - module Apache 2.2 apacheCGI - exécutable Apache CGI iis4ISAPI - module IIS ISAPI iis4CGI - exécutable IIS CGI iis4FastCGI - exécutable IIS CGI NSAPI - module serveur Sun/iPlanet/Netscape netserve - exécutable NetServe Web Server CGI Xitami - exécutable Xitami CGI Sambar - module Sambar Server ISAPI CGI - exécutable php-cgi.exe PEAR - installeur PEAR Manual - manuel PHP au format CHM
Pour plus d'informations sur l'installation via les installeurs MSI depuis la ligne de commande, visitez » http://msdn.microsoft.com/en-us/library/aa367988.aspx
Pour effectuer une mise à jour, exécutez l'installeur soit en mode graphique, soit en ligne de commande. L'installeur lira vos options d'installation, effacera votre ancienne installation et réinstallera PHP avec les mêmes options que précédemment. Il est recommandé d'utiliser cette méthode pour mettre à jour votre installation de PHP plutôt que d'aller remplacer manuellement les fichiers dans le dossier d'installation.
Cette section contient les instructions pour installer manuellement et configurer PHP sous Microsoft Windows. Si vous recherchez la façon dont doit être utilisé l'installeur PHP pour installer et configurer PHP et un serveur Web sous Windows, référez-vous à l'installeur Windows (PHP 5.2 et suivants).
Téléchargez l'archive PHP depuis » PHP pour Windows: Binaires et sources. Il y a plusieurs versions de l'archive zip - choisissez la version correspondante au serveur web que vous utilisez :
Si PHP est utilisé avec IIS, alors choisissez PHP 5.3 VC9 Non Thread Safe ou PHP 5.2 VC6 Non Thread Safe;
Si PHP est utilisé avec IIS7 ou supérieure et PHP 5.3+, alors les binaires VC9 de PHP doivent être utilisés.
Si PHP est utilisé avec Apache 1 ou Apache 2, alors choisissez PHP 5.3 VC6 ou PHP 5.2 VC6.
Note:
Les versions VC9 sont compilées avec le compilateur Visual Studio 2008 et sont optimisées en terme de performance et de stabilité. Les versions VC9 nécessitent d'avoir » Microsoft 2008 C++ Runtime (x86) ou » Microsoft 2008 C++ Runtime (x64) d'installé.
Décompressez le contenu de l'archive zip dans le dossier de votre choix, par exemple C:\PHP\. La structure des dossiers et des fichiers extraits depuis l'archive zip ressemble à ceci :
Exemple #1 Structure d'un paquet PHP 5
c:\php | +--dev | | | |-php5ts.lib -- php5.lib en version non thread safe | +--ext -- bibliothèques DLLs pour PHP | | | |-php_bz2.dll | | | |-php_cpdf.dll | | | |-... | +--extras -- vide | +--pear -- copie initiale de PEAR | | |-go-pear.bat -- script d'installation de PEAR | |-... | |-php-cgi.exe -- exécutable CGI | |-php-win.exe -- exécution de scripts sans avoir un prompt de commande ouvert | |-php.exe -- exécutable de ligne de commande (CLI) | |-... | |-php.ini-development -- configuration par défaut du php.ini | |-php.ini-production -- configuration recommandée du php.ini | |-php5apache2_2.dll -- n'existe pas dans la version non thread safe | |-php5apache2_2_filter.dll -- n'existe pas dans la version non thread safe | |-... | |-php5ts.dll -- bibliothèque DLL coeur de PHP ( php5.dll en version non thread safe) | |-...
Voici la liste des modules et des exécutables inclus dans l'archive zip de PHP :
go-pear.bat - le script de configuration de PEAR. Référez-vous à l'» installation de PEAR pour plus de détails.
php-cgi.exe - exécutable CGI qui peut être utilisé lors de l'exécution de PHP sous IIS via CGI ou FastCGI.
php-win.exe - l'exécutable PHP pour l'exécution de scripts PHP sans fenêtre de ligne de commande (par exemple, des applications PHP qui utilisent un GUI Windows).
php.exe - l'exécutable PHP pour l'exécution de scripts PHP dans une interface de ligne de commande (CLI).
php5apache2_2.dll - module Apache 2.2.X.
php5apache2_2_filter.dll - filtre Apache 2.2.X.
Après l'extraction du contenu du paquet PHP, copiez le fichier php.ini-production dans le fichier php.ini du même dossier. Si nécessaire, il est également possible de placer le fichier php.ini dans le dossier de votre choix mais cela nécessite d'autres étapes de configuration décrites dans la configuration de PHP.
Le fichier php.ini indique à PHP la façon doit il doit se configurer, mais aussi la façon dont il doit travailler avec l'environnement sur lequel il s'exécute. Voici quelques concfigurations du fichier php.ini qui aide PHP à fonctionner d'une meilleure façon sous Windows. Quelques-unes sont optionnelles. Il y a bien d'autres directives utiles pour votre environnement - référez-vous à la liste des directives du php.ini pour plus d'informations.
Directives nécessaires :
extension_dir = <chemin vers le dossier des extensions> - extension_dir doit pointer vers le dossier contenant les fichiers des extensions PHP. Le chemin peut être absolu (e.g. "C:\PHP\ext") ou relatif (e.g. ".\ext"). Les extensions listées ci-dessous dans le fichier php.ini doivent se trouver dans le dossier extension_dir.
extension = xxxxx.dll - Pour chaque extension que vous voulez activer, vous avez besoin d'une directive "extension=" qui indique à PHP quelles extensions du dossier extension_dir doivent être chargées au démarrage.
log_errors = On - PHP a une fonctionnalité permettant d'historiser les erreurs, pouvant être utilisée pour envoyer les erreurs dans un fichier, ou vers un service (i.e. syslog) et fonctionne en conjonction de la directive error_log ci-dessous. Lors de l'exécution sous IIS, log_errors devrait être activée, avec une valeur valide de error_log.
error_log = <chemin vers le fichier d'historisation des erreurs> - error_log doit spécifier le chemin absolu ou relatif vers un fichier où les erreurs PHP doivent être écrites. Le fichier doit être accessible en écriture par le serveur web. L'endroit commun de ce fichier est le dossier TEMP, par exemple, "C:\inetpub\temp\php-errors.log".
cgi.force_redirect = 0 - Cette directive est nécessaire pour le fonctionnement sous IIS. Elle est relative à la sécurité et est nécessaire par bons nombres de serveurs web. Cependant, son activation sous IIS fera échouer le moteur PHP sous Windows.
cgi.fix_pathinfo = 1 - Cette directive permet à PHP d'accéder aux informations concernant le chemin réel suivi par la spécification CGI. Cette directive est nécessaire lors de l'implémentation de FastCGI sous IIS.
fastcgi.impersonate = 1 - FastCGI sous IIS supporte la possibilité de rendre impersonnels les éléments relatifs à la sécurité lors d'un appel client. Ceci permet à IIS de définir le contexte de sécurité sur lequel la demande est effectuée.
fastcgi.logging = 0 - L'historisation FastCGI doit être désactivé sous IIS. S'il est activé, alors tous les messages de toutes les classes seront traités par FastCGI comme des conditions d'erreur, ce qui fera qu'IIS générera des exceptions HTTP 500.
Directives optionnelles
max_execution_time = ## - Cette directive demande à PHP un maximum de temps afin d'exécuter un script donné. Par défaut, c'est 30 secondes. Augmentez la valeur de cette direction si l'application PHP prend plus de temps à s'exécuter.
memory_limit = ###M - La mémoire maximale disponible pour le processus PHP, en méga-octets. Par défaut, c'est 128, ce qui est parfait pour la plupart des applications PHP. Pour des applications plus complexes, il peut être nécessaire d'augmenter cette valeur.
display_errors = Off - Cette directive indique à PHP si les messages d'erreur doivent être inclus dans le flux retourné au serveur web. Si défini à "On", alors PHP les enverra, suivants les classes d'erreur que vous avez définies avec la directive error_reporting, au serveur web comme partie du flux d'erreur. Pour des raisons de sécurité, il est recommandé de définir à "Off" cette directive sur les serveurs de production afin de ne pas révéler les informations concernant la sécurité, qui sont inclues dans les messages d'erreur.
open_basedir = <chemins vers les dossiers, séparés par un point virgule>, e.g. openbasedir="C:\inetpub\wwwroot;C:\inetpub\temp". Cette directive spécifie le chemin vers le dossier où PHP est autorisé à effectuer des opérations sur le système de fichiers. Toute opération en dehors de ces chemins retournera une erreur. Cette directive est spécialement utile pour cantonner l'installation de PHP dans des environnements partagés afin d'éviter que les scripts PHP accèdent à tout fichier se trouvant en dehors du dossier racine du site web.
upload_max_filesize = ###M et post_max_size = ###M - La taille maximale autorisée, respectivement, d'un fichier téléchargé et des données de type POST. Les valeurs de ces directives devraient être augmentées si les applications PHP doivent effectuer de gros téléchargements, comme des images ou des fichiers vidéos.
PHP est maintenant configuré pour votre système. La prochaine étape est de choisir un serveur web et de la configurer pour y faire fonctionner PHP. Choisissez un serveur web depuis la table de contenus.
En plus de faire fonctionner PHP via un serveur web, PHP peut être exécuté depuis la ligne de commande, à la façon des scripts .BAT. Reportez-vous au chapitre sur la ligne de commande PHP sous Microsoft Windows pour plus d'informations.
Cette section contient les instructions spécifiques d'installation de PHP sous Microsoft Internet Information Services (IIS).
Cette section contient les instructions pour une installation manuelle sous IIS (Internet Information Services) 5.1 et IIS 6.0 de PHP sous Microsoft Windows XP et Windows Server 2003. Pour des instructions sur la configuration sous IIS 7.0 et supérieur sous Windows Vista, Windows Server 2008, Windows 7 et Windows Server 2008 R2, reportez-vous à la section Microsoft IIS 7.0 et suivant.
Téléchargez et installez PHP suivant les instructions décrites dans les étapes d'installation manuelle.
Note:
La version PHP non thread-safe est recommandé lors de l'utilisation d'IIS. Ces versions sont disponibles sur la page » PHP pour Windows : Binaires et sources.
Configurez les options CGI- et FastCGI du fichier php.ini comme ceci :
Exemple #1 Options de configuration de CGI et FastCGI du fichier php.ini
fastcgi.impersonate = 1 fastcgi.logging = 0 cgi.fix_pathinfo=1 cgi.force_redirect = 0
Téléchargez et installez l'extension » Microsoft FastCGI pour IIS 5.1 et 6.0. L'extension est disponible pour les plate-formes 32-bit et 64-bit - sélectionnez le bon paquet pour votre plate-forme..
Configurez l'extension FastCGI pour gérer les requêtes spécifiques PHP en exécutant la commande ci-dessous. Remplacez la valeur du paramètre "-path" avec le chemin absolu vers le fichier php-cgi.exe.
Exemple #2 Configuration de l'extension FastCGI pour gérer les requêtes PHP
cscript %windir%\system32\inetsrv\fcgiconfig.js -add -section:"PHP" ^ -extension:php -path:"C:\PHP\php-cgi.exe"
Cette commande va créer un mapping des scripts IIS pour les extensions de fichiers *.php, ce qui aura pour effet la gestion de toutes les URLs se terminant par .php par l'extension FastCGI. De plus, la commande configurera l'extension FastCGI lui demandant d'utiliser l'exécutable php-cgi.exe pour traiter les requêtes PHP.
Note:
A ce point, les étapes d'installation et de configuration nécessaires sont terminées. Les instructions qui suivent dans cette section sont optionnelles mais vivement recommandées afin d'atteindre des fonctionnalités et des performances optimales de PHP sous IIS.
Il est recommandé d'activer l'usurpation d'identité pour FastCGI en PHP lors de l'utilisation avec IIS. Ce mode est contrôlé par la directive fastcgi.impersonate du fichier php.ini. Lorsque ce mode est activé, PHP effectuera toutes les opérations du système de fichiers avec le compte utilisateur qui a été choisi pour l'authentification IIS. Ceci assure que, même si le même processus PHP est partagé avec différents sites web IIS, les scripts PHP de ces sites web ne pourront pas accéder aux autres fichiers tant que différents comptes utilisateurs sont utilisées pour l'authentification IIS de chaque site web.
Par exemple, IIS 5.1 et IIS 6.0, dans leurs configurations par défaut, ont d'activé l'authentification anonyme avec le compte interne IUSR_<MACHINE_NAME> utilisé comme identité par défaut. Ceci signifie que, afin de permettre à IIS d'exécuter des scripts PHP, il est nécessaire de donner les droits de lecture au compte IUSR_<MACHINE_NAME> pour ces scripts. Si les applications PHP doivent effectuer des opérations en écriture sur certains fichiers ou écrire des fichiers dans des dossiers, le compte IUSR_<MACHINE_NAME> doit avoir les permissions en écriture sur ces différents éléments.
Pour déterminer quel est le compte utilisateur utilisé par l'authentification anonyme IIS, suivez ces étapes :
Dans le menu de démarrage de Windows, choisissez : "Run:", tapez "inetmgr" et cliquez sur "Ok";
Dépliez la liste des sites Web sous le nœud "Web Sites" de l'arbre, faîtes un clic droit sur un site web utilisé et sélectionnez "Properties";
Cliquez sur l'onglet "Directory Security";
Prenez note du champ "User name:" dans le dialogue "Authentication Methods"
Pour modifier la configuration des permissions sur des fichiers ou des dossiers, utilisez l'explorateur Windows ou la commande icacls.
Exemple #3 Configuration des permissions d'accès
icacls C:\inetpub\wwwroot\upload /grant IUSR:(OI)(CI)(M)
Les documents par défaut IIS sont utilisés pour les requêtes HTTP qui ne spécifie pas de nom de document. Avec les applications PHP, index.php agit généralement comme document par défaut. Pour ajouter index.php à la liste des documents par défaut IIS, suivez ces étapes :
Dans le menu de démarrage Windows, choisissez "Run:", tapez "inetmgr" et cliquez sur "Ok";
faîtes un clic droit sur le nœud "Web Sites" de l'arbre et sélectionnez "Properties";
Cliquez sur l'onglet "Documents";
Cliquez sur le bouton "Add..." et entrez "index.php" comme "Default content page:".
Configurez l'extension IIS FastCGI pour le recyclage des processus PHP en utilisant la commande ci-dessous. La directive instanceMaxRequests de FastCGI contrôle le nombre de requêtes a traité par un seul processus php-cgi.exe avant l'extinction de l'extension FastCGI. La variable d'environnement PHP PHP_FCGI_MAX_REQUESTS contrôle le nombre de requêtes qu'un seul processus php-cgi.exe peut gérer avant de ce recycler lui-même. Assurez-vous que la valeur spécifiée pour la directive InstanceMaxRequests FastCGI est inférieure ou égale à la valeur spécifiée pour la directive PHP_FCGI_MAX_REQUESTS.
Exemple #4 Configuration du recyclage FastCGI et PHP
cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -InstanceMaxRequests:10000 cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -EnvironmentVars:PHP_FCGI_MAX_REQUESTS:10000
Augmentez le délai d'expiration pour l'extension FastCGI s'il y a des applications dont les scripts PHP mettent beaucoup de temps à s'exécuter. Les 2 configurations qui contrôlent les délais d'expiration sont ActivityTimeout et RequestTimeout. Referez-vous à la » configuration de l'extension FastCGI pour IIS 6.0 pour plus d'informations sur ces configurations.
Exemple #5 Configuration du délai d'expiration FastCGI
cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -ActivityTimeout:90 cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -RequestTimeout:90
PHP recherche le fichier php.ini dans différents endroits et il est possible de modifier ces endroits de recherche du fichier php.ini en utilisant la variable d'environnement PHPRC. Pour demander à PHP de charger le fichier de configuration depuis un dossier personnalisé, exécutez la commande ci-dessous. Le chemin absolu du dossier contenant le fichier php.ini doit être spécifié sous la variable d'environnement PHPRC.
Exemple #6 Modification du dossier contenant le fichier php.ini
cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -EnvironmentVars:PHPRC:"C:\Some\Directory\"
Cette section contient les instructions pour une configuration manuelle d'IIS (Internet Information Services) 7.0 et suivants pour fonctionner avec PHP sous Microsoft Windows Vista SP1, Windows 7, Windows Server 2008 et Windows Server 2008 R2. Pour des instructions de configuration d'IIS 5.1 et IIS 6.0 sous Windows XP et Windows Server 2003, reportez-vous à la documentation sur Microsoft IIS 5.1 et IIS 6.0.
Le module FastCGI est désactivé par défaut sous IIS. Les étapes pour l'activer diffèrent suivant la version de Windows utilisée.
Pour activer le support FastCGI sous Windows Vista SP1 et Windows 7 :
Dans le menu de démarrage Windows, choisissez "Run:", tapez "optionalfeatures.exe" et cliquez sur "Ok";
Dans la fenêtre "Windows Features", dépliez l'arbre "Internet Information Services", "World Wide Web Services", "Application Development Features", puis, activez la boite à cocher "CGI";
Cliquez sur OK et attendez que l'installation se termine.
Pour activer le support FastCGI sous Windows Server 2008 et Windows Server 2008 R2 :
Dans le menu de démarrage Windows, choisissez "Run:", tapez "CompMgmtLauncher" et cliquez sur "Ok";
Si le rôle "Web Server (IIS)" n'est pas présent dans le nœud "Roles" , ajoutez-le en cliquant sur "Add Roles";
Si le rôle "Web Server (IIS)" est présent, cliquez sur "Add Role Services", puis, activez la boite à cocher "CGI" sous le groupe "Application Development";
Cliquez sur "Next", puis "Install", et attendez la fin de l'installation.
Téléchargez et installez PHP suivant les instructions décrites dans les étapes d'installation manuelle.
Note:
La version PHP non thread-safe est recommandée lors de l'utilisation d'IIS. Les versions non thread-safe sont disponibles sur la page » PHP pour Windows : Binaires et sources.
Configurez les options CGI et FastCGI dans le fichier php.ini comme ceci :
Exemple #1 Options CGI et FastCGI dans le fichier php.ini
fastcgi.impersonate = 1 fastcgi.logging = 0 cgi.fix_pathinfo=1 cgi.force_redirect = 0
Configurez le gestionnaire de mapping IIS pour PHP en utilisant soit l'interface de gestion utilisateurs IIS ou l'outil en ligne de commande.
Suivez ces étapes pour créer un gestionnaire de mapping IIS pour PHP dans l'interface de gestion utilisateurs IIS :
Dans le menu démarrer de Windows, choisissez "Run:", tapez "inetmgr" et cliquez sur "Ok";
Dans l'interface de gestion utilisateurs IIS, sélectionnez le nœud correspondant au serveur dans l'arbre "Connections";
Dans la page "Features View", ouvrez la fonctionnalité "Handler Mappings";
Dans le panneau "Actions", cliquez sur "Add Module Mapping...";
Dans la fenêtre "Add Module Mapping", entrez ceci :
Cliquez sur le bouton "Request Restrictions", puis, configurez le mappin pour appeler le gestionnaire uniquement si la requête est mappée à un fichier ou un dossier;
Cliquez sur OK sur tous les dialogues pour sauvegarder la configuration.
Utilisez la commande suivante pour créer une file de processus IIS FastCGI qui utilisera l'exécutable php-cgi.exe pour traiter les requêtes PHP. Remplacez la valeur du paramètre fullPath avec le chemin absolu vers le fichier php-cgi.exe.
Exemple #2 Création d'une file de processus IIS FastCGI
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI ^ /+[fullPath='c:\PHP\php-cgi.exe']
Configurez IIS pour gérer les requêtes PHP spécifiques en exécutant la commande suivante. Remplacez la valeur du paramètre scriptProcessor avec le chemin absolu vers le fichier php-cgi.exe.
Exemple #3 Création d'un gestionnaire de mapping pour les requêtes PHP
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/handlers ^ /+[name='PHP_via_FastCGI', path='*.php',verb='*',modules='FastCgiModule',^ scriptProcessor='c:\PHP\php-cgi.exe',resourceType='Either']
Cette commande crée un gestionnaire de mapping IIS pour les fichiers dont l'extension est *.php, ce qui fera que toutes les URLs qui se terminent par .php seront gérées par le module FastCGI.
Note:
À ce moment, les étapes d'installation et de configuration nécessaires sont terminées. Les instructions qui suivent sont optionnelles mais vivement recommandées afin d'avoir un maximum de fonctionnalités mais aussi de bonnes performances pour PHP sous IIS.
Il est recommandé d'activer l'usurpation d'identité FastCGI en PHP lors de l'utilisation avec IIS. Ce mode est contrôlé par la directive fastcgi.impersonate du fichier php.ini. Lorsque l'usurpation d'identité est active, PHP effectuera toutes les opérations sur le systèmes de fichiers en se faisant passer pour le compte utilisateur qui a été déterminé par l'authentification IIS. Ceci assure que même si le même processus PHP est partagé sur plusieurs sites Web IIS, les scripts PHP de ces sites Web ne pourront pas accéder aux autres fichiers sachant qu'un compte utilisateur différent est utilisé pour l'authentification IIS de chacun de ces sites.
Par exemple, IIS 7, dans sa configuration par défaut, a d'activer l'authentification anonyme avec le compte utilisateur interne IUSR, utilisé comme identité par défaut. Ceci signifie que, pour qu'IIS puisse exécuter des scripts PHP, il est nécessaire d'avoir une permission en lecture pour le compte utilisateur IUSR sur ces scripts. Si les applications PHP doivent effectuer des opérations en écriture sur certains fichiers ou écrire des fichiers dans des dossiers, alors le compte IUSR doit avoir les bonnes permissions en écriture.
Pour déterminer le compte utilisateur utilisé comme identité anonyme sous IIS 7, utilisez la commande suivante. Remplacez "Default Web Site" avec le nom du site web IIS que vous utilisez. Dans l'élément de configuration XML, regardez l'attribut userName.
Exemple #4 Déterminer le compte utilisé comme identité anonyme sous IIS
%windir%\system32\inetsrv\appcmd.exe list config "Default Web Site" ^
/section:anonymousAuthentication
<system.webServer>
<security>
<authentication>
<anonymousAuthentication enabled="true" userName="IUSR" />
</authentication>
</security>
</system.webServer>
Note:
Si l'attribut userName n'est pas présent dans l'élément anonymousAuthentication, ou s'il est vide, alors cela signifie que l'identité de l'application est bien l'identité anonyme pour ce site web.
Pour modifier la configuration sur les permissions de ces fichiers ou ces dossiers, utilisez l'interface de l'explorateur Windows ou la ligne commande icacls.
Exemple #5 Configuration des permissions d'accès aux fichiers
icacls C:\inetpub\wwwroot\upload /grant IUSR:(OI)(CI)(M)
Les documents par défaut IIS sont utilisés pour les requêtes HTTP qui ne spécifient pas un nom de document. Avec les applications PHP, index.php agit généralement comme document par défaut. Pour ajouter index.php à la liste des documents par défaut d'IIS, utilisez la commande suivante :
Exemple #6 Définir index.php comme document par défaut sous IIS
%windir%\system32\inetsrv\appcmd.exe set config ^ -section:system.webServer/defaultDocument /+"files.[value='index.php']" ^ /commit:apphost
Configurez l'extension IIS FastCGI pour le recyclage des processus PHP en utilisant la commande ci-dessous. La directive instanceMaxRequests de FastCGI contrôle le nombre de requêtes a traité par un seul processus php-cgi.exe avant l'extinction d'IIS. La variable d'environnement PHP PHP_FCGI_MAX_REQUESTS contrôle le nombre de requêtes qu'un seul processus php-cgi.exe peut gérer avant de ce recycler lui-même. Assurez-vous que la valeur spécifiée pour la directive InstanceMaxRequests FastCGI est inférieure ou égale à la valeur spécifiée pour la directive PHP_FCGI_MAX_REQUESTS.
Exemple #7 Configuration du recyclage FastCGI et PHP
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^
/[fullPath='c:\php\php-cgi.exe'].instanceMaxRequests:10000
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^
/+"[fullPath='C:\{php_folder}\php-cgi.exe'].environmentVariables.^
[name='PHP_FCGI_MAX_REQUESTS',value='10000']"
Augmentez le délai d'expiration pour l'extension FastCGI s'il y a des applications dont les scripts PHP mettent beaucoup de temps à s'exécuter. Les 2 configurations qui contrôlent les délais d'expiration sont activityTimeout et requestTimeout. Utilisez les commandes ci-dessous pour modifier la configuration du délai d'expiration. Assurez-vous de remplacer la valeur du paramètre fullPath par le chemin absolu vers le fichier php-cgi.exe.
Exemple #8 Configuration du délai d'expiration FastCGI
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^ /[fullPath='C:\php\php-cgi.exe',arguments=''].activityTimeout:"90" /commit:apphost %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^ /[fullPath='C:\php\php-cgi.exe',arguments=''].requestTimeout:"90" /commit:apphost
PHP recherche le fichier php.ini dans différents endroits et il est possible de modifier ces endroits de recherche du fichier php.ini par défaut en utilisant la variable d'environnement PHPRC. Pour demander à PHP de charger le fichier de configuration depuis un dossier personnalisé, exécutez la commande ci-dessous. Le chemin absolu du dossier contenant le fichier php.ini doit être spécifié sous la variable d'environnement PHPRC.
Exemple #9 Modification du dossier contenant le fichier php.ini
appcmd.exe set config -section:system.webServer/fastCgi ^ /+"[fullPath='C:\php\php.exe',arguments=''].environmentVariables.^ [name='PHPRC',value='C:\Some\Directory\']" /commit:apphost
Cette section contient des notes et conseils spécifiques pour l'installation de PHP avec Apache 1.3.x sur les systèmes Microsoft Windows. Il y a aussi des instructions et des notes spécifiques pour Apache 2 sur une page séparée.
Note:
Lisez les étapes d'installation du manuel d'abord !
Il y a deux méthodes pour faire fonctionner PHP avec Apache 1.3.x sous Windows. La première est d'utiliser l'exécutable CGI (php.exe pour PHP 4 et php-cgi.exe pour PHP 5), l'autre est d'utiliser les modules Apache DLL. Dans les deux cas, vous devez arrêter le serveur Apache, éditer votre fichier httpd.conf pour dire à Apache de prendre PHP en compte et redémarrer Apache.
Maintenant que le module SAPI a été rendu plus stable sous Windows, nous recommandons son usage plutôt que celui de l'exécutable CGI, car il est plus transparent et sécurisé.
Bien qu'il puisse y avoir quelques différences de configuration de PHP sous Apache, le processus reste simple et à la portée du néophyte. Reportez-vous aux documentations Apache pour plus de détails sur ces directives.
Après avoir modifié le fichier de configuration, pensez à redémarrer le serveur web, par exemple avec NET STOP APACHE suivi de NET START APACHE, si vous utilisez Apache comme service Windows, ou bien utilisez vos alias classiques.
Note: Souvenez-vous que lorsque vous ajoutez des valeurs représentants un chemin dans la configuration d'Apache sous Windows, tous les antislash, comme c:\repertoire\fichier.ext, devraient être convertis en slashes, comme c:/repertoire/fichier.ext. Un slash final peut également être nécessaire pour les dossiers.
Vous devez ajouter les lignes suivantes à votre fichier de configuration Apache httpd.conf :
Exemple #1 PHP comme module Apache 1.3.x
Cet exemple suppose que PHP est installé dans le dossier c:\php. Ajustez le chemin si ce n'est pas le cas.
Pour PHP 4 :
# À ajouter à la fin de la section LoadModule # N'oubliez pas de copier ce fichier depuis le dossier sapi ! LoadModule php4_module "C:/php/php4apache.dll" # À ajouter à la fin de la section AddModule AddModule mod_php4.c
Pour PHP 5 :
# À ajouter à la fin de la section LoadModule LoadModule php5_module "C:/php/php5apache.dll" # À ajouter à la fin de la section AddModule AddModule mod_php5.c
Pour les deux :
# Ajoutez cette ligne dans les parenthèses conditionnelles <IfModule mod_mime.c> AddType application/x-httpd-php .php # Pour les fichiers de syntaxe colorisée .phps, ajoutez également AddType application/x-httpd-php-source .phps
Si vous avez dézippé le paquet PHP dans le répertoire c:\php\ comme décrit dans la section sur les étapes d'installation du manuel, vous devez insérer ces lignes à votre fichier de configuration Apache pour activer le binaire CGI :
Exemple #2 PHP et Apache 1.3.x en tant que CGI
ScriptAlias /php/ "c:/php/" AddType application/x-httpd-php .php # Pour PHP 4 Action application/x-httpd-php "/php/php.exe" # Pour PHP 5 Action application/x-httpd-php "/php/php-cgi.exe" # spécifez le répertoire où se trouve php.ini SetEnv PHPRC C:/php
En utilisant le mode CGI, votre serveur est ouvert à de possibles attaques sérieuses. Lisez attentivement notre section sur la sécurité en mode CGI pour apprendre comment vous défendre contre ces attaques.
Si vous voulez présenter la source de vos fichiers PHP avec la coloration syntaxique, il n'existe pas d'option équivalente de celle de la version module de PHP. Si vous choisissez de configurer Apache pour utiliser PHP en mode CGI, vous aurez besoin d'utiliser la fonction highlight_file(). Pour réaliser cela simplement, créez un script PHP dans un fichier et ajoutez ce code : <?php highlight_file('original_php_script.php'); ?>.
Cette section contient les notes et conseils d'installation de PHP avec le serveur Apache 2.x sur les systèmes Microsoft Windows. Nous avons également des notes et des instructions pour Apache 1.3.x sur une page séparée.
Note:
Vous devriez lire les étapes d'installation du manuel d'abord !
Note: Support Apache 2.2
Les utilisateurs d'Apache 2.2 doivent conserver à l'esprit que la bibliothèque DLL d'Apache 2.2 sont nommées php5apache2_2.dll plutôt que php5apache2.dll et n'est disponible que pour PHP 5.2.0 et suivant. Voir aussi » http://snaps.php.net/
Il est vivement recommandé de consulter la » documentation Apache pour avoir une meilleure connaissance du serveur web Apache 2.x. Lisez également les » notes spécifiques à Windows pour Apache 2.x avant de lire cette documentation.
Apache 2.x est prévu pour fonctionner sur les versions de Windows désignées comme serveurs, comme Windows NT 4.0, Windows 2000, Windows XP, ou Windows 7. Bien qu'Apache 2.x fonctionne parfaitement bien sous Windows 9x, le support de ces plateformes est incomplet et quelques fonctionnalités peuvent ne pas fonctionner correctement ; et il n'est pas prévu d'améliorer cela.
Téléchargez la version la plus récente de » Apache 2.x et une version de PHP. Suivez les instructions d'installation manuelle puis revenez ici pour réaliser l'intégration de PHP et Apache.
Il y a trois méthodes pour que PHP fonctionne avec Apache 2.x sous Windows. Vous pouvez exécuter PHP comme gestionnaire, comme CGI ou comme FastCGI.
Note: Souvenez-vous que lorsque vous ajoutez des valeurs représentants un chemin dans la configuration d'Apache sous Windows, tous les antislash, comme c:\repertoire\fichier.ext, devraient être convertis en slashes, comme c:/repertoire/fichier.ext. Un slash final peut également être nécessaire pour les dossiers.
Vous devez insérer les lignes suivantes dans le fichier de configuration httpd.conf d'Apache pour charger le module PHP pour Apache 2.x :
Exemple #1 PHP et Apache 2.x comme gestionnaire
# LoadModule php5_module "c:/php/php5apache2.dll" AddHandler application/x-httpd-php .php # configure the path to php.ini PHPIniDir "C:/php"
Note: Rappelez-vous de placer votre chemin actuel de PHP dans le chemin C:/php/ des exemples ci-dessous. Assurez-vous d'utiliser soit php5apache2.dll, soit php5apache2_2.dll dans la directive LoadModule et de vérifiez que le fichier correspondant est en réalité situé dans le chemin utilisé dans cette directive.
La configuration suivante activera le gestionnaire PHP pour tous les fichiers qui ont l'extension .php, même si d'autres extensions sont utilisées pour ces fichiers. Par exemple, un fichier nommé example.php.txt sera exécuté par le gestionnaire PHP. Pour vous assurez que seuls les fichiers se terminant par .php sont exécutés, utilisez plutôt la configuration suivante :
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
Vous devriez consulter la » documentation Apache CGI où vous trouverez toutes les informations nécessaires à l'exécution d'Apache CGI.
Pour exécuter PHP en tant que CGI, vous devez placer tous vos fichiers php-cgi dans un dossier désigné comme dossier CGI en utilisant la directive ScriptAlias.
Vous devez ensuite insérer une ligne #! dans vos fichiers PHP, pointant vers le binaire PHP :
Exemple #2 PHP et Apache 2.x en tant que CGI
#!C:/php/php.exe <?php phpinfo(); ?>
En utilisant le mode CGI, votre serveur est ouvert à de possibles attaques sérieuses. Lisez attentivement notre section sur la sécurité en mode CGI pour apprendre comment vous défendre contre ces attaques.
L'exécution de PHP en tant que FastCGI a un beaucoup d'avantages contrairement à son exécution en tant que CGI. Sa mise en place de cette manière est assez simple :
Récupérez mod_fcgid depuis » http://httpd.apache.org/mod_fcgid/. Les bibliothèques Win32 sont disponibles au téléchargement depuis ce site. Installez le module suivant les instructions fournies.
Configurez votre serveur web comme ci-dessous, en vous assurant d'ajuster tous les chemins pour refléter votre configuration système particulière :
Exemple #3 Configuration d'Apache pour exécuter PHP en tant que FastCGI
LoadModule fcgid_module modules/mod_fcgid.so # Où se trouve le fichier php.ini ? FcgidInitialEnv PHPRC "c:/php" AddHandler fcgid-script .php FcgidWrapper "c:/php/php-cgi.exe" .php
Cette section contient les notes et détails spécifiques à l'installation de PHP sur des serveurs Sun Java System Web Server, Sun ONE web Server, Netscape et iPlanet, sous Windows.
Depuis PHP 4.3.3, vous pouvez utiliser les scripts PHP avec le module NSAPI pour gérer des listes de dossiers et des pages d'erreurs personnalisées. Des fonctions supplémentaires sont disponibles pour assurer la compatibilité avec Apache. Pour du support sur les serveurs courants, voyez la note sur les sous-requêtes.
Pour installer PHP en CGI, suivez ce qui suit :
Faites un fichier d'association depuis la ligne de commande. Tapez les lignes suivantes :
assoc .php=PHPScript ftype PHPScript=c:\php\php.exe %1 %*
Plus de détails sur la configuration de PHP comme CGI sont disponibles à » http://benoit.noss.free.fr/php/install-php.html
Pour installer PHP avec l'interface NSAPI, faites ceci :
Faites un fichier d'association depuis la ligne de commande. Tapez les lignes suivantes :
assoc .php=PHPScript ftype PHPScript=c:\php\php.exe %1 %*
Éditez le fichier magnus.conf (pour les serveurs >= 6) ou obj.conf (pour les serveurs < 6) et ajoutez ce qui suit : Vous devez placer ces lignes après mime types init.
Init fn="load-modules" funcs="php4_init,php4_execute,php4_auth_trans" shlib="c:/php/sapi/php4nsapi.dll" Init fn="php4_init" LateInit="yes" errorString="Failed to initialise PHP!" [php_ini="c:/path/to/php.ini"]
Configurez l'objet par défaut dans le fichier obj.conf (pour les classes de serveur virtuel [Sun Web Server 6.0+], dans le fichier vserver.obj.conf) : dans la section <Object name="default">, placez cette ligne nécessairement avant toutes les lignes 'ObjectType' et après toutes les lignes 'ObjectType' :
Service fn="php4_execute" type="magnus-internal/x-httpd-php" [inikey=value inikey=value ...]
Cela n'est nécessaire que si vous voulez configurer un dossier qui ne contiendra que vos scripts PHP (tout comme un dossier cgi-bin) :
<Object name="x-httpd-php"> ObjectType fn="force-type" type="magnus-internal/x-httpd-php" Service fn=php4_execute [inikey=value inikey=value ...] </Object>
Note:
Plus de détails sur la configuration de PHP comme filtre NSAPI peuvent être trouvés ici : » http://benoit.noss.free.fr/php/install-php4.html
Note:
La taille de la pile que PHP utilise dépend de la configuration du serveur web. Si vous rencontrez des crashs avec les grands scripts PHP, il est recommandé d'augmenter la taille de la pile avec la console d'administration : dans la section "MAGNUS EDITOR".
Il est important de garder en tête que iPlanet/SunONE/Netscape est un serveur web multi-threadé. Comme toutes les requêtes se situent dans le même contexte (c'est le contexte sur serveur web), et que ce contexte est unique. SI vous voulez accéder a des variables comme PATH_INFO, HTTP_HOST etc. il n'est pas recommandé d'y accéder à l'ancienne manière de PHP, avec la fonction getenv() ou une autre méthode (register globals, $_ENV). De cette manière, vous n'aurez que des valeurs d'environnement du serveur, et non pas des valeurs correctes pour le CGI.
Note:
Pourquoi est-ce que les variables CGI sont invalides ?
C'est lié au fait que le processus du serveur web est lancé par l'administrateur du serveur, qui utilise le script de lancement au démarrage. En fait, il aurait fallu que vous lanciez vous-même le processus. C'est pour cela que l'environnement du serveur web contient des variables d'environnement CGI. Vous pouvez vérifier cela en lançant le serveur web depuis un autre endroit que l'administrateur du serveur : utilisez la ligne de commande Unix en tant que root : vous verrez alors qu'il n'y a pas de variables d'environnement.
Changez simplement vos scripts pour lire les variables CGI, en utilisant le tableau superglobal $_SERVER. Si vous avez d'autres scripts qui utilisent encore $HTTP_HOST et compagnie, il est recommandé d'activer l'option register_globals dans le php.ini et de changer l'ordre des variables. IMPORTANT : supprimez le "E" dans cette option, car vous n'en avez pas besoin pour cet environnement.
variables_order = "GPCS" register_globals = On
Vous pouvez utiliser PHP pour générer des pages d'erreurs de type "404 Not Found" ou apparentée. Ajoutez la ligne suivante dans le fichier obj.conf pour chaque page d'erreur que vous souhaitez remplacer :
Error fn="php4_execute" code=XXX script="/path/to/script.php" [inikey=value inikey=value...]
Une autre possibilité est de générer une liste de dossiers personnalisée. Créez simplement un script PHP qui affiche le contenu du dossier, et remplacez la ligne Service par défaut par type="magnus-internal/directory" dans obj.conf avec ceci :
Service fn="php4_execute" type="magnus-internal/directory" script="/path/to/script.php" [inikey=value inikey=value...]
Le module NSAPI supporte désormais la fonction nsapi_virtual() (alias : virtual()), pour réaliser des sous requêtes au serveur web, et inclure le résultat dans une page. Le problème est que cette fonction utilise une fonctionnalité non documentée de la bibliothèque NSAPI.
Sous Unix, ce n'est pas un problème, car le module va automatiquement rechercher les fonctions nécessaires, et les utiliser si elles sont disponibles. Sinon, nsapi_virtual() sera désactivée.
Sous Windows, des limitations dans la gestion des DLL impose l'utilisation de la plus récente bibliothèque ns-httpdXX.dll. Cela a été testé pour les serveurs jusqu'à la version 6.0. Si une nouvelle version de SunONE server est utilisée, la détection échoue, et nsapi_virtual() est désactivée.
Dans ce cas, essayez ceci : ajoutez le paramètre suivant à php4_init dans magnus.conf/obj.conf :
Init fn=php4_init ... server_lib="ns-httpdXX.dll"
Vous pouvez vérifier le statut en utilisant la fonction phpinfo().
Note:
Soyez prévenu : le support de nsapi_virtual() est expérimental.
Cette section contient les notes et conseils d'installation de PHP sur les serveurs » Sambar, sur Windows.
Note:
Vous devriez lire les étapes d'installation du manuel d'abord !
Cette liste décrit comment configurer le module ISAPI avec le serveur Sambar sous Windows.
Trouvez le fichier appelé mappings.ini (dans le dossier de configuration), dans le dossier d'installation de Sambar.
Ouvrez mappings.ini et ajoutez la ligne suivante, sous la section [ISAPI] :
Exemple #1 Configuration ISAPI de Sambar
#pour PHP 4 *.php = c:\php\php4isapi.dll #pour PHP 5 *.php = c:\php\php5isapi.dll
Maintenant, redémarrez le serveur Sambar pour que les modifications prennent effet.
Note:
Si vous voulez utiliser PHP pour communiquer avec les ressources se trouvant sur un autre ordinateur de votre réseau, vous devez modifier le compte utilisé par le service Sambar Server. Le compte par défaut utilisé par le service Sambar Server est LocalSystem, qui n'a pas accès aux ressources distantes. Le compte peut être modifié en utilisant les options des services, se trouvant dans le centre de contrôle de Windows.
Cette section contient les conseils d'installation spécifiques à » Xitami sur Microsoft Windows.
Note:
Vous devriez lire les étapes d'installation du manuel d'abord !
Cette liste décrit comment installer PHP comme CGI exécutable avec Xitami sous Windows.
Note: Important pour les utilisateurs de CGI
Lisez la FAQ sur cgi.force_redirect pour d'importants détails. Cette directive doit être configurée à 0. Si vous voulez utiliser $_SERVER['PHP_SELF'], vous devez activer la directive cgi.fix_pathinfo.
En utilisant le mode CGI, votre serveur est ouvert à de possibles attaques sérieuses. Lisez attentivement notre section sur la sécurité en mode CGI pour apprendre comment vous défendre contre ces attaques.
Assurez-vous que le serveur web fonctionne, et allez dans la console d'administration du serveur (généralement http://127.0.0.1/admin), puis cliquez sur "Configuration".
Naviguez dans les Filters, et ajoutez l'extension que vous souhaitez (souvent .php) dans le champ File extensions.
Dans la commande Filter, ajoutez le nom et le chemin de votre exécutable PHP i.e C:\php\php.exe pour PHP 4 ou C:\php\php-cgi.exe pour PHP 5.
Cliquez sur le bouton Save.
Redémarrez le serveur pour prendre en compte les modifications.
Ce chapitre va vous apprendre à compiler PHP depuis les sources sous Windows, en utilisant les utilitaires Microsoft. Pour compiler PHP avec Cygwin, référez-vous à Installation sur les systèmes UNIX.
Reportez-vous à la documentation fournie par le wiki : » http://wiki.php.net/internals/windows/stepbystepbuild.
Après avoir installé PHP et un serveur web sous Windows, vous devriez probablement vouloir installer quelques extensions pour avoir des fonctionnalités supplémentaires. Vous pouvez choisir quelles extensions seront chargées lors du démarrage de PHP en modifiant votre php.ini. Vous pouvez également en charger dynamiquement dans vos scripts à l'aide de la fonction dl().
Les bibliothèques DLLs pour les extensions PHP sont préfixées par php_.
Beaucoup d'extensions sont incluses dans la version pour Windows de PHP. Cela signifie que les bibliothèques DLL additionnelles et la directive extension ne sont pas utilisées pour charger ces extensions. La table des extensions PHP pour Windows liste les extensions qui requièrent des bibliothèques DLL additionnelles PHP. Voici une liste d'extensions internes :
En PHP 4 (mise à jour : PHP 4.3.11) : BCMath, Caledar, COM, Ctype, FTP, MySQL, ODBC, Overload, PCRE, Session, Tokenizer, WDDX, XML et Zlib
En PHP 5 (mise à jour : PHP 5.0.4), les changements suivants existent. En interne : DOM, LibXML, Iconv, SimpleXML, SPL et SQLite Les suivants ne sont plus intégrés : MySQL and Overload.
Le dossier par défaut dans lequel PHP cherche des extensions est c:\php4\extensions en PHP 4 et c:\php5 en PHP 5. Pour changer ce comportement pour refléter votre installation de PHP, éditez votre fichier php.ini :
Vous devriez pouvoir changer le paramètre extension_dir pour pointer vers le dossier contenant vos extensions ou l'endroit où vous avez placé vos fichiers php_*.dll. Par exemple :
extension_dir = c:\php\extensions
Pour activer ces extensions dans votre php.ini, vous devez décommenter les lignes extension=php_*.dll dans votre php.ini. Cela se fait en effaçant le point virgule (";") du début de la ligne que vous voulez activer.
Exemple #1 Activer l'extension Bzip2 pour PHP-Windows
// changez la ligne suivante : ;extension=php_bz2.dll // En : extension=php_bz2.dll
Quelques extensions ont besoin de bibliothèques DLLs supplémentaire pour fonctionner. La plupart d'entre elles peuvent être trouvées dans le paquet de votre distribution de PHP, dans le dossier c:\php\dlls\ en PHP 4 ou dans le dossier principal en PHP 5 mais quelques autres, comme Oracle (php_oci8.dll), requierent des DLLs qui ne sont pas fournies avec votre distribution de PHP. Si vous installez PHP 4, copiez les bibliothèques DLLs depuis le dossier C:\php\dlls vers le dossier principal C:\php. N'oubliez pas d'inclure le dossier C:\php dans la variable d'environnement PATH (ce processus est expliqué dans une entrée de la FAQ).
Quelques-unes de ces bibliothèques ne sont pas incluses dans la distribution de PHP. Lisez la documentation de chaque extension pour plus de détails. Lisez également la section du manuel nommée Installation d'extensions PECL pour plus de détails sur PECL. Un nombre toujours plus important d'extensions PHP se trouve dans PECL, et ces extensions nécessitent un téléchargement séparé.
Note: Si vous utilisez PHP en tant que module d'un serveur web, pensez à redémarrer votre serveur web pour charger les modifications apportées au fichier php.ini.
La table suivante décrit quelques extensions disponibles requérant des bibliothèques DLLs supplémentaires.
| Extension | Description | Notes |
|---|---|---|
| php_bz2.dll | bzip2 : fonctions de compression | Non |
| php_calendar.dll | Calendar : fonctions de conversion | Intégrées à PHP depuis la version 4.0.3 |
| php_crack.dll | Fonctions Crack | None |
| php_ctype.dll | Famille de fonctions ctype | Intégrées à PHP depuis la version 4.3.0 |
| php_curl.dll | Fonctions de bibliothèque client CURL | Requiert : libeay32.dll, ssleay32.dll (intégré) |
| php_dba.dll | DBA: DataBase (dbm-style) Fonctions d'abstraction | Non |
| php_dbase.dll | Fonctions dBase | Non |
| php_dbx.dll | Fonctions dbx | |
| php_domxml.dll | Fonctions DOM XML | PHP <= 4.2.0 requiert : libxml2.dll (intégré) PHP >= 4.3.0 requiert : iconv.dll (intégré) |
| php_dotnet.dll | Fonctions .NET | PHP <= 4.1.1 |
| php_exif.dll | Fonctions EXIF | php_mbstring.dll. Attention, php_exif.dll doit être chargé après php_mbstring.dll dans le php.ini. |
| php_fbsql.dll | Fonctions FrontBase | PHP <= 4.2.0 |
| php_fdf.dll | FDF : fonctions Forms Data Format. | Requiert : fdftk.dll (intégré) |
| php_filepro.dll | Fonctions filePro | Accès en lecture seule |
| php_ftp.dll | Fonctions FTP | Intégrées à PHP depuis la version 4.0.3 |
| php_gd.dll | GD : bibliothèque de fonctions image | Supprimer en PHP 4.3.2. Notez que les fonctions sur les couleurs vraies ne sont pas disponibles en GD1 ; utilisez plutôt php_gd2.dll. |
| php_gd2.dll | GD : Bibliothèque de fonctions image | GD2 |
| php_gettext.dll | Fonctions Gettext | PHP <= 4.2.0 requiert gnu_gettext.dll (intégré), PHP >= 4.2.3 requiert libintl-1.dll, iconv.dll (intégré). |
| php_hyperwave.dll | Fonctions HyperWave | Non |
| php_iconv.dll | ICONV : conversion de jeux de caractères | Requiert : iconv-1.3.dll (intégré), PHP >=4.2.1 iconv.dll |
| php_ifx.dll | Fonctions Informix | Requiert : bibliothèque Informix |
| php_iisfunc.dll | Fonctions d'administration IIS | Non |
| php_imap.dll | IMAP : fonctions POP3 et NNTP | Non |
| php_ingres.dll | Fonctions Ingres | Requiert : bibliothèque Ingres |
| php_interbase.dll | Fonctions InterBase | Requiert : gds32.dll (intégré) |
| php_java.dll | Fonctions Java | PHP <= 4.0.6 requit : jvm.dll (intégré) |
| php_ldap.dll | Fonctions LDAP | PHP <= 4.2.0 requiert libsasl.dll (intégré), PHP >= 4.3.0 requiert libeay32.dll, ssleay32.dll (intégré) |
| php_mbstring.dll | Fonctions Chaînes multioctets | Non |
| php_mcrypt.dll | Fonctions Mcrypt Encryption | Requiert : libmcrypt.dll |
| php_mhash.dll | Fonctions Mhash | PHP >= 4.3.0 requiert : libmhash.dll (intégré) |
| php_mime_magic.dll | Fonctions Mimetype | Requiert : magic.mime (intégré) |
| php_ming.dll | Fonctions Ming pour Flash | Non |
| php_msql.dll | Fonctions mSQL | Requiert : msql.dll (intégré) |
| php_mssql.dll | Fonctions MSSQL | Requiert : ntwdblib.dll (intégré) |
| php_mysql.dll | Fonctions MySQL | PHP >= 5.0.0, requires libmysql.dll (intégré) |
| php_mysqli.dll | Fonctions MySQLi | PHP >= 5.0.0, requires libmysql.dll (libmysqli.dll en PHP <=5.0.2) (intégré) |
| php_oci8.dll | Fonctions Oracle 8 | Requiert : bibliothèque cliente Oracle 8.1+ |
| php_openssl.dll | Fonctions OpenSSL | Requiert : libeay32.dll (intégré) |
| php_overload.dll | Fonctions Object overloading | Intégrée à PHP depuis la version 4.3.0 |
| php_pdf.dll | Fonctions PDF | Non |
| php_pgsql.dll | Fonctions PostgreSQL | Non |
| php_printer.dll | Fonctions Printer | Non |
| php_shmop.dll | Fonctions de partage de mémoire | Non |
| php_snmp.dll | Fonctions SNMP | NT seulement ! |
| php_soap.dll | Fonctions SOAP | PHP >= 5.0.0 |
| php_sockets.dll | Fonctions Socket | Non |
| php_sybase_ct.dll | Fonctions Sybase | Requiert : bibliothèque cliente Sybase |
| php_tidy.dll | Fonctions Tidy | PHP >= 5.0.0 |
| php_tokenizer.dll | Fonctions Tokenizer | Intégrées à PHP depuis la version 4.3.0 |
| php_w32api.dll | Fonctions W32api | Non |
| php_xmlrpc.dll | Fonctions XML-RPC | PHP >= 4.2.1 requiert : iconv.dll (intégré) |
| php_xslt.dll | Fonctions XSLT | PHP <= 4.2.0 requiert sablot.dll, expat.dll (intégré). PHP >= 4.2.1 requiert sablot.dll, expat.dll et iconv.dll (intégré). |
| php_yaz.dll | Fonctions YAZ | Requiert : yaz.dll (intégré) |
| php_zip.dll | Fonctions Zip File | Accès en lecture seule |
| php_zlib.dll | Fonctions de compression ZLib | Intégrées à PHP depuis la version 4.3.0 |
Cette section contient les notes et les astuces spécifiques à l'installation de PHP depuis la ligne de commande sous Windows.
Note:
Vous devriez lire les étapes du manuel d'installation d'abord !
Faire fonctionner PHP depuis la ligne de commande peut être effectué sans aucune modification de Windows.
C:\PHP5\php.exe -f "C:\PHP Scripts\script.php" -- -arg1 -arg2 -arg3
Mais il existe quelques étapes à suivre pour rendre ceci plus simple. La plupart de ces étapes ont déjà dû être faite, mais elles sont répétées ici pour fournir une séquence étape par étape complète.
Ajouter la localisation de l'exécutable PHP (php.exe, php-win.exe ou php-cli.exe suivant la version de PHP ainsi que les préférences d'affichage) à la variable d'environnement PATH. Vous trouverez plus d'informations concernant l'ajout du dossier PHP à la variable PATH dans l'entrée correspondante de la FAQ.
Ajouter l'extension .PHP à la variable d'environnement PATHEXT. Ceci peut être fait lors de la modification de la variable d'environnement PATH. Suivez les mêmes étapes que celles décrites dans la FAQ mais utilisez la variable PATHEXT au lieu de la variable d'environnement PATH.
Note:
La position à laquelle vous placez le .PHP déterminera le script ou le programme à exécuter lorsqu'un nom de fichier de cette forme sera trouvé. Par exemple, le fait de placer .PHP avant .BAT fera que votre script sera exécuté à la place du fichier batch, s'il y a un fichier batch avec le même nom.
Associer l'extension .PHP avec un type de fichier. Ceci peut être fait en exécutant la commande suivante :
assoc .php=phpfile
Associer le type de fichier phpfile avec l'exécutable PHP approprié. Ceci peut être fait en exécutant la commande suivante :
ftype phpfile="C:\PHP5\php.exe" -f "%1" -- %~2
Ces étapes permettent aux scripts PHP d'être exécutés depuis n'importe quel répertoire, sans pour autant spécifier l'exécutable PHP ou l'extension .PHP, et tous les paramètres seront passés au script pour traitement.
L'exemple ci-dessous montre les modifications pouvant être faites manuellement au registre Windows.
Exemple #1 Modification du registre
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.php] @="phpfile" "Content Type"="application/php" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile] @="PHP Script" "EditFlags"=dword:00000000 "BrowserFlags"=dword:00000008 "AlwaysShowExt"="" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\DefaultIcon] @="C:\\PHP5\\php-win.exe,0" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell] @="Open" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell\Open] @="&Open" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell\Open\command] @="\"C:\\PHP5\\php.exe\" -f \"%1\" -- %~2"
Avec ces modifications, la même commande peut maintenant être écrite comme ceci :
"C:\PHP Scripts\script" -arg1 -arg2 -arg3
script -arg1 -arg2 -arg3
Note:
Il y a un petit problème si vous tentez d'utiliser cette technique et qu'en même temps, vous utilisez votre script PHP comme filtre d'une commande, comme ceci :
oudir | "C:\PHP Scripts\script" -arg1 -arg2 -arg3Vous pourriez trouver que le script s'interrompt et que rien ne s'affiche. Afin de rendre ceci opérationnel, vous devez effectuer une nouvelle modification au registre Windows.dir | script -arg1 -arg2 -arg3Plus d'informations concernant ce problème peuvent être trouvées dans » l'article de la base de connaissance Microsoft : 321788.Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer] "InheritConsoleHandles"=dword:00000001
PHP s'installe sur le cloud. Vers le cloud PHP !
PHP s'installe sur la plateforme » Azure cloud.
Pour en savoir plus, voyez le » SDK Azure pour PHP.
FPM (FastCGI Process Manager) est une implémentation alternative à PHP FastCGI avec quelques fonctionnalités additionnelles particulièrement utiles pour les environnements à haute charge.
Ces fonctionnalités incluent :
Gestion avancée des processus avec stop/start doux (graceful) ;
Possibilité de démarrer des processus avec différents uid/gid/chroot/environment, écoutant sur différents ports et utilisant différents php.ini (remplace le safe_mode) ;
Journalisation stdout et stderr ;
Redémarrage d'urgence en cas de destruction accidentelle du cache opcode ;
Support de l'upload acccéléré ;
"slowlog" - journalisation des scripts (pas juste leurs noms, mais leur backtrace PHP également, utilisant ptrace ou équivalent pour lire le processus distant) qui s'éxecutent de manière anormalement lente ;
fastcgi_finish_request() - fonction spéciale pour terminer la requête et vider toutes les données tout en continuant d'exécuter une tâche consommatrice (conversion vidéo par exemple) ;
Naissance de processus fils dynamic/static ;
Informations sur la SAPI (similaire à mod_status d'Apache) ;
Fichier de configuration basé sur php.ini
Pour activer FPM dans votre construction de PHP vous devez ajouter la ligne --enable-fpm à votre ligne de configure.
Il existe de multiples options de configure pour FPM (toutes optionnelles):
--with-fpm-user - l'utilisateur FPM (defaut - nobody).
--with-fpm-group - le groupe FPM (defaut - nobody).
FPM utilise la syntaxe php.ini pour son fichier de configuration - php-fpm.conf.
pid
string
Chemin vers le fichier PID. Par défaut: none.
error_log
string
Chemin vers le fichier de journal. Par défaut: #INSTALL_PREFIX#/log/php-fpm.log.
log_level
string
Niveau de journalisation d'erreur. Valeurs possibles: alert, error, warning, notice, debug. Par défaut: notice.
emergency_restart_threshold
int
Si ce nombre de processus fils terminent avec un SIGSEGV ou SIGBUS dans l'intervalle de temps précisé dans emergency_restart_interval, alors FPM redémarrera. Une valeur de 0 signifie 'Off'. Valeur par défaut: 0 (Off).
emergency_restart_interval
mixed
Interval de temps utilisé par emergency_restart_interval pour determiner lorsqu'un redémarrage doux doit être lancé. Ceci peut être utile pour contourner des corruptions accidentelles dans la mémoire partagée d'un acccelérateur. Unités disponibles: s(econdes), m(inutes), h(eures), ou d(ays). Unité par défaut: secondes. Valeur par défaut: 0 (Off).
process_control_timeout
mixed
Temps limite qu'attendront les processus fils pour réagir aux signals du père. Unités disponibles: s(econdes), m(inutes), h(eures), ou d(ays) Unité par défaut: secondes. Valeur par défaut: 0.
daemonize
boolean
Envoie FPM en arrière plan. Mettez 'no' pour garder FPM au premier plan lors du débogage. Valeur par défaut: yes.
Avec FPM vous pouvez executer plusieurs pools de processus avec des paramètres différents. Voici les paramètres qui peuvent être ajustés par pool.
listen
string
L'adresse pour accepter des requêtes FastCGI. Syntaxes valides: 'ip.add.re.ss:port', 'port', '/path/to/unix/socket'. Cette option est obligatoire pour chaque pool.
listen.backlog
int
Affecte listen(2) backlog. Une valeur de '-1' signifie illimité. Valeur par défaut: -1.
listen.allowed_clients
string
Liste d'adresses ipv4 des clients FastCGI autorisés à se connecter. C'est équivalent à la variable d'environnement FCGI_WEB_SERVER_ADDRS dans le système FastCGI original de PHP (5.2.2+). N'a de sens qu'avec un socket tcp en écoute. Chaque adresse doit être séparée par une virgule. Si cette valeur n'est pas précisée, les connexions seront accceptées depuis toute adresse ip. Valeur par défaut: any.
listen.owner
string
Affecte les permissions pour le socket Unix si utilisé. Sous Linux, les permissions read/write doivent être affectées pour autoriser des connexions depuis un serveur web. Beaucoup de systèmes dérivés BSD autorisent les connexions quelles que soient les permissions. Valeurs par défaut: user et group sont ceux de l'utilisateur courant, le mode est 0666.
listen.group
string
Voyez listen.owner.
listen.mode
string
Voyez listen.owner.
user
string
Utilisateur Unix des processus FPM. Cette option est obligatoire.
group
string
Groupe Unix des processus FPM. Si non précisé, le groupe de l'utilisateur est utilisé.
pm
string
Choisi comment le gestionnaire de processus va contrôler le nombre de processus fils. Valeurs possibles : static, ondemand, dynamic. Option obligatoire.
static - nombre de processus fils fixés (pm.max_children).
ondemand - le processus se réactive à la demande (lorsque demandé, c'est l'opposé de dynamique où pm.start_servers sont démarrés lorsque le service démarre).
dynamic - nombre de processus fils dynamiques basé sur le directives suivantes: pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers.
pm.max_children
int
Nombre de processus fils à créer lorsque pm est réglé sur static. Nombre maximum de processus fils à créer lorsque pm est réglé sur dynamic. Options obligatoire.
Cette option affecte la limite du nombre de requêtes simultanées qui seront servies. Equivalent à ApacheMaxClients avec mpm_prefork et à PHP_FCGI_CHILDREN dans l'implémentation originale de FastCGI de PHP.
pm.start_servers
in
Nombre de processus fils à créer au démarrage. Utilisé seulement si pm est réglé sur dynamic. Valeur par défaut: min_spare_servers + (max_spare_servers - min_spare_servers) / 2.
pm.min_spare_servers
int
Nombre minimum de processus au repos (idle) voulus. Utilisé seulement si pm est réglé sur dynamic. Obligatoire dans ce cas.
pm.max_spare_servers
int
Nombre maximum de processus au repos (idle) voulus. Utilisé seulement si pm est réglé sur dynamic. Obligatoire dans ce cas.
pm.max_requests
int
Nombre de requête que chaque processus fils devrait exécuter avant de renaitre. Ceci peut être utile pour contourner des fuites mémoires dans des librairies tierces. Pour un traitement sans fin des requêtes, précisez '0'. Equivalent à PHP_FCGI_MAX_REQUESTS. Par défaut: 0.
pm.status_path
string
L'URI vers la page de statut de FPM. Si cette valeur n'est pas précisée, aucune page de statut ne sera utilisée, ce qui est le cas par défaut.
ping.path
string
L'URI de ping pour appeler la page de monitoring de FPM. Si aucune valeur n'est précisée, aucune page de ping ne sera disponible. Ceci pourrait être utilisé pour tester depuis l'extérieur si FPM est toujours disponible et prêt à répondre. Notez que la valeur doit commencer par un slash (/).
ping.response
string
Cette directive est utile pour personnaliser la réponse à une requête de ping. La réponse est formatée comme text/plain avec un code de réponse de 200. Valeur par défaut: pong.
request_terminate_timeout
mixed
Le timeout pour servir une requête après lequel le processus concerné sera tué. Cette option devrait être utilisée lorsque l'option 'max_execution_time' ne stoppe pas l'exécution du script pour une raison quelconque. Une valeur de '0' signifie 'Off'. Unités disponibles: s(econdes)(défaut), m(inutes), h(eures), ou d(ays). Par défaut: 0.
request_slowlog_timeout
mixed
Le timeout pour servir une requête dans laquelle la backtrace PHP sera vidée dans le fichier 'slowlog'. Une valeur de '0' signifie 'Off'. Unités disponibles: s(econdes)(défaut), m(inutes), h(eures), ou d(ays). Par défaut: 0.
slowlog
string
Le journal pour les requêtes lentes, par défaut: #INSTALL_PREFIX#/log/php-fpm.log.slow.
rlimit_files
int
Affecte la rlimit pour les descripteurs de fichiers ouverts. Valeur par défaut: valeur du système.
rlimit_core
int
Affecte la taille maximale de rlimit. Valeurs possibles: 'unlimited' ou un entier plus grand ou égal à 0. Valeur par défaut: valeur définie par le système.
chroot
string
Chroot vers ce dossier au démarrage. Cette valeur doit être un chemin absolu. Si cette valeur n'est pas définie, chroot n'est pas utilisé.
chdir
string
Chdir vers ce dossier au démarrage. Cette valeur doit être un chemin absolu. Valeur par défaut: dossier courant ou / si chroot.
catch_workers_output
boolean
Redirige stdout et stderr vers le journal d'erreur principal. Si non précisé, stdout et stderr seront redirigés vers /dev/null selon les specifications FastCGI. Valeur par défaut: no.
Il est possible de passer des variables d'environnement additionnelles et mettre à jour les paramètres de PHP d'un pool. Pour ce faire, vous devez ajouter les options suivantes à php-fpm.conf
Exemple #1 Passer des variables d'environnement et des paramètres PHP à un pool
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 32M
Les paramètres définis avec php_admin_value et php_admin_flag ne peuvent être surchargés via ini_set().
» PECL est un dépôt d'extensions PHP qui sont disponibles via le système de paquet » PEAR. Cette section du manuel vous guide dans l'obtention et l'installation d'extensions PECL.
Ces instructions supposent que /your/phpsrcdir/ est le chemin jusqu'aux sources de la distribution PHP, et extname est le nom de votre extension PECL : adaptez les commandes qui suivent à votre situation. Ces instructions supposent aussi que vous êtes familier avec l'utilisation des » commandes pear. Les informations dans le manuel PEAR pour la commande pear sont également applicables à la commande pecl.
Pour être utilisée, une extension partagée doit être compilée, installée et chargée. Les méthodes décrites ci-dessous vous fournissent diverses instructions sur la façon de compiler et d'installer des extensions mais ne les chargent pas automatiquement. Les extensions peuvent être chargées en ajoutant une directive d'extension au fichier php.ini ou à l'aide de la fonction dl().
Lorsque vous compilez des modules PHP, il est important d'avoir les outils dans leurs versions appropriées, tels que autoconf, automake, libtool, etc. Voyez les » Instructions pour le SVN anonyme, afin de connaître les utilitaires nécessaires, et leurs versions.
Il existe plusieurs méthodes pour télécharger des extensions PECL :
La commande pecl install extname télécharge le code des extensions automatiquement, ce qui évite de réaliser un téléchargement particulier.
Sur Windows, vous avez deux moyens de charger une extension PHP : soit vous la compilez dans PHP, soit vous chargez une DLL. Charger une extension précompilée est la méthode la plus pratique et la plus recommandée.
Pour charger une extension, vous devez disposer de son fichier ".dll" sur votre système. Toutes les extensions sont automatiquement et périodiquement compilée par le groupe PHP (voyez la section de téléchargements).
Pour compiler une extension dans PHP, reportez-vous à la documentation sur la compilation des sources.
Pour compiler une extension autonome, (c'est-à-dire un fichier DLL), reportez-vous documentation sur la compilation des sources. Si le fichier DLL est absent de votre distribution PHP et de PECL, il vous faudra la compiler avant de pouvoir l'utiliser.
Les extensions PHP sont généralement appelées "php_*.dll" (où les astérisques représentent le nom de l'extension) et elles sont rangées dans le dossier "PHP\ext" ("PHP\extensions" en PHP 4).
PHP est livré avec les extensions qui sont les plus utiles à la majorité des utilisateurs. Elles sont appelées des extensions coeur, ou "core".
Cependant, si vous avez besoins de fonctionnalités qui ne sont pas fournies par une extension coeur, vous pourriez quand même les trouver dans PECL. Le PHP Extension Community Library (PECL, aussi dit Bibliothèque d'Extensions Communautaires de PHP) est un dépôt de code pour les extensions PHP, qui fournit un annuaire de toutes les extensions connues, et un service d'hébergement pour télécharger et développer ces extensions.
Si vous avez développé une extension pour votre propre usage, vous pourriez avoir envie de l'héberger sur PECL, pour que tous ceux qui ont eu le même problème que vous, puissent avoir accès à la même solution. Cela vous donne de bonnes chances d'avoir des retours de la communauté, et, peut-être, des remerciements, des rapports de bugs, et même des correctifs. Avant que vous n'envoyez votre extension sur les serveurs PECL, il est recommandé de lire http://pecl.php.net/package-new.php.
Souvent, vous trouverez plusieurs versions de chaque DLL :
Il est recommandé de choisir les extensions pour qu'elles soient adaptées à la machine serveur sur laquelle vous utilisez PHP. Le script suivant va vous afficher toutes vos configurations PHP :
Exemple #1 Appel de la fonction phpinfo()
<?php
phpinfo();
?>
Ou bien, en ligne de commande :
drive:\\path\to\php\executable\php.exe -i
Le moyen le plus courant pour charger une extension PHP est de l'inclure dans votre fichier de configuration php.ini. Notez que de nombreuses extensions sont déjà présentes dans le fichier php.ini et que vous avez simplement à supprimer le point-virgule pour les activer.
;extension=php_extname.dll
extension=php_extname.dll
Cependant, certains serveurs Web sont déroutants, car ils n'utilisent pas le fichier php.ini rangé avec votre exécutable PHP. Pour en savoir plus sur votre véritable php.ini, recherchez son dossier dans le fichier phpinfo():
Configuration File (php.ini) Path C:\WINDOWS
Loaded Configuration File C:\Program Files\PHP\5.2\php.ini
Après activation d'une extension, sauvegardez le fichier php.ini, et relancez le serveur Web, puis vérifiez à nouveau le fichier phpinfo(). La nouvelle extension devrait y avoir sa section.
Si l'extension n'apparaît pas dans le fichier phpinfo(), vous devriez jeter un oeil dans les logs pour savoir d'où vient le problème.
Si vous utilisez PHP en ligne de commande (CLI), l'erreur de chargement de l'extension devrait être lisible directement sur l'écran.
Si vous utilisez PHP sur un serveur Web, la position et le format des logs varient grandement d'un serveur à l'autre. Lisez la documentation de votre serveur Web pour savoir où ils sont : PHP ne peut pas vous aider pour cela.
Les problèmes les plus courants sont la localisation du fichier DLL, la valeur de la directive "extension_dir" dans le php.ini et les incohérences de compilations.
Si le problème est une incohérence de compilation, vous avez probablement téléchargé une mauvaise DLL. Essayez d'en charger une nouvelle, avec les bonnes configurations pour votre serveur. phpinfo() vous sera alors très utile.
PECL facilite la création d'extension PHP partagées. En utilisant la » commande pecl, faites ceci :
Ceci va télécharger le fichier source de l'extension extname, le compiler et installer le fichier extname.so dans votre dossier extension_dir. extname.so doit ensuite être chargé via php.ini.
Par défaut, la commande pecl n'installera pas les paquets marqués comme étant alpha ou beta. Si aucun paquet stable est disponible, vous devrez installer un paquet beta en utilisant la commande suivante :
Vous pouvez également installer une version spécifique en utilisant la commande :
Note:
Après avoir activée cette extension dans le php.ini, relancez le serveur Web afin de la prendre en compte.
Parfois, l'utilisation de l'installeur pecl n'est pas une bonne option. Ceci parce que vous être derrière un pare-feu ou parce que l'extension que vous voulez installer n'est pas disponible en tant que paquet PECL comme une extension uniquement disponible via SVN. Si vous devez compiler une telle extension, vous pouvez utiliser l'utilitaire de compilation afin d'exécuter la compilation manuellement.
La commande phpize est utilisée pour préparer l'environnement de compilation pour une extension PHP. Dans l'exemple suivant, les sources de l'extension sont dans un dossier appelé extname :
$ cd extname $ phpize $ ./configure $ make # make install
Une installation réussie aura créé un fichier extname.so et l'aura placé dans le dossier des extensions de PHP. Vous devez ajouter la ligne extension=extname.so dans votre php.ini avant de pouvoir utiliser l'extension.
Si le système ne possède pas la commande phpize et que vous utilisez des paquets précompilés (comme des RPM), assurez-vous d'installer également la version de développement appropriée des paquets PHP car elle inclut également la commande phpize ainsi que les en-têtes appropriés pour construire PHP et ses extensions.
Exécutez la commande phpize --help pour afficher des informations d'utilisation supplémentaires.
php-config est un petit script shell pour obtenir des informations sur la configuration installée de PHP.
Lors de la compilation des extensions, si vous avez plusieurs versions PHP d'installées, vous devez spécifier l'installation pour laquelle vous souhaitez les compiler en utilisant l'option --with-php-config lors de la configuration, spécifiant ainsi le chemin vers le script php-config.
La liste des options de ligne de commande fournies par le script php-config peut être obtenue en exécutant le script php-config avec l'option -h :
Usage: /usr/local/bin/php-config [OPTION] Options: --prefix [...] --includes [...] --ldflags [...] --libs [...] --extension-dir [...] --include-dir [...] --php-binary [...] --php-sapis [...] --configure-options [...] --version [...] --vernum [...]
| Option | Description |
|---|---|
| --prefix | Préfixe du dossier où PHP est installé, i.e. /usr/local |
| --includes | Liste des options -I avec tous les fichiers inclus |
| --ldflags | Drapeaux LD qui ont été compilés avec PHP |
| --libs | Bibliothèques additionnelles qui ont été compilées avec PHP |
| --extension-dir | Dossiers où les extensions sont recherchées par défaut |
| --include-dir | Préfixe du dossier où les en-têtes de fichiers sont installés par défaut |
| --php-binary | Chemin complet vers le CLI PHP ou le binaire CGI |
| --php-sapis | Affiche tous les modules SAPI disponibles |
| --configure-options | Options de configuration pour recréer la configuration de l'installation courante de PHP |
| --version | Version de PHP |
| --vernum | Version de PHP sous la forme d'un entier |
Il peut arriver que vous ayez à compiler votre extension PECL statiquement dans votre binaire PHP. Pour ce faire, vous devez placer les sources de l'extension dans le dossier php-src/ext/ et exécuter à nouveau le script de configuration de PHP.
$ cd /your/phpsrcdir/ext $ pecl download extname $ gzip -d < extname.tgz | tar -xvf - $ mv extname-x.x.x extname $ rm package.xml
Cela générera le dossier suivant :
À partir de la, forcez PHP à reconstruire le script de configuration, puis, suivez le processus classique de compilation de PHP :
Note: Pour exécuter le script 'buildconf', vous devez posséder autoconf 2.13 et automake 1.4+ (les versions plus récentes de autoconf peuvent fonctionner, mais ne sont pas supportées).
L'utilisation de --enable-extname ou --with-extname dépend de l'extension. Généralement, une extension qui ne dépend pas d'une bibliothèque externe utilise --enable. Pour être certain, utilisez la commande suivante après avoir utilisé buildconf :
Certains problèmes sont récurrents : les plus communs sont listés dans la FAQ PHP, disponible dans ce manuel.
Si vous êtes complètement bloqué, quelqu'un sur la liste de diffusion PHP pourra probablement vous aider. Essayez de consulter les archives, au cas où quelqu'un aurait déjà rencontré votre problème. Les archives sont toujours accessibles à : » http://www.php.net/support.php. Pour souscrire à la liste de diffusion, envoyez un mail vide à » php-install-subscribe@lists.php.net. L'adresse de la liste de diffusion est » php-install@lists.php.net.
Si vous voulez obtenir de l'aide sur la liste de diffusion PHP, essayez d'être concis et clair, et pensez à donner tous les détails sur votre environnement (OS, version de PHP, serveur Web, CGI ou module, safe mode, etc.), et n'hésitez pas à envoyer suffisamment de code pour que nous puissions reproduire et tester l'erreur.
Si vous pensez avoir trouvé un bogue dans PHP, n'oubliez pas de le signaler. L'équipe de développement PHP ne le connaît peut être pas et, si vous ne le signalez pas, vos chances de voir le bogue corrigé sont nulles. Vous pouvez rapporter des bogues grâce au système de suivi, accessible à » http://bugs.php.net/. S'il vous plait, n'envoyez pas de rapports de bogue sur les listes de diffusion ou par courier personnel. Le système de suivi est de plus prévu pour permettre la proposition de nouvelles fonctionnalités.
Lisez le guide » Comment rapporter un bogue (Les bogues : ce qu'il faut faire, et ce qu'il ne faut pas faire) avant d'envoyer n'importe quel rapport !
Le fichier de configuration (php.ini) est lu par PHP au démarrage. Si vous avez compilé PHP en module, le fichier n'est lu qu'une seule fois, au lancement du serveur web. Pour les versions CGI et CLI le fichier est lu à chaque invocation.
Le php.ini est cherché dans ces endroits (et dans cet ordre) :
Si le fichier php-SAPI.ini existe (où SAPI utilise SAPI, donc le nom du fichier est e.g. php-cli.ini ou php-apache.ini), il sera utilisé à la place du php.ini. Le nom SAPI peut être déterminé en utilisant la fonction php_sapi_name().
Note:
Le serveur web Apache change ce dossier en dossier root au démarrage, ce qui fait que PHP essaye de lire php.ini depuis le système de fichiers racine s'il existe.
Les directives php.ini sont directement documentées, par extensions, sur les pages respectives du manuel de ces extensions. La liste des directives internes est disponible en annexe. Il est probable que toutes les directives PHP ne sont pas documentées dans le manuel. Pour une liste complète des directives disponibles dans votre version de PHP, merci de lire les commentaires de votre propre fichier php.ini. Vous pouvez également trouver la » dernière version du php.ini sur SVN.
Exemple #1 Extrait du php.ini
; tout texte sur une ligne, situé après un point-virgule ";" est ignoré [php] ; les marqueurs de section (texte entre crochets) sont aussi ignorés ; Les valeurs booléennes peuvent être spécifiées comme ceci : ; true, on, yes ; ou false, off, no, none register_globals = off track_errors = yes ; vous pouvez placer les chaînes de caractères entre guillemets include_path = ".:/usr/local/lib/php" ; Les antislash sont traités comme n'importe quel caractère include_path = ".;c:\php\lib"
Depuis PHP 5.1.0, il est possible de se référer à des variables .ini depuis des fichiers .ini. Par exemple : open_basedir = ${open_basedir} ":/new/dir".
Depuis PHP 5.3.0, PHP inclut le support des fichiers INI au style .htaccess sur une base par dossier. Ces fichiers sont analysés uniquement par le SAPI CGI/FastCGI. Cette fonctionnalité rend obsolète l'extension PECL htscanner. Si vous utilisez Apache, l'utilisation des fichiers .htaccess produit le même effet.
En plus du fichier php.ini principal, PHP analyse les fichiers INI contenu dans chaque dossier, en commençant par le dossier depuis lequel le fichier PHP courant est appelé, et parcours les dossiers jusqu'au dossier racine courant (tel que défini par la variable $_SERVER['DOCUMENT_ROOT']). Dans le cas où le fichier PHP est hors de la racine web, seul sont dossier est scanné.
Seuls les configurations INI avec les modes PHP_INI_PERDIR
et PHP_INI_USER seront reconnues dans les fichiers INI
.user.ini-style.
Deux nouvelles directives INI, user_ini.filename et user_ini.cache_ttl contrôlent l'utilisation des fichiers INI définis par l'utilisateur.
user_ini.filename définit le nom du fichier cherché par PHP dans chaque dossier ; si cette directive est définie à une chaîne vide, PHP n'analysera rien du tout. Par défaut, vaut .user.ini.
user_ini.cache_ttl contrôle la durée entre 2 re-lectures des fichiers INI définis par l'utilisateur. Par défaut, vaut 300 secondes (5 minutes).
Ces modes déterminent quand et où une directive PHP peut ou ne peut pas être modifiée, et chaque directive du manuel est dirigée par un de ces modes. Par exemple, certaines directives peuvent être modifiées dans un script PHP avec la fonction ini_set(), alors que d'autres ont besoin d'être modifiées dans les fichiers php.ini ou httpd.conf.
Par exemple, la directive output_buffering a le mode PHP_INI_PERDIR alors elle ne peut pas être modifiée avec la fonction ini_set(). D'un autre coté, la directive display_errors a le mode PHP_INI_ALL, et peut être modifiée n'importe où, y compris avec la fonction ini_set().
| Mode | Signification |
|---|---|
| PHP_INI_USER | La directive peut être modifiée dans un script utilisateur, avec la fonction ini_set(), ou via la base de registre Windows |
| PHP_INI_PERDIR | La directive peut être modifiée dans les fichiers php.ini, .htaccess ou httpd.conf |
| PHP_INI_SYSTEM | La directive peut être modifiée dans les fichiers php.ini ou httpd.conf |
| PHP_INI_ALL | La directive peut être modifiée n'importe où |
Lorsque vous utilisez le module Apache, vous pouvez aussi changer les paramètres de configuration en utilisant les directives dans les fichiers de configuration d'Apache (httpd.conf) et dans les fichiers .htaccess. Vous aurez besoin des privilèges "AllowOverride Options" ou "AllowOverride All".
Il y a de nombreuses directives
Apache qui vous permettent de modifier la configuration de PHP
à partir des fichiers de configuration Apache. Pour une liste des
directives qui sont PHP_INI_ALL,
PHP_INI_PERDIR ou PHP_INI_SYSTEM
reportez-vous à l'annexe Liste des directives
du php.ini.
php_value
nom
valeur
Modifie la valeur de la directive spécifiée.
Cette instruction n'est utilisable qu'avec les directives PHP de type
PHP_INI_ALL et PHP_INI_PERDIR.
Pour annuler une valeur qui aurait été modifiée au préalable,
utilisez la valeur none.
Note: N'utilisez pas
php_valuepour configurer des valeurs booléennes.php_flag(voir plus bas) doit être utilisée.
php_flag
nom
on|off
Cette instruction est utilisée pour activer ou
désactiver une option.
Cette instruction n'est utilisable qu'avec les directives
PHP de type PHP_INI_ALL et
PHP_INI_PERDIR.
php_admin_value
nom
valeur
Cette instruction affecte une valeur à la variable spécifiée.
Cette instruction NE peut PAS être utilisée dans un fichier
.htaccess. Toute directive de PHP configurée avec le type
php_admin_value ne peut pas être
modifiée en utilisant le fichier .htaccess ou la fonction ini_set().
Pour annuler une valeur qui aurait été modifiée au préalable, utilisez la
valeur none.
php_admin_flag
name
on|off
Cette directive est utilisée pour activer ou désactiver une option.
Cette instruction NE peut PAS être utilisée dans un fichier
.htaccess. Toute directive de PHP configurée avec le type
php_admin_flag ne peut pas être
modifiée en utilisant le fichier .htaccess ou par la fonction ini_set().
Exemple #1 Exemple de configuration Apache
<IfModule mod_php5.c> php_value include_path ".:/usr/local/lib/php" php_admin_flag engine on </IfModule> <IfModule mod_php4.c> php_value include_path ".:/usr/local/lib/php" php_admin_flag engine on </IfModule>
Les constantes PHP n'existent pas en dehors de PHP. Par
exemple, dans le fichier httpd.conf,
vous ne pouvez pas utiliser des constantes PHP telles que
E_ALL ou E_NOTICE pour spécifier
le niveau de rapport d'erreur,
car ces constantes n'ont pas de signification pour Apache,
et seront remplacées par 0.
Utilisez les valeurs numériques à la place.
Les constantes peuvent être utilisées dans le php.ini
Lorsque vous utilisez PHP sur Windows, la configuration peut
être modifiée dossier par dossier en utilisant la base de registres
de Windows. Les valeurs de configuration sont stockées
avec la clé de registre
HKLM\SOFTWARE\PHP\Per Directory Values,
dans les sous-clés correspondantes aux noms de dossier. Par exemple,
la valeur d'une option dans le dossier c:\inetpub\wwwroot
sera stockée dans la clé
HKLM\SOFTWARE\PHP\Per Directory Values\c\inetpub\wwwroot.
La valeur de cette option sera utilisée pour tous les
scripts qui fonctionnent dans ce dossier ou ses sous-dossiers.
Les valeurs sous la clé doivent avoir le nom d'une
direction de configuration PHP,
et la valeur correspondante. Les constantes PHP ne sont
pas utilisables : il faut mettre la valeur entière.
Cependant, seules les valeurs des configurations dans
PHP_INI_USER peuvent être fixées de cette manière,
celles dans PHP_INI_PERDIR ne peuvent l'être.
Suivant la façon dont vous exécutez PHP, vous pouvez changer certaines valeurs durant l'exécution de vos scripts en utilisant ini_set(). Voir la documentation de la fonction ini_set() pour plus d'informations.
Si vous êtes intéressé par une liste complète des options configurées sur votre système avec leurs valeurs courantes, vous pouvez exécuter la fonction phpinfo() et consulter la page résultante. Vous pouvez aussi accéder individuellement aux directives de configuration pendant l'exécution de vos scripts en utilisant soit la fonction ini_get(), soit la fonction get_cfg_var().
Tout ce qui se trouve en dehors d'une paire de balises ouvrantes/fermantes est ignoré par l'analyseur PHP, ce qui permet d'avoir des fichiers PHP mixant les contenus. Ceci permet à PHP d'être contenu dans des documents HTML, pour créer par exemple des templates.
<p>Ceci sera ignoré par PHP et affiché au navigateur.</p>
<?php echo 'Alors que ceci sera analysé par PHP.'; ?>
<p>Ceci sera aussi ignoré par PHP et affiché au navigateur.</p>
Utilisation de structures avec des conditions
Exemple #1 Echappement avancé en utilisant des conditions
<?php if ($expression == true): ?>
Ceci sera affiché si l'expression est vrai.
<?php else: ?>
Sinon, ceci sera affiché.
<?php endif; ?>
Pour afficher de gros blocs de texte, il est plus efficace de sortir du mode d'analyse de PHP plutôt que d'envoyer le texte via la fonction echo ou print.
Il y a quatre paires différentes de balises ouvrantes / fermantes qui peuvent être utilisées dans PHP. Deux de ces balises, <?php ?> et <script language="php"> </script>, sont toujours disponibles. Les deux autres sont les balises courtes et les balises du style ASP, et peuvent être activées ou désactivées depuis le fichier de configuration php.ini. Cependant, malgré le fait que des personnes trouvent les balises courtes et les balises du style ASP pratiques, elles sont moins portables et donc, généralement, non recommandées.
Note:
Notez également que si vous intégrez PHP dans des documents XML ou XHTML, vous devez utiliser les balises <?php ?> pour rester conforme aux standards.
Exemple #2 Balises d'ouvertures et de fermetures PHP
1. <?php echo 'Si vous voulez réaliser des documents XHTML ou XML, faites comme ceci'; ?>
2. <script language="php">
echo 'quelques éditeurs (comme FrontPage)
n\'aiment pas ce genre d\'instructions';
</script>
3. <? echo 'ceci est le plus simple, une instruction SGML'; ?>
<?= expression ?> Ceci est la version courte pour "<? echo expression ?>"
4. <% echo 'Vous pouvez optionnellement utiliser les balises ASP-style'; %>
<%= $variable; # Ceci est la version courte pour "<% echo . . ." %>
Bien que les balises vues dans les exemples un et deux sont toutes les deux disponibles, l'exemple un est le plus communément utilisé et le plus recommandé des deux.
Les balises courtes (troisième exemple) ne sont disponibles que s'elles ont été activées via la directive short_open_tag du fichier de configuration php.ini, ou si PHP a été configuré avec l'option --enable-short-tags .
Les balises du style ASP (quatrième exemple) sont uniquement disponibles lorsqu'elles sont activées via la directive asp_tags du fichier de configuration php.ini.
Note:
L'utilisation des balises courtes doit être bannie lors de développements d'applications ou de bibliothèques qui sont destinées à être redistribuées, ou déployées sur des serveurs qui ne sont pas sous votre contrôle, car les balises courtes peuvent ne pas être supportées sur le serveur cible. Pour réaliser du code portable, qui peut être redistribué, n'utilisez jamais les balises courtes.
Note:
En PHP 5.2 et antérieures, l'analyseur n'autorisait pas un tag ouvrant <?php comme seul élément d'une page. Ceci est permis à compter de la version 5.3 de PHP lorsqu'il y a un ou plusieurs espaces après la balise ouvrante.
Note:
Depuis PHP 5.4, le tag echo court <?= est toujours reconnu et valide, suivant la configuration de l'option short_open_tag.
Comme en C ou en Perl, PHP requiert que les instructions soient terminées par un point-virgule à la fin de chaque instruction. La balise fermante d'un bloc de code PHP implique automatiquement un point-virgule ; vous n'avez donc pas besoin d'utiliser un point-virgule pour terminer la dernière ligne d'un bloc PHP. La balise fermante d'un bloc inclura immédiatement un caractère de nouvelle ligne si un est présent.
Exemple #1 Séparation des instructions
<?php
echo 'Ceci est un test';
?>
<?php echo 'Ceci est un test' ?>
<?php echo 'Oubli de la balise fermante';
Note:
La balise fermante d'un bloc PHP à la fin d'un fichier est optionnelle, et parfois, il est utile de l'omettre lors de l'utilisation de la fonction include ou de la fonction require, car les espaces non désirés n'apparaîtront pas à la fin des fichiers, et ainsi, vous pourrez toujours ajouter des en-têtes à la réponse plus tard. C'est utile également si vous voulez utiliser l'affichage du buffer et que vous ne voulez pas voir d'espaces blancs ajoutés à la fin des parties générées par les fichiers inclus.
PHP supporte les commentaires de type C, C++ et Shell Unix (aussi appelé style Perl). Par exemple :
Exemple #1 Exemple de commentaire
<?php
echo 'Ceci est un test'; // Ceci est un commentaire sur une seule ligne, style c++
/* Ceci est un commentaire sur
plusieurs lignes */
echo 'Ceci est un autre test';
echo 'Et un test final'; # Ceci est un commentaire style shell sur une seule ligne
?>
Les commentaires sur une seule ligne ne commentent que jusqu'à la fin de la ligne du bloc PHP courant. Ceci signifie que le code HTML après // ... ?> ou après # ... ?> SERA affiché : ?> terminera le mode PHP et retournera en mode HTML, et // ou # n'influencera pas cela. Si la directive de configuration asp_tags est activée, ce comportement sera identique avec // %> et # %>. Cependant, la balise </script> ne terminera pas le mode PHP dans un commentaire d'une seule ligne.
Exemple #2 Les commentaires vont jusqu'à la fin de la ligne
<h1>Ceci est un exemple <?php # echo 'simple';?></h1>
<p>La ligne ci-dessus affichera 'Ceci est un exemple'.</p>
Les commentaires style 'C' commentent jusqu'à ce que le premier */ soit rencontré. Vous devriez faire attention aux commentaires style 'C' nichés dans de gros blocs lorsque vous les commentez.
Exemple #3 Les commentaires de type C
<?php
/*
echo 'Ceci est un test'; /* Ce commentaire posera un problème */
*/
?>
PHP supporte 8 types basiques.
4 types scalaires :
2 types composés :
Et finalement, 3 types spéciaux :
Ce manuel introduit également quelques pseudo-types pour des raisons de lisibilité :
Et la pseudo-variable $....
Ce manuel peut toutefois contenir des références au type "double". Considérez ce type comme étant un type "float". Les deux noms n'existent que pour des raisons historiques.
Le type d'une variable n'est pas toujours défini par le programmeur ; il peut être défini par PHP au moment de l'exécution, suivant le contexte dans lequel la variable est utilisée.
Note: Pour vérifier le type et la valeur d'une expression, utilisez la fonction var_dump().
Pour afficher une représentation humainement lisible d'un type aux fins de déboguage, utilisez la fonction gettype(). Pour vérifier un certain type, n'utilisez pas la fonction gettype(), mais plutôt les fonctions is_type. Voici quelques exemples :
<?php
$a_bool = TRUE; // un booléen
$a_str = "foo"; // une chaîne de caractères
$a_str2 = 'foo'; // une chaîne de caractères
$an_int = 12; // un entier
echo gettype($a_bool); // affiche : boolean
echo gettype($a_str); // affiche : string
// Si c'est un entier, incrément de 4
if (is_int($an_int)) {
$an_int += 4;
}
// Si $a_bool est une chaîne de caractères, on l'affiche
if (is_string($a_bool)) {
echo "String: $a_bool";
}
?>
Pour forcer la conversion d'une variable en un certain type, vous pouvez transtyper (cast) la variable ou utiliser la fonction settype().
Notez qu'une variable peut être évaluée avec différentes valeurs dans certaines situations, suivant son type à un moment donné. Pour plus d'informations, lisez la section sur le transtypage. La table de comparaison des types peut également être très utile, montrant différents exemples.
C'est le type le plus simple. Un booléen représente une valeur de vérité.
Il peut valoir TRUE ou FALSE.
Pour spécifier un booléen littéral, utilisez le mot-clé TRUE ou
FALSE. Les deux sont insensibles à la casse.
<?php
$foo = True; // assigne la valeur TRUE à $foo
?>
Typiquement, le résultat d'un opérateur qui retourne un booléen, passé ensuite à une structure de contrôle.
<?php
// == est un opérateur qui teste
// l'égalité et retourne un booléen
if ($action == "show_version") {
echo "La version est 1.23";
}
// ceci n'est pas nécessaire...
if ($show_separators == TRUE) {
echo "<hr>\n";
}
// ...à la place, vous pouvez utiliser, avec la même signification :
if ($show_separators) {
echo "<hr>\n";
}
?>
Pour convertir explicitement une valeur en booléen, utilisez (bool) ou (boolean). Cependant, dans la plupart des cas, le transtypage n'est pas nécessaire, sachant qu'une valeur sera automatiquement convertie si un opérateur, une fonction ou une structure de contrôle demandent un argument de type booléen.
Voir aussi le transtypage.
Lors d'une conversion en booléen, les valeurs suivantes sont
considérées comme FALSE :
FALSE, lui-même
Toutes les autres valeurs sont considérées comme TRUE (y compris toutes les
ressources).
-1 est considéré comme TRUE, comme tous les nombres
différents de zéro (négatifs ou positifs) !
<?php
var_dump((bool) ""); // bool(false)
var_dump((bool) 1); // bool(true)
var_dump((bool) -2); // bool(true)
var_dump((bool) "foo"); // bool(true)
var_dump((bool) 2.3e5); // bool(true)
var_dump((bool) array(12)); // bool(true)
var_dump((bool) array()); // bool(false)
var_dump((bool) "false"); // bool(true)
?>
Un entier est un nombre appartenant à la classe ℤ = {..., -2, -1, 0, 1, 2, ...}.
Voir aussi :
Les entiers peuvent être spécifiés en notation décimale (base 10), hexadécimale (base 16), octale (base 8), ou binaire (base 2) optionnellement précédée d'un signe (- ou +).
Les entiers littéraux binaires sont disponibles depuis PHP 5.4.0.
Pour utiliser la notation octale, précédez le nombre d'un 0 (zéro). Pour utiliser la notation hexadécimale, précédez le nombre d'un 0x. Pour utiliser la notation binaire, précédez le nombre d'un 0b.
Exemple #1 Les entiers littéraux
<?php
$a = 1234; // un nombre décimal
$a = -123; // un nombre négatif
$a = 0123; // un nombre octal (équivalent à 83 décimales)
$a = 0x1A; // un nombre héxadecimal (équivalent à 26 décimales)
?>
Formellement, la structure d'un entier littéral est :
decimal : [1-9][0-9]*
| 0
hexadecimal : 0[xX][0-9a-fA-F]+
octal : 0[0-7]+
integer : [+-]?decimal
| [+-]?hexadecimal
| [+-]?octal
| [+-]?binary
La taille d'un entier est dépendant de la plate-forme, cependant,
une valeur maximale d'environ 2 milliards est habituelle (cela correspond
à 32 bits signés). Les plateformes 64-bit ont habituellement une valeur
maximale d'environ 9E18. PHP ne supporte pas les entiers non-signés. La taille
d'un entier peut être déterminée en utilisant la constante
PHP_INT_SIZE, et la valeur maximale, en utilisant
la constante PHP_INT_MAX depuis PHP 4.4.0 et PHP 5.0.5.
Si un nombre invalide est fourni dans un entier octal (i.e. 8 ou 9), le reste du nombre est ignoré.
Exemple #2 Bizarrerie avec les valeurs octales
<?php
var_dump(01090); // 010 octal = 8 décimales
?>
Si PHP rencontre un nombre supérieur au maximal d'un entier, il sera interprété comme un nombre décimal. De la même façon, une opération qui résulte en un nombre supérieur au nombre maximal d'un entier, retournera un nombre décimal.
Exemple #3 Dépassement d'entier sur un système 32-bit
<?php
$large_number = 2147483647;
var_dump($large_number); // int(2147483647)
$large_number = 2147483648;
var_dump($large_number); // float(2147483648)
$million = 1000000;
$large_number = 50000 * $million;
var_dump($large_number); // float(50000000000)
?>
Exemple #4 Dépassement d'entier sur un système 64-bit
<?php
$large_number = 9223372036854775807;
var_dump($large_number); // int(9223372036854775807)
$large_number = 9223372036854775808;
var_dump($large_number); // float(9.2233720368548E+18)
$million = 1000000;
$large_number = 50000000000000 * $million;
var_dump($large_number); // float(5.0E+19)
?>
Il n'y a pas d'opérateur de division entière en PHP. 1/2 contient en fait, float(0.5). La valeur peut être convertie en un entier en l'arrondissant, en utilisant la fonction round().
<?php
var_dump(25/7); // float(3.5714285714286)
var_dump((int) (25/7)); // int(3)
var_dump(round(25/7)); // float(4)
?>
Pour convertir explicitement une valeur en un entier, utilisez soit le mot-clé (int), soit (integer). Cependant, dans la plupart des cas, ce mot-clé n'est pas nécessaire vu qu'une valeur sera automatiquement convertie si un opérateur, une fonction ou une structure de contrôle demande un entier en guise d'argument. Une valeur peut également être convertie en un entier en utilisant la fonction intval().
Voir aussi : le transtypage.
FALSE correspond à 0 (zéro), et TRUE correspond à
1 (un).
Lorsque l'on convertit un nombre décimal en un entier, le nombre sera arrondi vers zéro.
Si le nombre à virgule flottante est au delà des limites des entiers (habituellement, +/- 2.15e+9 = 2^31 sur les plate-formes 32-bit et +/- 9.22e+18 = 2^63 sur les plate-formes 64-bit), le résultat sera indéfini, sachant que le nombre à virgule flottante n'a pas une précision suffisante pour donner un résultat entier exact. Aucune alerte n'est émise lorsque ce comportement survient !
Ne convertissez jamais une fraction inconnue en un entier, ceci peut engendrer un résultat inattendu.
<?php
echo (int) ( (0.1+0.7) * 10 ); // Affiche 7 !
?>
Voir aussi la section sur les alertes concernant la précision des nombres à virgule flottante.
Voir la section sur la conversion des chaînes en nombres
Le comportement de la conversion en un entier est indéfini depuis les autres types. Ne rapporter aucun comportement observé, sachant qu'ils peuvent changer sans avertissement.
Les nombres décimaux, (aussi connus comme nombres à virgule flottante, "floats", "doubles", ou "real numbers") peuvent être spécifiés en utilisant les syntaxes suivantes :
<?php
$a = 1.234;
$b = 1.2e3;
$c = 7E-10;
?>
Formellement :
LNUM [0-9]+
DNUM ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM})
La taille d'un nombre décimal est dépendant de la plate-forme, cependant, un nombre maximal de ~1.8e308 avec une précision sur 14 chiffres est une valeur commune (format 64 bits IEEE).
Les nombres décimaux ont une précision limitée. Même s'ils dépendent du système, PHP utilise le format de précision des décimaux IEEE 754, qui donnera une erreur maximale relative de l'ordre de 1.11e-16 (dûe aux arrondis). Les opérations arithmétiques non-élémentaires peuvent donner des erreurs plus importantes et bien sûr les erreurs doivent être prises en compte lorsque plusieurs opérations sont liées.
Aussi, les nombres rationnels exactement représentables sous forme de nombre à virgule flottante en base 10, comme 0.1 ou 0.7, n'ont pas de représentation exacte comme nombres à virgule flottante en base 2, utilisée en interne, et ce qu'elle que soit la taille de la mantisse. De ce fait, ils ne peuvent être convertis sans une petite perte de précision. Ceci peut mener à des résultats confus: par exemple, floor((0.1+0.7)*10) retournera normalement 7 au lieu de 8 attendu, car la représentation interne sera quelque chose comme 7.9999999999999991118....
Ainsi, ne faites jamais confiance aux derniers chiffres d'un nombre décimal, mais aussi, ne comparez pas l'égalité de 2 nombres décimaux directement. Si vous avez besoin d'une haute précision, les fonctions mathématiques de précision et les fonctions gmp sont disponibles.
Pour plus d'informations sur la conversion de chaînes en nombres décimaux, voir la section sur la conversion de chaînes en nombres décimaux. Pour les valeurs d'autres types, la conversion est effectuée en convertissant tout d'abord la valeur en un entier, puis, en nombre décimal. Voir la section sur la conversion en entier pour plus d'informations. Une notice est émise si un objet est converti en nombre décimal.
Comme dit dans la note ci-dessus, le test d'égalité des valeurs de nombres décimaux est problématique, en raison de la façon dont ils sont représentés en interne. Cependant, il existe des façons de réaliser cette comparaison.
Pour tester l'égalité de valeurs de nombres décimaux, une borne supérieure de l'erreur relative à l'arrondi est utilisée. Cette valeur est connue comme étant l'epsilon de la machine, ou le unit roundoff, et est la différence la plus petite acceptable dans les calculs.
$a et $b sont égaux sur 5 nombres après la virgule.
<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;
if(abs($a-$b) < $epsilon) {
echo "true";
}
?>
Quelques opérations numériques peuvent donner comme résultat une valeur
représentée par la constante NAN. Ce résultat représente
une valeur indéfinie ou non représentable lors de calculs avec des nombres
à virgule flottante. Toute comparaison, même stricte de cette valeur avec
une autre valeur, y compris cette constante elle-même, donnera une valeur
de FALSE.
En raison du fait que NAN représente tout nombre de valeur
différente, NAN ne doit pas être comparé à d'autres valeurs,
y compris cette constante elle-même, et à la place, elle doit être vérifiée
en utilisant la fonction is_nan().
Une chaîne de caractères est une série de caractères et un caractère est la même chose qu'un octet. De ce fait, PHP ne supporte que les jeux de caractères comportant exactement 256 caractères différents. Ainsi, PHP n'a pas de support natif pour l'Unicode. Reportez-vous aux chapitres sur les types de chaînes de caractères pour plus de détails.
Note: Une chaîne de caractères peut être d'une taille jusqu'à 2Go.
Une chaîne de caractères littérale peut être spécifiée de 4 façons différentes :
La façon la plus simple de spécifier une chaîne de caractères est de l'entourer de guillemets simples (le caractère ').
Pour spécifier un guillemet simple littéral, vous devrez l'échapper d'un antislash (\). Pour spécifier un antislash littéral échappez-le deux fois (\\). Notez que si vous tentez d'échapper n'importe quel autre caractère, l'antislash s'affichera, ce qui signifie que les séquences auquelles vous êtes éventuellement habitués (\r, \n) s'afficheront telles quelles.
Note: Contrairement aux syntaxes double guillemets et heredoc, les variables et les séquences échappées des caractères spéciaux ne seront pas traitées lorsqu'elles seront dans une chaîne de caractères entourée de simples guillemets.
<?php
echo 'ceci est une chaîne simple';
echo 'Vous pouvez également ajouter des nouvelles lignes
dans vos chaînes
de cette façon';
// Affiche : Arnold dit : "I'll be back"
echo 'Arnold dit : "I\'ll be back"';
// Affiche : Voulez-vous supprimer C:\*.*?
echo 'Voulez-vous supprimer C:\\*.*?';
// Affiche : Voulez-vous supprimer C:\*.*?
echo 'Voulez-vous supprimer C:\*.*?';
// Affiche : Ceci n'affichera pas \n de nouvelle ligne
echo 'Ceci n\'affichera pas \n de nouvelle ligne';
// Affiche : Les variables ne seront pas $traitees $ici
echo 'Les variables ne seront pas $traitees $ici';
?>
Si la chaîne de caractères est entourée de guillemets doubles ("), PHP interprétera plus de séquences échappées pour les caractères spéciaux :
| Séquence | Signification |
|---|---|
| \n | Fin de ligne (LF ou 0x0A (10) en ASCII) |
| \r | Retour à la ligne (CR ou 0x0D (13) en ASCII) |
| \t | Tabulation horizontale (HT or 0x09 (9) en ASCII) |
| \v | Tabulation verticale (VT ou 0x0B (11) en ASCII) (depuis PHP 5.2.5) |
| \e | échappement (ESC or 0x1B (27) en ASCII) (depuis PHP 5.4.0) |
| \f | Saut de page (FF ou 0x0C (12) en ASCII) (depuis PHP 5.2.5) |
| \\ | Antislash |
| \$ | Signe dollar |
| \" | Guillemet double |
| \[0-7]{1,3} | La séquence de caractères correspondant à une expression régulière est un caractère, en notation octal |
| \x[0-9A-Fa-f]{1,2} | La séquence de caractères correspondant à une expression régulière est un caractère, en notation hexadécimale |
De la même façon que pour les chaînes entourées de simples guillemets, l'échappement de tout autre caractère affichera l'antislash. Avant PHP 5.1.1, l'antislash de \{$var} n'était pas affiché.
La fonctionnalité la plus intéressante des chaînes entourées de guillemets doubles est que les noms de variables sont traités. Voir la documentation sur l'analyse des chaînes de caractères pour plus de détails.
Une 3ème façon de délimiter une chaîne de caractères est la syntaxe Heredoc : <<<. Après cet opérateur, un identifiant est fourni, puis, une nouvelle ligne. La chaîne elle-même suit, puis, le même identifiant pour fermer la notation.
L'identifiant doit commencer la première colonne de la ligne. De plus, l'identifiant doit suivre les mêmes règles que n'importe quel libellé PHP : il ne doit contenir que des caractères alphanumériques et des soulignés, et doit commencer par un caractère non numérique ou un souligné ("underscore").
Il est très important de noter que la ligne contenant l'identifiant ne doit contenir aucun autre caractère, mis à part, éventuellement, un point-virgule (;). Cela signifie que l'identifiant ne doit pas être indenté, et il ne doit y avoir aucun espace ou tabulation avant ou après le point-virgule. Il est également important de garder à l'esprit que le premier caractère avant l'identifiant de fermeture doit être une nouvelle ligne sur les systèmes Unix, incluant Mac OSX (caractère \n). Le délimiteur de fermeture (pouvant être suivi d'un point-virgule) doit aussi être suivi d'une nouvelle ligne.
Si cette règle n'est pas respectée et que l'identifiant de fermeture n'est pas "propre", il ne sera pas considéré comme identifiant de fermeture, et PHP continuera à en chercher un. Si un identifiant de fermeture "propre" n'est pas trouvé avant la fin du fichier courant, une erreur d'analyse sera émise à la dernière ligne.
Heredoc ne peut être utilisé pour initialiser les proriétés d'une classe. Depuis PHP 5.3, cette limitation ne s'applique qu'aux Heredoc qui contiennent des variables.
Exemple #1 Exemple invalide
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
?>
Heredoc se comporte exactement comme une chaîne entourée de doubles guillemets, sans avoir de double guillemet. Cela signifie que les guillemets dans une syntaxe Heredoc n'ont pas besoin d'être échappés, mais les codes d'échappement listés ci-dessus peuvent toujours être utilisés. Les variables seront traitées mais les mêmes attentions doivent être prises lorsque vous utilisez des variables complexes dans une syntaxe Heredoc.
Exemple #2 Exemple de chaînes Heredoc
<?php
$str = <<<EOD
Exemple de chaîne
sur plusieurs lignes
en utilisant la syntaxe Heredoc.
EOD;
/* Exemple plus complexe, avec des variables. */
class foo
{
var $foo;
var $bar;
function foo()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'MyName';
echo <<<EOT
Mon nom est "$name". J'affiche quelques $foo->foo.
Maintenant, j'affiche quelques {$foo->bar[1]}.
Et ceci devrait afficher un 'A': \x41
EOT;
?>
L'exemple ci-dessus va afficher :
Mon nom est "MyName". J'affiche quelques Foo. Maintenant, j'affiche quelques Bar2. Et ceci devrait afficher un 'A' majuscule : A
Il est aussi possible d'utiliser la syntaxe Heredoc pour passer des arguments à une fonction :
Exemple #3 Exemple d'utilisation de Heredoc pour passer des arguments
<?php
var_dump(array(<<<EOD
foobar!
EOD
));
Depuis PHP 5.3.0, il est possible d'initialiser les variables statiques et les propriétés ou constantes de classes avec la syntaxe Heredoc :
Exemple #4 Utilisation de Heredoc pour initialiser des valeurs statiques
<?php
// Variables statiques
function foo()
{
static $bar = <<<LABEL
Nothing in here...
LABEL;
}
// Constantes et propriétés de classe
class foo
{
const BAR = <<<FOOBAR
Constant example
FOOBAR;
public $baz = <<<FOOBAR
Property example
FOOBAR;
}
?>
Depuis PHP 5.3.0, les guillemets doubles peuvent être utilisés dans les déclarations Heredoc :
Exemple #5 Utilisation des guillemets doubles avec Heredoc
<?php
echo <<<"FOOBAR"
Hello World!
FOOBAR;
>
Nowdoc est aux chaînes entourées de guillemets simples ce qu'Heredoc est aux chaînes entourées de guillemets doubles. Nowdoc est spécifié de manière similaire à Heredoc, mais aucune analyse n'est effectuée dans une syntaxe Nowdoc. La construction est idéale pour embarquer du code PHP ou d'autres larges blocs de texte, sans avoir besoin d'échapper quoi que ce soit. Cette syntaxe partage les mêmes fonctionnalités que le constructeur SGML <![CDATA[ ]]>, en ce qu'elle déclare un bloc de texte qui ne doit pas être analysé.
Nowdoc est identifié avec la même séquence <<< utilisée par Heredoc, mais l'identifiant qui suit est entouré de guillemets simples, e.g. <<<'EOT'. Toutes les règles concernant les identifiants Heredoc sont également appliquées aux identifiants Nowdoc, et tout spécialement, celles concernant l'apparence de l'identifiant.
Exemple #6 Exemple de chaînes Nowdoc
<?php
$str = <<<'EOD'
Exemple de chaîne
sur plusieurs lignes
en utilisant la syntaxe Nowdoc.
EOD;
/* Exemple complexe, avec des variables. */
class foo
{
public $foo;
public $bar;
function foo()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'MyName';
echo <<<'EOT'
Mom nom est "$name". J'affiche quelques $foo->foo.
Maintenant, j'affiche quelques {$foo->bar[1]}.
Ceci ne devrait pas afficher un 'A': \x41
EOT;
?>
L'exemple ci-dessus va afficher :
Mom nom est "$name". J'affiche quelques $foo->foo.
Maintenant, j'affiche quelques {$foo->bar[1]}.
Ceci ne devrait pas afficher un 'A': \x41Note:
Tout comme Heredoc, NowDoc peut être utilisé dans n'importe quel contexte de données statiques. L'exemple typique est l'initialisation de proriétés ou de constantes de classe :
Exemple #7 Exemple avec des données statiques
<?php
class foo {
public $bar = <<<'EOT'
bar
EOT;
}
?>
Note:
Le support Nowdoc a été ajouté en PHP 5.3.0.
Lorsqu'une chaîne de caractères est spécifiée entre guillemets doubles ou en Heredoc, les variables sont analysées.
Il y a 2 types de syntaxe : une simple et une complexe. La syntaxe simple est la plus commune et la plus pratique. Elle fournit une façon d'embarquer une variable, un tableau ou un objet dans une chaîne avec un minimum d'effort.
La syntaxe complexe se reconnaît en l'utilisation d'accolades autour de l'expression.
Si un signe dollar ($) est rencontré, l'analyse prendra autant de caractères que possible pour former un nom de variable valide. Si vous entourez un nom de variable par des accolades explicitement, alors le nom de la variable n'aura aucune ambiguïté.
<?php
$juice = "pomme";
echo "Il a bu du jus de $juice.".PHP_EOL;
// Invalide. "s" est un caractère valide de nom de variable, mais la variable est $juice.
echo "Il a bu du jus constitué de $juices.";
?>
L'exemple ci-dessus va afficher :
Il a bu du jus de pomme. Il a bu du jus de.
De la même façon, l'index d'un tableau ou la propriété d'un objet peut être analysé. Avec les indices d'un tableau, les crochets (]) forment la fin de l'index. Les mêmes règles sont appliquées aux propriétés d'objet comme pour les simples variables.
Exemple #8 Exemple de la syntaxe simple
<?php
$juices = array("pomme", "poire", "koolaid1" => "raisin");
echo "Il a bu du jus de $juices[0].".PHP_EOL;
echo "Il a bu du jus de $juices[1].".PHP_EOL;
echo "Il a bu du jus à base de $juice[0]s.".PHP_EOL; // Ne fonctionne pas
echo "Il a bu du jus de $juices[koolaid1].".PHP_EOL;
class people {
public $john = "John Smith";
public $jane = "Jane Smith";
public $robert = "Robert Paulsen";
public $smith = "Smith";
}
$people = new people();
echo "$people->john a bu du jus de $juices[0].".PHP_EOL;
echo "$people->john a dit bonjour à $people->jane.".PHP_EOL;
echo "$people->john's wife greeted $people->robert.".PHP_EOL;
echo "$people->robert a dit bonjour aux $people->smiths."; // Ne fonctionne pas
?>
L'exemple ci-dessus va afficher :
Il a bu du jus de pomme. Il a bu du jus de poire. Il a bu du jus à base de s. Il a bu du jus de raisin. John Smith a bu du jus de pomme. John Smith a dit bonjour à Jane Smith. John Smith's wife greeted Robert Paulsen. Robert Paulsen a dit bonjour aux .
Pour tout ce qui est plus complexe, vous devriez utiliser la syntaxe complexe.
Cette syntaxe est appelée complexe, non pas par qu'elle est complexe, mais parce qu'elle permet l'utilisation d'expressions complexes.
Toute variable scalaire, tableau ou attribut d'objet représenté en temps que chaîne de caractères peut être utilisée avec cette syntaxe. Écrivez simplement l'expression de la même façon qu'elle devrait l'être à l'extérieur de la chaîne et ensuite, entourez-là des caractères { et }. Sachant que le caractère { ne peut pas être échappé, cette syntaxe ne sera reconnue que lorsque le caractère $ suit immédiatement le caractère {. Utilisez {\$ pour afficher littéralement {$. Quelques exemples pour être clair :
<?php
// Montre toutes les erreurs
error_reporting(E_ALL);
$great = 'fantastic';
// Ne fonctionne pas, affiche : This is { fantastic}
echo "This is { $great}";
// Fonctionne, affiche : This is fantastic
echo "This is {$great}";
echo "This is ${great}";
// Fonctionne
echo "This square is {$square->width}00 centimeters broad.";
// Fonctionne, les clés entourées de quotes ne fonctionnent qu'avec la syntaxe à accolades
echo "This works: {$arr['key']}";
// Fonctionne
echo "This works: {$arr[4][3]}";
// Ceci est faux pour la même raison pour laquelle $foo[bar] est faux à l'extérieur d'une chaîne.
// En d'autres termes, ceci fonctionnera, mais uniquement parceque PHP cherchera d'abord
// une constante nommée foo ; une erreur de niveau E_NOTICE (constante indéfinie) sera émise.
echo "This is wrong: {$arr[foo][3]}";
// Fonctionne. Lors de l'utilisation de tableaux multidimensionnels, utilisez toujours
// les accolades autour du tableau lorsqu'il se trouve dans la chaîne
echo "This works: {$arr['foo'][3]}";
// Fonctionne.
echo "This works: " . $arr['foo'][3];
echo "This works too: {$obj->values[3]->name}";
echo "This is the value of the var named $name: {${$name}}";
echo "This is the value of the var named by the return value of getName(): {${getName()}}";
echo "This is the value of the var named by the return value of \$object->getName(): {${$object->getName()}}";
// Ne fonctionne pas, affiche: This is the return value of getName(): {getName()}
echo "This is the return value of getName(): {getName()}";
?>
Il est également possible d'accéder aux propriétés de classes en utilisant les variables contenues dans des chaînes, en utilisant cette syntaxe.
<?php
class foo {
var $bar = 'I am bar.';
}
$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo "{$foo->$bar}\n";
echo "{$foo->$baz[1]}\n";
?>
L'exemple ci-dessus va afficher :
I am bar. I am bar.
Note:
Les appels aux fonctions, méthodes, variables statiques de classes, ainsi qu'aux constantes de classes à l'intérieur de {$} fonctionnent, cependant la valeur accédée sera interprétée comme le nom d'une variable dans le contexte duquel la chaîne est définie. L'utilisation de simples accolades ({}) ne fonctionnera pas pour accéder à la valeur retournée par les fonctions, méthodes ou les valeurs des constantes et des variables statiques de classes.
<?php
// Affichage de toutes les erreurs.
error_reporting(E_ALL);
class beers {
const softdrink = 'rootbeer';
public static $ale = 'ipa';
}
$rootbeer = 'A & W';
$ipa = 'Alexander Keith\'s';
// Ceci fonctionne ; Affiche : I'd like an A & W
echo "I'd like an {${beers::softdrink}}\n";
// Ceci fonctionne également ; Affiche : I'd like an Alexander Keith's
echo "I'd like an {${beers::$ale}}\n";
?>
On peut accéder et modifier les caractères d'une chaîne de caractères en spécifiant sa position (à partir de 0) en utilisant la même syntaxe que pour les tableaux, comme pour la variable $str[42]. Il convient de voir une chaîne de caractères comme un tableau dans ce cas. Les fonctions substr() et substr_replace() peuvent être utilisées quand vous voulez extraire ou remplacer plus d'un caractère.
Note: On peut également accéder à une chaîne en utilisant des accolades, comme ceci : $str{42}.
Écrire à une position hors de l'intervalle de l'existant fait que
la chaîne est complétée par des espaces jusqu'à cette position.
Les positions sont toujours converties en valeur entière.
Les positions invalides produisent une alerte E_NOTICE.
Les positions négatives produisent une alerte E_NOTICE
mais retournent une chaîne vide en lecture.
Seul le premier caractère d'une chaîne assignée est utilisé.
Assigner une chaîne vide assigne le caractère NULL.
Exemple #9 Quelques exemples de chaînes
<?php
// Récupération du premier caractère d'une chaîne
$str = 'This is a test.';
$first = $str[0];
// Récupération du troisième caractère d'une chaîne
$third = $str[2];
// Récupération du dernier caractère d'une chaîne
$str = 'This is still a test.';
$last = $str[strlen($str)-1];
// Modification du dernier caractère d'une chaîne
$str = 'Look at the sea';
$str[strlen($str)-1] = 'e';
?>
Note:
L'accès aux autres types de variables (c'est à dire pas les tableaux ni les objets implémentant les bonnes interfaces) en utilisant [] ou {} retournera silencieusement
NULL.
Une chaîne de caractères peut être concaténée en utilisant l'opérateur '.' (point). Notez que l'opérateur '+' (addition) ne fonctionnera pas. Reportez-vous aux opérateurs de chaîne pour plus d'informations.
Il y a beaucoup de fonctions utiles pour la manipulation de chaîne de caractères.
Reportez-vous à la section sur les fonctions des chaînes de caractères pour plus de précisions et à la section sur les expressions rationnelles ou sur les expressions rationnelles compatibles Perl pour des recherches et des remplacements avancés.
Il y a également des fonctions pour les URL, et des fonctions pour chiffrer/déchiffrer les chaînes de caractères (mcrypt et mhash).
Et pour finir, reportez-vous aux fonctions "type de caractères".
Une valeur peut être convertie en une chaîne de caractères, en utilisant le mot-clé (string) ou la fonction strval(). La conversion d'une chaîne de caractères est automatiquement effectuée dans le contexte d'une expression où une chaîne de caractères est nécessaire. Ceci survient lors de l'utilisation des fonctions echo ou print ou lorsqu'une variable est comparée à une chaîne. Les sections sur les types et sur le transtypage expliquent ce qui suit de manière plus détaillée. Reportez-vous également à la fonction settype().
La valeur booléenne TRUE est convertie en la chaîne
"1". La valeur booléenne FALSE est convertie en
"" (une chaîne vide). Ceci permet les conversions vers et
depuis une chaîne et un booléen.
Un entier ou un nombre décimal est converti en une chaîne de caractères représentant le nombre de façon textuel (incluant la partie exponentielle pour les nombres à virgule flottante). Les nombres à virgule flottante peuvent être convertis en utilisant la notation exponentielle (4.1E+6).
Note:
Le point décimal est défini dans la locale du script (catégorie LC_NUMERIC). Reportez-vous à la fonction setlocale().
Les tableaux sont toujours convertis en la chaîne "Array" ; ainsi, echoet print ne peuvent être utilisés pour afficher le contenu d'un tableau. Pour afficher un seul élément, utilisez une syntaxe comme echo $arr['foo']. Voir ci-dessous pour des astuces permettant d'afficher le contenu complet.
Les objets en PHP <5.2 sont convertis en la chaîne "Object id#1" où 1 un est un chiffre pouvant varier. Pour afficher les valeurs des propriétés de l'objet (à des fins de déboguage, par exemple), lisez le paragraphe ci-dessous. Pour récupérer le nom de la classe de l'objet, utilisez la fonction get_class(). Notez qu'à partir de PHP 5, la méthode __toString est utilisée lorsqu'elle peut s'appliquer.
Les ressources sont toujours converties en la chaîne "Resource id #1", où 1 est le nombre unique assigné à la ressource par PHP au moment de l'exécution. Ne vous fiez pas à cette structure, il est possible qu'elle change. Pour récupérer le type de la ressource, utilisez la fonction get_resource_type().
NULL est toujours converti en une chaîne vide.
Au vu de tout cela, la conversion d'un tableau, d'un objet ou d'une ressource en une chaîne de caractères ne fournit aucune information utile sur la valeur contenue dans ce type. Reportez-vous aux fonctions print_r() et var_dump() pour plus d'informations sur le contenu de ces types.
La plupart des valeurs en PHP peuvent également être converties en chaîne de caractères afin de les stocker. Cette méthode est appelée "linéarisation", et est effectuée par la fonction serialize(). Si le moteur PHP a été compilé avec le support WDDX, les valeurs PHP peuvent également être linéarisées en XML.
Lorsqu'une chaîne de caractères est évaluée dans un contexte numérique, la valeur et le type résultants sont déterminés comme suit.
Si la chaîne de caractères ne contient aucun '.', 'e', ou 'E' et que la valeur
numérique est dans l'intervalle de représentation des entiers (et notamment
plus petite que PHP_INT_MAX), alors la
chaîne de caractères sera transformée en entier. Dans les autres cas, elle sera
interprétée comme un nombre décimal.
La valeur est fournie par la portion initiale de la chaîne de caractères. Si la chaîne de caractères commence par un caractère numérique valide, ce sera la valeur utilisée. Sinon, la valeur sera de 0 (zéro). Une valeur numérique valide est un signe optionnel, suivi par un ou plusieurs nombres (contenant, optionnellement, un point décimal), suivi par, éventuellement, un exponentiel. L'exponentiel est un 'e' ou 'E' suivi par un ou plusieurs nombres.
<?php
$foo = 1 + "10.5"; // $foo est un nombre à virgule flottante (11.5)
$foo = 1 + "-1.3e3"; // $foo est un nombre à virgule flottante (-1299)
$foo = 1 + "bob-1.3e3"; // $foo est un entier (1)
$foo = 1 + "bob3"; // $foo est un entier (1)
$foo = 1 + "10 Small Pigs"; // $foo est un entier (11)
$foo = 4 + "10.2 Little Piggies"; // $foo est un nombre à virgule flottante (14.2)
$foo = "10.0 pigs " + 1; // $foo est un nombre à virgule flottante (11)
$foo = "10.0 pigs " + 1.0; // $foo est un nombre à virgule flottante (11)
?>
Pour plus d'informations sur ces conversions, reportez-vous au manuel Unix de la fonction strtod(3).
Pour tester un exemple de cette section, copiez/collez l'exemple et insérez la ligne suivante pour voir ce qu'il se passe :
<?php
echo "Le type de \$foo==$foo; est " . gettype ($foo) . "<br />\n";
?>
Ne vous attendez pas à récupérer le code d'un caractère en le convertissant en entier, comme cela est possible en C. Utilisez la fonction ord() et la fonction chr() pour convertir les caractères en codes ASCII.
Le type string en PHP est implémenté sous la forme d'un tableau d'octets ainsi que d'un entier indiquant la longueur du buffer. Il n'a aucune information sur la traduction octet/caractère, laissant cette tâche au programmeur. Il n'y a aucune limitation sur les valeurs pouvant être présentes dans une chaîne ; en particulier, les octets dont la valeur est 0 (“NUL bytes”) sont autorisés à n'importe quel endroit de la chaîne (cependant, quelques fonctions de ce manuel indiquées comme n'étant pas “sécurisée au niveau binaire”, peuvent ignorer tous les octets après un octet nul.)
De part la nature même du type "chaîne de caractères", cela explique le fait qu'il n'existe pas de type “byte” en PHP - la chaîne de caractères prend ce rôle. Les fonctions qui ne retournent pas de données textuelles - par exemple, des données arbitraires lues depuis un socket réseau - continueront de retourner des chaînes de caractères.
Ceci étant dit, PHP ne dicte aucun encodage spécifique pour les chaînes de caractères ; aussi, on pourrait se demander comment les chaînes littérales sont codés. Par exemple, est-ce que la chaîne "á" équivaut à la chaîne "\xE1" (ISO-8859-1), "\xC3\xA1" (UTF-8, C form), "\x61\xCC\x81" (UTF-8, D form) ou toutes autres représentations ? La réponse est que la chaîne sera encodée suivant l'encodage courant du script. Aussi, si le script est écrit en ISO-8859-1, la chaîne sera encodée en ISO-8859-1 et ainsi de suite. Cependant, ceci n'est pas vrai si Zend Multibyte est actif ; dans ce cas, le script peut être écrit dans n'importe quel encodage (explicitement déclaré ou bien détecté) puis, sera convertis en un encodage interne, qui sera utilisé pour les chaînes littérales. Notez qu'il existe des contraintes sur l'encodage du script (ou sur l'encodage interne, si Zend Multibyte est activé) - cela signifie que l'encodage utilisé doit être un sous-ensemble compatible d'ASCII, comme UTF-8 ou ISO-8859-1. Notez, cependant, que les encodages dépendant de l'état, où les mêmes valeurs de l'octet peuvent être utilisées dans le statut du décalage initial et non-initial, peuvent devenir problématiques.
Bien évidemment, les fonctions qui opèrent sur du texte peuvent devoir faire des hypothèses sur la façon dont est encodé la chaîne de caractères. Malheureusement, ces hypothèses ne sont pas les mêmes suivants les fonctions PHP :
Pour conclure, le fait d'écrire un programme correct en utilisant Unicode dépend de l'utilisation ou non de fonctions qui ne fonctionnent pas en Unicode, et qui corrompront les données ; il conviendra donc d'utiliser des fonctions qui fonctionnent correctement, comme celles des extensions intl et mbstring. Cependant, l'utilisation de fonctions qui peuvent gérer des encodages Unicode n'est que le commencement. Quelques soient les fonctions fournies par le langage, il est essentiel de connaître les spécifications de l'Unicode. Par exemple, un programme qui assume qu'il n'y a que des caractères en majuscule et en minuscule fait une mauvaise hypothèse.
Un tableau en PHP est en fait une carte ordonnée. Une carte est un type qui associe des valeurs en clés. Ce type est optimisé pour différentes utilisations ; il peut être considéré comme un tableau, une liste, une table de hashage, un dictionnaire, une collection, une pile, une file d'attente et probablement plus. On peut avoir, comme valeur d'un tableau, d'autres tableaux, multidimensionnels ou non.
La structure de ces données dépasse l'objet de ce manuel, mais vous trouverez au moins un exemple pour chacun des cas évoqués. Pour plus d'informations, reportez-vous aux différentes explications sur le sujet que l'on trouve sur le web.
Un tableau peut être créé en utilisant la structure de langage array(). Il prend un nombre illimité de paramètres, chacun séparé par une virgule, sous la forme d'une paire key => value.
array(
key => value,
key2 => value2,
key3 => value3,
...
)
La virgule après le dernier élément d'un tableau est optionnelle et peut ne pas être ajoutée. C'est généralement ce qui est fait pour les tableaux sur une seule ligne, i.e. array(1, 2) est préféré à array(1, 2, ). Pour les tableaux sur plusieurs lignes, la virgule finale est généralement utilisée, car elle permet d'ajouter plus facilement de nouveaux éléments à la fin.
Depuis PHP 5.4, vous pouvez également utiliser la syntaxe courte, qui remplace array() par [].
Exemple #1 Un tableau simple
<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
);
// depuis PHP 5.4
$array = [
"foo" => "bar",
"bar" => "foo",
];
?>
La clé key peut être soit un integer, soit une chaîne de caractères. La valeur value peut être de n'importe quel type.
De plus, les modifications de type pour la clé key peuvent survenir :
En PHP 5.4, l'accès par position d'un caractère a été rendu cohérent. Par contre, les valeurs retournées peuvent être différentes avec les anciennes versions. Depuis PHP 5.4, la position d'un caractère doit être un entier ou un entier sous forme de chaîne, sinon, une alerte sera émise.
Exemple #2 Exemple d'accès à un caractère par sa position
<?php
$str = 'abc';
var_dump($str['1']);
var_dump(isset($str['1']));
var_dump($str['1.0']);
var_dump(isset($str['1.0']));
var_dump($str['x']);
var_dump(isset($str['x']));
var_dump($str['1x']);
var_dump(isset($str['1x']));
?>
Résultat de l'exemple ci-dessus en PHP 5.3 :
string(1) "b" bool(true) string(1) "b" bool(true) string(1) "a" bool(true) string(1) "b" bool(true)
Résultat de l'exemple ci-dessus en PHP 5.4 :
string(1) "b" bool(true) Warning: Illegal string offset '1.0' in /tmp/t.php on line 7 string(1) "b" bool(false) Warning: Illegal string offset 'x' in /tmp/t.php on line 9 string(1) "a" bool(false) string(1) "b" bool(false)
Si plusieurs éléments dans la déclaration d'un tableau utilise la même clé, seule la dernière sera utilisée, écrasant ainsi toutes les précédentes.
Exemple #3 Exemple sur la modification de type et l'écrasement
<?php
$array = array(
1 => "a",
"1" => "b",
1.5 => "c",
true => "d",
);
var_dump($array);
?>
L'exemple ci-dessus va afficher :
array(1) {
[1]=>
string(1) "d"
}
Vu que toutes les clés de l'exemple ci-dessus sont modifiées en l'entier 1, la valeur sera écrasée sur chaque nouvel élément, et seul le dernier dont la valeur assignée est "d" sera conservé.
Les tableaux PHP peuvent contenir des clés de type integer et string en même temps, vu que PHP ne distingue pas les tableaux indexés et les tableaux associatifs.
Exemple #4 Exemple avec des clés de type integer et string
<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
100 => -100,
-100 => 100,
);
var_dump($array);
?>
L'exemple ci-dessus va afficher :
array(4) {
["foo"]=>
string(3) "bar"
["bar"]=>
string(3) "foo"
[100]=>
int(-100)
[-100]=>
int(100)
}
La clé key est optionnelle. Si elle n'est pas spécifiée, PHP utilisera un incrément de la dernière clé entière utilisée.
Exemple #5 Tableaux indexés sans clé
<?php
$array = array("foo", "bar", "hallo", "world");
var_dump($array);
?>
L'exemple ci-dessus va afficher :
array(4) {
[0]=>
string(3) "foo"
[1]=>
string(3) "bar"
[2]=>
string(5) "hallo"
[3]=>
string(5) "world"
}
Il est possible de spécifier la clé seulement pour quelques éléments et ne pas la fournir pour d'autres :
Exemple #6 Exemple avec des clés seulement pour quelques éléments
<?php
$array = array(
"a",
"b",
6 => "c",
"d",
);
var_dump($array);
?>
L'exemple ci-dessus va afficher :
array(4) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[6]=>
string(1) "c"
[7]=>
string(1) "d"
}
Comme vous pouvez le voir, la dernière valeur "d" a été assignée à la clé 7. Ceci est du au fait que le dernier entier le plus grand utilisé auparavant était 6.
Les éléments d'un tableau peuvent être accédés en utilisant la syntaxe array[key].
Exemple #7 Accès aux éléments d'un tableau
<?php
$array = array(
"foo" => "bar",
42 => 24,
"multi" => array(
"dimensional" => array(
"array" => "foo"
)
)
);
var_dump($array["foo"]);
var_dump($array[42]);
var_dump($array["multi"]["dimensional"]["array"]);
?>
L'exemple ci-dessus va afficher :
string(3) "bar" int(24) string(3) "foo"
Depuis PHP 5.4, il est possible de faire référence à un tableau résultant d'une fonction ou d'une méthode directement. Avant, cela n'était possible qu'en utilisant une variable temporaire.
Exemple #8 Faire référence à un tableau à la sortie d'une fonction ou d'une méthode
<?php
function getArray() {
return array(1, 2, 3);
}
// Depuis PHP 5.4
$secondElement = getArray()[1];
// Avant PHP 5.4
$tmp = getArray();
$secondElement = $tmp[1];
// ou
list(, $secondElement) = getArray();
?>
Note:
Une tentative d'accès à une clé d'un tableau qui n'a pas été définie revient à tenter d'accès à une variable non définie : une alerte de niveau
E_NOTICEsera émise, et le résultat vaudraNULL.
Un tableau existant peut être modifié en y assignant explicitement des valeurs.
L'assignation d'une valeur dans un tableau est effectué en spécifiant la clé, entre crochets. La clé peut également ne pas être renseignée, sous la forme : [].
$arr[clé] = valeur; $arr[] = valeur; // clé peut être un entier ou une chaîne de caractères // valeur peut être n'importe quel type
Si $arr n'existe pas lors de l'assignation, il sera créé ; c'est ainsi une façon détournée de créer un tableau. Cette pratique est cependant découragée car si $arr contient déjà quelques valeurs (i.e. string depuis la variable demandée) alors cette valeur restera en place et [] peut attendre un opérateur d'accès sur une chaîne. C'est toujours un meilleur choix que d'initialiser une variable par assignement direct.
Pour modifier une valeur en particulier, il convient d'assigner une valeur en spécifiant sa clé. Pour effacer une paire clé/valeur, il convient d'appeler la fonction unset() sur la clé désirée.
<?php
$arr = array(5 => 1, 12 => 2);
$arr[] = 56; // Identique à $arr[13] = 56;
// à cet endroit du script
$arr["x"] = 42; // Ceci ajoute un nouvel élément au
// tableau avec la clé "x"
unset($arr[5]); // Ceci efface l'élément du tableau
unset($arr); // Ceci efface complètement le tableau
?>
Note:
Comme dit plus haut, si aucune clé n'est spécifiée, l'indice maximal existant est repris, et la nouvelle clé sera ce nombre, plus 1 (mais au moins 0). Si aucun indice entier n'existe, la clé sera 0 (zéro).
Notez que la clé entière maximale pour cette opération n'a pas besoin d'exister dans le tableau au moment de la manipulation. Elle doit seulement avoir existé dans le tableau à un moment ou un autre depuis la dernière fois où le tableau a été ré-indexé. Voici un exemple qui illustre ce principe :
<?php
// Création d'un tableau simple.
$array = array(1, 2, 3, 4, 5);
print_r($array);
// Maintennant, on efface tous les éléments, mais on concerne le tableau :
foreach ($array as $i => $value) {
unset($array[$i]);
}
print_r($array);
// Ajout d'un élément (notez que la nouvelle clé est 5, et non 0).
$array[] = 6;
print_r($array);
// Ré-indexation :
$array = array_values($array);
$array[] = 7;
print_r($array);
?>L'exemple ci-dessus va afficher :
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) Array ( ) Array ( [5] => 6 ) Array ( [0] => 6 [1] => 7 )
Il y a beaucoup de fonctions utiles pour travailler avec les tableaux. Nous vous invitons à lire la section de ce manuel sur les fonctions en rapport avec les tableaux.
Note:
La fonction unset() permet d'effacer les clés d'un tableau. Soyez attentif sur le fait que le tableau ne sera pas ré-indexé. Si vous voulez réaliser un effacement complet et une ré-indexation de votre tableau, vous devez utiliser la fonction array_values().
<?php
$a = array(1 => 'one', 2 => 'two', 3 => 'three');
unset($a[2]);
/* produira un tableau comme ceci
$a = array(1 => 'one', 3 => 'three');
et NON un tableau comme ceci
$a = array(1 => 'one', 2 =>'three');
*/
$b = array_values($a);
// Maintenant, $b vaut array(0 => 'one', 1 =>'three')
?>
La structure de contrôle foreach existe tout spécialement pour les tableaux. Elle fournit une manière pratique de parcourir un tableau.
Utiliser toujours des guillemets autour d'un index littéral. Par exemple, $foo['bar'] est correct, alors que $foo[bar] ne l'est pas. Mais pourquoi ? il est courant de rencontrer ce genre de syntaxe dans d'ancien script :
<?php
$foo[bar] = 'enemy';
echo $foo[bar];
// etc
?>
C'est incorrect, mais ça fonctionne. La raison est que ce code a une constante
indéfinie (bar) plutôt qu'une chaîne ('bar' - noter les guillemets). PHP
peut définir plus loin une constante portant le même nom.
Cela fonctionne car PHP convertit automatiquement une chaîne nue
(une chaîne sans guillemets qui ne correspond à aucun symbole connu) en une chaîne
qui la contient. Actuellement, s'il n'y a aucune constante nommée bar,
alors PHP substituera 'bar' dans la chaîne et l'utilisera.
Note: Ceci ne signifie pas qu'il faut toujours mettre la clé entre guillemets. N'utilisez pas de guillemets avec les clés qui sont des constantes ou des variables, car cela empêcherait PHP de les interpréter.
<?php
error_reporting(E_ALL);
ini_set('display_errors', true);
ini_set('html_errors', false);
// Tableau simple :
$array = array(1, 2);
$count = count($array);
for ($i = 0; $i < $count; $i++) {
echo "\nVérification de $i : \n";
echo "Mauvais : " . $array['$i'] . "\n";
echo "Bon : " . $array[$i] . "\n";
echo "Mauvais : {$array['$i']}\n";
echo "Bon : {$array[$i]}\n";
}
?>L'exemple ci-dessus va afficher :
Vérification de 0 : Notice: Undefined index: $i in /path/to/script.html on line 9 Mauvais : Bon : 1 Notice: Undefined index: $i in /path/to/script.html on line 11 Mauvais : Bon : 1 Vérification de 1 : Notice: Undefined index: $i in /path/to/script.html on line 9 Mauvais : Bon : 2 Notice: Undefined index: $i in /path/to/script.html on line 11 Mauvais : Bon : 2
Plus d'exemples pour expliquer ce comportement :
<?php
// Affichons toutes les erreurs
error_reporting(E_ALL);
$arr = array('fruit' => 'apple', 'veggie' => 'carrot');
// Correct
print $arr['fruit']; // apple
print $arr['veggie']; // carrot
// Incorrect. Ceci fonctionne mais PHP émettera une erreur de type E_NOTICE car
// on utilise la constante nommée fruit qui est indéfinie
//
// Notice: Use of undefined constant fruit - assumed 'fruit' in...
print $arr[fruit]; // apple
// Ceci définit une constante pour expliquer ce qu'il ne va pas. La valeur 'veggie'
// est assignée à la constante nommée fruit.
define('fruit', 'veggie');
// Noter la différence maintenant
print $arr['fruit']; // apple
print $arr[fruit]; // carrot
// Ce qui squit est correct, car c'est dans une chaîne. Les constantes ne sont pas recherchées
// dans les chaînes, et donc, aucune alerte E_NOTICE ne sera émise
print "Hello $arr[fruit]"; // Hello apple
// Avec une exception : les parenthèses autour d'un tableau dans une chaîne permettent
// aux constantes d'être interprétées
print "Hello {$arr[fruit]}"; // Hello carrot
print "Hello {$arr['fruit']}"; // Hello apple
// Ceci ne fonctionnera pas, et en résultera une erreur d'analyse, comme ceci :
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// Ceci arrive lors de l'utilisation d'une supergloables dans les chaînes
print "Hello $arr['fruit']";
print "Hello $_GET['foo']";
// La concaténation est une autre solution
print "Hello " . $arr['fruit']; // Hello apple
?>
Lorsque error_reporting est défini afin
de montrer les erreurs de type E_NOTICE (en le définissant à
E_ALL, par exemple), une telle pratique devient immédiatement
visible. Par défaut,
error_reporting n'est pas défini pour
afficher toutes les alertes.
Comme vu dans la section "syntaxe", ce qui se trouve entre crochets ('[' et ']') doit être une expression. Ceci signifie que le code ci-dessous fonctionne :
<?php
echo $arr[somefunc($bar)];
?>
C'est un exemple d'utilisation d'une fonction retournant une valeur qui sera la clé du tableau. PHP comprend également les constantes :
<?php
$error_descriptions[E_ERROR] = "A fatal error has occured";
$error_descriptions[E_WARNING] = "PHP issued a warning";
$error_descriptions[E_NOTICE] = "This is just an informal notice";
?>
Noter que E_ERROR est également un identifiant valide,
tout comme bar dans le premier exemple. Mais le dernier
exemple est finalement le même que celui-ci :
<?php
$error_descriptions[1] = "A fatal error has occured";
$error_descriptions[2] = "PHP issued a warning";
$error_descriptions[8] = "This is just an informal notice";
?>
car E_ERROR vaut 1, etc.
Dans le futur, les développeurs PHP peuvent vouloir ajouter une autre constante ou un autre mot clé, ou bien une constante dans une autre partie du code qui peut interférer. Par exemple, il est toujours incorrect d'utiliser le mot empty et default, sachant que ce sont des mots réservés.
Note: Pour être plus clair, dans une chaîne entourée de guillemets doubles, il est valide de ne pas entourer les indexes d'un tableau avec des guillemets, et donc, "$foo[bar]" est valide. Voir les exemples ci-dessous pour plus détails mais aussi la section sur l'analyse des variables dans les chaînes.
Pour tous les types : entier, nombre décimal, chaîne de caractères, booléen et ressource, le fait de convertir une valeur en un tableau résulte en un tableau contenant un seul élément dont l'indexe vaut zéro et la valeur, une valeur scalaire convertie. En d'autres termes, (array)$scalarValue est exactement la même chose que array($scalarValue).
Si un objet est converti en un tableau, le résultat sera un tableau dont les éléments sont les propriétés de l'objet. Les clés sont les noms des membres, avec une légère exception : les variables ayant un nom sous forme d'entier sont inaccessible; les variables privées auront le nom de la classe ajouté au nom de la variable ; les variables protégées auront un '*' ajouté au nom de la variable. Ce comportement peut amener à des résultats inattendus :
<?php
class A {
private $A; // Ceci devient '\0A\0A'
}
class B extends A {
private $A; // Ceci devient '\0B\0A'
public $AA; // Ceci devient 'AA'
}
var_dump((array) new B());
?>
Ici, on pourrait penser qu'il y a 2 clés nommées 'AA', alors qu'une est actuellement nommée '\0A\0A'.
La conversion de NULL en un tableau résultat en un tableau vide.
Il est possible de comparer plusieurs tableaux avec la fonction array_diff() ainsi qu'avec les opérateurs de tableaux.
Le type tableau en PHP est vraiment versatile. Voici quelques exemples :
<?php
// This
$a = array( 'color' => 'red',
'taste' => 'sweet',
'shape' => 'round',
'name' => 'apple',
4 // la clé sera 0
);
// est strictement équivalent à
$a = array();
$a['color'] = 'red';
$a['taste'] = 'sweet';
$a['shape'] = 'round';
$a['name'] = 'apple';
$a[] = 4; // la clé sera 0
$b[] = 'a';
$b[] = 'b';
$b[] = 'c';
// Après exécution du code ci-dessus, $a sera le tableau
// array('color' => 'red', 'taste' => 'sweet', 'shape' => 'round',
// 'name' => 'apple', 0 => 4), et $b sera le tableau
// array(0 => 'a', 1 => 'b', 2 => 'c'), ou simplement array('a', 'b', 'c').
?>
Exemple #9 Utilisation de array()
<?php
// Tableau comme carte de propriétés
$map = array( 'version' => 4,
'OS' => 'Linux',
'lang' => 'english',
'short_tags' => true
);
// clés numériques strictes
$array = array( 7,
8,
0,
156,
-10
);
// est identique à array(0 => 7, 1 => 8, ...)
$switching = array( 10, // clé = 0
5 => 6,
3 => 7,
'a' => 4,
11, // clé = 6 (l'indice entier maximal est 5)
'8' => 2, // clé = 8 (intier !)
'02' => 77, // clé = '02'
0 => 12 // la valeur 10 sera écrasée par la valeur 12
);
// empty array
$empty = array();
?>
Exemple #10 Collection
<?php
$colors = array('rouge', 'bleu', 'verte', 'jaune');
foreach ($colors as $color) {
echo "Aimez-vous la couleur $color ?\n";
}
?>
L'exemple ci-dessus va afficher :
Aimez-vous la couleur rouge ? Aimez-vous la couleur bleu ? Aimez-vous la couleur verte ? Aimez-vous la couleur jaune ?
La modification directe de valeurs d'un tableau est possible depuis PHP 5 en le passant par référence. Avant cette version, nous devions utiliser l'astuce suivante :
Exemple #11 Modification d'un élément dans la boucle
<?php
// PHP 5
foreach ($colors as &$color) {
$color = strtoupper($color);
}
unset($color); /* On s'assure que les écritures suivantes
sur $color ne modifie pas le dernier élément du tableau */
// Astuce pour les anciennes versions
foreach ($colors as $key => $color) {
$colors[$key] = strtoupper($color);
}
print_r($colors);
?>
L'exemple ci-dessus va afficher :
Array
(
[0] => ROUGE
[1] => BLEU
[2] => VERTE
[3] => JAUNE
)
Cet exemple crée un tableau, dont l'indexation commence à 1.
Exemple #12 Indexation commençant à 1
<?php
$firstquarter = array(1 => 'Janvier', 'Février', 'Mars');
print_r($firstquarter);
?>
L'exemple ci-dessus va afficher :
Array
(
[1] => 'Janvier'
[2] => 'Février'
[3] => 'Mars'
)
Exemple #13 Remplissage d'un tableau
<?php
// Remplit un tableau avec tous les éléments d'un dossier
$handle = opendir('.');
while (false !== ($file = readdir($handle))) {
$files[] = $file;
}
closedir($handle);
?>
Les tableaux sont ordonnés. L'ordre peut être modifié en utilisant plusieurs fonctions. Voir la section sur les fonctions sur les tableaux pour plus d'informations. La fonction count() peut être utilisée pour compter le nombre d'éléments d'un tableau.
Exemple #14 Trie d'un tableau
<?php
sort($files);
print_r($files);
?>
Sachant que la valeur d'une tableau peut être n'importe quoi, elle peut aussi être un autre tableau. Ceci permet la création de tableaux récursifs et de tableaux multidimensionnels.
Exemple #15 Tableaux récursifs et multidimensionnels
<?php
$fruits = array ( "fruits" => array ( "a" => "orange",
"b" => "banana",
"c" => "apple"
),
"numbers" => array ( 1,
2,
3,
4,
5,
6
),
"holes" => array ( "first",
5 => "second",
"third"
)
);
// Quelques exemples pour retrouver les valeurs dans le tableau ci-dessus
echo $fruits["holes"][5]; // affiche "second"
echo $fruits["fruits"]["a"]; // affiche "orange"
unset($fruits["holes"][0]); // efface "first"
// Création d'un tableau multidimensionnel
$juices["apple"]["green"] = "good";
?>
L'assignation d'un tableau induit toujours la copie des valeurs. Utilisez l'opérateur de référence pour copier un tableau par référence.
<?php
$arr1 = array(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // $arr2 est modifié,
// $arr1 vaut toujours array(2, 3)
$arr3 = &$arr1;
$arr3[] = 4; // maintenant, $arr1 et $arr3 sont identiques
?>
Pour créer un nouvel objet, utilisez le mot clé new afin d'instancier une classe :
<?php
class foo
{
function do_foo()
{
echo "Doing foo.";
}
}
$bar = new foo;
$bar->do_foo();
?>
Pour une discussion complète, voir le chapitre sur les classes et les objets.
Si un objet est converti en un objet, il ne sera pas modifié.
Si une valeur de n'importe quel type est convertie en un objet,
une nouvelle instance de la classe interne stdClass
sera créée. Si la valeur est NULL, la nouvelle instance sera vide.
La conversion d'un tableau en objet fera que les clés deviendront les
proriétés, et les valeurs des clés, deviennent les valeurs des proriétés.
Pour n'importe quel autre type, un membre appelé scalar
contiendra la valeur.
<?php
$obj = (object) 'ciao';
echo $obj->scalar; // Affiche : 'ciao'
?>
Une ressource est une variable spéciale, contenant une référence vers une ressource externe. Les ressources sont créées et utilisées par des fonctions spéciales. Voir l'appendice pour une liste de toutes ces fonctions ainsi que les types de ressource correspondants.
Voir aussi la fonction get_resource_type().
Sachant qu'une ressource représente un fichier ouvert, une connexion à une base de données, une image, etc..., la conversion en une ressource n'a pas de sens.
Sachant qu'une ressource qui n'a plus aucune référence est détectée automatiquement et est libérée par le collecteur, il est rarement nécessaire de libérer la mémoire manuellement.
Note: Les connexions persistantes aux bases de données sont des exceptions à cette règle. Elles ne sont pas détruites par le collecteur. Voir la section sur les connexions persistantes pour plus d'informations.
La valeur spéciale NULL représente une variable sans valeur. NULL est
la seule valeur possible du type NULL.
Une variable est considérée comme null si :
elle s'est vue assigner la constante NULL.
elle n'a pas encore reçu de valeur.
elle a été effacée avec la fonction unset().
Il y a une seule valeur de type null, et c'est la constante
insensible à la casse NULL.
<?php
$var = NULL;
?>
Transtyper une variable vers null en utilisant
la syntaxe (unset) $var n'effacera pas
la variable, ni écrasera sa valeur. Ca ne fera que retourner
la valeur NULL.
Les fonctions de rappel sont identifiés via le type callable depuis PHP 5.4. Cette documentation utilise le type callback qui revient exactement au même.
Quelques fonctions comme call_user_func() ou usort() acceptent des fonctions de rappel définies par l'utilisateur comme paramètre. Les fonctions de rappel ne peuvent pas être que de simples fonctions, mais aussi des méthodes object, incluant des méthodes statiques de classe.
Une fonction PHP est passée par son nom, sous la forme d'une chaîne de caractères. Toute fonction interne ou définie par l'utilisateur peut être utilisée, sauf les constructions de language comme : array(), echo, empty(), eval(), exit(), isset(), list(), print ou unset().
Une méthode d'un objet instancié est passé comme un tableau contenant un objet à l'index 0 et le nom de la méthode à l'index 1.
Les méthodes statiques de classe peuvent aussi être passées sans instancier l'objet en passant le nom de la classe au lieu d'un objet à l'index 0. Depuis PHP 5.2.3, il est également possible de passer 'NomDeLaClasse::NomDeLaMethode'.
Sauf depuis une fonction définie par l'utilisateur, la fonction create_function() peut également être utilisée pour créer une fonction de rappel anonyme. Depuis PHP 5.3.0, il est également possible de passe une closure comme paramètre de la fonction de rappel.
Exemple #1 Exemple de fonctions de rappel
<?php
// Un exemple de fonction de rappel
function my_callback_function() {
echo 'hello world!';
}
// Un exemple de méthode de rappel
class MyClass {
static function myCallbackMethod() {
echo 'Hello World!';
}
}
// Type 1 : Fonction de rappel simple
call_user_func('my_callback_function');
// Type 2 : Appel d'une méthode statique de classe
call_user_func(array('MyClass', 'myCallbackMethod'));
// Type 3 : Appel d'une méthode objet
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
// Type 4 : Appel d'une méthode statique de classe (depuis PHP 5.2.3)
call_user_func('MyClass::myCallbackMethod');
// Type 5 : Appel à une méthode statique de classe relative (depuis PHP 5.3.0)
class A {
public static function who() {
echo "A\n";
}
}
class B extends A {
public static function who() {
echo "B\n";
}
}
call_user_func(array('B', 'parent::who')); // A
?>
Exemple #2 Exemple d'une fonction de rappel utilisant une closure
<?php
// notre closure
$double = function($a) {
return $a * 2;
};
// Ceci est notre intervalle de nombres
$numbers = range(1, 5);
// Utilisation de la closure comme fonction de rappel ici
// pour doubler la taille de chaque élément de notre intervalle
$new_numbers = array_map($double, $numbers);
print implode(' ', $new_numbers);
?>
L'exemple ci-dessus va afficher :
2 4 6 8 10
Note: En PHP 4, il était nécessaire d'utiliser une référence pour créer une fonction de rappel, qui pointe vers l'objet actuel, et non une copie de l'objet. Pour plus de détails, reportez-vous à l'explication sur les références.
Note:
Notez que les fonctions de rappel enregistrées avec des fonctions comme call_user_func() et call_user_func_array() ne seront pas appelées si une exception n'est pas interceptée alors qu'elle a été lancée dans une précédente fonction de rappel.
mixed indique qu'un paramètre peut accepter plusieurs (mais pas nécessairement tous) types.
gettype() par exemple, accepte tous les types PHP, alors que str_replace() accepte les chaînes et les tableaux.
number indique qu'un paramètre peut être soit un nombre entier, soit un nombre décimal (nombre décimal).
Les pseudo-types callback étaient utilisés dans cette documentation avant que le type callable ne soit introduit en PHP 5.4. Leur signification est exactement la même.
void comme type retourné signifie que la valeur retournée est inutile. void dans une liste de paramètre signifie que la fonction n'accepte aucun paramètre.
$... dans le prototype d'une fonction signifie
"et bien plus...". Ce nom de variable est utilisé
lorsqu'une fonction peut prendre un nombre indéfini d'arguments.
PHP n'impose pas de définir explicitement le type d'une variable lors de sa déclaration ; le type d'une variable est déterminé par son contexte d'utilisation. Si une valeur de type string est assignée à la variable $var, $var devient de type string. Si une valeur de type integer est ensuite assignée à cette variable $var, alors, son type devient integer.
Un exemple de conversion de type automatique avec PHP est l'ajout de l'opérateur '+'. Si une des opérandes est de type float, alors toutes les opérandes seront évaluées comme de types float, et le résultat sera de type float. Sinon, les opérandes seront interprétées comme integers, et le résultat sera également de type integer. Noter que cela ne modifie pas le type des opérandes ; la seule modification est la façon dont les opérandes sont évaluées et le type de l'expression elle-même.
<?php
$foo = "0"; // $foo est une chaîne de caractères (ASCII 48)
$foo += 2; // $foo est maintenant un entier (2)
$foo = $foo + 1.3; // $foo est maintenant un nombre à virgule flottante (3.3)
$foo = 5 + "10 Little Piggies"; // $foo est un entier (15)
$foo = 5 + "10 Small Pigs"; // $foo est un entier (15)
?>
Si les 2 derniers exemples vous semblent compliqués, reportez-vous à la section sur les conversions de chaînes en nombres.
Pour forcer une variable à être évaluée en un certain type, reportez-vous à la section sur le transtypage. Pour changer le type d'une variable, reportez-vous à la fonction settype().
Pour tester les exemples de cette section, utilisez la fonction var_dump().
Note:
Le comportement d'une conversion automatique en tableau est actuellement non-défini.
De plus, vu que PHP supporte l'indexation des chaînes de caractères via des positions en utilisant la même syntaxe que pour les tableaux, l'exemple suivant est correct pour toutes les versions de PHP :
<?php
$a = 'car'; // $a est une chaîne de caractères
$a[0] = 'b'; // $a est toujours une chaîne de caractères
echo $a; // bar
?>Reportez-vous à la section sur l'accès aux chaînes par ces caractères pour plus d'informations.
La modification de types en PHP fonctionne de la même façon qu'en C : le nom du type désiré est écrit entre parenthèses avant la variable à traiter.
<?php
$foo = 10; // $foo est un entier
$bar = (boolean) $foo; // $bar est un booléen
?>
Les préfixes autorisés sont :
La modification en binaire et le préfixe b ont été ajoutés en PHP 5.2.1
Notez que les tabulations et les espaces sont autorisés dans les parenthèses. Les exemples suivants sont fonctionnellement équivalents :
<?php
$foo = (int) $bar;
$foo = ( int ) $bar;
?>
Modification d'une chaîne littérale et de variables en chaînes binaires :
<?php
$binary = (binary) $string;
$binary = b"binary string";
?>
Note:
Au lieu de modifier une variable en chaîne, il est également possible d'entourer la variable de doubles guillemets.
<?php
$foo = 10; // $foo est un entier
$str = "$foo"; // $str est une chaîne
$fst = (string) $foo; // $fst est également une chaîne
// Ceci affichera "ils sont identiques"
if ($fst === $str) {
echo "ils sont identiques";
}
?>
Le comportement d'une modification de type n'est pas toujours identique suivant les types. Pour plus d'informations, reportez-vous à ces sections :
En PHP, les variables sont représentées par un signe dollar "$" suivi du nom de la variable. Le nom est sensible à la casse.
Les noms de variables suivent les mêmes règles de nommage que les autres entités PHP. Un nom de variable valide doit commencer par une lettre ou un souligné (_), suivi de lettres, chiffres ou soulignés. Exprimé sous la forme d'une expression régulière, cela donne : '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
Note: Dans nos propos, une lettre peut être a-z, A-Z, et les octets de 127 à 255 (0x7f-0xff).
Note: $this est une variable spéciale, qui ne peut pas être assignée.
Vous pourriez également avoir besoin de jeter un oeil sur Guide de nommage de l'espace utilisateur.
Pour obtenir des informations sur une variable, voyez les fonctions dédiées aux variables.
Exemple #1 Validité des noms de variables
<?php
$var = 'Jean';
$Var = 'Paul';
echo "$var, $Var"; // affiche "Jean, Paul"
$4site = 'pas encore'; // invalide : commence par un nombre
$_4site = 'pas encore'; // valide : commence par un souligné
$täyte = 'mansikka'; // valide : 'ä' est ASCII (étendu) 228.
?>
Les variables sont toujours assignées par valeur. C'est-à-dire, lorsque vous assignez une expression à une variable, la valeur de l'expression est recopiée dans la variable. Cela signifie, par exemple, qu'après avoir assigné la valeur d'une variable à une autre, modifier l'une des variables n'aura pas d'effet sur l'autre. Pour plus de détails sur ce genre d'assignation, reportez-vous aux expressions.
PHP permet aussi d'assigner les valeurs aux variables par référence. Cela signifie que la nouvelle variable ne fait que référencer (en d'autres termes, "devient un alias de", ou encore "pointe sur") la variable originale. Les modifications de la nouvelle variable affecteront l'ancienne et vice versa.
Pour assigner par référence, ajoutez simplement un & (ET commercial) au début de la variable qui est assignée (la variable source). Dans l'exemple suivant, Mon nom est Pierre s'affichera deux fois :
Exemple #2 Assignation de référence
<?php
$foo = 'Pierre'; // Assigne la valeur 'Pierre' à $foo
$bar = &$foo; // Référence $foo avec $bar.
$bar = "Mon nom est $bar"; // Modifie $bar...
echo $foo; // $foo est aussi modifiée
echo $bar;
?>
Une chose importante à noter est que seules les variables nommées peuvent être assignées par référence.
Exemple #3 Assignation de référence et variables anonymes
<?php
$foo = 25;
$bar = &$foo; // assignation valide
$bar = &(24 * 7); // assignation invalide : référence une expression sans nom
function test() {
return 25;
}
$bar = &test(); // assignation invalide.
?>
Il n'est pas nécessaire d'initialiser les variables en PHP, cependant, cela reste
une excellente pratique. Les variables non initialisées ont une valeur par défaut
selon leur type - FALSE pour les booléens, zéro pour les entiers et les réels, chaîne vide
pour les chaînes de caractères (comme utilisée avec
echo) ou un tableau vide
pour les tableaux.
Exemple #4 Valeurs par défaut des variables non initialisées
<?php
// Une variable non initialisée et non référencée (pas de contexte d'utilisation); retourne NULL
var_dump($unset_var);
// L'utilisation d'un booléen; retourne 'false' (Voir l'opérateur ternaire pour comprendre cette syntaxe)
echo($unset_bool ? "true\n" : "false\n");
// Utilisation d'une chaîne de caractères; retourne 'string(3) "abc"'
$unset_str .= 'abc';
var_dump($unset_str);
// Utilisation d'un entier; retourne 'int(25)'
$unset_int += 25; // 0 + 25 => 25
var_dump($unset_int);
// Utilisation d'un entier/double; retourne 'float(1.25)'
$unset_float += 1.25;
var_dump($unset_float);
// Utilisation d'un tableau : retourne array(1) { [3]=> string(3) "def" }
$unset_arr[3] = "def"; // array() + array(3 => "def") => array(3 => "def")
var_dump($unset_arr);
// Utilisation d'un objet; crée un nouvel objet stdClass (voir http://www.php.net/manual/fr/reserved.classes.php)
// Retourne : object(stdClass)#1 (1) { ["foo"]=> string(3) "bar" }
$unset_obj->foo = 'bar';
var_dump($unset_obj);
?>
Utiliser la valeur par défaut d'une variable non initialisée est problématique lorsque vous incluez un fichier dans un autre qui utilise le même nom de variable. C'est également un risque niveau sécurité lorsque register_globals est activé. Une erreur de niveau E_NOTICE sera émise lorsque vous travaillerez avec des variables non initialisées, cependant, aucune erreur ne sera lancée lorsque vous tenterez d'insérer un élément dans un tableau non initialisé. La structure de langage isset() peut être utilisée pour détecter si une variable a déjà été initialisée.
PHP fourni un grand nombre de variables pré-définies. Cependant, beaucoup de ces variables ne peuvent pas être présentées ici, car elles dépendent du serveur sur lequel elles tournent, de la version et de la configuration du serveur ou encore d'autres facteurs. Certaines de ces variables ne seront pas accessibles lorsque PHP fonctionne en ligne de commande. Pour une liste de ces variables, lisez la section sur les variables réservées prédéfinies.
Depuis la version PHP 4.2.0, la valeur par défaut de la directive PHP register_globals est off. Ceci est une évolution majeure de PHP. Avoir la directive register_globals à off affecte les variables pré-définies du contexte global. Par exemple, pour lire DOCUMENT_ROOT vous devez utiliser $_SERVER['DOCUMENT_ROOT'] au lieu de $DOCUMENT_ROOT ou bien, il faut lire $_GET['id'] dans l'URL http://www.example.com/test.php?id=3 au lieu de $id ou encore $_ENV['HOME'] au lieu de $HOME.
Pour des informations liées à cette évolution, lisez la documentation de la directive register_globals , le chapitre sur la sécurité, à propos de l'Utilisation des variables superglobales, ainsi que les annonces de PHP » 4.1.0 et » 4.2.0.
L'utilisation des variables pré-définies de PHP, comme les tableaux superglobaux, est recommandée.
Depuis la version 4.1.0, PHP fournit un jeu de tableaux pré-définis, contenant les variables du serveur (si possible), les variables d'environnement et celle d'entrées. Ces nouveaux tableaux sont un peu particuliers, car ils sont automatiquement globaux : ils sont automatiquement disponibles dans tous les environnements d'exécution. Pour cette raison, ils sont dits 'superglobaux' (il n'y a pas de mécanisme PHP pour créer de telles variables. Les superglobales sont listées ci-dessous. Cependant, pour connaître le détails de leur contenu et une présentation approfondie sur les variables pré-définies PHP et leur nature, reportez-vous à la section variables pré-définies. De plus, vous noterez que les anciennes variables pré-définies ($HTTP_*_VARS) existent toujours. Depuis PHP 5.0.0, les tableaux prédéfinis PHP peuvent être désactivés avec l'option de configuration register_long_arrays.
Note: Variables variables
Les superglobales ne peuvent pas être utilisées comme variables dynamiques dans les fonctions ou les méthodes des classes.
Note:
Même si les superglobales et HTTP_*_VARS peuvent exister en même temps, elles ne sont pas identiques, donc, le changement d'une ne changera pas l'autre.
Si certaines variables de variables_order ne sont pas définies, leur tableau pré-défini PHP correspondant est laissé vide.
La portée d'une variable dépend du contexte dans lequel la variable est définie. Pour la majorité des variables, la portée concerne la totalité d'un script PHP. Mais, lorsque vous définissez une fonction, la portée d'une variable définie dans cette fonction est locale à la fonction. Par exemple :
Exemple #1 Les variables sont locales à la fonction
<?php
$a = 1;
include 'b.inc';
?>
Ici, la variable $a sera accessible dans le script inclus b.inc. Cependant, dans les fonctions définies par l'utilisateur, une nouvelle définition de cette variable sera donnée, limitée à la fonction. Toute variable utilisée dans une fonction est, par définition, locale. Par exemple :
<?php
$a = 1; /* portée globale */
function test()
{
echo $a; /* portée locale */
}
test();
?>
Le script n'affichera rien à l'écran car l'instruction echo utilise la variable locale $a, et celle-ci n'a pas été assignée préalablement dans la fonction. Vous pouvez noter que ce concept diffère un petit peu du langage C dans lequel une variable globale est automatiquement accessible dans les fonctions, à moins d'être redéfinie localement dans la fonction. Cela peut poser des problèmes si vous redéfinissez des variables globales localement. En PHP, une variable globale doit être déclarée à l'intérieur de chaque fonction afin de pouvoir être utilisée dans cette fonction.
Commençons par un exemple avec global :
Exemple #2 Exemple avec global
<?php
$a = 1;
$b = 2;
function somme() {
global $a, $b;
$b = $a + $b;
}
somme();
echo $b;
Le script ci-dessus va afficher la valeur 3. En déclarant globales les variables $a et $b locales de la fonction somme(), toutes les références à ces variables concerneront les variables globales. Il n'y a aucune limite au nombre de variables globales qui peuvent être manipulées par une fonction.
Une deuxième méthode pour accéder aux variables globales est d'utiliser le tableau associatif pré-défini $GLOBALS. Le précédent exemple peut être réécrit de la manière suivante :
Exemple #3 Les variables globales et $GLOBALS
<?php
$a = 1;
$b = 2;
function somme() {
$GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
}
somme();
echo $b;
?>
Le tableau $GLOBALS est un tableau associatif avec le nom des variables globales comme clé et les valeurs des éléments du tableau comme valeur des variables. Notez que $GLOBALS existe dans tous les contextes, car $GLOBALS est un superglobal. Voici un exemple des super globaux :
Exemple #4 Les variables super globales
<?php
function test_global() {
// La plupart des variables pré-définies ne sont pas des "superglobales" et
// requièrent le mot-clé 'global' pour être disponibles dans une fonction.
global $HTTP_POST_VARS;
echo $HTTP_POST_VARS['name'];
// Les superglobales sont accessibles dans tous les contextes
// et ne requièrent pas 'global'. Les superglobales sont disponibles
// depuis PHP 4.1.0 et HTTP_POST_VARS est de plus en plus
// obsolète.
echo $_POST['name'];
}
?>
Note:
L'utilisation du mot clé global à l'extérieur d'une fonction n'est pas une erreur. Il peut être utilisé si le fichier est inclus depuis l'intérieur d'une fonction.
Une autre caractéristique importante de la portée des variables est la notion de variable static. Une variable statique a une portée locale uniquement, mais elle ne perd pas sa valeur lorsque le script appelle la fonction. Prenons l'exemple suivant :
Exemple #5 Les variables statiques
<?php
function test()
{
$a = 0;
echo $a;
$a++;
}
?>
Cette fonction est un peu inutile car à chaque fois qu'elle est appelée, elle initialise $a à 0 et affiche "0". L'incrémentation de la variable ($a++) ne sert pas à grand chose, car dès que la fonction est terminée, la variable $a disparaît. Pour faire une fonction de comptage utile, c'est-à-dire qui ne perdra pas la trace du compteur, la variable $a est déclarée comme une variable statique :
Exemple #6 Les variables statiques (2)
<?php
function test()
{
static $a = 0;
echo $a;
$a++;
}
?>
Maintenant, la variable $a est initialisée uniquement lors du première appel à la fonction et, à chaque fois que la fonction test() est appelée, elle affichera une valeur de $a incrémentée de 1.
Les variables statiques sont essentielles lorsque vous faites des appels récursifs à une fonction. Une fonction récursive est une fonction qui s'appelle elle-même. Il faut faire attention lorsque vous écrivez une fonction récursive car il est facile de faire une boucle infinie. Vous devez vérifier que vous avez bien une condition qui permet de terminer votre récursivité. La fonction suivante compte récursivement jusqu'à 10, en utilisant la variable $count pour savoir quand il faut s'arrêter :
Exemple #7 Les variables statiques et la récursivité
<?php
function test()
{
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
test();
}
$count--;
}
?>
Note:
Les variables statiques doivent être déclarées comme dans l'exemple ci-dessus. Tenter d'assigner des valeurs à ces variables qui sont le résultat d'expressions causera une erreur d'analyse.
Exemple #8 Déclaration de variables statiques
<?php
function foo(){
static $int = 0; // correct
static $int = 1+2; // faux (car c'est une expression)
static $int = sqrt(121); // faux (car c'est aussi une expression)
$int++;
echo $int;
}
?>
Note:
Les déclarations statiques sont résolues au moment de la compilation.
Note:
L'utilisation du mot clé global à l'extérieur d'une fonction n'est pas une erreur. Il peut être utilisé si le fichier est inclus depuis l'intérieur d'une fonction.
Le Zend Engine 1, sur qui repose PHP 4, implémente les options static et global pour les variables, en terme de référence. Par exemple, une vraie variable globale est importée dans un contexte de fonction avec global. Cette commande crée en fait une référence sur la variable globale. Cela peut vous mener à des comportements inattendus, par exemple :
<?php
function test_global_ref() {
global $obj;
$obj = &new stdclass;
}
function test_global_noref() {
global $obj;
$obj = new stdclass;
}
test_global_ref();
var_dump($obj);
test_global_noref();
var_dump($obj);
?>
L'exemple ci-dessus va afficher :
Un comportement similaire s'applique à la commande static. Les références ne sont pas stockées dynamiquement :
<?php
function &get_instance_ref() {
static $obj;
echo 'Objet statique : ';
var_dump($obj);
if (!isset($obj)) {
// Assigne une référence à une variable statique
$obj = &new stdclass;
}
$obj->property++;
return $obj;
}
function &get_instance_noref() {
static $obj;
echo 'Objet statique : ';
var_dump($obj);
if (!isset($obj)) {
// Assigne une objet à une variable statique
$obj = new stdclass;
}
$obj->property++;
return $obj;
}
$obj1 = get_instance_ref();
$still_obj1 = get_instance_ref();
echo "\n";
$obj2 = get_instance_noref();
$still_obj2 = get_instance_noref();
?>
L'exemple ci-dessus va afficher :
Ces exemples illustrent les problèmes rencontrés lors de l'assignation de référence à des variables statiques, qui sont oubliées lorsque vous appelez &get_instance_ref() une seconde fois.
Il est pratique d'avoir parfois des noms de variables qui sont variables. C'est-à-dire un nom de variable qui est affecté et utilisé dynamiquement. Une variable classique est affectée avec l'instruction suivante :
<?php
$a = 'bonjour';
?>
Une variable dynamique prend la valeur d'une variable et l'utilise comme nom d'une autre variable. Dans l'exemple ci-dessous, bonjour peut être utilisé comme le nom d'une variable en utilisant le "$$" précédent la variable. C'est-à-dire :
<?php
$$a = 'monde';
?>
À ce niveau, deux variables ont été définies et stockées dans l'arbre des symboles PHP : $a avec comme valeur "bonjour" et $bonjour avec comme valeur "monde". Alors, l'instruction :
<?php
echo "$a ${$a}";
?>
produira le même affichage que :
<?php
echo "$a $bonjour";
?>
c'est-à-dire : bonjour monde.
Afin de pouvoir utiliser les variables dynamiques avec les tableaux, vous avez à résoudre un problème ambigu. Si vous écrivez $$a[1], l'analyseur a besoin de savoir si vous parler de la variable qui a pour nom $a[1] ou bien si vous voulez l'index [1] de la variable $$a. La syntaxe pour résoudre cette ambiguïté est la suivante : ${$a[1]} pour le premier cas et ${$a}[1] pour le deuxième.
On peut également accéder aux propriétés d'une classe en utilisant les noms des variables. Le nom de la variable sera résolu en utilisant le scope depuis lequel l'appel s'effectue. Par exemple, si vous avez une expression de la forme $foo->$bar, alors le scope local sera examiné pour $bar et sa valeur sera utilisée comme nom pour la propriété de $foo. Ce comportement reste valide si $bar est un tableau.
Exemple #1 Exemple de propriété variable
<?php
class foo {
var $bar = 'I am bar.';
}
$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo $foo->$bar . "\n";
echo $foo->$baz[1] . "\n";
?>
L'exemple ci-dessus va afficher :
Notez que les variables dynamiques ne peuvent pas être utilisées avec les tableaux Superglobaux dans une fonction ou une classe. La variable $this est aussi une variable spéciale qui ne peut être référencée dynamiquement.
Lorsqu'un formulaire est envoyé à un script PHP, toutes les variables du formulaire seront automatiquement disponibles dans le script. Par exemple, considérons le formulaire suivant :
Exemple #1 Exemple avec un formulaire simple
<form action="foo.php" method="post">
Nom : <input type="text" name="username" /><br />
Email: <input type="text" name="email" /><br />
<input type="submit" name="submit" value="Envoie!" />
</form>
Suivant votre configuration particulière et vos préférences, vous avez plusieurs méthodes pour accéder aux variables du formulaires. Voici quelques exemples :
Exemple #2 Accéder simplement à des variables de formulaires POST
<?php
// Disponibles depuis PHP 4.1.0
echo $_POST['username'];
echo $_REQUEST['username'];
import_request_variables('p', 'p_');
echo $p_username;
// Depuis PHP 5.0.0, ce type de variable peut être désactivé
// avec la directive de configuration register_long_arrays.
echo $HTTP_POST_VARS['username'];
// Disponibles si la directive register_globals = on. Depuis
// PHP 4.2.0 la valeur par défaut de cette directive est register_globals = off.
// Utiliser ou présumer cette méthode est découragé.
echo $username;
?>
Utiliser un formulaire de type GET est similaire, hormis le fait que vous deviez utiliser les variables pré-définies de GET à la place. GET s'applique aussi à la QUERY_STRING (les informations disponibles après le '?' dans une URL). De ce fait, par exemple, http://www.example.com/test.php?id=3 contient les données de GET, qui sont accessibles via $_GET['id']. Voyez aussi $_REQUEST et import_request_variables().
Note:
Les tableaux superglobaux, comme $_POST et $_GET sont disponibles depuis PHP 4.1.0.
Note:
Les points et les espaces dans les noms de variables sont convertis en underscores. Par exemple, <input name="a.b" /> deviendra $_REQUEST["a_b"].
Comme nous l'avons déjà dis, avant PHP 4.2.0, la valeur par défaut de register_globals était on. La communauté PHP n'encourage personne à utiliser cette directive et privilégie la valeur off et un code accordé.
Note:
La directive de configuration magic_quotes_gpc affecte les valeurs de GET, POST et cookies. Si elle est activée, une valeur comme celle de (C'est "PHP!") sera magiquement transformée en (C\'est \"PHP!\"). La protection des caractères est nécessaire pour l'insertion dans les bases de données. Voyez aussi les fonctions addslashes(), stripslashes() et magic_quotes_sybase.
PHP comprend aussi les tableaux dans le contexte des formulaires. (voir aussi la FAQ). Vous pouvez, par exemple, grouper des variables ensemble ou bien utiliser cette fonctionnalité pour lire des valeurs multiples d'un menu déroulant. Par exemple, voici un formulaire qui se poste lui-même des données, et les affiche :
Exemple #3 Variables de formulaires complexes
<?php
if ($_POST) {
echo '<pre>';
echo htmlspecialchars(print_r($_POST, true));
echo '</pre>';
}
?>
<form action="" method="post">
Name: <input type="text" name="personal[name]" /><br />
Email: <input type="text" name="personal[email]" /><br />
Beer: <br />
<select multiple name="beer[]">
<option value="warthog">Warthog</option>
<option value="guinness">Guinness</option>
<option value="stuttgarter">Stuttgarter Schwabenbräu</option>
</select><br />
<input type="submit" value="Validez moi !" />
</form>
Lors de la soumission d'un formulaire, il est possible d'utiliser une image au lieu d'un bouton standard, comme ceci :
<input type="image" src="image.gif" name="sub" />
Lorsque l'utilisateur clique sur cette image, le formulaire associé est envoyé au serveur, avec deux données supplémentaires, sub_x et sub_y. Elles contiennent les coordonnées du clic de l'utilisateur dans l'image. Vous noterez que ces variables sont envoyées par le navigateur avec un point dans leur nom, mais PHP convertit ces points en soulignés.
PHP supporte les cookies HTTP de manière totalement transparente, comme défini dans la » RFC 6265. Les cookies sont un mécanisme permettant de stocker des données sur la machine cliente à des fins d'identification de l'utilisateur. Vous pouvez établir un cookie grâce à la fonction setcookie(). Les cookies font partie intégrante des en-têtes HTTP et donc la fonction setcookie() doit être appelée avant que le moindre affichage ne soit envoyé au navigateur. C'est la même restriction que pour la fonction header(). Les données contenus dans les cookies sont alors disponibles dans les tableaux de cookies appropriés, comme $_COOKIE, $HTTP_COOKIE_VARS mais aussi $_REQUEST. Lisez la page de la documentation sur la fonction setcookie() pour plus de détails ainsi que des exemples.
Si vous souhaitez assigner plusieurs valeurs à un seul cookie, il devait l'assigner sous forme de tableau. Par exemple :
<?php
setcookie("MyCookie[foo]", 'Test 1', time()+3600);
setcookie("MyCookie[bar]", 'Test 2', time()+3600);
?>
Cela va créer deux cookies distincts bien que MyCookie est maintenant un simple tableau dans votre script. Si vous voulez définir seulement un cookie avec plusieurs valeurs, utilisez la fonction serialize() ou explode() sur la première valeur.
Il est à noter qu'un cookie remplace le cookie précédent par un cookie de même nom tant que le chemin ou le domaine sont identiques. Donc, pour une application de panier, vous devez implémenter un compteur et l'incrémenter au fur et à mesure. C'est-à-dire :
Exemple #4 Exemple avec setcookie()
<?php
if (isset($_COOKIE['compte'])) {
$compte = $_COOKIE['compte'] + 1;
} else {
$compte = 1;
}
setcookie('Panier', $compte, time()+3600);
setcookie("Panier[$compte]", $item, time()+3600);
?>
Typiquement, PHP ne modifie pas les noms des variables lorsqu'elles sont passées à un script. Cependant, il faut noter que les points (.) ne sont pas autorisés dans les noms de variables PHP. Pour cette raison, jetez un oeil sur :
<?php
$varname.ext; /* nom de variable invalide */
?>
Pour cette raison, il est important de noter que PHP remplacera automatiquement les points des noms de variables entrantes par des soulignés.
Parce que PHP détermine le type des variables et les convertit (généralement) comme il faut, ce n'est pas toujours le type de variable que vous souhaitez. PHP inclut des fonctions permettant de déterminer le type d'une variable : gettype(), is_array(), is_float(), is_int(), is_object() et is_string(). Lisez également le chapitre sur les types.
Une constante est un identifiant (un nom) qui représente une valeur simple. Comme son nom le suggère, cette valeur ne peut jamais être modifiée durant l'exécution du script (sauf les constantes magiques). Par défaut, le nom d'une constante est sensible à la casse. Par convention, les constantes sont toujours en majuscules.
Les noms de constantes suivent les mêmes règles que n'importe quel nom en PHP. Un nom de constante valide commence par une lettre ou un souligné, suivi d'un nombre quelconque de lettres, chiffres ou soulignés. Sous forme d'expression régulière, cela peut s'exprimer comme ceci : [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*
Vous pourriez également avoir besoin de jeter un oeil sur Guide de nommage de l'espace utilisateur.
Exemple #1 Noms valides et invalides pour les constantes
<?php
// Noms valides
define("FOO", "something");
define("FOO2", "something else");
define("FOO_BAR", "something more");
// Noms invalides
define("2FOO", "something");
// Ce nom est valide, mais évitez-le:
// PHP peut un jour fournir une constante magique nommée
// ainsi, ce qui va corrompre vos scripts.
define("__FOO__", "something");
?>
Note: Dans cette documentation, une lettre peut être un des caractères suivants : de a à z, de A à Z et tous les caractères ASCII de 127 à 255 (0x7f-0xff).
Tout comme les superglobals, les constantes sont accessibles de manière globale. Vous pouvez les définir n'importe où, et y accéder depuis n'importe quelle fonction. Pour plus d'informations sur le contexte, lisez la section du manuel sur la portée des variables.
Vous pouvez définir une constante en utilisant la fonction define() ou en utilisant le mot-clé const en dehors d'une définition de classe à partir de PHP 5.3.0. Une fois qu'une constante est définie, elle ne peut jamais être modifiée, ou détruite.
Seuls les types de données scalaires peuvent être placés dans une constante : c'est à dire les types booléen, entier, double et chaîne de caractères (soit bool, entier, double et string.) Il est possible de définir des constantes en tant que resource, mais cet usage est déconseillé, car il peut mener à des résultats inattendus.
Vous pouvez accéder à la valeur d'une constante en spécifiant simplement son nom. Contrairement aux variables, vous ne devez PAS préfixer le nom de la constante avec $. Vous pouvez aussi utiliser la fonction constant(), pour lire dynamiquement la valeur d'une constante, dont vous obtenez le nom dynamiquement (retour de fonction, par exemple). Utilisez la fonction get_defined_constants() pour connaître la liste de toutes les constantes définies.
Note: Les constantes et les variables globales utilisent deux espaces de noms différents. Ce qui implique que
TRUEet $TRUE sont généralement différents (en tous cas, ils peuvent avoir des valeurs différentes).
Si vous utilisez une constante non définie, PHP considère que vous souhaitez uniquement le nom de la constante elle-même, comme si vous l'appeliez comme étant une chaîne de caractères (CONSTANT vs "CONSTANT"). Une alerte de type E_NOTICE sera émise lorsque ce cas se produit. Lisez également l'entrée du manuel qui explique pourquoi $foo[bar] est faux (tant que vous ne définissez pas bar comme étant une constante). Si vous voulez simplement vérifier qu'une constante est définie, utilisez la fonction defined().
Il y a des différences entre les constantes et les variables :
Exemple #1 Définir une constante
<?php
define("CONSTANTE", "Bonjour le monde.");
echo CONSTANTE; // affiche "Bonjour le monde."
echo Constante; // affiche "Constante" et une notice.
?>
Exemple #2 Définir des constantes en utilisant le mot-clé const
<?php
// Fonctionne depuis PHP 5.3.0.
const CONSTANT = 'Hello World';
echo CONSTANT;
?>
Note:
Contrairement aux constantes définies en utilisant l'instruction define(), les constantes définies en utilisant le mot-clé const doivent être déclarées au plus haut niveau du contexte, car elles seront définies au moment de la compilation. Cela signifie qu'elles ne peuvent être déclarées à l'intérieur de fonctions, boucles ou instructions if.
Voir aussi les constantes de classe.
PHP fournit un grand nombre de constantes magiques. Certaines constantes sont définies par différentes extensions, et ne seront présentes que si ces extensions sont compilées avec PHP, ou bien si l'extension a été chargée dynamiquement.
Il y a huit constantes magiques qui changent suivant l'emplacement où
elles sont utilisées.
Par exemple, la valeur de __LINE__ dépend
de la ligne où vous l'utilisez dans votre script.
Ces constantes spéciales sont insensibles à la casse.
| Nom | Description |
|---|---|
__LINE__ |
La ligne courante dans le fichier. |
__FILE__ |
Le chemin complet et le nom du fichier courant. Si utilisé pour une
inclusion, le nom du fichier inclus est retourné.
__FILE__ contient toujours le chemin absolu
pour les liens symboliques.
|
__DIR__ |
Le dossier du fichier. Si utilisé dans une inclusion, le dossier du fichier inclus sera retourné. C'est l'équivalent de dirname(__FILE__). Ce nom de dossier ne contiendra pas de slash final, sauf si c'est le dossier racine. (Ajouté en PHP 5.3.0.) |
__FUNCTION__ |
Le nom de la fonction. Cette constante retourne le nom de la fonction comme il a été déclaré (sensible à la casse). |
__CLASS__ |
Le nom de la classe courante. Cette constante retourne le nom de la classe comme il a été déclaré (sensible à la casse). Le nom de la classe contient l'espace de nom dans lequel cette classe a été déclarée (i.e. Foo\Bar). Notez que depuis PHP 5.4, __CLASS__ fonctionne aussi en Traits. Lorsqu'une méthode Trait est utilisée, __CLASS__ est le nom de la classe que Trait utilise en interne. |
__TRAIT__ |
Le nom Trait (Ajouté en PHP 5.4.0). Depuis PHP 5.4, cette constante retourne le Trait comme il a été déclaré (sensible à la casse). Le nom Trait inclut l'espace de nom dans lequel il a été déclaré (e.g. Foo\Bar). |
__METHOD__ |
Le nom de la méthode courante. Le nom de la méthode est retourné comme il a été déclaré (sensible à la casse). |
__NAMESPACE__ |
Le nom de l'espace de noms courant (sensible à la casse). Cette constante est définie au moment de la compilation (Ajouté en PHP 5.3.0). |
Voir aussi get_class(), get_object_vars(), file_exists() et function_exists().
Les expressions sont la partie la plus importante de PHP. En PHP, presque tout ce que vous écrivez est une expression. La manière la plus simple de définir une expression est : "tout ce qui a une valeur".
Les formes les plus simples d'expressions sont les constantes et les variables. Lorsque vous écrivez "$a = 5", vous assignez la valeur '5' à la variable $a. Bien évidemment, '5' vaut 5 ou, en d'autres termes, '5' est une expression avec pour valeur 5 (dans ce cas, '5' est un entier constant).
Après cette assignation, vous pouvez considérer que $a a pour valeur 5 et donc, écrire $b = $a, revient à écrire $b = 5. En d'autres termes, $a est une expression avec une valeur de 5. Si tout fonctionne correctement, c'est exactement ce qui arrive.
Un exemple plus complexe concerne les fonctions. Par exemple, considérons la fonction suivante :
<?php
function foo ()
{
return 5;
}
?>
En supposant que vous êtes familiers avec le concept de fonction, (si ce n'est pas le cas, jetez un oeil au chapitre concernant les fonctions), vous serez d'accord que $c = foo() est équivalent à $c = 5, et vous aurez tout à fait raison. Les fonctions sont des expressions qui ont la valeur de leur "valeur de retour". Si foo() renvoie 5, la valeur de l'expression 'foo()' est 5. Habituellement, les fonctions ne font pas que renvoyer une valeur constante mais réalisent des traitements.
Bien sûr, les valeurs en PHP n'ont pas à être des valeurs numériques, comme c'est souvent le cas. PHP supporte quatre types de variables scalaires : les valeurs entières (entier), les nombres à virgule flottante (float), les chaînes de caractères (chaîne de caractères) et les booléens (boolean). (une variable scalaire est une variable que vous ne pouvez pas scinder en morceaux, au contraire des tableaux par exemple). PHP supporte aussi deux types composés : les tableaux et les objets. Chacun de ces types de variables peut être affecté ou renvoyé par une fonction.
PHP va plus loin dans la gestion des expressions, comme le font d'autres langages. PHP est un langage orienté expression, dans le sens où presque tout est une expression. Considérons l'exemple dont nous avons déjà parlé, '$a = 5'. Il est facile de voir qu'il y a deux valeurs qui entrent en jeu ici, la valeur numérique constante '5' et la valeur de la variable $a qui est mise à jour à la valeur 5. Mais, la vérité est qu'il y a une autre valeur qui entre en jeu ici et c'est la valeur de l'assignation elle-même. L'assignation elle-même est assignée à une valeur, dans ce cas-là 5. En pratique, cela signifie que '$a = 5' est une expression qui a pour valeur 5. Donc, écrire '$b = ($a = 5)' revient à écrire '$a = 5; $b = 5;' (un point virgule marque la fin d'une instruction). Comme les assignations sont analysées de droite à gauche, vous pouvez aussi bien écrire '$b = $a = 5'.
Un autre bon exemple du langage orienté expression est la pre-incrémentation et la post-incrémentation, (ainsi que la décrémentation). Les utilisateurs de PHP et ceux de nombreux autres langages sont habitués à la notation "variable++" et "variable--". Ce sont les opérateurs d'incrémentation et de décrémentation. PHP ajoute les possibilités d'incrémentation et de décrémentation comme c'est le cas dans le langage C. En PHP, comme en C, il y a deux types d'opérateurs d'incrémentation (pre-incrémentation et post-incrémentation). Les deux types d'opérateur d'incrémentation jouent le même rôle (c'est-à-dire qu'ils incrémentent la variable). La différence vient de la valeur de l'opérateur d'incrémentation. L'opérateur de pre-incrémentation, qui s'écrit '++$variable', évalue la valeur incrémentée (PHP incrémente la variable avant de lire la valeur de cette variable, d'où le nom de pre-incrémentation). L'opérateur de post-incrémentation, qui s'écrit '$variable++', évalue la valeur de la variable avant de l'incrémenter (PHP incrémente la variable après avoir lu sa valeur, d'où le nom de post-incrémentation).
Un type d'expression très commun est l'expression de comparaison. Ces
expressions sont évaluées à 0 ou 1, autrement dit FALSE ou TRUE,
respectivement. PHP supporte les opérateurs de comparaison > (plus
grand que), => (plus grand ou égal), == (égal à), < (plus petit que),
<= (plus petit ou égal). Ces expressions sont
utilisées de manière courante dans les instructions conditionnelles, comme
l'instruction if.
Pour le dernier exemple d'expression, nous allons parler des combinaisons d'opérateurs/assignation. Vous savez que si vous voulez incrémenter la variable $a d'une unité, vous devez simplement écrire '$a++' ou '++$a'. Mais si vous voulez ajouter la valeur '3' à votre variable ? Vous pouvez écrire plusieurs fois '$a++', mais ce n'est pas la meilleure des méthodes. Un pratique plus courante est d'écrire '$a = $a + 3'. L'expression '$a + 3' correspond à la valeur $a plus 3, et est de nouveau assignée à la variable $a. Donc, le résultat est l'incrémentation de 3 unités de la variable $a. En PHP, comme dans de nombreux autres langages comme le C, vous pouvez écrire cela de manière plus concise, manière qui avec le temps se révélera plus claire et plus rapide à comprendre. Ajouter 3 à la valeur de la variable $a peut s'écrire '$a += 3'. Cela signifie précisément : "on prend la valeur de la variable $a, on ajoute la valeur 3 et on assigne cette valeur à la variable $a". Et pour être plus concis et plus clair, cette expression est plus rapide. La valeur de l'expression '$a += 3', comme l'assignation d'une valeur quelconque, est la valeur assignée. Il est à noter que ce n'est pas 3 mais la combinaison de la valeur de la variable $a plus la valeur 3. (c'est la valeur qui est assignée à la variable $a). N'importe quel opérateur binaire peut utiliser ce type d'assignation, par exemple '$a -= 5' (soustraction de 5 de la valeur de la variable $a), '$b *= 7' (multiplication de la valeur de la variable $b par 7).
Il y a une autre expression qui peut paraître complexe si vous ne l'avez pas vue dans d'autres langages, l'opérateur conditionnel ternaire :
<?php
$first ? $second : $third
?>
Si la valeur de la première sous-expression est vraie (TRUE)
(différente de 0), alors la deuxième sous-expression est
évaluée et constitue le résultat de l'expression
conditionnelle. Sinon, c'est la troisième sous-expression qui est
évaluée et qui constitue le résultat de l'expression.
Les exemples suivants devraient vous permettre de mieux comprendre la pre-incrémentation, la post-incrémentation et le concept des expressions en général :
<?php
function double($i)
{
return $i*2;
}
$b = $a = 5; /* Assigne la valeur 5 aux variables $a et $b */
$c = $a++; /* Post-incrémentation de la variable $a et assignation de
la valeur à la variable $c */
$e = $d = ++$b; /* Pre-incrémentation, et assignation de la valeur aux
variables $d et $e */
/* à ce niveau, les variables $d et $e sont égales à 6 */
$f = double($d++); /* assignation du double de la valeur de $d à la variable $f ($f vaut 12),
puis incrémentation de la valeur de $d */
$g = double(++$e); /* assigne deux fois la valeur de $e après
incrémentation, 2*7 = 14 to $g */
$h = $g += 10; /* Tout d'abord, $g est incrémentée de 10, et donc $g vaut 24.
Ensuite, la valeur de $g, (24) est assignée à la variable $h,
qui vaut donc elle aussi 24. */
?>
Au début de ce chapitre, nous avons dit que nous allions décrire les différents types d'instructions, et donc, comme promis, nous allons voir que les expressions peuvent être des instructions. Mais attention, toutes les expressions ne sont pas des instructions. Dans ce cas-là, une instruction est de la forme 'expr ;', c'est-à-dire, une expression suivie par un point-virgule. L'expression '$b = $a = 5;', '$a = 5' est valide, mais ce n'est pas une instruction en elle-même. '$b = $a = 5;' est une instruction valide.
La dernière chose qui mérite d'être mentionnée est
la véritable valeur des expressions. Lorsque vous faites des tests
sur une variable, dans une boucle conditionnelle par exemple, cela ne vous
intéresse pas de savoir quelle est la valeur exacte de l'expression.
Mais vous voulez seulement savoir si le résultat signifie TRUE ou FALSE
Les constantes TRUE et FALSE (insensible à la casse) sont les deux
valeurs possibles pour un booléen. Lorsque nécessaire, une expression
est automatiquement convertie en booléen. Lisez la
section sur le transtypage
pour plus de détails.
PHP propose une implémentation complète et détaillée des expressions. PHP documente toutes ses expressions dans le manuel que vous êtes en train de lire. Les exemples qui vont suivre devraient vous donner une bonne idée de ce qu'est une expression et comment construire vos propres expressions. Dans tout ce qui va suivre, nous écrirons expr pour indiquer toute expression PHP valide.
Un opérateur est quelque chose qui prend une ou plusieurs valeurs (ou expressions, dans le jargon de la programmation) et qui retourne une autre valeur (donc la construction elle-même devient une expression).
Les opérateurs peuvent être regroupés en fonction du nombre de valeurs qu'ils acceptent. L'opérateur unaire n'opère que sur une seule valeur, par exemple ! (l'opérateur de négation) ou ++ (l'opérateur d'incrémentation). Le second type, les opérateurs binaires (comme le très célèbre opérateur mathématique + ou -) contient la plupart des opérateurs supportés par PHP. Enfin, l'opérateur ternaire, ? :, qui accepte trois valeurs (on peut aussi l'appeler l'opérateur conditionnel).
Une liste complète des opérateurs se trouve dans la section précédence des opérateurs. Cette section explique aussi la précédence des opérateurs et l'associativité, c'est à dire les priorités d'exécution des opérateurs.
La priorité des opérateurs spécifie l'ordre dans lequel les valeurs doivent être analysées. Par exemple, dans l'expression 1 + 5 * 3, le résultat est 16 et non 18, car la multiplication ("*") a une priorité supérieure par rapport à l'addition ("+"). Des parenthèses peuvent être utilisées pour forcer la priorité, si nécessaire. Par exemple : (1 + 5) * 3 donnera 18.
Lorsque les opérateurs ont une précédence équivalente, c'est leur associativité qui détermine s'ils sont évalués de droite à gauche ou inversement. Voyez les exemples ci-après.
Le tableau qui suit liste les opérateurs par ordre de précédence, avec la précédence la plus élevée en haut. Les opérateurs sur la même ligne ont une précédence équivalente (donc l'associativité décide de l'ordre de leur évaluation).
| Associativité | Opérateurs | Information additionnelle |
|---|---|---|
| non-associative | clone new | clone et new |
| gauche | [ | array() |
| non-associatif | ++ -- | incrémentation/décrémentation |
| droite | ~ - (int) (float) (string) (array) (object) (bool) @ | types |
| non-associatif | instanceof | types |
| droite | ! | logique |
| gauche | * / % | arithmétique |
| gauche | + - . | arithmétique et chaîne de caractères |
| gauche | << >> | bitwise |
| non-associatif | < <= > >= <> | comparaison |
| non-associatif | == != === !== | comparaison |
| gauche | & | bitwise et références |
| gauche | ^ | bitwise |
| gauche | | | bitwise |
| gauche | && | logique |
| gauche | || | logique |
| gauche | ? : | ternaire |
| droite | = += -= *= /= .= %= &= |= ^= <<= >>= => | assignation |
| gauche | and | logique |
| gauche | xor | logique |
| gauche | or | logique |
| gauche | , | plusieurs utilisations |
Pour les opérateurs à précédence égale, l'associativité de gauche signifie que l'expression est évaluée de gauche à droite, l'associativité de droite, l'inverse.
Exemple #1 Associativité
<?php
$a = 3 * 3 % 5; // (3 * 3) % 5 = 4
$a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2
$a = 1;
$b = 2;
$a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5
// Le fait de mélanger ++ et + produit un comportement indéfini
$a = 1;
echo ++$a + $a++; // peut afficher 4 ou 5
?>
Note:
Bien que = soit prioritaire sur la plupart des opérateurs, PHP va tout de même exécuter des expressions comme : if (!$a = foo()). Dans cette situation, le résultat de foo() sera placé dans la variable $a.
Vous rappelez-vous des opérations élémentaires apprises à l'école ? Les opérateurs arithmétiques fonctionnent comme elles.
| Exemple | Nom | Résultat |
|---|---|---|
| -$a | Négation | Opposé de $a. |
| $a + $b | Addition | Somme de $a et $b. |
| $a - $b | Soustraction | Différence de $a et $b. |
| $a * $b | Multiplication | Produit de $a et $b. |
| $a / $b | Division | Quotient de $a et $b. |
| $a % $b | Modulo | Reste de $a divisé par $b. |
L'opérateur de division ("/") retourne une valeur à virgule flottante sauf si les 2 opérandes sont des entiers (ou une chaîne de caractères qui a été convertie en entiers) et cette valeur est toujours divisible, auquel cas une valeur entière sera retournée.
Les opérandes du modulo sont converties en entiers (en supprimant la partie décimale) avant exécution.
Le résultat de l'opération modulo % a le même signe que le premier opérande, ansi le résultat de $a % $b aura le signe de $a. Par exemple:
<?php
echo (5 % 3)."\n"; // affiche 2
echo (5 % -3)."\n"; // affiche 2
echo (-5 % 3)."\n"; // affiche -2
echo (-5 % -3)."\n"; // affiche -2
?>
Voir aussi le manuel sur les fonctions mathématiques.
L'opérateur d'assignation le plus simple est le signe "=". Le premier réflexe est de penser que ce signe veut dire "égal à". Ce n'est pas le cas. Il signifie que l'opérande de gauche se voit affecter la valeur de l'expression qui est à droite du signe égal.
La valeur d'une expression d'assignation est la valeur assignée. Par exemple, la valeur de l'expression '$a = 3' est la valeur 3. Cela permet d'utiliser des astuces telles que :
<?php
$a = ($b = 4) + 5;
// $a est maintenant égal à 9, et $b vaut 4.
?>
Pour les arrays, assigner une valeur à une clé donnée est effectué au moyen de l'opérateur "=>". La précédence de cet opérateur est la même que celle des opérateurs d'assignation.
En plus du simple opérateur d'assignation, il existe des "opérateurs combinés" pour tous les opérateurs arithmétiques, l'union de tableaux et pour les opérateurs sur les chaînes de caractères. Cela permet d'utiliser la valeur d'une variable dans une expression et d'affecter le résultat de cette expression à cette variable. Par exemple :
<?php
$a = 3;
$a += 5; // affecte la valeur 8 à la variable $a correspond à l'instruction '$a = $a + 5';
$b = "Bonjour ";
$b .= " tout le monde!"; // affecte la valeur "Bonjour tout le monde!" à
// la variable $b
// identique à $b = $b." tout le monde!";
?>
On peut noter que l'assignation copie le contenu de la variable originale dans la nouvelle variable (assignation par valeur), ce qui fait que les changements de valeur d'une variable ne modifieront pas la valeur de l'autre. Cela peut se révéler important lors de la copie d'un grand tableau durant une boucle.
Une exception au comportement d'assignation par valeur en PHP est le type object, ceux-ci sont assignés par référence dans PHP 5. La copie d'objet doit être explicitement demandée grâce au mot-clé clone.
L'assignation par référence est aussi supportée, au moyen de la syntaxe "$var = &$othervar;". L'assignation par référence signifie que les deux variables pointent vers le même conteneur de donnée, rien n'est copié nul part.
Exemple #1 Assignation par référence
<?php
$a = 3;
$b = &$a; // $b est une référence à $a
print "$a\n"; // affiche 3
print "$b\n"; // affiche 3
$a = 4; // change $a
print "$a\n"; // affiche 4
print "$b\n"; // affiche 4 aussi, car $b est une référence à $a, qui a été
// changée
?>
Depuis PHP 5, l'opérateur new
retourne une référence automatiquement, donc assigner le résultat de
new par référence retournera une
erreur E_DEPRECATED depuis PHP 5.3, et une erreur de niveau
E_STRICT avant PHP 5.3.
Par exemple, ce code génère un message d'erreur:
<?php
class C {}
/* La ligne suivante génère une erreur dont le message est:
* Deprecated: Assigning the return value of new by reference is deprecated in...
*/
$o = &new C;
?>
Plus d'informations sur le références et leurs utilisations possibles peuvent être trouvées dans la section du manuel Les références expliquées.
Les opérateurs sur les bits vous permettent de manipuler les bits dans un entier.
| Exemple | Nom | Résultat |
|---|---|---|
$a & $b |
And (Et) | Les bits positionnés à 1 dans $a ET dans $b sont positionnés à 1. |
$a | $b |
Or (Ou) | Les bits positionnés à 1 dans $a OU $b sont positionnés à 1. |
$a ^ $b |
Xor (ou exclusif) | Les bits positionnés à 1 dans $a OU dans $b mais pas dans les deux sont positionnés à 1. |
~ $a |
Not (Non) | Les bits qui sont positionnés à 1 dans $a sont positionnés à 0, et vice-versa. |
$a << $b |
Décalage à gauche | Décale les bits de $a, $b fois sur la gauche (chaque décalage équivaut à une multiplication par 2). |
$a >> $b |
Décalage à droite | Décalage les bits de $a, $b fois par la droite (chaque décalage équivaut à une division par 2). |
Le décalage de bits en PHP est arithmétique. Les bits qui sont décalés hors de l'entier sont perdus. Les décalages à gauche font apparaître des zéros à droite, tandis que le bit de signe est décalé à gauche, ce qui signifie que le signe de l'entier n'est pas préservé. Les décalages à droite décalent aussi le bit de signe sur la droite, ce qui signifie que le signe est préservé.
Utilisez des parenthèses pour vous assurer que la précédence voulue est bien appliquée. Par exemple, $a & $b == true applique d'abord l'égalité, et ensuite le ET logique, alors que ($a & $b) == true applique d'abord le ET logique, puis l'égalité.
Prenez garde aux transtypages. Si les deux paramètres, de chaque coté de l'opérateur, sont des chaînes, l'opérateur de bit va opérer sur les valeurs ASCII des chaînes.
Le rapport d'erreur de PHP utilise des champs de bits,
qui sont une illustration de l'extinction des bits.
Pour afficher les erreurs, sauf les notices, les
instructions du php.ini sont :
E_ALL & ~E_NOTICE
Cela se comprend en comparant avec E_ALL :
00000000000000000111011111111111
Puis en éteignant la valeur de E_NOTICE...
00000000000000000000000000001000
... et en l'inversant via ~:
11111111111111111111111111110111
Finalement, on utilise le ET logique (&) pour lire les bits activés
dans les deux valeurs :
00000000000000000111011111110111
Un autre moyen d'arriver à ce résultat est d'utiliser
le OU exclusif (^), qui cherche
les bits qui ne sont activés que dans l'une ou l'autre des
valeurs, exclusivement :
E_ALL ^ E_NOTICE
error_reporting peut aussi être utilisé pour
illustrer l'activation de bits. Pour afficher
uniquement les erreurs et les erreurs recouvrables,
on utilise :
E_ERROR | E_RECOVERABLE_ERROR
Cette approche combine E_ERROR
00000000000000000000000000000001
et E_RECOVERABLE_ERROR
00000000000000000001000000000000
Avec l'opérateur OR (|) pour s'assurer que
les bits sont activés dans l'une ou l'autre valeur :
00000000000000000001000000000001
Exemple #1 Opérations sur les bits et les entiers
<?php
/*
* Ignorez cette partie,
* c'est juste du formatage pour clarifier les résultats
*/
$format = '(%1$2d = %1$04b) = (%2$2d = %2$04b)'
. ' %3$s (%4$2d = %4$04b)' . "\n";
echo <<<EOH
--------- --------- -- ---------
resultat valeur test
--------- --------- -- ---------
EOH;
/*
* Voici les exemples
*/
$values = array(0, 1, 2, 4, 8);
$test = 1 + 4;
echo "\n Bitwise AND \n";
foreach ($values as $value) {
$result = $value & $test;
printf($format, $result, $value, '&', $test);
}
echo "\n Bitwise Inclusive OR \n";
foreach ($values as $value) {
$result = $value | $test;
printf($format, $result, $value, '|', $test);
}
echo "\n Bitwise Exclusive OR (XOR) \n";
foreach ($values as $value) {
$result = $value ^ $test;
printf($format, $result, $value, '^', $test);
}
?>
L'exemple ci-dessus va afficher :
--------- --------- -- --------- resultat valeur test --------- --------- -- --------- Bitwise AND ( 0 = 0000) = ( 0 = 0000) & ( 5 = 0101) ( 1 = 0001) = ( 1 = 0001) & ( 5 = 0101) ( 0 = 0000) = ( 2 = 0010) & ( 5 = 0101) ( 4 = 0100) = ( 4 = 0100) & ( 5 = 0101) ( 0 = 0000) = ( 8 = 1000) & ( 5 = 0101) Bitwise Inclusive OR ( 5 = 0101) = ( 0 = 0000) | ( 5 = 0101) ( 5 = 0101) = ( 1 = 0001) | ( 5 = 0101) ( 7 = 0111) = ( 2 = 0010) | ( 5 = 0101) ( 5 = 0101) = ( 4 = 0100) | ( 5 = 0101) (13 = 1101) = ( 8 = 1000) | ( 5 = 0101) Bitwise Exclusive OR (XOR) ( 5 = 0101) = ( 0 = 0000) ^ ( 5 = 0101) ( 4 = 0100) = ( 1 = 0001) ^ ( 5 = 0101) ( 7 = 0111) = ( 2 = 0010) ^ ( 5 = 0101) ( 1 = 0001) = ( 4 = 0100) ^ ( 5 = 0101) (13 = 1101) = ( 8 = 1000) ^ ( 5 = 0101)
Exemple #2 Opération sur les bits et les chaînes
<?php
echo 12 ^ 9; // Affiche '5'
echo "12" ^ "9"; // Affiche le caractère d'effacement (ascii 8)
// ('1' (ascii 49)) ^ ('9' (ascii 57)) = #8
echo "hallo" ^ "hello"; // Affiche les valeurs ASCII #0 #4 #0 #0 #0
// 'a' ^ 'e' = #4
echo 2 ^ "3"; // Affiche 1
// 2 ^ ((int)"3") == 1
echo "2" ^ 3; // Affiche 1
// ((int)"2") ^ 3 == 1
?>
Exemple #3 Décalage de bits sur les entiers
<?php
/*
* Voici quelques exemples
*/
echo "\n--- Décalages à droite sur des entiers positifs ---\n";
$val = 4;
$places = 1;
$res = $val >> $places;
p($res, $val, '>>', $places, 'copie du bit de signe maintenant à gauche');
$val = 4;
$places = 2;
$res = $val >> $places;
p($res, $val, '>>', $places);
$val = 4;
$places = 3;
$res = $val >> $places;
p($res, $val, '>>', $places, 'des bits sont sortis par la droite');
$val = 4;
$places = 4;
$res = $val >> $places;
p($res, $val, '>>', $places, 'même résultat que ci-dessus : pas de décalage au dela de 0');
echo "\n--- Décalages à droite sur des entiers négatifs ---\n";
$val = -4;
$places = 1;
$res = $val >> $places;
p($res, $val, '>>', $places, 'copie du bit de signe maintenant à gauche');
$val = -4;
$places = 2;
$res = $val >> $places;
p($res, $val, '>>', $places, 'des bits sont sortis par la droite');
$val = -4;
$places = 3;
$res = $val >> $places;
p($res, $val, '>>', $places, 'même résultat que ci-dessus : pas de décalage au dela de -1');
echo "\n--- Décalages à gauche sur des entiers positifs ---\n";
$val = 4;
$places = 1;
$res = $val << $places;
p($res, $val, '<<', $places, 'complément de zéros à droite');
$val = 4;
$places = (PHP_INT_SIZE * 8) - 4;
$res = $val << $places;
p($res, $val, '<<', $places);
$val = 4;
$places = (PHP_INT_SIZE * 8) - 3;
$res = $val << $places;
p($res, $val, '<<', $places, 'le bit de signe est sorti');
$val = 4;
$places = (PHP_INT_SIZE * 8) - 2;
$res = $val << $places;
p($res, $val, '<<', $places, 'des bits sont sortis à gauche');
echo "\n--- Décalages à gauche sur des entiers négatifs ---\n";
$val = -4;
$places = 1;
$res = $val << $places;
p($res, $val, '<<', $places, 'complément de zéros à droite');
$val = -4;
$places = (PHP_INT_SIZE * 8) - 3;
$res = $val << $places;
p($res, $val, '<<', $places);
$val = -4;
$places = (PHP_INT_SIZE * 8) - 2;
$res = $val << $places;
p($res, $val, '<<', $places, 'des bits sont sortis à gauche, y compris le bit de signe');
/*
* Ignorez cette section
* Elle contient du code pour le formatage de cet exemple
*/
function p($res, $val, $op, $places, $note = '') {
$format = '%0' . (PHP_INT_SIZE * 8) . "b\n";
printf("Expression : %d = %d %s %d\n", $res, $val, $op, $places);
echo " Décimal :\n";
printf(" val=%d\n", $val);
printf(" res=%d\n", $res);
echo " Binaire :\n";
printf(' val=' . $format, $val);
printf(' res=' . $format, $res);
if ($note) {
echo " Note : $note\n";
}
echo "\n";
}
?>
Résultat de l'exemple ci-dessus sur une machine 32 bits :
--- Décalages à droite sur des entiers positifs --- Expression : 2 = 4 >> 1 Décimal : val=4 res=2 Binaire : val=00000000000000000000000000000100 res=00000000000000000000000000000010 Note : copie du bit de signe maintenant à gauche Expression : 1 = 4 >> 2 Décimal : val=4 res=1 Binaire : val=00000000000000000000000000000100 res=00000000000000000000000000000001 Expression : 0 = 4 >> 3 Décimal : val=4 res=0 Binaire : val=00000000000000000000000000000100 res=00000000000000000000000000000000 Note : des bits sont sortis par la droite Expression : 0 = 4 >> 4 Décimal : val=4 res=0 Binaire : val=00000000000000000000000000000100 res=00000000000000000000000000000000 Note : même résultat que ci-dessus : pas de décalage au dela de 0 --- Décalages à droite sur des entiers négatifs --- Expression : -2 = -4 >> 1 Décimal : val=-4 res=-2 Binaire : val=11111111111111111111111111111100 res=11111111111111111111111111111110 Note : copie du bit de signe à gauche Expression : -1 = -4 >> 2 Décimal : val=-4 res=-1 Binaire : val=11111111111111111111111111111100 res=11111111111111111111111111111111 Note : des bits sont sortis par la droite Expression : -1 = -4 >> 3 Décimal : val=-4 res=-1 Binaire : val=11111111111111111111111111111100 res=11111111111111111111111111111111 Note : même résultat que ci-dessus : pas de décalage au dela de -1 --- Décalages à gauche sur des entiers positifs --- Expression : 8 = 4 << 1 Décimal : val=4 res=8 Binaire : val=00000000000000000000000000000100 res=00000000000000000000000000001000 Note : complément de zéros à droite Expression : 1073741824 = 4 << 28 Décimal : val=4 res=1073741824 Binaire : val=00000000000000000000000000000100 res=01000000000000000000000000000000 Expression : -2147483648 = 4 << 29 Décimal : val=4 res=-2147483648 Binaire : val=00000000000000000000000000000100 res=10000000000000000000000000000000 Note : le bit de signe est sorti Expression : 0 = 4 << 30 Décimal : val=4 res=0 Binaire : val=00000000000000000000000000000100 res=00000000000000000000000000000000 Note : des bits sont sortis à gauche --- Décalages à gauche sur des entiers négatifs --- Expression : -8 = -4 << 1 Décimal : val=-4 res=-8 Binaire : val=11111111111111111111111111111100 res=11111111111111111111111111111000 Note : complément de zéros à droite Expression : -2147483648 = -4 << 29 Décimal : val=-4 res=-2147483648 Binaire : val=11111111111111111111111111111100 res=10000000000000000000000000000000 Expression : 0 = -4 << 30 Décimal : val=-4 res=0 Binaire : val=11111111111111111111111111111100 res=00000000000000000000000000000000 Note : des bits sont sortis à gauche, y compris le bit de signe
Résultat de l'exemple ci-dessus sur une machine 64 bits :
--- Décalages à droite sur des entiers positifs --- Expression : 2 = 4 >> 1 Décimal : val=4 res=2 Binaire : val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000010 Note : copie du bit de signe maintenant à gauche Expression : 1 = 4 >> 2 Décimal : val=4 res=1 Binaire : val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000001 Expression : 0 = 4 >> 3 Décimal : val=4 res=0 Binaire : val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000000 Note : des bits sont sortis par la droite Expression : 0 = 4 >> 4 Décimal : val=4 res=0 Binaire : val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000000 Note : même résultat que ci-dessus : pas de décalage au dela de 0 --- Décalages à droite sur des entiers négatifs --- Expression : -2 = -4 >> 1 Décimal : val=-4 res=-2 Binaire : val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111110 Note : copie du bit de signe maintenant à gauche Expression : -1 = -4 >> 2 Décimal : val=-4 res=-1 Binaire : val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111111 Note : des bits sont sortis par la droite Expression : -1 = -4 >> 3 Décimal : val=-4 res=-1 Binaire : val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111111 Note : même résultat que ci-dessus : pas de décalage au dela de -1 --- Décalage à gauche sur les entiers négatifs --- Expression : 8 = 4 << 1 Décimal : val=4 res=8 Binaire : val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000001000 Note : complément de zéros à droite Expression : 4611686018427387904 = 4 << 60 Décimal : val=4 res=4611686018427387904 Binaire : val=0000000000000000000000000000000000000000000000000000000000000100 res=0100000000000000000000000000000000000000000000000000000000000000 Expression : -9223372036854775808 = 4 << 61 Décimal : val=4 res=-9223372036854775808 Binaire : val=0000000000000000000000000000000000000000000000000000000000000100 res=1000000000000000000000000000000000000000000000000000000000000000 Note : le bit de signe est sorti Expression : 0 = 4 << 62 Décimal : val=4 res=0 Binaire : val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000000 Note : des bits sont sortis à gauche --- Décalage à gauche sur les entiers négatifs --- Expression : -8 = -4 << 1 Décimal : val=-4 res=-8 Binaire : val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111000 Note : complément de zéros à droite Expression : -9223372036854775808 = -4 << 61 Décimal : val=-4 res=-9223372036854775808 Binaire : val=1111111111111111111111111111111111111111111111111111111111111100 res=1000000000000000000000000000000000000000000000000000000000000000 Expression : 0 = -4 << 62 Décimal : val=-4 res=0 Binaire : val=1111111111111111111111111111111111111111111111111111111111111100 res=0000000000000000000000000000000000000000000000000000000000000000 Note : des bits sont sortis à gauche, y compris le bit de signe
N'effectuez pas de décalage à droite de plus de 32 bits sur les systèmes 32 bits. N'effectuez pas de décalage à gauche dans le cas où le résultat est un nombre plus long que 32 bits. Utilisez les fonctions de l'extension gmp pour les manipulations sur les bits, lorsque les entiers dépassent PHP_INT_MAX.
Voyez aussi pack(), unpack(), gmp_and(), gmp_or(), gmp_xor(), gmp_testbit(), gmp_clrbit()
Les opérateurs de comparaison, comme leur nom l'indique, vous permettent de comparer deux valeurs. Vous devriez également être intéressés par les tables de comparaisons de types, car ils montrent des exemples de beaucoup de types de comparaisons.
| Exemple | Nom | Résultat |
|---|---|---|
| $a == $b | Egal | TRUE si $a est égal à
$b après le transtypage. |
| $a === $b | Identique |
TRUE si $a est égal à $b et
qu'ils sont de même type.
|
| $a != $b | Différent | TRUE si $a est différent de
$b après le transtypage. |
| $a <> $b | Différent | TRUE si $a est différent de
$b après le transtypage. |
| $a !== $b | Différent |
TRUE si $a est différent de $b
ou bien qu'ils ne sont pas du même type.
|
| $a < $b | Plus petit que | TRUE si $a est strictement plus petit que
$b. |
| $a > $b | Plus grand | TRUE si $a est strictement plus grand que
$b. |
| $a <= $b | Inférieur ou égal | TRUE si $a est plus petit ou égal à
$b. |
| $a >= $b | Supérieur ou égal | TRUE si $a est plus grand ou égal à
$b. |
Si vous comparez un nombre avec une chaîne ou bien que la comparaison implique des chaînes numériques, alors chaque chaîne sera convertie en un nombre et la comparaison sera effectuée numériquement. Ces règles s'appliquent également à l'instruction switch. La comparaison de type n'a pas de place lorsque la comparaison est === ou !== vu que ceci engendre aussi bien une comparaison de type que de valeur.
<?php
var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("10" == "1e1"); // 10 == 10 -> true
var_dump(100 == "1e2"); // 100 == 100 -> true
switch ("a") {
case 0:
echo "0";
break;
case "a": // jamais évalué parce que "a" est déjà trouvé avec 0
echo "a";
break;
}
?>
Pour les différents types, la comparaison est faite en suivant la table suivante (dans l'ordre).
| Type de l'opérande 1 | Type de l'opérande 2 | Résultat |
|---|---|---|
| null ou chaîne de caractères | string | Convertit NULL en "", comparaison numérique ou lexicale |
| booléen ou null | N'importe quoi | Convertit en booléen, FALSE < TRUE |
| objet | objet | Les classes internes peuvent définir leur propre méthode de comparaison; différentes classes ne sont pas comparables; entre objets de même classe, PHP a son propre comportement |
| chaîne de caractères, ressource ou nombre | chaîne de caractères, ressource ou nombre | Transforme les chaînes de caractères et les ressources en nombres |
| tableaux | tableaux | Le tableau avec le moins de membres est plus petit, si la clé de l'opérande 1 n'est pas trouvée dans l'opérande 2, alors les tableaux ne sont pas comparables, sinon la comparaison se fait valeur par valeur (voir l'exemple suivant) |
| tableau | N'importe quoi | Le tableau est toujours plus grand |
| objet | N'importe quoi | L'objet est toujours plus grand |
Exemple #1 Transcription des comparaisons standards des tableaux
<?php
// Les tableaux sont comparés comme ceci avec les opérateurs standards de comparaison
function standard_array_compare($op1, $op2)
{
if (count($op1) < count($op2)) {
return -1; // $op1 < $op2
} elseif (count($op1) > count($op2)) {
return 1; // $op1 > $op2
}
foreach ($op1 as $key => $val) {
if (!array_key_exists($key, $op2)) {
return null; // incomparable
} elseif ($val < $op2[$key]) {
return -1;
} elseif ($val > $op2[$key]) {
return 1;
}
}
return 0; // $op1 == $op2
}
?>
Voir aussi strcasecmp(), strcmp() les opérateurs de tableaux, et le chapitre sur les types.
A cause de la façon dont les nombres à virgule flottante sont représentés en interne, vous ne devriez pas tester l'égalité entre deux nombres de type float.
Voyez la documentation de float pour plus d'informations.
Un autre opérateur conditionnel est l'opérateur ternaire (":?").
Exemple #2 Assignation d'une valeur par défaut
<?php
// Exemple d'utilisation pour l'opérateur ternaire
$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];
// La ligne ci-dessus est identique à la condition suivante :
if (empty($_POST['action'])) {
$action = 'default';
} else {
$action = $_POST['action'];
}
?>
TRUE, et
expr3 si
expr1 est évaluée à FALSE.
Depuis PHP 5.3, il est possible d'omettre la partie centrale de l'opérateur
ternaire. L'expression expr1 ?: expr3 retourne
expr1 si expr1
vaut TRUE, et expr3 sinon.
Note: Notez que l'opérateur ternaire est une instruction, et il n'est pas évalué en tant que variable, mais en tant que résultat de l'instruction. Il est important de savoir si vous voulez retourner une variable par référence. L'instruction return $var == 42 ? $a : $b; dans une fonction retournée par référence ne fonctionnera donc pas et une alerte est émise.
Note:
Il est recommandé de ne pas "empiler" les expressions ternaires. Le comportement de PHP lors de l'utilisation de plus d'un opérateur ternaire dans une seule instruction n'est pas évident :
Exemple #3 Comportement de PHP
<?php
// A première vue, ce qui suit devrait retourner 'true'
echo (true?'true':false?'t':'f');
// cependant, l'expression ci-dessus retournera 't'
// car l'expression ternaire est évaluée de gauche à droite
// l'expression suivante est une version plus évidente du même code
echo ((true ? 'true' : false) ? 't' : 'f');
// ici, vous pouvez voir que la première expression est évaluée à 'true',
// ce qui fait qu'elle est évaluée à (bool)true, ce qui retourne la branche
// 'vraie' de la seconde expression ternaire.
?>
PHP supporte un opérateur de contrôle d'erreur : c'est @. Lorsque cet opérateur est ajouté en préfixe d'une expression PHP, les messages d'erreur qui peuvent être générés par cette expression seront ignorés.
Si vous avez défini un gestionnaire d'erreurs personnalisé avec la fonction set_error_handler(), alors il sera toujours appelé, mais ce gestionnaire d'erreurs peut (et doit) appeler la fonction error_reporting() qui devra retourner 0 lorsque l'appel qui a émis l'erreur était précédé d'un @.
Si l'option track_errors est activée, les messages d'erreurs générés par une expression seront sauvés dans la variable globale $php_errormsg. Cette variable sera écrasée à chaque erreur. Il faut alors la surveiller souvent pour pouvoir l'utiliser.
<?php
/* Erreur intentionnelle (le fichier n'existe pas): */
$mon_fichier = @file ('non_persistent_file') or
die ("Impossible d'ouvrir le fichier : L'erreur est : '$php_errormsg'");
// Cela fonctionne avec n'importe quelle expression, pas seulement les fonctions
$value = @$cache[$key];
// la ligne ci-dessus n'affichera pas d'alerte si la clé $key du tableau n'existe pas
?>
Note: L'opérateur @ ne fonctionne qu'avec les expressions. La règle générale de fonctionnement est la suivante : si vous pouvez prendre la valeur de quelque chose, vous pouvez le préfixer avec @. Par exemple, vous pouvez ajouter @ aux variables, fonctions, à include, aux constantes, etc. Vous ne pourrez pas le faire avec des éléments de langage tels que les classes, if et foreach, etc.
Voir aussi error_reporting() et la section sur la gestion d'erreurs.
En fait, l'opérateur "@" va aussi désactiver les rapports d'erreurs critiques, qui stoppent l'exécution du script. Entre autres, si vous utilisez "@" pour supprimer les erreurs de certaines fonctions, et que cette fonction n'existe pas, ou qu'elle a été mal orthographiée, vous n'aurez aucune indication.
PHP supporte un opérateur d'exécution : guillemets obliques ("``"). Notez bien qu'il ne s'agit pas de guillemets simples. PHP essaie d'exécuter le contenu de ces guillemets obliques comme une commande shell. Le résultat sera retourné (i.e. : il ne sera pas simplement envoyé à la sortie standard, il peut être assigné à une variable). Utilisez les guillemets obliques revient à utiliser la fonction shell_exec().
Exemple #1 Opérateur d'exécution
<?php
$output = `ls -al`;
echo "<pre>$output</pre>";
?>
Note:
Cet opérateur est désactivé lorsque le safe mode est activé ou bien que la fonction shell_exec() est désactivée.
Note:
Contrairement à d'autres langages, les guillemets obliques ne peuvent pas être utilisés dans une chaîne entourée de guillemets doubles.
Voir aussi le manuel à la section sur les fonctions d'exécution système, popen(), proc_open() et l'utilisation de PHP en ligne de commande.
PHP supporte les opérateurs de pre- et post-incrémentation et décrémentation, comme en langage C.
Note: Les opérateurs d'incrémentation/décrémentation n'affectent pas les valeurs booléennes. La décrémentation des valeurs
NULLn'a également aucun effet, mais leur incrémentation donnera comme résultat 1.
| Exemple | Nom | Résultat |
|---|---|---|
| ++$a | Pre-incrémente | Incrémente $a de 1, puis retourne $a. |
| $a++ | Post-incrémente | Retourne $a, puis incrémente $a de 1. |
| --$a | Pré-décrémente | Décrémente $a de 1, puis retourne $a. |
| $a-- | Post-décrémente | Retourne $a, puis décrémente $a de 1. |
Voici un exemple simple :
<?php
echo '<h3>Post-incrémentation</h3>';
$a = 5;
echo "Devrait valoir 5: " . $a++ . "<br />\n";
echo "Devrait valoir 6: " . $a . "<br />\n";
echo '<h3>Pre-incrémentation</h3>';
$a = 5;
echo "Devrait valoir 6: " . ++$a . "<br />\n";
echo "Devrait valoir 6: " . $a . "<br />\n";
echo '<h3>Post-décrémentation</h3>';
$a = 5;
echo "Devrait valoir 5: " . $a-- . "<br />\n";
echo "Devrait valoir 4: " . $a . "<br />\n";
echo '<h3>Pre-décrémentation</h3>';
$a = 5;
echo "Devrait valoir 4: " . --$a . "<br />\n";
echo "Devrait valoir 4: " . $a . "<br />\n";
?>
PHP suit les conventions de Perl pour la gestion des opérateurs arithmétiques sur les variables de caractères et non pas celle du C. Par exemple, en PHP et en Perl, $a = 'Z'; $a++; transforme $a en 'AA', alors qu'en C, a = 'Z'; a++; transforme a en '[' (la valeur ASCII de 'Z' est 90, la valeur ASCII de '[' est 91). Notez que les variables de caractères peuvent être incrémentées mais pas décrémentées, mais aussi que seuls les caractères ASCII pleins (a-z et A-Z) sont supportés. L'incrémentation/décrémentation d'autres variables de caractères n'a aucun effet, la chaîne originale n'est pas modifiée.
Exemple #1 Opérations arithmétiques sur un caractère
<?php
$i = 'W';
for($n=0; $n<6; $n++) {
echo ++$i . "\n";
}
?>
L'exemple ci-dessus va afficher :
X Y Z AA AB AC
L'incrémentation ou la décrémentation d'un booléen n'a aucun effet.
| Exemple | Nom | Résultat |
|---|---|---|
| $a and $b | And (Et) | TRUE si $a ET $b valent TRUE. |
| $a or $b | Or (Ou) | TRUE si $a OU $b valent TRUE. |
| $a xor $b | XOR |
TRUE si $a OU $b est TRUE,
mais pas les deux en même temps.
|
| ! $a | Not (Non) | TRUE si $a n'est pas TRUE. |
| $a && $b | And (Et) | TRUE si $a ET $b sont TRUE. |
| $a || $b | Or (Ou) | TRUE si $a OU $b est TRUE. |
La raison pour laquelle il existe deux types de "ET" et de "OU" est qu'ils ont des priorités différentes. Voir le paragraphe précédence d'opérateurs.
Exemple #1 Illustration des opérateurs logiques
<?php
// --------------------
// foo() ne sera jamais appelée car ces opérateurs s'annulent
$a = (false && foo());
$b = (true || foo());
$c = (false and foo());
$d = (true or foo());
// --------------------
// "||" a un précédence supérieure à "or"
// Le résultat de l'expression (false || true) est assigné à $e
// Agit comme : ($e = (false || true))
$e = false || true;
// La constante false est assignée à $f, puis, true est ignoré
// Agit comme : (($f = false) or true)
$f = false or true;
var_dump($e, $f);
// --------------------
// "&&" a un précédence supérieure à "and"
// Le résultat de l'expression (true && false) est assigné à $g
// Agit comme : ($g = (true && false))
$g = true && false;
// La constante true est assignée à $h, puis, false est ignoré
// Agit comme : (($h = true) and false)
$h = true and false;
var_dump($g, $h);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
bool(true) bool(false) bool(false) bool(true)
Il y a deux opérateurs de chaînes de caractères string. Le premier est l'opérateur de concaténation ('.'), qui retourne la concaténation de ses deux arguments. Le second est l'opérateur d'assignation concaténant (.=). Reportez-vous à opérateurs d'assignation pour plus de détails.
Exemple #1 Opérateur de concaténation
<?php
$a = "Bonjour ";
$b = $a . "Monde !"; // $b contient "Bonjour Monde !"
$a = "Bonjour ";
$a = $a . "Monde !"; // $a contient "Bonjour Monde !"
?>
Voir aussi les sections du manuel sur les types de chaînes de caractères et les chaînes de caractères.
| Exemple | Nom | Résultat |
|---|---|---|
| $a + $b | Union | Union de $a et $b. |
| $a == $b | Egalité | TRUE si $a et $b contiennent les mêmes paires clés/valeurs. |
| $a === $b | Identique | TRUE si $a et $b contiennent les mêmes paires clés/valeurs dans le même ordre et du même type. |
| $a != $b | Inégalité | TRUE si $a n'est pas égal à $b. |
| $a <> $b | Inégalité | TRUE si $a n'est pas égal à $b. |
| $a !== $b | Non-identique | TRUE si $a n'est pas identique à $b. |
L'opérateur + retourne le tableau de droite auquel sont ajoutés les éléments du tableau de gauche. Pour les clés présentes dans les 2 tableaux, les éléments du tableau de gauche seront utilisés alors que les éléments correspondants dans le tableau de droite seront ignorés.
<?php
$a = array("a" => "pomme", "b" => "banane");
$b = array("a" =>"poire", "b" => "fraise", "c" => "cerise");
$c = $a + $b; // Union de $a et $b
echo "Union de \$a et \$b : \n";
var_dump($c);
$c = $b + $a; // Union de $b et $a
echo "Union de \$b et \$a : \n";
var_dump($c);
?>
Union de $a et $b :
array(3) {
["a"]=>
string(5) "pomme"
["b"]=>
string(6) "banane"
["c"]=>
string(6) "cerise"
}
Union de $b et $a :
array(3) {
["a"]=>
string(5) "poire"
["b"]=>
string(6) "fraise"
["c"]=>
string(6) "cerise"
}
Les éléments d'un tableau sont égaux en terme de comparaison s'ils ont la même clé et la même valeur.
Exemple #1 Comparer des tableaux
<?php
$a = array("pomme", "banane");
$b = array(1 => "banane", "0" => "pomme");
var_dump($a == $b); // bool(true)
var_dump($a === $b); // bool(false)
?>
Voyez aussi le manuel aux sections Tableaux et fonctions de tableaux.
instanceof est utilisé pour déterminer si une variable PHP est un objet instancié d'une certaine classe :
Exemple #1 Utilisation de instanceof avec des classes
<?php
class MaClasse
{
}
class PasMaClasse
{
}
$a = new MaClasse;
var_dump($a instanceof MaClasse);
var_dump($a instanceof PasMaClasse);
?>
L'exemple ci-dessus va afficher :
bool(true) bool(false)
instanceof peut également être utilisé pour déterminer si une variable est un objet instancié d'une classe qui hérite d'une classe parente :
Exemple #2 Utilisation de instanceof avec des classes héritées
<?php
class ParentClass
{
}
class MyClass extends ParentClass
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof ParentClass);
?>
L'exemple ci-dessus va afficher :
bool(true) bool(true)
Pour vérifier si un objet n'est pas une instance d'une classe, l'opérateur logique not peut être utilisé.
Exemple #3 Utilisation de instanceof pour vérifier que l'objet n'est pas une instance de la classe
<?php
class MyClass
{
}
$a = new MyClass;
var_dump(!($a instanceof stdClass));
?>
L'exemple ci-dessus va afficher :
bool(true)
Et finalement, instanceof peut être utilisé pour déterminer si une variable est un objet instancié d'une classe qui implémente une interface :
Exemple #4 Utilisation de instanceof pour une interface
<?php
interface MyInterface
{
}
class MyClass implements MyInterface
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof MyInterface);
?>
L'exemple ci-dessus va afficher :
bool(true) bool(true)
Bien que instanceof soit habituellement utilisé avec un nom de classe littéral, il peut également être utilisé avec un autre objet ou une chaîne représentant une variable :
Exemple #5 Utilisation de instanceof avec d'autres variables
<?php
interface MyInterface
{
}
class MyClass implements MyInterface
{
}
$a = new MyClass;
$b = new MyClass;
$c = 'MyClass';
$d = 'NotMyClass';
var_dump($a instanceof $b); // $b est un objet de la classe MyClass
var_dump($a instanceof $c); // $c est une chaîne 'MyClass'
var_dump($a instanceof $d); // $d est une chaîne 'NotMyClass'
?>
L'exemple ci-dessus va afficher :
bool(true) bool(true) bool(false)
Il y a quelques pièges à éviter. Avant PHP version 5.1.0, instanceof appellera __autoload() si le nom de la classe n'existe pas. De plus, si la classe n'a pas été chargée, une erreur fatale sera émise. Ceci peut fonctionner en utilisant une référence de classe dynamique, ou une chaîne représentant une variable contenant le nom de la classe :
Exemple #6 Pas de recherche sur le nom de la classe et une erreur fatale avec instanceof en PHP 5.0
<?php
$d = 'NotMyClass';
var_dump($a instanceof $d); // no fatal error here
?>
L'exemple ci-dessus va afficher :
bool(false)
L'opérateur instanceof a été introduit en PHP 5. Avant cette version, is_a() était utilisée mais is_a() est depuis devenue obsolète, en faveur de instanceof. Notez que depuis PHP 5.3.0, is_a() n'est de nouveau plus obsolète.
Voir aussi get_class() et is_a().
Tous les scripts PHP sont une suite d'instructions. Une instruction peut être une assignation, un appel de fonction, une instruction conditionnelle ou bien une instruction qui ne fait rien (une instruction vide). Une instruction se termine habituellement par un point virgule (";"). De plus, plusieurs instructions peuvent être regroupées en bloc, délimité par des accolades ("{}"). Un bloc est considéré comme une instruction. Les différents types d'instructions sont décrits dans ce chapitre.
(PHP 4, PHP 5)
L'instruction if est une des plus importantes instructions de tous les langages, PHP inclus. Elle permet l'exécution conditionnelle d'une partie de code. Les fonctionnalités de l'instruction if sont les mêmes en PHP qu'en C :
if (expression) commandes
Comme nous l'avons vu dans le paragraphe consacré aux
expressions,
expression est convertie en sa valeur
booléenne. Si l'expression vaut
TRUE, PHP exécutera l'instruction et
si elle vaut FALSE, l'instruction sera ignorée. Plus de détails sur les valeurs
qui valent FALSE sont disponibles dans la section
Conversion en booléen.
L'exemple suivant affiche la phrase a est plus grand que b si $a est plus grand que $b :
<?php
if ($a > $b)
echo "a est plus grand que b";
?>
Souvent, vous voulez que plusieurs instructions soient exécutées après un branchement conditionnel. Bien évidemment, il n'est pas obligatoire de répéter l'instruction conditionnelle if autant de fois que vous avez d'instructions à exécuter. À la place, vous pouvez rassembler toutes les instructions dans un bloc. L'exemple suivant affiche a est plus grand que b, si $a est plus grand que $b, puis assigne la valeur de $a à la variable $b :
<?php
if ($a > $b) {
echo "a est plus grand que b";
$b = $a;
}
?>
Vous pouvez imbriquer indéfiniment des instructions if dans d'autres instructions if, ce qui permet une grande flexibilité dans l'exécution d'une partie de code suivant un grand nombre de conditions.
(PHP 4, PHP 5)
Souvent, vous voulez exécuter une instruction si une
condition est remplie, et une autre instruction si cette condition
n'est pas remplie. C'est à cela que sert else.
else fonctionne après un
if et exécute les instructions
correspondantes au cas où l'expression du if
est FALSE. Dans l'exemple suivant, ce bout de code
affiche a est plus grand que b si la
variable $a est plus grande que la variable
$b, et a est plus petit que b
sinon :
<?php
if ($a > $b) {
echo "a est plus grand que b";
} else {
echo "a est plus petit que b";
}
?>
FALSE, et si elle n'est pas suivie par l'expression
elseif - uniquement si elles sont évaluées à FALSE (voir elseif).
(PHP 4, PHP 5)
elseif, comme son nom l'indique, est une combinaison
de if et de else. Comme l'expression
else, il permet d'exécuter une instruction
après un if dans le cas où le "premier"
if est évalué comme FALSE. Mais,
à la différence de l'expression else,
il n'exécutera l'instruction que si l'expression conditionnelle
elseif est évaluée comme
TRUE. L'exemple suivant affichera
a est plus grand que b,
a est égal à b ou
a est plus petit que b :
<?php
if ($a > $b) {
echo "a est plus grand que b";
} elseif ($a == $b) {
echo "a est égal à b";
} else {
echo "a est plus petit que b";
}
?>
Vous pouvez avoir plusieurs elseif qui se suivent
les uns après les autres, après un if initial.
Le premier elseif qui sera évalué
à TRUE sera exécuté. En PHP, vous
pouvez aussi écrire "else if" en deux mots et
son comportement sera identique à la version en un seul mot.
La sémantique des deux expressions est légèrement
différente, mais au bout du compte, le résultat sera
exactement le même.
L'expression elseif est exécutée
seulement si le if précédent et tout
autre elseif précédent sont
évalués comme FALSE, et que
votre elseif est évalué à
TRUE.
Note: A noter que elseif et else if sont traités de la même façon seulement quand des accolades sont utilisées, comme dans l'exemple ci-dessus. Quand vous utilisez ":" pour définir votre condition if/elseif, vous ne devez pas séparer else if en deux mots, sans quoi PHP soulèvera une erreur d'interprétation.
<?php
/* Mauvaise méthode : */
if($a > $b):
echo $a." est plus grand que ".$b;
else if($a == $b): // ne compilera pas
echo "La ligne ci-dessus provoque une erreur d'interprétation";
endif;
/* Bonne méthode : */
if($a > $b):
echo $a." est plus grand que ".$b;
elseif($a == $b): // Les deux mots sont collés
echo $a." égal ".$b;
else:
echo $a." est plus grand ou égal à ".$b;
endif;
?>
(PHP 4, PHP 5)
PHP propose une autre manière de rassembler des instructions à l'intérieur d'un bloc, pour les fonctions de contrôle if, while, for, foreach et switch. Dans chaque cas, le principe est de remplacer l'accolade d'ouverture par deux points (:) et l'accolade de fermeture par, respectivement, endif;, endwhile;, endfor;, endforeach;, ou endswitch;.
<?php if ($a == 5): ?>
A égal 5
<?php endif; ?>
Dans l'exemple ci-dessus, le bloc HTML "A égal 5" est inclus à l'intérieur d'un if en utilisant cette nouvelle syntaxe. Ce code HTML ne sera affiché que si la variable $a est égale à 5.
Cette autre syntaxe fonctionne aussi avec le else et elseif. L'exemple suivant montre une structure avec un if, un elseif et un else utilisant cette autre syntaxe :
<?php
if ($a == 5):
echo "a égale 5";
echo "...";
elseif ($a == 6):
echo "a égale 6";
echo "!!!";
else:
echo "a ne vaut ni 5 ni 6";
endif;
?>
Note:
Vous ne pouvez pas utiliser différentes syntaxes dans le même bloc de contrôle.
(PHP 4, PHP 5)
La boucle while est le moyen le plus simple d'implémenter une boucle en PHP. Cette boucle se comporte de la même manière qu'en C. L'exemple le plus simple d'une boucle while est le suivant :
while (expression)
commandes
La signification d'une boucle while est
très simple. PHP exécute l'instruction tant
que l'expression de la boucle while est
évaluée comme TRUE. La valeur
de l'expression est vérifiée à chaque
début de boucle, et, si la valeur change durant
l'exécution de l'instruction, l'exécution ne
s'arrêtera qu'à la fin de l'itération
(chaque fois que PHP exécute l'instruction, on appelle
cela une itération). De temps en temps, si l'expression du
while est FALSE avant la
première itération, l'instruction ne sera jamais
exécutée.
Comme avec le if, vous pouvez regrouper plusieurs instructions dans la même boucle while en les regroupant à l'intérieur de parenthèses ou en utilisant la syntaxe suivante :
while (expression):
commandes
...
endwhile;
Les exemples suivants sont identiques et affichent tous les nombres de 1 jusqu'à 10 :
<?php
/* exemple 1 */
$i = 1;
while ($i <= 10) {
echo $i++; /* La valeur affiche est $i avant l'incrémentation
(post-incrémentation) */
}
/* exemple 2 */
$i = 1;
while ($i <= 10):
echo $i;
$i++;
endwhile;
?>
(PHP 4, PHP 5)
Les boucles do-while ressemblent beaucoup
aux boucles while, mais l'expression est
testée à la fin de chaque itération plutôt
qu'au début. La principale différence par rapport
à la boucle while est que la
première itération de la boucle
do-while est toujours exécutée
(l'expression n'est testée qu'à la fin de
l'itération), ce qui n'est pas le cas lorsque vous
utilisez une boucle while (la condition
est vérifiée dès le début de chaque itération, et si elle
s'avère FALSE dès le début, la boucle sera immédiatement arrêtée).
Il n'y a qu'une syntaxe possible pour les boucles do-while :
<?php
$i = 0;
do {
echo $i;
} while ($i > 0);
?>
La boucle ci-dessus ne va être exécutée
qu'une seule fois, car lorsque l'expression est
évaluée, elle vaut FALSE (car
la variable $i n'est pas plus grande que 0) et l'exécution
de la boucle s'arrête.
Les utilisateurs familiers du C sont habitués à une utilisation différente des boucles do-while , qui permet de stopper l'exécution de la boucle au milieu des instructions, en encapsulant dans un do-while(0) la fonction break. Le code suivant montre une utilisation possible :
<?php
do {
if ($i < 5) {
echo "i n'est pas suffisamment grand";
break;
}
$i *= $factor;
if ($i < $minimum_limit) {
break;
}
echo "i est bon";
/* ...traitement de i... */
} while (0);
?>
Ne vous inquiétez pas si vous ne comprenez pas tout correctement. Vous pouvez écrire des scripts très très puissants sans utiliser cette fonctionnalité. Depuis PHP 5.3.0, il est possible d'utiliser l'opérateur goto à l'intérieur de cette fonctionnalité.
(PHP 4, PHP 5)
Les boucles for sont les boucles les plus complexes en PHP. Elles fonctionnent comme les boucles for du langage C. La syntaxe des boucles for est la suivante :
for (expr1; expr2; expr3)
commandes
La première expression (expr1) est évaluée (exécutée), quoi qu'il arrive au début de la boucle.
Au début de chaque itération, l'expression
expr2 est évaluée.
Si l'évaluation vaut TRUE, la boucle
continue et l'instruction est exécutée. Si
l'évaluation vaut FALSE,
l'exécution de la boucle s'arrête.
À la fin de chaque itération, l'expression expr3 est évaluée (exécutée).
Les expressions peuvent éventuellement être
laissées vides ou peuvent contenir plusieurs expressions séparées par des virgules.
Dans expr2, toutes les expressions séparées par une virgule
sont évaluées mais le résultat est obtenu depuis la dernière partie.
Si l'expression expr2
est laissée vide, cela signifie que c'est une boucle infinie
(PHP considère implicitement qu'elle vaut TRUE,
comme en C). Cela n'est pas vraiment très utile, à moins que vous
souhaitiez terminer votre boucle par l'instruction conditionnelle
break.
Considérons les exemples suivants. Tous affichent les chiffres de 1 jusqu'à 10 :
<?php
/* exemple 1 */
for ($i = 1; $i <= 10; $i++) {
echo $i;
}
/* exemple 2 */
for ($i = 1; ; $i++) {
if ($i > 10) {
break;
}
echo $i;
}
/* exemple 3 */
$i = 1;
for (; ; ) {
if ($i > 10) {
break;
}
echo $i;
$i++;
}
/* exemple 4 */
for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);
?>
Bien évidemment, le premier exemple est le plus simple de tous (ou peut être le quatrième), mais vous pouvez aussi penser qu'utiliser une expression vide dans une boucle for peut être utile parfois.
PHP supporte aussi la syntaxe alternative suivante pour les boucles for :
for (expr1; expr2; expr3):
commandes
...
endfor;
Beaucoup de personnes ont l'habitude d'itérer grâce à des tableaux, comme dans l'exemple ci dessous.
<?php
/*
* Ceci est un tableau avec des données que nous voulons modifier
* au long de la boucle
*/
$people = Array(
Array('name' => 'Kalle', 'salt' => 856412),
Array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0; $i < sizeof($people); ++$i)
{
$people[$i]['salt'] = rand(000000, 999999);
}
?>
Le problème se situe dans le deuxième argument de l'expression for. Ce code peut être lent parce qu'il doit calculer la taille du tableau à chaque itération. Etant donné que la taille ne change jamais, il peut facilement être optimisé en utilisant une variable intermédiaire pour stocker la taille et en l'utilisant dans la boucle à la place de sizeof. L'exemple ci-dessous illustre ce cas :
<?php
$people = Array(
Array('name' => 'Kalle', 'salt' => 856412),
Array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0, $size = sizeof($people); $i < $size; ++$i)
{
$people[$i]['salt'] = rand(000000, 999999);
}
?>
(PHP 4, PHP 5)
La structure de langage foreach fournit une façon simple de parcourir des tableaux. foreach ne fonctionne que pour les tableaux et les objets, et émettra une erreur si vous tentez de l'utiliser sur une variable de type différent ou une variable non initialisée. Il existe deux syntaxes :
foreach (array_expression as $value)
commandes
foreach (array_expression as $key => $value)
commandes
La première forme passe en revue le tableau array_expression. À chaque itération, la valeur de l'élément courant est assignée à $value et le pointeur interne de tableau est avancé d'un élément (ce qui fait qu'à la prochaine itération, on accédera à l'élément suivant).
La seconde forme assignera en plus la clé de l'élément courant à la variable $key à chaque itération.
Il est possible de personnaliser l'itération sur des objets.
Note:
Lorsque foreach démarre, le pointeur interne du tableau est automatiquement ramené au premier élément du tableau. Cela signifie que vous n'aurez pas à faire appel à reset() avant foreach.
Vu que foreach utilise le pointeur interne du tableau à chaque itération, il conviendra d'en tenir compte lors d'une utilisation future du tableau dans votre code.
Vous pouvez modifier facilement les éléments d'un tableau en précédent $value d'un &. Ceci assignera une référence au lieu de copier la valeur.
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as $value) {
$value = $value * 2;
}
// $arr vaut maintenant array(2, 4, 6, 8)
unset($value); // Détruit la référence sur le dernier élément
?>
Le référencement de $value est seulement possible si le tableau parcouru peut être référencé (i.e. si c'est une variable). Le code suivant ne fonctionnera pas :
<?php
foreach (array(1, 2, 3, 4) as $value) {
$value = $value * 2;
}
?>
La référence de $value et le dernier élément du tableau sont conservés après l'exécution de la boucle foreach. Il est recommandé de les détruire en utilisant la fonction unset().
Note:
foreach n'accepte pas l'opérateur de suppression des erreurs @.
Vous pouvez remarquer que les exemples suivants fonctionnent de manière identique :
<?php
$arr = array("un", "deux", "trois");
reset($arr);
while (list(, $value) = each($arr)) {
echo "Valeur : $value<br />\n";
}
foreach ($arr as $value) {
echo "Valeur : $value<br />\n";
}
?>
Les exemples suivants sont aussi fonctionnellement identiques :
<?php
$arr = array("un", "deux", "trois");
reset($arr);
while (list($key, $value) = each($arr)) {
echo "Clé : $key; Valeur : $value<br />\n";
}
foreach ($arr as $key => $value) {
echo "Clé : $key; Valeur : $value<br />\n";
}
?>
Voici quelques exemples de plus :
<?php
/* exemple foreach 1 : la valeur seulement */
$a = array(1, 2, 3, 17);
foreach ($a as $v) {
echo "Valeur courante de \$a: $v.\n";
}
/* exemple foreach 2 : la valeur et sa clé d'index */
$a = array(1, 2, 3, 17);
$i = 0; /* uniquement pour l'illustration */
foreach ($a as $v) {
echo "\$a[$i] => $v.\n";
$i++;
}
/* exemple foreach 3 : la clé et la valeur */
$a = array(
"un" => 1,
"deux" => 2,
"trois" => 3,
"dix-sept" => 17
);
foreach ($a as $k => $v) {
echo "\$a[$k] => $v.\n";
}
/* exemple foreach 4 : tableaux multidimensionnels */
$a = array();
$a[0][0] = "a";
$a[0][1] = "b";
$a[1][0] = "y";
$a[1][1] = "z";
foreach ($a as $v1) {
foreach ($v1 as $v2) {
echo "$v2\n";
}
}
/* exemple foreach 5 : tableaux dynamiques */
foreach (array(1, 2, 3, 4, 5) as $v) {
echo "$v\n";
}
?>
(PHP 4, PHP 5)
L'instruction break permet de sortir d'une structure for, foreach, while, do-while ou switch.
break accepte un argument numérique optionnel qui vous indiquera combien de structures emboîtées doivent être interrompues.
<?php
$arr = array('un', 'deux', 'trois', 'quatre', 'stop', 'cinq');
while (list(, $val) = each($arr)) {
if ($val == 'stop') {
break; /* Vous pourriez aussi utiliser 'break 1;' ici. */
}
echo "$val<br />\n";
}
/* Utilisation de l'argument optionnel. */
$i = 0;
while (++$i) {
switch ($i) {
case 5:
echo "At 5<br />\n";
break 1; /* Termine uniquement le switch. */
case 10:
echo "At 10; quitting<br />\n";
break 2; /* Termine le switch et la boucle while. */
default:
break;
}
}
?>
| Version | Description |
|---|---|
| 5.4.0 | Supprime la possibilité de passer des variables (i.e., $num = 2; break $num;) comme argument numérique. |
(PHP 4, PHP 5)
L'instruction continue est utilisée dans une boucle afin d'éluder les instructions de l'itération courante et de continuer l'exécution à la condition de l'évaluation et donc, de commencer la prochaine itération.
Note: Notez qu'en PHP, la structure switch est considérée comme une boucle par continue.
continue accepte un argument numérique optionnel qui vous indiquera combien de structures emboîtées doivent être éludées.
Note:
continue 0; et continue 1; sont identiques à continue;.
<?php
while (list($key, $value) = each($arr)) {
if (!($key % 2)) { // évite les membres impairs
continue;
}
do_something_odd($value);
}
$i = 0;
while ($i++ < 5) {
echo "Dehors<br />\n";
while (1) {
echo "Milieu<br />\n";
while (1) {
echo "Intérieur<br />\n";
continue 3;
}
echo "Ceci n'est jamais atteint.<br />\n";
}
echo "Ceci non plus.<br />\n";
}
?>
Oublier le point virgule après continue peut porter à confusion. Voici un exemple de ce que vous ne devez pas faire :
<?php
for ($i = 0; $i < 5; ++$i) {
if ($i == 2)
continue
print "$i\n";
}
?>
On peut s'attendre à ce que le résultat soit :
0 1 3 4
mais ce script affichera :
2
car le commande complète continue print "$i\n"; est évaluée comme une seule expression, et ainsi, la fonction print est appelée uniquement lorsque $i == 2 est vrai. (La valeur retournée de print est passée à continue comme argument numérique.)
| Version | Description |
|---|---|
| 5.4.0 | Supprime la possibilité de passer des variables (i.e., $num = 2; continue $num;) comme argument numérique. |
(PHP 4, PHP 5)
L'instruction switch équivaut à une série d'instructions if. En de nombreuses occasions, vous aurez besoin de comparer la même variable (ou expression) avec un grand nombre de valeurs différentes, et d'exécuter différentes parties de code suivant la valeur à laquelle elle est égale. C'est exactement à cela que sert l'instruction switch.
Note: Notez que contrairement à d'autres langages, la structure continue s'applique aux structures switch et se comporte de la même manière que break. Si vous avez un switch dans une boucle, et que vous souhaitez continuer jusqu'à la prochaine itération de la boucle extérieure, vous devez utiliser continue 2.
Note:
Notez que switch/case provoque une comparaison large.
Les deux exemples suivants sont deux manières différentes d'écrire la même chose, l'une en utilisant une séries de if, et l'autre en utilisant l'instruction switch :
Exemple #1 Instruction switch
<?php
if ($i == 0) {
echo "i égal 0";
} elseif ($i == 1) {
echo "i égal 1";
} elseif ($i == 2) {
echo "i égal 2";
}
switch ($i) {
case 0:
echo "i égal 0";
break;
case 1:
echo "i égal 1";
break;
case 2:
echo "i égal 2";
break;
}
?>
Exemple #2 Instruction switch utilisant une chaîne de caractères
<?php
switch ($i) {
case "apple":
echo "i est une tarte";
break;
case "bar":
echo "i est une barre";
break;
case "cake":
echo "i est un gateau";
break;
}
?>
Il est important de comprendre que l'instruction switch exécute chacune des clauses dans l'ordre. L'instruction switch est exécutée ligne par ligne. Au début, aucun code n'est exécuté. Seulement lorsqu'un case est vérifié, PHP exécute alors les instructions correspondantes. PHP continue d'exécuter les instructions jusqu'à la fin du bloc d'instructions du switch, ou bien dès qu'il trouve l'instruction break. Si vous ne pouvez pas utiliser l'instruction break à la fin de l'instruction case, PHP continuera à exécuter toutes les instructions qui suivent. Par exemple :
<?php
switch ($i) {
case 0:
echo "i égal 0";
case 1:
echo "i égal 1";
case 2:
echo "i égal 2";
}
?>
Dans cet exemple, si $i est égal à 0, PHP va exécuter quand même toutes les instructions qui suivent! Si $i est égal à 1, PHP exécutera les deux dernières instructions. Et seulement si $i est égal à 2, vous obtiendrez le résultat escompté, c'est-à-dire, l'affichage de "i égal 2". Donc, l'important est de ne pas oublier l'instruction break (même s'il est possible que vous l'omettiez dans certaines circonstances).
Dans une commande switch, une condition n'est évaluée qu'une fois, et le résultat est comparé à chaque case. Dans une structure elseif, les conditions sont évaluées à chaque comparaison. Si votre condition est plus compliquée qu'une simple comparaison, ou bien fait partie d'une boucle, switch sera plus rapide.
La liste de commandes d'un case peut être vide, auquel cas PHP utilisera la liste de commandes du cas suivant.
<?php
switch ($i) {
case 0:
case 1:
case 2:
echo "i est plus petit que 3 mais n'est pas négatif";
break;
case 3:
echo "i égal 3";
}
?>
Un cas spécial est default. Ce cas est utilisé lorsque tous les autres cas ont échoué. Par exemple :
<?php
switch ($i) {
case 0:
echo "i égal 0";
break;
case 1:
echo "i égal 1";
break;
case 2:
echo "i égal 2";
break;
default:
echo "i n'est ni égal à 2, ni à 1, ni à 0.";
}
?>
Une autre chose à mentionner est que la valeur du case peut être toute expression de type scalaire, c'est-à-dire nombre entier, nombre à virgule flottante et chaîne de caractères. Les tableaux sont sans intérêt dans ce contexte-là.
La syntaxe alternative pour cette structure de contrôle est la suivante : (pour plus d'informations, voir syntaxes alternatives).
<?php
switch ($i):
case 0:
echo "i égal 0";
break;
case 1:
echo "i égal 1";
break;
case 2:
echo "i égal 2";
break;
default:
echo "i n'est ni égal à 2, ni à 1, ni à 0";
endswitch;
?>
Il est possible d'utiliser un point-virgule plutôt que deux points après un case, comme ceci :
<?php
switch($beer)
{
case 'leffe';
case 'grimbergen';
case 'guinness';
echo 'Bon choix';
break;
default;
echo 'Merci de faire un choix...';
break;
}
?>
(PHP 4, PHP 5)
L'élément de langage declare sert à ajouter des directives d'exécutions dans un bloc de code. La syntaxe de declare est similaire à la syntaxe des autres fonctions de contrôle :
declare (directive)
commandes
L'expression directive permet de contrôler l'intervention du bloc declare. Actuellement, seulement deux directives sont reconnues : la directive ticks (voir plus bas pour plus de détails sur les ticks) et la directive d'encodage encoding (Voir plus bas pour plus de détails sur la directive encoding).
Note: La directive encoding a été ajoutée en PHP 5.3.0.
L'expression commandes du bloc de declare sera exécutée. Comment elle sera exécutée, et quels effets cela aura, dépend de la directive utilisée dans le bloc directive.
La structure declare peut aussi être utilisée dans le contexte global. Elle affecte alors tout le code qui la suit (même si le fichier avec declare a été inclus après, ça n'affecte pas le fichier parent).
<?php
// Ces déclarations sont identiques.
// Vous pouvez utiliser ceci
declare(ticks=1) {
// script entier ici
}
// ou ceci
declare(ticks=1);
// script entier ici
?>
Un tick est un événement qui intervient toutes les N
commandes bas niveau tickables, exécutées par l'analyseur dans le bloc de
declare. La valeur de N est spécifiée
par la syntaxe ticks=N dans le bloc de
directive declare.
Toutes les commandes ne sont pas tickables. Typiquement, les expressions de condition et les expressions d'arguments ne sont pas tickables.
Un événement qui intervient à chaque tick est spécifié avec la fonction register_tick_function(). Reportez-vous à l'exemple ci-dessous pour plus de détails. Notez que plus d'un événement peut intervenir par tick.
Exemple #1 Exemple d'utilisation des ticks
<?php
declare(ticks=1);
// A function called on each tick event
function tick_handler()
{
echo "tick_handler() called\n";
}
register_tick_function('tick_handler');
$a = 1;
if ($a > 0) {
$a += 2;
print($a);
}
?>
Exemple #2 Exemple d'utilisation des ticks
<?php
function tick_handler()
{
echo "tick_handler() called\n";
}
$a = 1;
tick_handler();
if ($a > 0) {
$a += 2;
tick_handler();
print($a);
tick_handler();
}
tick_handler();
?>
Voir aussi register_tick_function() et unregister_tick_function().
L'encodage d'un script peut être spécifié par script en utilisant la directive encoding.
Exemple #3 Déclaration d'un encodage pour un script
<?php
declare(encoding='ISO-8859-1');
// le code
?>
Combinée avec les espaces de nommage, la seule syntaxe valable pour declare est declare(encoding='...'); où ... est la valeur de l'encodage. declare(encoding='...') {} soulèvera une erreur d'interprétation dans le cas des espaces de nommage.
La valeur d'encodage est ignorée en PHP 5.3 à moins que PHP soit compilé avec --enable-zend-multibyte.
Notez que PHP ne vous renseignera sur l'activation ou non de --enable-zend-multibyte qu'au moyen de phpinfo().
Voir aussi zend.script_encoding.
(PHP 4, PHP 5)
Si appelée depuis une fonction, la commande return termine immédiatement la fonction, et retourne l'argument qui lui est passé. return interrompt aussi l'exécution de commande eval() ou de scripts.
Si appelée depuis l'environnement global, l'exécution du script est interrompue. Si le script courant était inclus avec la structure include ou require, alors le contrôle est rendu au script appelant. De plus, si le fichier du script courant a été inclus via l'instruction include, alors la valeur retournée sera utilisée comme résultat de l'instruction include. Si return est appelée depuis le script principal, alors l'exécution du script s'arrête. Si le script courant est auto_prepend_file ou auto_append_file dans le fichier php.ini, alors l'exécution du script s'arrête.
Pour plus d'informations, voyez retourner des valeurs.
Note: Notez que puisque return est une structure de langage, et non une fonction, les parenthèses entourant les arguments ne sont pas nécessaires. Il est classique de les oublier et vous devriez le faire car PHP travaillera moins dans ce cas.
Note: Si aucun paramètre n'est fourni, alors les parenthèses peuvent être omises et
NULLsera retourné. L'appel à la fonction return avec des parenthèses mais sans argument résultera en une alerte d'analyse.
Note: Vous ne devriez jamais utiliser les parenthèses autour de la variable retournée lorsque vous la retournez pas référence, car cela ne fonctionnera pas. Vous ne pouvez retourner que les variables par référence, et non le résultat du traitement. Si vous utilisez return ($a);, alors vous ne retournez pas une variable mais le résultat de l'expression ($a) (qui est, bien sûr, la valeur de $a).
(PHP 4, PHP 5)
require est identique à
include
mise à part le fait que lorsqu'une erreur survient, il produit également
une erreur fatale de niveau E_COMPILE_ERROR. En d'autres termes,
il stoppera le script alors que include
n'émettra qu'une alerte de niveau E_WARNING, ce qui permet au script de
continuer.
Voir la documentation de l'instruction include pour en connaître son fonctionnement.
(PHP 4, PHP 5)
L'instruction de langage include inclut et exécute le fichier spécifié en argument.
Cette documentation s'applique aussi à l'instruction de langage require.
Les fichiers sont inclus suivant le chemin du fichier fourni ; si aucun n'est fourni, l'include_path sera vérifié. Si le fichier n'est pas trouvé dans l' include_path, include vérifiera dans le dossier du script appelant et dans le dossier de travail courant avant d'échouer. L'instruction include enverra une erreur de type warning si elle ne peut trouver le fichier; ce comportement est différent de require, qui enverra une erreur de niveau fatal.
Si un chemin est défini, absolu ou relatif (commençant par une lettre de lecteur suivie de \ pour Windows, ou / pour Unix/Linux), l'include_path sera ignoré. Par exemple, si un nom de fichier commence par ../, PHP cherchera dans le dossier parent pour y trouver le fichier spécifié.
Pour plus d'informations sur la façon dont PHP gère les fichiers inclus ainsi que le chemin d'inclusion, reportez-vous à la documentation relative à l'include_path.
Lorsqu'un fichier est inclus, le code le composant hérite de la portée des variables de la ligne où l'inclusion apparaît. Toutes les variables disponibles à cette ligne dans le fichier appelant seront disponibles dans le fichier appelé, à partir de ce point. Cependant, toutes les fonctions et classes définies dans le fichier inclus ont une portée globale.
Exemple #1 Exemple avec include
vars.php
<?php
$couleur = 'verte';
$fruit = 'pomme';
?>
test.php
<?php
echo "Une $fruit $couleur"; // Une
include 'vars.php';
echo "Une $fruit $couleur"; // Une pomme verte
?>
Si l'inclusion intervient à l'intérieur d'une fonction, le code inclus sera alors considéré comme faisant partie de la fonction. Cela modifie donc le contexte de variables accessibles. Une exception à cette règle : les constantes magiques sont analysées par l'analyseur avant que l'inclusion n'intervienne.
Exemple #2 Inclusion de fichiers dans une fonction
<?php
function foo()
{
global $couleur;
include 'vars.php';
echo "Une $fruit $couleur";
}
/* vars.php est dans le contexte de foo() *
* donc $fruit n'est pas disponible hors de *
* cette fonction. $couleur l'est, car c'est *
* une variable globale */
foo(); // Une pomme verte
echo "Une $fruit $couleur"; // Une verte
?>
Il est important de noter que lorsqu'un fichier est include ou require, les erreurs d'analyse apparaîtront en HTML tout au début du fichier, et l'analyse du fichier parent ne sera pas interrompue. Pour cette raison, le code qui est dans le fichier doit être placé entre les balises habituelles de PHP.
Si les Gestionnaires d'URL sont activés dans PHP (ce qui est le cas par défaut), vous pouvez localiser le fichier avec une URL (via HTTP ou bien avec un gestionnaire adapté : voir Liste des protocoles et des gestionnaires supportés pour une liste des protocoles), au lieu d'un simple chemin local. Si le serveur distant interprète le fichier comme du code PHP, des variables peuvent être transmises au serveur distant via l'URL et la méthode GET. Ce n'est pas, à strictement parler, la même chose que d'hériter du contexte de variable. Le fichier inclus est en fait un script exécuté à distance, et son résultat est inclus dans le code courant.
Les versions Windows de PHP antérieures à la version 4.3.0 ne supportent pas l'accès aux fichiers distants avec cette fonction, même si allow_url_fopen est activé.
Exemple #3 Utiliser l'instruction include via HTTP
<?php
/* Cet exemple suppose que www.example.com est configuré pour traiter
* les fichiers .php et non pas les fichiers .txt. De plus,
* 'Work' signifie ici que les variables
* $foo et $bar sont disponibles dans le fichier inclus
*/
// Ne fonctionne pas : file.txt n'a pas été traité par www.example.com comme du PHP
include 'http://www.example.com/file.txt?foo=1&bar=2';
// Ne fonctionne pas : le script cherche un fichier nommé
// 'file.php?foo=1&bar=2' sur le système local
include 'file.php?foo=1&bar=2';
// Réussi
include 'http://www.example.com/file.php?foo=1&bar=2';
$foo = 1;
$bar = 2;
include 'file.txt'; // Ok.
include 'file.php'; // Ok.
?>
Un fichier distant peut être traité sur le serveur distant (dépendamment de l'extension du fichier et si le serveur distant exécute PHP ou non) mais il doit toujours produire un script PHP valide parce qu'il sera traité sur le serveur local. Si le fichier du serveur distant doit être traité sur place et affiché seulement, readfile() est une fonction beaucoup plus appropriée. Autrement, vous devriez bien faire attention à sécuriser le script distant afin qu'il produise un code valide et désiré.
Voir aussi travailler avec les fichiers distants, fopen() et file() pour des informations relatives.
Gestion du retour : il est possible d'exécuter une commande return dans un fichier inclus pour en terminer le traitement et retourner au fichier appelant. De plus, il est possible de retourner des valeurs des fichiers inclus. Vous pouvez prendre et traiter la valeur retournée par la fonction, comme toute autre fonction. Ce n'est cependant pas possible lors de l'inclusion de fichier distant à moins que le fichier distant ait des balises valides de début et de fin de script PHP (comme avec les fichiers locaux). Vous pouvez déclarer les variables nécessaires dans ces tags et elles seront introduites à l'endroit où le fichier a été inclus.
Comme include est une structure de langage particulière, les parenthèses ne sont pas nécessaires autour de l'argument. Faites attention lorsque vous comparez la valeur retournée.
Exemple #4 Comparaison de la valeur de retour d'une inclusion
<?php
// Ne fonctionne pas, évalué comme include(('vars.php') == 'OK'), i.e. include('')
if (include('vars.php') == 'OK') {
echo 'OK';
}
// Fonctionne
if ((include 'vars.php') == 'OK') {
echo 'OK';
}
?>
Exemple #5 include et return
return.php
<?php
$var = 'PHP';
return $var;
?>
noreturn.php
<?php
$var = 'PHP';
?>
testreturns.php
<?php
$foo = include 'return.php';
echo $foo; // affiche 'PHP'
$bar = include 'noreturn.php';
echo $bar; // affiche 1
?>
$bar a la valeur de 1 car
l'inclusion était réussie. Notez la différence entre les deux
exemples ci-dessus. Le premier utilise la commande
return
dans le fichier inclus, alors que le second ne le fait pas.
Si le fichier ne peut être inclus, FALSE est retourné et une erreur
de niveau E_WARNING est envoyée.
S'il y a des fonctions définies dans le fichier inclus, elles peuvent être utilisées dans le fichier principal si elles sont avant le return ou après. Si le fichier est inclus deux fois, PHP 5 enverra une erreur fatale car les fonctions seront déjà déclarées, alors que PHP 4 ne dira rien sur les fonctions définies après return. Il est recommandé d'utiliser include_once au lieu de vérifier si le fichier a déjà été inclus et donc de retourner conditionnellement l'inclusion du fichier.
Une autre façon d'inclure un fichier PHP dans une variable est de capturer la sortie en utilisant les fonctions de contrôle de sortie avec include. Par exemple :
Exemple #6 Utilisation de la sortie du buffer pour inclure un fichier PHP dans une chaîne
<?php
$string = get_include_contents('somefile.php');
function get_include_contents($filename) {
if (is_file($filename)) {
ob_start();
include $filename;
return ob_get_clean();
}
return false;
}
?>
Pour automatiquement inclure des fichiers dans vos scripts, voyez également les options de configuration auto_prepend_file et auto_append_file du php.ini.
Note: Comme ceci est une structure du langage, et non pas une fonction, il n'est pas possible de l'appeler avec les fonctions variables.
Voir aussi require, require_once, include_once, get_included_files(), readfile(), virtual(), et include_path.
(PHP 4, PHP 5)
L'instruction require_once est identique à require mise à part que PHP vérifie si le fichier a déjà été inclus et si c'est le cas, ne l'inclut pas une deuxième fois.
Voir la documention de include_once pour plus d'informations concernant le comportement de _once, et ce qui le différencie des instructions sans _once.
(PHP 4, PHP 5)
La structure include_once inclut et évalue le fichier spécifié durant l'exécution du script. Le comportement est similaire à include, mais la différence est que si le code a déjà été inclus, il ne le sera pas une seconde fois.
La structure include_once est utilisée de préférence lorsque le fichier va être inclus ou évalué plusieurs fois dans un script, ou bien lorsque vous voulez être sûr qu'il ne sera inclus qu'une seule fois, pour éviter des redéfinitions de fonctions ou de classes.
Voyez la structure include pour plus de détails sur son fonctionnement.
Note:
En PHP 4, la fonctionnalité _once diffère avec les systèmes insensibles à la casse (comme Windows).
Exemple #1 include_once avec un OS insensible à la casse en PHP 4
<?php
include_once "a.php"; // ceci inclut le fichier a.php
include_once "A.php"; // ceci inclut encore le fichier a.php! (uniquement en PHP 4)
?>Ce comportement a changé en PHP 5 : le chemin est normalisé d'abord, donc, le fichier C:\PROGRA~1\A.php est reconnu comme étant identique au fichier C:\Program Files\a.php et le fichier ne sera inclus qu'une seule fois.
(PHP 5 >= 5.3.0)
L'opérateur goto peut être utilisé pour continuer l'exécution du script à un autre point du programme. La cible est spécifiée par un label, suivi de deux-point, et l'instruction goto est ensuite suivie de ce label. goto n'est pas totalement sans limitations. L'étiquette cible doit être dans le même contexte et fichier, ce qui signifie qu'il n'est pas possible de changer de méthode ou de fonction, ni de se rendre dans une autre fonction. Vous pouvez sortir d'une fonction, et l'utilisation courante est alors de se servir de goto comme un break.
Exemple #1 Exemple avec goto
<?php
goto a;
echo 'Foo';
a:
echo 'Bar';
?>
L'exemple ci-dessus va afficher :
Bar
Exemple #2 Exemple de boucle avec goto
<?php
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
if($j==17) goto end;
}
}
echo "i = $i";
end:
echo 'j hit 17';
?>
L'exemple ci-dessus va afficher :
j hit 17
Exemple #3 Ce goto ne fonctionne pas
<?php
goto loop;
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
loop:
}
}
echo "$i = $i";
?>
L'exemple ci-dessus va afficher :
Fatal error: 'goto' into loop or switch statement is disallowed in script on line 2
Note:
L'opérateur goto est disponible depuis PHP 5.3.
Une fonction peut être définie en utilisant la syntaxe suivante :
Exemple #1 Pseudo code pour illustrer l'usage d'une fonction
<?php
function foo($arg_1, $arg_2, /* ..., */ $arg_n)
{
echo "Exemple de fonction.\n";
return $retval;
}
?>
Tout code PHP, correct syntaxiquement, peut apparaître dans une fonction et dans des définitions de classe.
Les noms de fonctions suivent les mêmes règles que les autres labels en PHP. Un nom de fonction valide commence par une lettre ou un souligné, suivi par un nombre quelconque de lettres, de nombres ou de soulignés. Ces règles peuvent être représentées par l'expression rationnelle suivante : [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.
Vous pourriez également avoir besoin de jeter un oeil sur Guide de nommage de l'espace utilisateur.
Les fonctions n'ont pas besoin d'être définies avant d'être utilisées, SAUF lorsqu'une fonction est définie conditionnellement, comme montré dans les deux exemples suivants.
Lorsqu'une fonction est définie de manière conditionnelle, comme dans les exemples ci-dessous, leur définition doit précéder leur utilisation.
Exemple #2 Fonctions conditionnelles
<?php
$makefoo = true;
/* Impossible d'appeler foo() ici,
car cette fonction n'existe pas.
Mais nous pouvons utiliser bar() */
bar();
if ($makefoo) {
function foo()
{
echo "Je n'existe pas tant que le programme n'est pas passé ici.\n";
}
}
/* Maitenant, nous pouvons appeler foo()
car $makefoo est maintenant vrai */
if ($makefoo) foo();
function bar()
{
echo "J'existe dès de début du programme.\n";
}
?>
Exemple #3 Fonctions dans une autre fonction
<?php
function foo()
{
function bar()
{
echo "Je n'existe pas tant que foo() n'est pas appelé.\n";
}
}
/* Impossible d'appeler bar() ici
car il n'existe pas. */
foo();
/* Maintenant, nous pouvons appeler bar(),
car l'utilisation de foo() l'a rendue
accessible. */
bar();
?>
Toutes les fonctions et classes en PHP ont une portée globale - elles peuvent être appelées à l'extérieur d'une fonction si elles ont été définies à l'intérieur et vice-versa.
PHP ne supporte pas le surchargement de fonction, ni la destruction ou la redéfinition de fonctions déjà déclarées.
Note: Les noms de fonctions sont insensibles à la casse, et il est généralement admis que les fonctions doivent être appelées avec le nom utilisé dans leur déclaration, y compris la casse.
Les listes variables d'arguments de fonction et les valeurs par défaut d'arguments sont supportés : voir les fonctions de références que sont func_num_args(), func_get_arg(), et func_get_args() pour plus d'informations.
Il est possible d'appeler des fonctions récursives en PHP. Cependant, les appels de méthodes/fonctions récursives avec 100-200 degrés de récursivité peuvent remplir la pile et ainsi, terminer le script courant.
Exemple #4 Fonctions récursives
<?php
function recursion($a)
{
if ($a < 20) {
echo "$a\n";
recursion($a + 1);
}
}
recursion(3);
?>
Des informations peuvent être passées à une fonction en utilisant une liste d'arguments, dont chaque expression est séparée par une virgule. Les arguments seront évalués depuis la gauche vers la droite.
PHP supporte le passage d'arguments par valeur (comportement par défaut), le passage par référence, et des valeurs d'arguments par défaut. Une liste variable d'arguments est également supportée, voir la documentation sur les fonctions func_num_args(), func_get_arg(), et func_get_args() pour plus d'informations.
Exemple #1 Nombre variable d'argument sous forme de tableau
<?php
function takes_array($input)
{
echo "$input[0] + $input[1] = ", $input[0]+$input[1];
}
takes_array(array(2,3));
?>
Par défaut, les arguments sont passés à la fonction par valeur (Ainsi changer la valeur d'un argument dans la fonction ne change pas sa valeur à l'extérieur de la fonction). Si vous voulez que vos fonctions puissent changer la valeur des arguments, vous devez passer ces arguments par référence.
Si vous voulez qu'un argument soit toujours passé par référence, vous pouvez ajouter un '&' devant l'argument dans la déclaration de la fonction :
Exemple #2 Passage d'arguments par référence
<?php
function add_some_extra(&$string)
{
$string .= ', et un peu plus.';
}
$str = 'Ceci est une chaîne';
add_some_extra($str);
echo $str;
?>
Vous pouvez définir comme en C++ des valeurs par défaut pour les arguments de type scalaire :
Exemple #3 Valeur par défaut des arguments de fonctions
<?php
function servir_cafe ($type = "cappuccino")
{
return "Servir un $type.\n";
}
echo servir_cafe();
echo servir_cafe(null);
echo servir_cafe("espresso");
?>
L'exemple ci-dessus va afficher :
Servir un cappuccino. Servir un. Servir un espresso.
PHP vous autorise à utiliser des tableau ainsi que le type spécial
NULL comme valeur par défaut, par exemple :
Exemple #4 Utilisation de type non scalaire comme valeur par défaut
<?php
function servir_cafe($types = array("cappuccino"), $coffeeMaker = NULL)
{
$device = is_null($coffeeMaker) ? "les mains" : $coffeeMaker;
return "Préparation d'une tasse de ".join(", ", $types)." avec $device.\n";
}
echo servir_cafe();
echo servir_cafe(array("cappuccino", "lavazza"), "une cafetière");
?>
La valeur par défaut d'un argument doit obligatoirement être une constante, et ne peut être ni une variable, ni un membre de classe, ni un appel de fonction.
Il est à noter que si vous utilisez des arguments avec valeur par défaut avec d'autres sans valeur par défaut, les premiers doivent être placés à la suite de tous les paramètres sans valeur par défaut. Sinon, cela ne fonctionnera pas. Considérons le code suivant :
Exemple #5 Les arguments à valeur par défaut doivent être en premiers : erreur
<?php
function faireunyaourt ($type = "acidophilus", $flavour)
{
return "Préparer un bol de $type $flavour.\n";
}
echo faireunyaourt("framboise"); // ne fonctionne pas comme voulu
?>
L'exemple ci-dessus va afficher :
Warning: Missing argument 2 in call to makeyogurt() in /usr/local/etc/httpd/htdocs/phptest/functest.html on line 41 Préparer un bol de framboise .
Maintenant comparons l'exemple précédent avec l'exemple suivant :
Exemple #6 Les arguments à valeur par défaut doivent être en premiers : valide
<?php
function faireunyaourt ($flavour, $type = "acidophilus")
{
return "Préparer un bol de $type $flavour.\n";
}
echo faireunyaourt ("framboise"); // fonctionne comme voulu
?>
L'exemple ci-dessus va afficher :
Préparer un bol de acidophilus framboise.
Note: Les valeurs par défaut peuvent être passées par référence.
PHP supporte les fonctions à nombre d'arguments variable. C'est très simple à utiliser, avec les fonctions func_num_args(), func_get_arg() et func_get_args().
Aucune syntaxe particulière n'est nécessaire, et la liste d'arguments doit toujours être fournie explicitement avec la définition de la fonction, et se comportera normalement.
Les valeurs sont renvoyées en utilisant une instruction de retour optionnelle. Tous les types de variables peuvent être renvoyés, tableaux et objets compris. Cela fait que la fonction finit son exécution immédiatement et passe le contrôle à la ligne appelante. Voir return pour plus d'informations.
Note:
Si return est omis, la valeur
NULLsera retournée.
Exemple #1 Utilisation de return
<?php
function carre ($num)
{
return $num * $num;
}
echo carre (4);
?>
Une fonction ne peut pas renvoyer plusieurs valeurs en même temps, mais vous pouvez obtenir le même résultat en renvoyant un tableau.
Exemple #2 Retourner un tableau d'une fonction
<?php
function petit_nombre()
{
return array (0, 1, 2);
}
list ($zero, $un, $deux) = petit_nombre();
var_dump($zero, $un, $deux);
?>
Pour retourner une référence d'une fonction, utilisez l'opérateur & aussi bien dans la déclaration de la fonction que dans l'assignation de la valeur de retour.
Exemple #3 Retourner une référence d'une fonction
<?php
function &retourne_reference()
{
return $uneref;
}
$newref =& retourne_reference();
?>
Pour plus d'informations sur les références, référez-vous à l'explication sur les références.
PHP supporte le concept de fonctions variables. Cela signifie que si le nom d'une variable est suivi de parenthèses, PHP recherchera une fonction de même nom, et essaiera de l'exécuter. Cela peut servir, entre autres, pour faire des fonctions de rappel, des tables de fonctions...
Les fonctions variables ne peuvent pas fonctionner avec les éléments de langage comme les echo, print, unset(), isset(), empty(), include, require etc. Vous devez utiliser votre propre gestion de fonctions pour utiliser un de ces éléments de langages comme fonctions variables.
Exemple #1 Exemple de fonction variable
<?php
function foo() {
echo "dans foo()<br />\n";
}
function bar($arg = '')
{
echo "Dans bar(); l'argument était '$arg'.<br />\n";
}
// Ceci est une fonction détournée de echo
function echoit($string)
{
echo $string;
}
$func = 'foo';
$func(); // Appel foo()
$func = 'bar';
$func('test'); // Appel bar()
$func = 'echoit';
$func('test'); // Appel echoit()
?>
Vous pouvez aussi appeler une méthode d'un objet en utilisant le système des fonctions variables.
Exemple #2 Exemple de méthode variable
<?php
class Foo
{
function Variable()
{
$name = 'Bar';
$this->$name(); // Appelle la méthode Bar()
}
function Bar()
{
echo "C'est Bar";
}
}
$foo = new Foo();
$funcname = "Variable";
$foo->$funcname(); // Appelle $foo->Variable()
?>
Lors de l'appel à des méthodes statiques, l'appel fonction est meilleur que l'opérateur de propriété statique :
Exemple #3 Exemple de méthode variable avec des propriétés statiques
<?php
class Foo
{
static $variable = 'static property';
static function Variable()
{
echo 'Method Variable called';
}
}
echo Foo::$variable; // Ceci affiche 'static property'. Il est nécessaire d'avoir une $variable dans le contexte.
$variable = "Variable";
Foo::$variable(); // Ceci appelle $foo->Variable(), lisant ainsi la $variable depuis le contexte.
?>
Voir aussi call_user_func(), les variables variables et function_exists().
PHP dispose de nombreuses fonctions et structures standards. Il y a aussi des fonctions qui requièrent des extensions spécifiques de PHP, sans lesquelles vous obtiendrez l'erreur fatale undefined function. Par exemple, pour utiliser les fonctions d'images, telles que imagecreatetruecolor(), vous aurez besoin du support de GD dans PHP. Ou bien, pour utiliser mysql_connect(), vous aurez besoin de l'extension MySQL. Il y a des fonctions de base qui sont incluses dans toutes les versions de PHP, telles que les fonctions de chaînes de caractères et les fonctions de variables. Utilisez phpinfo() ou get_loaded_extensions() pour savoir quelles sont les extensions qui sont compilées avec votre PHP. Notez aussi que de nombreuses extensions sont activées par défaut, et que le manuel PHP est compartimenté par extension. Voyez les chapitres de configuration, installation ainsi que les détails particuliers à chaque extension, pour savoir comment les mettre en place.
Lire et comprendre le prototype d'une fonction est décrit dans l'annexe Comment lire la définition d'une fonction (prototype). Il est important de comprendre ce qu'une fonction retourne, ou si une fonction travaille directement sur la valeur des paramètres fournis. Par exemple, str_replace() va retourner une chaîne modifiée, tandis que usort() travaille directement sur la variable passée en paramètre. Chaque page du manuel a des informations spécifiques sur chaque fonction, comme le nombre de paramètres, les évolutions de spécifications, les valeurs retournées en cas de succès ou d'échec, et la disponibilité en fonction des versions. Bien connaître ces différences, parfois subtiles, est crucial pour bien programmer en PHP.
Note: Si les paramètres donnés à une fonction ne sont pas corrects, comme le fait de passer un tableau alors qu'une chaîne de caractères est attendue, la valeur retournée de la fonction est indéfinie. Dans ce cas, la fonction retournera la plupart du temps une valeur
NULLmais ce n'est juste qu'une convention et ne peut être considéré comme une certitude.
Voir aussi function_exists(), l'index des fonctions, get_extension_funcs() et dl().
Les fonctions anonymes, aussi appelées fermetures ou closures permettent la création de fonctions sans préciser leur nom. Elles sont particulièrement utiles comme fonctions de rappel, mais leur utilisation n'est pas limitée à ce seul usage.
Exemple #1 Exemples avec des fonctions anonymes
<?php
echo preg_replace_callback('~-([a-z])~', function ($match) {
return strtoupper($match[1]);
}, 'bonjour-le-monde');
?>
Les fonctions anonymes peuvent aussi être utilisées comme valeurs de variables. PHP va automatiquement convertir ces expressions en objets Closure. Assigner une fermeture à une variable est la même chose qu'un assignement classique, y compris pour le point-virgule final.
Exemple #2 Assignation de fonction anonyme à une variable
<?php
$greet = function($name)
{
printf("Bonjour %s\r\n", $name);
};
$greet('World');
$greet('PHP');
?>
Les fonctions anonymes peuvent hériter des variables du contexte de leur parent. Ces variables doivent alors être déclarées dans la signature de la fonction. L'héritage du contexte parent n'est pas la même chose que les variables de l'environnement global. Les variables globales existent dans le contexte global, qui est le même, quelle que que soit la fonction qui s'exécute. Le contexte parent d'une fonction anonyme est la fonction dans laquelle la fonction a été déclarée (pas nécessairement celle qui appelle). Voyez l'exemple ci-dessous :
Exemple #3 Fonctions anonymes et contexte
<?php
// Un panier d'achat simple, qui contient une liste de produits
// choisis et la quantité désirée de chaque produit. Il inclut
// une méthode qui calcule le prix total des éléments dans le panier
// en utilisant une fonction de rappel anonyme.
class Panier
{
const PRICE_BEURRE = 1.00;
const PRICE_LAIT = 3.00;
const PRICE_OEUF = 6.95;
protected $products = array();
public function add($product, $quantity)
{
$this->products[$product] = $quantity;
}
public function getQuantity($product)
{
return isset($this->products[$product]) ? $this->products[$product] :
FALSE;
}
public function getTotal($tax)
{
$total = 0.00;
$callback =
function ($quantity, $product) use ($tax, &$total)
{
$pricePerItem = constant(__CLASS__ . "::PRICE_" .
strtoupper($product));
$total += ($pricePerItem * $quantity) * ($tax + 1.0);
};
array_walk($this->products, $callback);
return round($total, 2);
}
}
$mon_panier = new Panier;
// Ajout d'élément au panier
$mon_panier->add('beurre', 1);
$mon_panier->add('lait', 3);
$mon_panier->add('oeuf', 6);
// Affichage du prix avec 5.5% de TVA
print $mon_panier->getTotal(0.055) . "\n";
?>
Les fonctions anonymes sont implémentées en utilisant la classe Closure.
| Version | Description |
|---|---|
| 5.4.0 | $this peut désormais être utilisé dans les fonctions anonymes. |
| 5.3.0 | Les fonctions anonymes deviennent disponibles. |
Note: Il est possible d'utiliser les fonctions func_num_args(), func_get_arg() et func_get_args() dans une fonction anonyme.
Depuis PHP 5, le modèle objet a été réécrit pour permettre de meilleures performances et offrir plus de fonctionnalités. Cette réécriture a été une des modifications majeures par rapport à PHP 4. PHP 5 a donc un modèle objet complet.
Parmi les fonctionnalités offertes par PHP 5, on peut citer la visibilité dans les classes, les classes abstract et les classes final mais aussi les méthodes magiques, les interfaces, le clônage et le typage (typehinting).
PHP gère les objets de la même façon, qu'ils soient des références ou des gestionnaires, ce qui signifie que chaque variable contient une référence vers l'objet plutôt qu'une copie de l'objet complet. Reportez-vous à la documentation Objets et Références pour plus de détails.
Vous pourriez également avoir besoin de jeter un oeil sur Guide de nommage de l'espace utilisateur.
Une définition de classe basique commence par le mot-clé class, suivi du nom de la classe. Suit une paire d'accolades contenant la définition des propriétés et des méthodes.
Le nom de la classe peut être quelconque à condition que ce ne soit pas un mot réservé en PHP. Un nom de classe valide commence par une lettre ou un underscore, suivi de nombres ou de lettres ou d'underscores. Si on devait l'exprimer sous forme d'expression régulière, il s'agirait de [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.
Une classe peut contenir ses propres constantes, variables (appelées "propriétés" ou "attributs"), et fonctions (appelées "méthodes").
Exemple #1 Définition typique d'une classe
<?php
class SimpleClass
{
// déclaration des propriétés
public $var = 'a default value';
// déclaration des méthodes
public function displayVar() {
echo $this->var;
}
}
?>
Une pseudo-variable $this est disponible lorsqu'une méthode est appelée depuis un contexte objet. $this est une référence à l'objet appelé (habituellement, l'objet auquel la méthode appartient, mais ce peut être un autre objet si la méthode est appelée de manière statique depuis le contexte d'un autre objet).
Exemple #2 Quelques exemples de la pseudo-variable $this
<?php
class A
{
function toto()
{
if (isset($this)) {
echo '$this est définie (';
echo get_class($this);
echo ")\n";
} else {
echo "\$this n'est pas définie.\n";
}
}
}
class B
{
function titi()
{
// Note: la ligne suivante émet une erreur si E_STRICT est activé.
A::toto();
}
}
$a = new A();
$a->toto();
// Note: la ligne suivante émet une erreur si E_STRICT est activé.
A::toto();
$b = new B();
$b->titi();
// Note: la ligne suivante émet une erreur si E_STRICT est activé.
B::titi();
?>
L'exemple ci-dessus va afficher :
$this est définie (A) $this n'est pas définie. $this est définie (B) $this n'est pas définie.
Pour créer une instance d'une classe, le mot-clé new doit être utilisé. Un objet sera alors créé à moins qu'il ait un constructeur défini qui lance une exception en cas d'erreur. Les classes doivent être définies avant l'instanciation (dans certains cas, c'est impératif).
Si une chaîne de caractères contenant un nom de classe est utilisée avec new, une nouvelle instance de cette classe sera créée. Si elle est dans un espace de noms, son nom pleinement qualifié doit être utilisé.
Exemple #3 Création d'une instance
<?php
$instance = new SimpleClass();
// Ceci peut également être réalisé avec une variable :
$className = 'Foo';
$instance = new $className(); // Foo()
?>
Dans le contexte de la classe, il est possible de créer un nouvel objet avec new self et new parent.
Lors de l'assignation d'une instance déjà créée d'une classe à une variable, la nouvelle variable accédera à la même instance de l'objet assigné. Ce comportement est le même que lors du passage d'une instance à une fonction. Une copie d'un objet déjà créé peut être effectuée par clonage.
Exemple #4 Assignation d'un objet
<?php
$instance = new SimpleClass();
$assigned = $instance;
$reference =& $instance;
$instance->var = '$assigned aura cette valeur';
$instance = null; // $instance et $reference deviennent null
var_dump($instance);
var_dump($reference);
var_dump($assigned);
?>
L'exemple ci-dessus va afficher :
NULL
NULL
object(SimpleClass)#1 (1) {
["var"]=>
string(30) "$assigned aura cette valeur"
}
PHP 5.3.0 a introduit de nouvelles manières de créer des objets:
Exemple #5 Créer de nouveaux objets
<?php
class Test
{
static public function getNew()
{
return new static;
}
}
class Child extends Test
{}
$obj1 = new Test();
$obj2 = new $obj1;
var_dump($obj1 !== $obj2);
$obj3 = Test::getNew();
var_dump($obj3 instanceof Test);
$obj4 = Child::getNew();
var_dump($obj4 instanceof Child);
?>
L'exemple ci-dessus va afficher :
bool(true) bool(true) bool(true)
Une classe peut hériter des méthodes et des membres d'une autre classe en utilisant le mot-clé extends dans la déclaration. Il n'est pas possible d'étendre de multiples classes : une classe peut uniquement hériter d'une seule classe de base.
Les méthodes et membres hérités peuvent être surchargés en les redéclarant avec le même nom que dans la classe parente. Cependant, si la classe parente a défini la méthode comme final, alors celle-ci ne sera pas surchargeable. Il est possible d'accéder à une méthode ou un membre parent avec l'opérateur parent::
Lors de la surcharge de méthodes, la signature devrait rester la même sinon
PHP génèrera une erreur de niveau E_STRICT. Ceci ne s'applique pas
au constructeur, qui accepte la surcharge avec des paramètres différents.
Exemple #6 Héritage d'une classe simple
<?php
class ExtendClass extends SimpleClass
{
// Redéfinition de la méthode parente
function displayVar()
{
echo "Classe étendue\n";
parent::displayVar();
}
}
$extended = new ExtendClass();
$extended->displayVar();
?>
L'exemple ci-dessus va afficher :
Classe étendue une valeur par défaut
Les variables au sein d'une classe sont appelées "propriétés". On peut également les retrouver sous la dénomination "attributs", "membres" ou "champs", mais nous conservervons l'appellation "propriété" pour cette documentation. Elles sont définies en utilisant un des mots-clés public, protected ou private, suivi d'une déclaration classique de variable. Cette déclaration peut être une initialisation, alors elle doit être initialisée à une valeur constante, c'est à dire que cette valeur doit pouvoir être évaluée durant la compilation et ne pas dépendre de l'exécution du code pour pouvoir être évaluée.
Voir Visibilité pour plus d'informations sur la signification public, protected et private.
Note:
Afin de maintenir la rétrocompatibilité avec PHP 4, PHP 5 continue d'accepter l'usage du mot-clé var pour la déclaration de propriétés en remplacement de (ou avec) public, protected et private. Cependant, var n'est plus requis par le modèle objet de PHP 5. Des versions PHP 5.0 à 5.1.3, l'usage de var était considéré comme obsolète et déclenchait un avertissement de niveau
E_STRICT, mais depuis PHP 5.1.3 l'usage n'est plus obsolète et ne déclenche plus d'avertissement.Si vous déclarez une propriété en utilisant var au lieu de public, protected ou private, alors PHP 5 traitera la propriété comme public.
Au sein des méthodes de classes, les propriétés, constantes et méthodes peuvent être appellées en utilisant la forme $this->property (où property est le nom de la propriété), à moins que l'appel se fasse sur une propriété statique dans une méthode de classe statique, auquel cas l'accès se fait en utilisant la forme self::$property. Voir Statique pour plus d'informations.
La pseudo-variable $this est disponible au sein de n'importe quelle méthode lorsque cette méthode est appelée depuis un objet. $this est une référence à l'objet appelant (en général l'objet auquel la méthode appartient, ou un autre objet si la méthode est appelée de façon statique depuis un autre objet).
Exemple #1 Déclarations de propriétés
<?php
class SimpleClass
{
// Déclarations invalides de propriété:
public $var1 = 'hello ' . 'world';
public $var2 = 1+2;
public $var3 = self::myStaticMethod();
public $var4 = $myVar;
// Déclarations valides de propriétés;
public $var5 = myConstant;
public $var6 = array(true, false);
// Autorisé depuis PHP 5.3.0
public $var7 = <<<EOD
hello world
EOD;
}
?>
Note:
Il existe des fonctions qui permettent de gérer des classes et des objets. Voir Fonctions Classes/Objets.
Comme la syntaxe heredoc, la syntaxe nowdoc peut être utilisée dans n'importe quel contexte statique, y compris la déclaration de propriétés.
Exemple #2 Exemple d'utilisation de la syntaxe nowdoc pour initialiser une propriété
<?php
class foo {
// Depuis PHP 5.3.0
public $bar = <<<'EOT'
bar
EOT;
}
?>
Note:
Le support de la syntaxe nowdoc à été ajouté à PHP 5.3.0.
Il est possible de définir des valeurs constantes à l'intérieur d'une classe, qui ne seront pas modifiables. Les constantes diffèrent des variables normales du fait qu'on n'utilise pas le symbole $ pour les déclarer ou les utiliser.
La valeur doit être une expression constante, pas (par exemple) une variable, une propriété, le résultat d'une opération mathématique ou un appel de fonction.
Il est aussi possible pour les interfaces d'avoir des constantes. Regardez la documentation des interfaces pour quelques exemples.
Depuis PHP 5.3.0, il est possible de référencer une classe en utilisant une variable. La valeur de la variable ne peut être un mot-clé (e.g. self, parent et static).
Exemple #1 Définition et utilisation d'une constante de classe
<?php
class MyClass
{
const constant = 'valeur constante';
function showConstant() {
echo self::constant . "\n";
}
}
echo MyClass::constant . "\n";
$classname = "MyClass";
echo $classname::constant . "\n"; // Depuis PHP 5.3.0
$class = new MyClass();
$class->showConstant();
echo $class::constant."\n"; // Depuis PHP 5.3.0
?>
Exemple #2 Exemple de données statiques
<?php
class foo {
// Depuis PHP 5.3.0
const bar = <<<'EOT'
bar
EOT;
}
?>
Tout comme heredocs, nowdocs peut être utilisée dans n'importe quel contexte de données statiques.
Note:
Le support de Nowdoc a été ajouté en PHP 5.3.0.
De nombreux développeurs qui créent des applications orientées objet, créent un fichier source par définition de classe. L'inconvénient majeur de cette méthode est d'avoir à écrire une longue liste d'inclusions de fichier de classes au début de chaque script : une inclusion par classe.
En PHP 5, ce n'est plus nécessaire. Vous pouvez définir la fonction __autoload() qui va automatiquement être appelée si une classe n'est pas encore définie au moment de son utilisation. Grâce à elle, vous avez une dernière chance pour inclure une définition de classe, avant que PHP ne lance une erreur.
La fonction spl_autoload_register() fournit une alternative plus flexible pour le chargement automatique des classes. Pour cette raison, l'utilisation de la fonction __autoload() n'est plus encouragé et devrait devenir obsolète, voire être supprimée dans le futur.
Note:
Avant PHP 5.3.0, les exceptions lancées depuis la fonction __autoload ne pouvaient pas être interceptées par un bloc catch et provoquaient une erreur fatale. Depuis PHP 5.3.0+, elles peuvent être interceptées danscatch, à une précision près : Si vous lancez une exception personnalisée, alors la classe de cette exception doit être disponible. La fonction __autoload doit pouvoir être utilisée récursivement pour charger automatiquement la classe de l'exception personnalisée.
Note:
L'auto-chargement n'est pas disponible si vous utilisez PHP en mode interactif CLI.
Note:
Si le nom de la classe est utilisé, e.g. dans la fonction call_user_func(), alors il peut contenir des caractères dangereux comme ../. Il est recommandé de ne pas utiliser d'entrées utilisateur dans de telle fonction, ou, au moins, vérifier l'entrée dans la fonction __autoload().
Exemple #1 Exemple avec __autoload()
Cet exemple tente de charger les classes MaClasse1 et MaClasse2, dans les fichiers MaClasse1.php et MaClasse2.php respectivement.
<?php
function __autoload($class_name) {
include $class_name . '.php';
}
$obj = new MaClasse1();
$obj2 = new MaClasse2();
?>
Exemple #2 Autre exemple d'auto-chargement
Cet exemple tente de charger l'interface ITest.
<?php
function __autoload($name) {
var_dump($name);
}
class Foo implements ITest {
}
/*
string(5) "ITest"
Fatal error: Interface 'ITest' not found in ...
*/
?>
Exemple #3 Auto-chargement avec gestion des exceptions en PHP 5.3.0+
Cet exemple lance une exception et montre comment la traiter avec les blocs try/catch.
<?php
function __autoload($name) {
echo "Tentative de chargement de $name.\n";
throw new Exception("Impossible de charger $name.");
}
try {
$obj = new NonLoadableClass();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
?>
L'exemple ci-dessus va afficher :
Tentative de chargement de NonLoadableClass. Impossible de charger NonLoadableClass.
Exemple #4 Auto-chargement avec gestion des exceptions en PHP 5.3.0+. Pas d'exception personnalisée
Cet exemple lance une exception pour une classe non-chargeable, en utilisant une exception personnalisée.
<?php
function __autoload($name) {
echo "Tentative de chargement de $name.\n";
throw new MissingException("Impossible de charger $name.");
}
try {
$obj = new NonLoadableClass();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
?>
L'exemple ci-dessus va afficher :
Tentative de chargement de NonLoadableClass. Tentative de chargement de MissingException. Fatal error: Class 'MissingException' not found in testMissingException.php on line 4
PHP permet aux développeurs de déclarer des constructeurs pour les classes. Les classes qui possèdent une méthode constructeur appellent cette méthode à chaque création d'une nouvelle instance de l'objet, ce qui est intéressant pour toutes les initialisations dont l'objet a besoin avant d'être utilisé.
Note: Les constructeurs parents ne sont pas appelés implicitement si la classe enfant définit un constructeur. Si vous voulez utiliser un constructeur parent, il sera nécessaire de faire appel à parent::__construct().
Exemple #1 Exemple d'utilisation des nouveaux constructeurs unifiés
<?php
class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor\n";
}
}
$obj = new BaseClass();
$obj = new SubClass();
?>
Pour des raisons de compatibilité ascendante, si PHP ne peut pas trouver une fonction __construct() pour une classe donnée, il cherchera une fonction constructeur représentée, comme dans l'ancien style (PHP < 5), par le nom de la classe. Effectivement, cela signifie que le seul cas où il pourrait y avoir un problème de compatibilité est celui où votre classe contiendrait une méthode nommée __construct() et que vous en ayez un autre usage.
A la différence des autres méthodes, PHP ne génèrera pas d'erreur de niveau
E_STRICT lorsque __construct() est
surchargé avec des paramètres différents du __construct() parent.
Depuis PHP 5.3.3, les méthodes ayant le même nom que la classe dans laquelle elle se trouve ne sont plus traitées comme des constructeur, si la classe considérée se situe dans un espace de noms. Ceci n'affecte pas les classes sans espace de noms.
Exemple #2 Constructeurs dans les classes dans des espaces de noms
<?php
namespace Foo;
class Bar {
public function Bar() {
// Traitée comme un constructeur dans PHP 5.3.0-5.3.2
// Traitée comme une méthode normale depuis PHP 5.3.3
}
}
?>
PHP 5 introduit un concept de destructeur similaire aux autres langages orientés objet, comme le C++. La méthode destructeur est appelée dès qu'il n'y a plus d'autres références sur des objets, ou dans n'importe quel ordre de la séquence d'arrêt.
Exemple #3 Exemple avec un Destructeur
<?php
class MyDestructableClass {
function __construct() {
print "In constructor\n";
$this->name = "MyDestructableClass";
}
function __destruct() {
print "Destruction de " . $this->name . "\n";
}
}
$obj = new MyDestructableClass();
?>
Tout comme le constructeur, le destructeur parent n'est pas appelé implicitement par le moteur. Pour exécuter le destructeur parent, vous devez appeler explicitement la fonction parent::__destruct dans le corps du destructeur.
Le destructeur sera appelé même si l'exécution du script est stoppé en utilisant la fonction exit(). Appeler la fonction exit() dans un destructeur permettra de ne pas exécuter les autres routines d'arrêt.
Note:
Les destructeurs appelées durant l'arrêt du script ont déjà envoyés les en-têtes HTTP. Le dossier de travail dans la phase du script d'arrêt peut être différent avec d'autres APIs (e.g. Apache).
Note:
Tenter de lancer une exception depuis un destructeur (appelé à la fin du script) émet une erreur fatale.
La visibilité d'une propriété ou d'une méthode peut être définie en préfixant la déclaration avec un mot-clé : public, protected ou private. Les éléments déclarés publics peuvent être utilisés par n'importe quelle partie du programme. L'accès aux éléments protégés est limité aux classes et parents hérités (et à la classe qui a défini l'élément). L'accès aux éléments privés est uniquement réservé à la classe qui les a définis.
Les propriétés des classes doivent être définies comme publiques, protégées ou privées. Si la propriété est déclarée avec le mot var, elle sera alors définie de façon publique.
Exemple #1 Déclaration des propriétés
<?php
/**
* Définition de MyClass
*/
class MyClass
{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj = new MyClass();
echo $obj->public; // Fonctionne
echo $obj->protected; // Erreur fatale
echo $obj->private; // Erreur fatale
$obj->printHello(); // Affiche Public, Protected et Private
/**
* Définition de MyClass2
*/
class MyClass2 extends MyClass
{
// On peut redéclarer les éléments publics ou protégés, mais pas ceux privés
protected $protected = 'Protected2';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj2 = new MyClass2();
echo $obj2->public; // Fonctionne
echo $obj2->private; // Indéfini
echo $obj2->protected; // Erreur fatale
$obj2->printHello(); // Affiche Public, Protected2 et Indéfini
?>
Note: La méthode de déclaration de variable en PHP 4 avec le mot-clé var est toujours supportée pour des raisons de compatibilité (en tant que synonyme du mot-clé public). Avant PHP 5.1.3, son utilisation génère une erreur de niveau
E_STRICT.
Les méthodes des classes peuvent être définies en tant que publiques, privées ou protégées. Les méthodes sans déclaration seront automatiquement définies comme étant publiques.
Exemple #2 Déclaration d'une méthode
<?php
/**
* Définition de MyClass
*/
class MyClass
{
// Déclare un constructeur public
public function __construct() { }
// Déclaration d'une méthode publique
public function MyPublic() { }
// Déclaration d'une méthode protégée
protected function MyProtected() { }
// Déclaration d'une méthode privée
private function MyPrivate() { }
// Celle-ci sera publique
function Foo()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();
}
}
$myclass = new MyClass;
$myclass->MyPublic(); // Fonctionne
$myclass->MyProtected(); // Erreur fatale
$myclass->MyPrivate(); // Erreur fatale
$myclass->Foo(); // Public, Protected et Private fonctionnent
/**
* Définition de MyClass2
*/
class MyClass2 extends MyClass
{
// Celle-ci sera publique
function Foo2()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate(); // Erreur fatale
}
}
$myclass2 = new MyClass2;
$myclass2->MyPublic(); // Fonctionne
$myclass2->Foo2(); // Public et Protected fonctionnent, non pas Private
class Bar
{
public function test() {
$this->testPrivate();
$this->testPublic();
}
public function testPublic() {
echo "Bar::testPublic\n";
}
private function testPrivate() {
echo "Bar::testPrivate\n";
}
}
class Foo extends Bar
{
public function testPublic() {
echo "Foo::testPublic\n";
}
private function testPrivate() {
echo "Foo::testPrivate\n";
}
}
$myFoo = new foo();
$myFoo->test(); // Bar::testPrivate
// Foo::testPublic
?>
Les objets de mêmes types ont un accès aux membres privés et protégés même s'ils ne sont pas dans la même instance. Ceci est dû au fait que les détails spécifiques de l'implémentation sont déjà connus en interne par ces objets.
Exemple #3 Accès aux membres privés d'un type d'objet identique
<?php
class Test
{
private $foo;
public function __construct($foo)
{
$this->foo = $foo;
}
private function bar()
{
echo 'Accès à la méthode privée.';
}
public function baz(Test $other)
{
// Nous pouvons modifier la propriété privée :
$other->foo = 'Bonjour';
var_dump($other->foo);
// Nous pouvons également appeler la méthode privée :
$other->bar();
}
}
$test = new Test('test');
$test->baz(new Test('other'));
?>
L'exemple ci-dessus va afficher :
string(5) "Bonjour" Accès à la méthode privée.
L'héritage fait partie des principes de la programmation orientée objet, et PHP l'implémente dans son modèle objet. L'héritage affecte les relations entre les classes et les objets.
Par exemple, lorsque vous étendez une classe, la classe fille hérite de toutes les méthodes publiques et protégées de la classe parente. Tant qu'une classe n'écrase pas ces méthodes, elles conservent leurs fonctionnalités d'origine.
L'héritage est donc très utile pour définir et abstraire certaines fonctionnalités communes à plusieurs classes, plusieurs objets, tout en permettant l'ajout de fonctionnalités propres dans les classes enfants sans réimplémenter en leur sein les fonctionnalités communes.
Note:
A moins que l'autoload ne soit utilisé, les classes doivent être connues avant d'être utilisées. Les classes mères doivent être définies avant l'écriture d'un héritage. Cette règle générale s'applique dans le cas d'héritage ou d'implémentation d'interfaces.
Exemple #1 Exemple d'héritage
<?php
class foo
{
public function printItem($string)
{
echo 'Foo: ' . $string . PHP_EOL;
}
public function printPHP()
{
echo 'PHP est super' . PHP_EOL;
}
}
class bar extends foo
{
public function printItem($string)
{
echo 'Bar: ' . $string . PHP_EOL;
}
}
$foo = new foo();
$bar = new bar();
$foo->printItem('baz'); // Affiche: 'Foo: baz'
$foo->printPHP(); // Affiche: 'PHP est super'
$bar->printItem('baz'); // Affiche: 'Bar: baz'
$bar->printPHP(); // Affiche: 'PHP est super'
?>
L'opérateur de résolution de portée (aussi appelé Paamayim Nekudotayim) ou, en termes plus simples, le symbole "double deux-points" (::), fournit un moyen d'accéder aux membres statics ou constants.
Lorsque vous référencez ces éléments en dehors de la définition de la classe, utilisez le nom de la classe.
Depuis PHP 5.3.0, il est possible de référencer une classe en utilisant une variable. La valeur de la variable ne peut être un mot-clé (e.g. self, parent et static).
Paamayim Nekudotayim peut sembler un choix étrange pour un double deux-points. Cependant, au moment de l'écriture du Zend Engine 0.5 (fourni avec PHP 3), c'est le nom choisi par le groupe Zend. En fait, cela signifie un double deux-points... en hébreu !
Exemple #1 :: en dehors de la définition de la classe
<?php
class MyClass {
const CONST_VALUE = 'Une valeur constante';
}
$classname = 'MyClass';
echo $classname::CONST_VALUE; // Depuis PHP 5.3.0
echo MyClass::CONST_VALUE;
?>
Trois mots-clé spéciaux, self, parent, et static sont utilisés pour accéder aux proriétés ou aux méthodes depuis la définition de la classe.
Exemple #2 :: depuis la définition de la classe
<?php
class OtherClass extends MyClass
{
public static $my_static = 'variable statique';
public static function doubleColon() {
echo parent::CONST_VALUE . "\n";
echo self::$my_static . "\n";
}
}
$classname = 'OtherClass';
echo $classname::doubleColon(); // Depuis PHP 5.3.0
OtherClass::doubleColon();
?>
Lorsqu'une classe étendue redéfinit une méthode de la classe parente, PHP n'appellera pas la méthode d'origine. Il appartient à la méthode dérivée d'appeler la méthode d'origine en cas de besoin. Cela est également valable pour les définitions des constructeurs et destructeurs, les surcharges et les méthodes magiques.
Exemple #3 Appel d'une méthode parente
<?php
class MyClass
{
protected function myFunc() {
echo "MyClass::myFunc()\n";
}
}
class OtherClass extends MyClass
{
// Dépassement de la définition parent
public function myFunc() {
// Mais appel de la fonction parent
parent::myFunc();
echo "OtherClass::myFunc()\n";
}
}
$class = new OtherClass();
$class->myFunc();
?>
Voir aussi quelques exemples d'appels statiques.
Le fait de déclarer des propriétés ou des méthodes comme statics vous permet d'y accéder sans avoir besoin d'instancier la classe. On ne peut accéder à une propriété déclarée comme statique avec l'objet instancié d'une classe (bien qu'une méthode statique le puisse).
Si aucune déclaration de visibilité n'est spécifiée, alors la propriété ou la méthode sera automatiquement spécifiée comme public.
Comme les méthodes statiques peuvent être appelées sans objet, la pseudo-variable $this n'est pas disponible dans la méthode déclarée en tant que statique.
On ne peut pas accéder à des propriétés statiques à travers l'objet en utilisant l'opérateur ->.
L'appel statique de méthodes non-statiques génère une erreur de niveau
E_STRICT.
Comme n'importe quelle autre variable PHP statique, les propriétés statiques ne peuvent être initialisées qu'en utilisant un littéral ou une constante; les expressions ne sont pas permises. Ainsi, vous pouvez initialiser une propriété statique avec un entier ou un tableau, mais ni avec une autre variable, ni avec une valeur de retour, ni avec un objet.
Depuis PHP 5.3.0, il est possible de référencer la classe en utilisant une variable. La valeur de la variable ne peut être un mot-clé (e.g. self, parent et static).
Exemple #1 Exemple avec une propriété statique
<?php
class Foo
{
public static $my_static = 'foo';
public function staticValue() {
return self::$my_static;
}
}
class Bar extends Foo
{
public function fooStatic() {
return parent::$my_static;
}
}
print Foo::$my_static . "\n";
$foo = new Foo();
print $foo->staticValue() . "\n";
print $foo->my_static . "\n"; // propriété my_static non définie
print $foo::$my_static . "\n";
$classname = 'Foo';
print $classname::$my_static . "\n"; // Depuis PHP 5.3.0
print Bar::$my_static . "\n";
$bar = new Bar();
print $bar->fooStatic() . "\n";
?>
Exemple #2 Exemple avec une méthode statique
<?php
class Foo
{
public static function aStaticMethod() {
// ...
}
}
Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod(); // Depuis PHP 5.3.0
?>
PHP 5 propose les classes et les méthodes abstraites. Les classes définies comme abstraites ne doivent pas être instanciées, et toutes les classes contenant au moins une méthode abstraite doivent aussi être abstraites. Les méthodes définies comme abstraites déclarent simplement la signature de la méthode - elles ne peuvent définir leur implémentation.
Lors de l'héritage d'une classe abstraite, toutes les méthodes marquées comme abstraites dans la déclaration de la classe parente doivent être définies par l'enfant ; de plus, ces méthodes doivent être définies avec la même visibilité, ou une visibilité moins restreinte. Par exemple, si la méthode abstraite est définie comme protégée, l'implémentation de la fonction doit être définie comme protégée ou publique, mais non privée. Par ailleurs, les signatures de ces méthodes doivent correspondre, i.e. leurs types et le nombre d'arguments requis doivent être les mêmes. Ceci s'applique aussi aux constructeurs depuis PHP 5.4.0. Avant la version 5.4.0., les signatures des constructeurs pouvaient être différentes.
Exemple #1 Exemple de classe abstraite
<?php
abstract class AbstractClass
{
// Force la classe étendue à définir cette méthode
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// méthode commune
public function printOut() {
print $this->getValue() . "\n";
}
}
class ConcreteClass1 extends AbstractClass
{
protected function getValue() {
return "ConcreteClass1";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass1";
}
}
class ConcreteClass2 extends AbstractClass
{
public function getValue() {
return "ConcreteClass2";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass2";
}
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."\n";
$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') ."\n";
?>
L'exemple ci-dessus va afficher :
ConcreteClass1 FOO_ConcreteClass1 ConcreteClass2 FOO_ConcreteClass2
L'ancien code qui n'a pas de classes définies par l'utilisateur ou de fonctions nommées 'abstract' peut continuer de fonctionner dans modification.
Les interfaces objet permettent de créer du code qui spécifie quelles méthodes une classe doit implémenter.
Les interfaces sont définies en utilisant le mot-clé interface, de la même façon qu'une classe standard mais sans aucun contenu de méthode.
Toutes les méthodes déclarées dans une interface doivent être publiques.
Pour implémenter une interface, l'opérateur implements est utilisé. Toutes les méthodes de l'interface doivent être implémentées dans une classe ; si ce n'est pas le cas, une erreur fatale sera émise. Les classes peuvent implémenter plus d'une interface en séparant chaque interface par une virgule.
Note:
Une classe ne peut implémenter deux interfaces qui partagent des noms de fonctions, puisque cela causerait une ambiguïté.
Note:
Les interfaces peuvent être étendues comme des classes en utilisant l'opérateur extends.
Note:
La classe implémentant l'interface doit utiliser la même signature de méthode que celle définie dans l'interface. Si vous ne le faîtes pas, une erreur fatale sera émise.
Les interfaces peuvent contenir des constantes. Les constantes d'interfaces fonctionnent exactement comme les constantes de classe à l'exception qu'elles ne peuvent pas être écrasées par des classes ou des interfaces qui en héritent.
Exemple #1 Exemple d'interface
<?php
// Declaration de l'interface 'iTemplate'
interface iTemplate
{
public function setVariable($name, $var);
public function getHtml($template);
}
// Implémentation de l'interface
// Ceci va fonctionner
class Template implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
public function getHtml($template)
{
foreach($this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}
return $template;
}
}
// Ceci ne fonctionnera pas
// Fatal error: Class BadTemplate contains 1 abstract methods
// and must therefore be declared abstract (iTemplate::getHtml)
class BadTemplate implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
}
?>
Exemple #2 Les interfaces extensibles
<?php
interface a
{
public function foo();
}
interface b extends a
{
public function baz(Baz $baz);
}
// Ceci fonctionnera
class c implements b
{
public function foo()
{
}
public function baz(Baz $baz)
{
}
}
// Ceci ne fonctionnera pas et soulèvera une erreur fatale
class d implements b
{
public function foo()
{
}
public function baz(Foo $foo)
{
}
}
?>
Exemple #3 L'héritage de plusieurs interfaces
<?php
interface a
{
public function foo();
}
interface b
{
public function bar();
}
interface c extends a, b
{
public function baz();
}
class d implements c
{
public function foo()
{
}
public function bar()
{
}
public function baz()
{
}
}
?>
Exemple #4 Les interfaces avec des constantes
<?php
interface a
{
const b = 'Constante de l\'interface';
}
// Affiche: Constante de l'interface
echo a::b;
// Ceci ne fonctionnera pas de toutes façons vu qu'il n'est pas autorisé
// d'écraser des constantes.
class b implements a
{
const b = 'Constante de classe';
}
?>
Une interface, avec le typage, fournit une bonne façon de vous assurer qu'un objet particulier contient des méthodes particulières. Reportez-vous à l'opérateur instanceof et au typage.
Depuis PHP 5.4.0, PHP supporte une manière de réutiliser le code appelée Traits.
Les traits sont un mécanisme de réutilisation de code dans un langage à héritage simple tel que PHP. Un trait tente de réduire certaines limites de l'héritage simple en autorisant le développeur à réutiliser un certain nombre de méthodes dans des classes indépendantes. La sémantique entre les classes et les traits réduit la complexité et évite les problèmes typiques de l'héritage multiple et des Mixins.
Un trait est semblable à une classe, mais il ne sert qu'à grouper des fonctionnalités d'une manière intéressante. C'est un ajout à l'héritage traditionnel qui autorise la composition horizontale de comportements, c'est à dire l'utilisation de méthodes de classe sans besoin d'héritage.
Exemple #1 Exemple d'utilisation de Trait
<?php
trait ezcReflectionReturnInfo {
function getReturnType() { /*1*/ }
function getReturnDescription() { /*2*/ }
}
class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* ... */
}
class ezcReflectionFunction extends ReflectionFunction {
use ezcReflectionReturnInfo;
/* ... */
}
?>
Une méthode héritée de classe est écrasée par une méthode issue d'un Trait. L'ordre de précédence fait en sorte que les méthodes de la classe courante surchargent les méthodes issues d'un Trait, elles-mêmes surchargeant les méthodes héritées.
Exemple #2 Exemple avec l'ordre de précédence
La méthode héritée depuis la classe de base est écrasée par celle provenant du Trait. Ce n'est pas le cas des méthodes réelles, écrites dans la classe de base.
<?php
class Base {
public function sayHello() {
echo 'Hello ';
}
}
trait SayWorld {
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
class MyHelloWorld extends Base {
use SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
L'exemple ci-dessus va afficher :
Hello World!
Exemple #3 Autre exemple de la précédence
<?php
trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
}
class TheWorldIsNotEnough {
use HelloWorld;
public function sayHello() {
echo 'Hello Universe!';
}
}
$o = new TheWorldIsNotEnough();
$o->sayHello();
?>
L'exemple ci-dessus va afficher :
Hello Universe!
Une classe peut utiliser de multiples Traits en les déclarant avec le mot-clé use, séparés par des virgules.
Exemple #4 Utilisation de plusieurs Traits
<?php
trait Hello {
public function sayHello() {
echo 'Hello ';
}
}
trait World {
public function sayWorld() {
echo 'World';
}
}
class MyHelloWorld {
use Hello, World;
public function sayExclamationMark() {
echo '!';
}
}
$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();
?>
L'exemple ci-dessus va afficher :
Hello World!
Si deux Traits insèrent une méthode avec le même nom, une erreur fatale est levée si le conflit n'est pas explicitement résolu.
Pour résoudre un conflit de nommage dans les Traits, on peut utiliser l'opérateur insteadof pour explicitement définir la précédence entre les Traits. Aussi, on peut utiliser l'opérateur as pour créer un alias du nom conflictuel.
Vu que ce principe ne permet d'exclure que les méthodes, l'opérateur as peut être utilisé pour autoriser l'inclusion d'une des méthodes conflictuelles sous un autre nom.
Exemple #5 Résolution des conflits
Dans cet exemple, la classe Talker utile les traits A et B. Comme A et B ont des méthodes conflictuelles, elle renseigne l'utilisation de la variante de smallTalk depuis le trait B, et la variante de bigTalk depuis le trait A.
La classe Aliased_Talker utilise l'opérateur as pour être capable d'utiliser l'implementation bigTalk de B sous un alias talk.
<?php
trait A {
public function smallTalk() {
echo 'a';
}
public function bigTalk() {
echo 'A';
}
}
trait B {
public function smallTalk() {
echo 'b';
}
public function bigTalk() {
echo 'B';
}
}
class Talker {
use A, B {
B::smallTalk insteadof A;
A::bigTalk insteadof B;
}
}
class Aliased_Talker {
use A, B {
B::smallTalk insteadof A;
A::bigTalk insteadof B;
B::bigTalk as talk;
}
}
?>
En utilisant la syntaxe as, vous pouvez aussi ajuster la visibilité de la méthode dans la classe qui l'utilise.
Exemple #6 Changer la visibilité des méthodes
<?php
trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
}
// Modification de la visibilité de la méthode sayHello
class MyClass1 {
use HelloWorld { sayHello as protected; }
}
// Utilisation d'un alias lors de la modification de la visibilité
// La visibilité de la méthode sayHello n'est pas modifiée
class MyClass2 {
use HelloWorld { sayHello as private myPrivateHello; }
}
?>
Tout comme les classes peuvent utiliser des traits, d'autres traits le peuvent aussi. Un trait peut donc utiliser d'autres traits et hériter de tout ou d'une partie de ceux-ci.
Exemple #7 Traits Composés depuis d'autres Traits
<?php
trait Hello {
public function sayHello() {
echo 'Hello ';
}
}
trait World {
public function sayWorld() {
echo 'World!';
}
}
trait HelloWorld {
use Hello, World;
}
class MyHelloWorld {
use HelloWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
?>
L'exemple ci-dessus va afficher :
Hello World!
Les traits supportent l'utilisation de méthodes abstraites afin d'imposer des contraintes aux classes sous-jacentes.
Exemple #8 Obligations requises par les méthodes abstraites
<?php
trait Hello {
public function sayHelloWorld() {
echo 'Hello'.$this->getWorld();
}
abstract public function getWorld();
}
class MyHelloWorld {
private $world;
use Hello;
public function getWorld() {
return $this->world;
}
public function setWorld($val) {
$this->world = $val;
}
}
?>
Des variables statiques peuvent être utilisées dans les méthodes d'un trait, mais ne peuvent être définies dans le trait. Les traits peuvent par contre déclarer des méthodes statiques pour la classe sous-jacente.
Exemple #9 Variables statiques
<?php
trait Counter {
public function inc() {
static $c = 0;
$c = $c + 1;
echo "$c\n";
}
}
class C1 {
use Counter;
}
class C2 {
use Counter;
}
$o = new C1(); $o->inc(); // echo 1
$p = new C2(); $p->inc(); // echo 1
?>
Exemple #10 Méthodes statiques
<?php
trait StaticExample {
public static function doSomething() {
return 'Doing something';
}
}
class Example {
use StaticExample;
}
Example::doSomething();
?>
Les traits peuvent aussi définir des propriétés.
Exemple #11 Définir des propriétes
<?php
trait PropertiesTrait {
public $x = 1;
}
class PropertiesExample {
use PropertiesTrait;
}
$example = new PropertiesExample;
$example->x;
?>
Si un trait définit une propriété, alors la classe ne peut définir la propriété
du même nom, une erreur serait levée. Une erreur de type
E_STRICT si la définition dans la classe est compatible
(même visibilité et valeur initiale), une erreur fatale dans les autres cas.
Exemple #12 Résolution des conflits
<?php
trait PropertiesTrait {
public $same = true;
public $different = false;
}
class PropertiesExample {
use PropertiesTrait;
public $same = true; // Strict Standards
public $different = true; // Fatal error
}
?>
La surcharge magique en PHP permet de créer dynamiquement des propriétés et des méthodes. Ces entités dynamiques sont traitées via les méthodes magiques établies dans une classe pour divers types d'actions.
Les méthodes magiques de surcharge sont appelées lors de l'interaction avec les propriétés et les méthodes qui n'ont pas été déclarées ou ne sont pas visibles dans le contexte courant. Le reste de cette section utilise les termes de "propriétés inaccessibles" et de "méthodes inaccessibles" pour se référer à cette combinaison de déclaration et de visibilité.
Toutes les méthodes magiques de surcharge doivent être définies comme public.
Note:
Aucun des arguments de ces méthodes magiques ne peut être passé par référence.
Note:
L'interprétation PHP de la "surcharge" est différente de la plupart des langages orientés objet. La surcharge, habituellement, fournit la possibilité d'avoir plusieurs méthodes portant le même nom mais avec une quantité et des types différents d'arguments.
| Version | Description |
|---|---|
| 5.3.0 | Ajout de __callStatic(). Ajout d'un avertissement pour forcer la visibilité public et la déclaration non static. |
| 5.1.0 | Ajout de __isset() et de __unset(). |
$name
)$name
)__set() est sollicitée lors de l'écriture de données vers des propriétés inaccessibles.
__get() est sollicitée pour lire des données depuis des propriétés inaccessibles.
__isset() est sollicitée lorsque isset() ou la fonction empty() sont appelées avec des propriétés inaccessibles.
__unset() est sollicitée lorsque unset() est appelée avec des propriétés inaccessibles.
L'argument $name est le nom du propriété qui interagit. L'argument $value de la méthode __set() spécifie la valeur de la propriété $name qui doit être définie.
La surcharge des propriétés ne fonctionne que dans les contextes objets. Ces méthodes magiques ne seront pas lancées dans un contexte statique. Par conséquent, ces méthodes ne devraient pas être déclarées comme statiques. Depuis PHP 5.3.0, une alerte est levée si une des méthodes magiques est déclarée statique.
Note:
La valeur retournée par __set() est ignorée en raison de la façon dont le processus PHP assigne les opérateurs. De la même façon, __get() n'est jamais appelée lors d'un enchaînement d'assignements, comme ceci :
$a = $obj->b = 8;
Note:
Il n'est pas possible d'utiliser les attributs surchargés dans d'autres structures de langages que isset(). Ceci signifie que si empty() est appelée avec un attribut surchargé, la méthode de surcharge n'est pas invoquée.
Pour contourner cette limitation, l'attribut surchargé doit être copié dans une variable locale du contexte courant puis passée à empty().
Exemple #1 Exemple de surcharge de propriétés avec les méthodes __get(), __set(), __isset() et __unset()
<?php
class PropertyTest
{
/** Variable pour les données surchargées. */
private $data = array();
/** La surcharge n'est pas utilisée sur les propriétés déclarées. */
public $declared = 1;
/** La surcharge n'est lancée que lorsque l'on accède à la classe depuis l'extérieur. */
private $hidden = 2;
public function __set($name, $value)
{
echo "Définition de '$name' à la valeur '$value'\n";
$this->data[$name] = $value;
}
public function __get($name)
{
echo "Récupération de '$name'\n";
if (array_key_exists($name, $this->data)) {
return $this->data[$name];
}
$trace = debug_backtrace();
trigger_error(
'Propriété non-définie via __get(): ' . $name .
' dans ' . $trace[0]['file'] .
' à la ligne ' . $trace[0]['line'],
E_USER_NOTICE);
return null;
}
/** Depuis PHP 5.1.0 */
public function __isset($name)
{
echo "Est-ce que '$name' est défini ?\n";
return isset($this->data[$name]);
}
/** Depuis PHP 5.1.0 */
public function __unset($name)
{
echo "Effacement de '$name'\n";
unset($this->data[$name]);
}
/** Ce n'est pas une méthode magique, nécessaire ici que pour l'exemple. */
public function getHidden()
{
return $this->hidden;
}
}
echo "<pre>\n";
$obj = new PropertyTest;
$obj->a = 1;
echo $obj->a . "\n\n";
var_dump(isset($obj->a));
unset($obj->a);
var_dump(isset($obj->a));
echo "\n";
echo $obj->declared . "\n\n";
echo "Manipulons maintenant la propriété privée nommée 'hidden':\n";
echo "'hidden' est visible depuis la classe, donc __get() n'est pas utilisée...\n";
echo $obj->getHidden() . "\n";
echo "'hidden' n'est pas visible en dehors de la classe, donc __get() est utlisée...\n";
echo $obj->hidden . "\n";
?>
L'exemple ci-dessus va afficher :
Définition de 'a' à '1' Récupération de 'a' 1 Est-ce que 'a' est défini ? bool(true) Effacement de 'a' Est-ce que 'a' est défini ? bool(false) 1 Manipulons maintenant la propriété privée nommée 'hidden': 'hidden' est visible depuis la classe, donc __get() n'est pas utilisée... 2 'hidden' n'est pas visible en dehors de la classe, donc __get() est utlisée... Récupération de 'hidden' Notice: Propriété non-définie via __get(): hidden dans <file> à la ligne 64 dans <file> à la ligne 28
__call() est lancée lorsque l'on invoque des méthodes inaccessibles dans le contexte de l'objet.
__callStatic() est lancée lorsque l'on invoque des méthodes inaccessibles dans un contexte statique.
L'argument $name est le nom de la méthode appelée. L'argument $arguments est un tableau contenant les paramètres passés à la méthode $name.
Exemple #2 Surcharge de méthodes avec __call() et __callStatic()
<?php
class MethodTest
{
public function __call($name, $arguments)
{
// Note : la valeur de $name est sensible à la casse.
echo "Appel de la méthode '$name' "
. implode(', ', $arguments). "\n";
}
/** Depuis PHP 5.3.0 */
public static function __callStatic($name, $arguments)
{
// Note : la valeur de $name est sensible à la casse.
echo "Appel de la méthode statique '$name' "
. implode(', ', $arguments). "\n";
}
}
$obj = new MethodTest;
$obj->runTest('dans un contexte objet');
MethodTest::runTest('dans un contexte static'); // Depuis PHP 5.3.0
?>
L'exemple ci-dessus va afficher :
Appel de la méthode 'runTest' dans un contexte objet Appel de la méthode statique 'runTest' dans un contexte static
PHP fournit une façon de définir les objets de manière à ce qu'on puisse parcourir une liste de membres avec une structure foreach. Par défaut, toutes les propriétés visibles seront utilisées pour le parcours.
Exemple #1 Parcours d'objet simple
<?php
class MyClass
{
public $var1 = 'valeur 1';
public $var2 = 'valeur 2';
public $var3 = 'valeur 3';
protected $protected = 'variable protégée';
private $private = 'variable privée';
function iterateVisible() {
echo "MyClass::iterateVisible:\n";
foreach($this as $key => $value) {
print "$key => $value\n";
}
}
}
$class = new MyClass();
foreach($class as $key => $value) {
print "$key => $value\n";
}
echo "\n";
$class->iterateVisible();
L'exemple ci-dessus va afficher :
var1 => valeur 1 var2 => valeur 2 var3 => valeur 3 MyClass::iterateVisible: var1 => valeur 1 var2 => valeur 2 var3 => valeur 3 protected => variable protégée private => variable privée
Comme le montre la sortie, l'itération foreach traverse toutes les propriétés visible qui doivent être accessibles.
Pour aller plus loin, l'interface Iterator peut être implémentée. Elle permet à l'objet d'indiquer la façon dont il doit être traversé, et quelles valeurs seront disponibles à chaque itération
Exemple #2 Itération d'un objet implémentant un itérateur
<?php
class MyIterator implements Iterator
{
private $var = array();
public function __construct($array)
{
if (is_array($array)) {
$this->var = $array;
}
}
public function rewind()
{
echo "rembobinage\n";
reset($this->var);
}
public function current()
{
$var = current($this->var);
echo "actuel : $var\n";
return $var;
}
public function key()
{
$var = key($this->var);
echo "clé : $var\n";
return $var;
}
public function next()
{
$var = next($this->var);
echo "suivant : $var\n";
return $var;
}
public function valid()
{
$key = key($this->var);
$var = ($key !== NULL && $key !== FALSE);
echo "valide : $var\n";
return $var;
}
}
$values = array(1,2,3);
$it = new MyIterator($values);
foreach ($it as $a => $b) {
print "$a: $b\n";
}
?>
L'exemple ci-dessus va afficher :
rembobinage valide : 1 actuel : 1 clé : 0 0: 1 suivant : 2 valide : 1 actuel : 2 clé : 1 1: 2 suivant : 3 valide : 1 actuel : 3 clé : 2 2: 3 suivant : valide :
L'interface IteratorAggregate peut être utilisé comme une alternative pour l'implémentation de toutes les méthodes Iterator. IteratorAggregate ne nécessite que l'implémentation d'une méthode, IteratorAggregate::getIterator(), qui doit retourner une instance d'une classe implémentant Iterator.
Exemple #3 Itération d'un objet implémentant IteratorAggregate
<?php
class MyCollection implements IteratorAggregate
{
private $items = array();
private $count = 0;
// Définition requise de l'interface IteratorAggregate
public function getIterator() {
return new MyIterator($this->items);
}
public function add($value) {
$this->items[$this->count++] = $value;
}
}
$coll = new MyCollection();
$coll->add('valeur 1');
$coll->add('valeur 2');
$coll->add('valeur 3');
foreach ($coll as $key => $val) {
echo "clé/valeur : [$key -> $val]\n\n";
}
?>
L'exemple ci-dessus va afficher :
rembobinage actuel : valeur 1 valide : 1 actuel : valeur 1 clé : 0 clé/valeur : [0 -> valeur 1] suivant : valeur 2 actuel : valeur 2 valide : 1 actuel : valeur 2 clé : 1 clé/valeur : [1 -> valeur 2] suivant : valeur 3 actuel : valeur 3 valide : 1 actuel : valeur 3 clé : 2 clé/valeur : [2 -> valeur 3] suivant : actuel : valide :
Note:
Pour plus d'exemples sur le parcours d'objets, lisez la section sur l'extension SPL.
Les patterns sont un moyen de décrire les meilleures pratiques et les bonnes conceptions. Ils proposent une solution flexible aux problèmes habituels de programmation.
Le pattern d'usine (factory) permet l'instanciation d'objets durant l'exécution. Il est appelé "pattern d'usine" puisqu'il est responsable de la "fabrication" d'un objet. Une méthode d'usine reçoit le nom de la classe pour l'instancier en tant qu'argument.
Exemple #1 Méthode de paramètre d'usine
<?php
class Exemple
{
// La méthode d'usine
public static function factory($type)
{
if (include_once 'Drivers/' . $type . '.php') {
$classname = 'Driver_' . $type;
return new $classname;
} else {
throw new Exception('Driver non trouvé');
}
}
}
?>
Définir cette méthode dans une classe permet de charger un pilote à la volée. Si la classe Example était une classe d'abstraction de base de données, le chargement des pilotes MySQL et SQLite pourrait être effectué comme ceci :
<?php
// Chargement du driver MySQL
$mysql = Exemple::factory('MySQL');
// Chargement du driver SQLite
$sqlite = Example::factory('SQLite');
?>
Le pattern singleton permet de s'assurer qu'il n'existe qu'une seule instance d'un objet, et propose un point d'accès global à cet objet. Il s'agit d'un pattern du "Gang of Four".
Le pattern singleton est souvent implémenté pour des classes de bases de données, des journaliseurs, des objets de requête, de réponse ou encore des contrôleurs frontaux.
Exemple #2 Exemple de Singleton
<?php
class Example
{
private static $instance;
private $count = 0;
private function __construct()
{
}
public static function singleton()
{
if (!isset(self::$instance)) {
echo "création de l'instance";
$className = __CLASS__;
self::$instance = new $className;
}
return self::$instance;
}
public function increment()
{
return $this->count++;
}
public function __wakeup()
{
trigger_error('Désérialiser est interdit.', E_USER_ERROR);
}
public function __clone()
{
trigger_error('Le clônage n\'est pas autorisé.', E_USER_ERROR);
}
}
?>
Illustration du comportement du Singleton
<?php
$singleton = Example::singleton(); // Affiche "création de l'instance."
echo $singleton->increment(); // 0
echo $singleton->increment(); // 1
$singleton = Example::singleton(); // Réutilise l'instance existante
echo $singleton->increment(); // 2
echo $singleton->increment(); // 3
// Tout cela lève des Fatal Error
$singleton2 = new Example;
$singleton3 = clone $singleton;
$singleton4 = unserialize(serialize($singleton));
?>
Le pattern Singleton est l'un des plus controversés. Les critiques indiquent que le singleton crée un contexte global dans l'application et couple fortement le singleton à d'autres classes. Ceci mène vers des dépendances cachées et des effets de bord désagréables, le code devient ainsi plus difficile à maintenir et à tester.
Les critiques pointent aussi l'inutilité d'un singleton dans un environnement isolé comme PHP où les objets ne sont pas persistents entre les requêtes. Il est plus simple et propre de créer son graphe d'objets en utilisant des monteurs ou des fabriques, en début de requête.
Les singletons violent aussi plusieurs principes "SOLID" et la loi de Demeter. Les singletons ne peuvent être sérialisés. Il ne peuvent être surchargés (avant PHP 5.3) et ne seront pas nettoyés par le collecteur car une instance est toujours présente en mémoire, dans le singleton lui-même.
Les méthodes __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state() et __clone() sont magiques en PHP. Vous ne pouvez pas utiliser ces noms de méthode dans vos classes, sauf si vous voulez implémenter le comportement associé à ces méthodes magiques.
PHP réserve tous les noms de fonctions commençant par un double souligné __ pour les méthodes magiques. Il est recommandé de ne pas utiliser de noms de fonctions commençant par __ sauf si vous voulez des fonctionnalités magiques documentées.
La fonction serialize() vérifie si votre classe a une méthode
avec le nom magique __sleep().
Si c'est le cas, cette méthode sera exécutée avant toute linéarisation. Elle peut
nettoyer l'objet et elle est supposée retourner un tableau avec les noms de toutes
les variables de l'objet qui doivent être linéarisées.
Si la méthode ne retourne rien, alors NULL est linéarisé et une alerte de type
E_NOTICE est émise.
Note:
Il n'est pas possible pour __sleep() de retourner les noms des propriétés privées des classes parentes. Le faire résulte en une erreur de niveau
E_NOTICE. À la place, vous devriez utiliser l'interface Serializable.
Le but avoué de __sleep() est de valider des données en attente ou d'effectuer les opérations de nettoyage. De plus, cette fonction est utile si vous avez de très gros objets qui n'ont pas besoin d'être sauvegardés en totalité.
Réciproquement, la fonction unserialize() vérifie la présence d'une méthode dont le nom est le nom magique __wakeup(). Si elle est présente, cette fonction peut reconstruire toute ressource que l'objet possède.
Le but avoué de __wakeup() est de rétablir toute connexion de base de données qui aurait été perdue durant la linéarisation et d'effectuer des tâches de réinitialisation.
Exemple #1 Utilisation de sleep() et wakeup()
<?php
class Connection
{
protected $link;
private $server, $username, $password, $db;
public function __construct($server, $username, $password, $db)
{
$this->server = $server;
$this->username = $username;
$this->password = $password;
$this->db = $db;
$this->connect();
}
private function connect()
{
$this->link = mysql_connect($this->server, $this->username, $this->password);
mysql_select_db($this->db, $this->link);
}
public function __sleep()
{
return array('server', 'username', 'password', 'db');
}
public function __wakeup()
{
$this->connect();
}
}
?>
La méthode __toString() détermine comment l'objet
doit réagir lorsqu'il est traité comme une chaîne de caractères.
Par exemple, ce que echo $obj; affichera. Cette méthode doit
retourner une chaine sinon une erreur E_RECOVERABLE_ERROR
sera levée.
Exemple #2 Exemple simple
<?php
// Déclaration d'une classe simple
class ClasseTest
{
public $foo;
public function __construct($foo)
{
$this->foo = $foo;
}
public function __toString()
{
return $this->foo;
}
}
$class = new ClasseTest('Bonjour');
echo $class;
?>
L'exemple ci-dessus va afficher :
Bonjour
Il est important de noter qu'avant PHP 5.2.0, la méthode
__toString() n'était appelée que si elle était
directement combinée avec
echo ou
print.
Depuis PHP 5.2.0, elle est appelée dans tous les contextes de chaîne
de caractères (e.g. dans printf() avec
le modificateur %s) mais pas dans les autres types
de contextes (e.g. avec le modificateur %d).
Depuis PHP 5.2.0, convertir un objet sans la méthode
__toString() en chaîne de caractères émettra une
E_RECOVERABLE_ERROR.
La méthode __invoke() est appelée lorsque le script tente d'appeler un objet comme une fonction.
Note:
Cette fonctionnalité est disponible depuis PHP 5.3.0.
Exemple #3 Exemple avec __invoke()
<?php
class CallableClass
{
public function __invoke($x)
{
var_dump($x);
}
}
$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj));
?>
L'exemple ci-dessus va afficher :
int(5) bool(true)
$properties
)Cette méthode statique est appelée pour les classes exportées par la fonction var_export() depuis PHP 5.1.0.
Le seul paramètre de cette méthode est un tableau contenant les propriétés exportées sous la forme array('propriété' => valeur, ...).
Exemple #4 Utilisation de __set_state() (depuis PHP 5.1.0)
<?php
class A
{
public $var1;
public $var2;
public static function __set_state($an_array) // Depuis PHP 5.1.0
{
$obj = new A;
$obj->var1 = $an_array['var1'];
$obj->var2 = $an_array['var2'];
return $obj;
}
}
$a = new A;
$a->var1 = 5;
$a->var2 = 'foo';
eval('$b = ' . var_export($a, true) . ';'); // $b = A::__set_state(array(
// 'var1' => 5,
// 'var2' => 'foo',
// ));
var_dump($b);
?>
L'exemple ci-dessus va afficher :
object(A)#2 (2) {
["var1"]=>
int(5)
["var2"]=>
string(3) "foo"
}
PHP dispose du mot-clé "final", qui empêche les classes filles de surcharger une méthode, lorsque la définition de cette dernière est préfixée par le mot-clé "final". Si la classe elle-même est définie comme finale, elle ne pourra plus être étendue.
Exemple #1 Exemple de méthode finale
<?php
class BaseClass {
public function test() {
echo "BaseClass::test() appelé\n";
}
final public function moreTesting() {
echo "BaseClass::moreTesting() appelé\n";
}
}
class ChildClass extends BaseClass {
public function moreTesting() {
echo "ChildClass::moreTesting() appelé\n";
}
}
// Résultat : Fatal error: Cannot override final method BaseClass::moreTesting()
?>
Exemple #2 Exemple de classe finale
<?php
final class BaseClass {
public function test() {
echo "BaseClass::test() appelé\n";
}
// Ici, peut importe si vous spécifiez la fonction en finale ou pas
final public function moreTesting() {
echo "BaseClass::moreTesting() appelé\n";
}
}
class ChildClass extends BaseClass {
}
// Résultat : Fatal error: Class ChildClass may not inherit from final class (BaseClass)
?>
Note: Les propriétés ne peuvent être déclarées finales, seules les méthodes ou les classes peuvent l'être.
Le fait de créer une copie d'un objet possédant exactement les mêmes propriétés n'est pas toujours le comportement que l'on souhaite. Un bon exemple pour illustrer le besoin d'un constructeur de copie : si vous avez un objet qui représente une fenêtre GTK et que l'objet contient la ressource représentant cette fenêtre GTK, lorsque vous créez une copie vous pouvez vouloir créer une nouvelle fenêtre avec les mêmes propriétés mais que le nouvel objet contienne une ressource représentant la nouvelle fenêtre.
Une copie d'objet est créée en utilisant le mot-clé clone (qui fait appel à la méthode __clone() de l'objet, si elle a été définie). La méthode __clone() d'un objet ne peut être appelée directement.
<?php $copie_d_objet = clone $objet; ?>
Lorsqu'un objet est cloné, PHP effectue une copie superficielle de toutes les propriétés de l'objet. Toutes les propriétés qui sont des références à d'autres variables demeureront des références.
Une fois le clonage effectué, si une méthode __clone() est définie, la méthode __clone() du nouvel objet sera appelée pour permettre à chaque propriété qui doit l'être d'être modifiée.
Exemple #1 Exemple de duplication d'objets
<?php
class SubObject
{
static $instances = 0;
public $instance;
public function __construct() {
$this->instance = ++self::$instances;
}
public function __clone() {
$this->instance = ++self::$instances;
}
}
class MyCloneable
{
public $objet1;
public $objet2;
function __clone()
{
// Force la copie de this->object, sinon
// il pointera vers le même objet.
$this->object1 = clone $this->object1;
}
}
$obj = new MyCloneable();
$obj->object1 = new SubObject();
$obj->object2 = new SubObject();
$obj2 = clone $obj;
print("Objet original :\n");
print_r($obj);
print("Objet cloné :\n");
print_r($obj2);
?>
L'exemple ci-dessus va afficher :
Object original :
MyCloneable Object
(
[object1] => SubObject Object
(
[instance] => 1
)
[object2] => SubObject Object
(
[instance] => 2
)
)
Object cloné :
MyCloneable Object
(
[object1] => SubObject Object
(
[instance] => 3
)
[object2] => SubObject Object
(
[instance] => 2
)
)
En PHP, la comparaison d'objets est proche du comportement des langages orientés objet (bien que PHP n'en soit pas un).
Lors de l'utilisation de l'opérateur de comparaison ==, les objets sont comparés de manière simple, à savoir : deux objets sont égaux s'ils ont les mêmes attributs et valeurs, et qu'ils sont des instances de la même classe.
D'un autre coté, lors de l'utilisation de l'opérateur d'identité (===), les objets sont identiques uniquement s'ils font référence à la même instance de la même classe.
Un exemple va illustrer ces règles.
Exemple #1 Exemple de comparaison d'objets en PHP
<?php
function bool2str($bool)
{
if ($bool === false) {
return 'FALSE';
} else {
return 'TRUE';
}
}
function compareObjects(&$o1, &$o2)
{
echo 'o1 == o2 : '.bool2str($o1 == $o2)."\n";
echo 'o1 != o2 : '.bool2str($o1 != $o2)."\n";
echo 'o1 === o2 : '.bool2str($o1 === $o2)."\n";
echo 'o1 !== o2 : '.bool2str($o1 !== $o2)."\n";
}
class Flag
{
public $flag;
function Flag($flag = true) {
$this->flag = $flag;
}
}
class OtherFlag
{
public $flag;
function OtherFlag($flag = true) {
$this->flag = $flag;
}
}
$o = new Flag();
$p = new Flag();
$q = $o;
$r = new OtherFlag();
echo "Deux instances de la même classe\n";
compareObjects($o, $p);
echo "\nDeux références sur le même objet\n";
compareObjects($o, $q);
echo "\nInstances de classes différentes\n";
compareObjects($o, $r);
?>
L'exemple ci-dessus va afficher :
Deux instances de la même classe o1 == o2 : TRUE o1 != o2 : FALSE o1 === o2 : FALSE o1 !== o2 : TRUE Deux références sur le même objet o1 == o2 : TRUE o1 != o2 : FALSE o1 === o2 : TRUE o1 !== o2 : FALSE Instances de classes différentes o1 == o2 : FALSE o1 != o2 : TRUE o1 === o2 : FALSE o1 !== o2 : TRUE
Note:
Les extensions peuvent définir leurs propres règles pour leurs comparaisons d'objet.
PHP 5 introduit le typage objet implicite (littéralement, Type Hinting). Les fonctions peuvent maintenant imposer aux paramètres d'être des objets (en spécifiant le nom de la classe dans le prototype de la fonction), des interfaces, des tableaux (depuis PHP 5.1) ou de type callable. Cependant, si NULL est utilisé en tant que valeur par défaut du paramètre, il sera autorisé comme argument pour tous les futurs appels.
Si une classe ou une interface est spécifié comme type, alors tous ces enfants ou ces implémentations sont aussi autorisés.
La spécification d'un type ne peut être utilisée avec les types scalaires comme int ou string. Traits n'est pas non plus autorisé.
Exemple #1 Exemples de typage d'objets
<?php
// Un exemple de classe
class MaClasse
{
/**
* Fonction de test
*
* Le premier paramètre doit être un objet de type AutreClasse
*/
public function test(AutreClasse $autreclasse) {
echo $autreclasse->var;
}
/**
* Une autre fonction de test
*
* Le premier paramètre doit être un tableau
*/
public function test_array(array $input_array) {
print_r($input_array);
}
/**
* Le premier paramètre doit être un itérateur
*/
public function test_interface(Traversable $iterator) {
echo get_class($iterator);
}
/**
* Le premier paramètre doit être une fonction de rappel (callable)
*/
public function test_callable(callable $callback, $data) {
call_user_func($callback, $data);
}
}
// Un autre exemple de classe
class AutreClasse {
public $var = 'Bonjour le monde!';
}
?>
Si le paramètre ne satisfait pas les conditions imposées, une erreur fatale (qui peut être attrapée) est émise.
<?php
// Une instance de chaque classe
$maclasse = new MaClasse;
$autreclasse = new AutreClasse;
// Erreur fatale : Argument 1 doit être un objet de la classe AutreClasse
$maclasse->test('salut');
// Erreur fatale : Argument 1 doit être une instance de AutreClasse
$foo = new stdClass;
$maclasse->test($foo);
// Erreur fatale : Argument 1 ne doit pas être null
$maclasse->test(null);
// Fonctionne : Affiche 'Bonjour le monde!'
$maclasse->test($autreclasse);
// Erreur fatale : Argument 1 doit être un tableau
$maclasse->test_array('a string');
// Fonctionne : Affiche le tableau
$maclasse->test_array(array('a', 'b', 'c'));
// Fonctionne : Affiche ArrayObject
$maclasse->test_interface(new ArrayObject(array()));
// Fonctionne : Affiche int(1)
$maclasse->test_callable('var_dump', 1);
?>
Le typage fonctionne aussi avec les fonctions :
<?php
// Un exemple de classe
class MaClasse {
public $var = 'Bonjour le monde!';
}
/**
* Fonction de test
*
* Le premier paramètre doit être un objet de type MaClasse
*/
function maFonction(MaClasse $foo) {
echo $foo->var;
}
// Fonctionne
$maclasse = new MaClasse;
maFonction($maclasse);
?>
Le typage objet autorise les valeurs NULL :
<?php
/* On accepte la valeur NULL */
function test(stdClass $obj = NULL) {
}
test(NULL);
test(new stdClass);
?>
Depuis PHP 5.3.0, PHP implémente une fonctionnalité appelée late static binding, en français la résolution statique à la volée, qui est utilisée pour choisir la classe appelée dans le cadre de l'héritage de méthodes statiques.
Plus précisément, les résolutions statiques à la volée fonctionnent en enregistrant le nom de le classe dans le dernier "appel non transmis". Dans le cas des appels de méthodes statiques, il s'agit de la classe explicitement nommée à gauche de l'opérateur ::; dans le cas de méthodes non statiques, il s'agit de la classe de l'objet. Un "appel transmis" est déclenché par self::, parent::, static::, ou, tout en haut de la hierarchie des classes, forward_static_call(). La fonction get_called_class() peut être utilisée pour récupérer une chaine contenant le nom de la classe appelée et static:: introduit son espace.
Cette fonctionnalité a été baptisée "late static bindings", d'un point de vue interne. "Late binding", littéralement compilation tardive, vient du fait que les éléments static:: ne seront pas résolus en utilisant la classe où la méthode a été définie, mais celle qui est active durant l'exécution. L'adjectif statique a été ajouté car ce problème s'applique aux méthodes statiques, mais pas seulement.
Les références à la classe courante, avec self:: ou __CLASS__ sont résolues en utilisant la classe à qui appartiennent les fonctions, où elles ont été définies :
Exemple #1 Utilisation de self::
<?php
class A {
public static function qui() {
echo __CLASS__;
}
public static function test() {
self::qui();
}
}
class B extends A {
public static function qui() {
echo __CLASS__;
}
}
B::test();
?>
L'exemple ci-dessus va afficher :
A
La résolution statique à la volée essaie de dépasser cette limitation en introduisant un mot clé qui fait référence à la classe qui est appelée durant l'exécution. Simplement, ce mot-clé vous permet de faire référence à B depuis test(), dans l'exemple précédent. Il a été décidé de ne pas introduire de nouveau mot clé, mais plutôt d'utiliser le mot static qui était déjà réservé.
Exemple #2 Utilisation simple de static::
<?php
class A {
public static function qui() {
echo __CLASS__;
}
public static function test() {
static::qui(); // Ici, résolution à la volée
}
}
class B extends A {
public static function qui() {
echo __CLASS__;
}
}
B::test();
?>
L'exemple ci-dessus va afficher :
B
Note:
Dans les contextes non statiques, la classe appelée sera celle de l'objet. Comme $this-> essayera d'appeler des méthodes privées depuis le même contexte, utiliser static:: pourrait donner des résultats différents. Notez aussi que static:: ne peut faire référence qu'à des attributs/méthodes statiques.
Exemple #3 Utilisation de static:: dans un contexte non statique
<?php
class A {
private function foo() {
echo "success!\n";
}
public function test() {
$this->foo();
static::foo();
}
}
class B extends A {
/* foo() sera copiée dans B, par conséquent son contexte sera toujours A
* et l'appel se fera sans problème */
}
class C extends A {
private function foo() {
/* La méthode originale est remplacée; le contexte est celui de C */
}
}
$b = new B();
$b->test();
$c = new C();
$c->test(); //échoue
?>
L'exemple ci-dessus va afficher :
success! success! success! Fatal error: Call to private method C::foo() from context 'A' in /tmp/test.php on line 9
Note:
La résolution des statiques à la volée va s'arrêter à un appel statique complètement résolu. D'un autre coté, les appels statiques en utilisant un mot-clé comme parent:: ou self:: va transmettre l'information appelante.
Exemple #4 Appel avec ou sans transmission
<?php
class A {
public static function foo() {
static::qui();
}
public static function qui() {
echo __CLASS__."\n";
}
}
class B extends A {
public static function test() {
A::foo();
parent::foo();
self::foo();
}
public static function qui() {
echo __CLASS__."\n";
}
}
class C extends B {
public static function qui() {
echo __CLASS__."\n";
}
}
C::test();
?>L'exemple ci-dessus va afficher :
A C C
Un des piliers de la POO de PHP 5 est le fait que les "objets sont passés par référence par défaut". Ce n'est pas complètement vrai. Cette section rectifie cette généralisation avec quelques exemples.
Une référence PHP est un alias, qui permet à deux variables différentes de représenter la même valeur. Depuis PHP 5, une variable contenant un objet ne contient plus l'objet lui-même. Il contient un identifiant d'objet, ce qui permet aux accesseurs d'objets de trouver cet objet. Lorsque l'objet est utilisé comme argument, retourné par une fonction ou assigné à une autre variable, les différentes variables ne sont pas des alias : elles contiennent le même identifiant, qui pointe sur la même valeur.
Exemple #1 Références et Objets
<?php
class A {
public $foo = 1;
}
$a = new A;
$b = $a; // $a et $b sont des copies du même identifiant
// ($a) = ($b) = <id>
$b->foo = 2;
echo $a->foo."\n";
$c = new A;
$d = &$c; // $c et $d sont des références
// ($c,$d) = <id>
$d->foo = 2;
echo $c->foo."\n";
$e = new A;
function foo($obj) {
// ($obj) = ($e) = <id>
$obj->foo = 2;
}
foo($e);
echo $e->foo."\n";
?>
L'exemple ci-dessus va afficher :
2 2 2
serialize() retourne une chaîne de caractères contenant une représentation linéaire de n'importe quelle valeur qui peut être stockée en PHP. unserialize() utilise cette chaîne de caractères pour recréer l'original de la variable à partir de sa représentation linéaire. Utiliser serialize() pour sauvegarder un objet conservera toutes ses variables. Ses méthodes ne seront pas conservées, seulement le nom de la classe.
Afin de pouvoir désérialiser (unserialize()) un objet, la classe de l'objet doit être définie pour permettre sa reconstruction. En d'autres termes, si vous avez un objet de la classe A et le sérialisez, la représentation linéaire obtenue dépendra de la classe A et contiendra toutes ses variables. Si vous voulez désérialiser la représentation linéaire dans un endroit où la classe A n'est pas définie (dans un autre fichier par exemple), alors vous devrez redéclarer la classe A avant de procéder à la désérialisation de la représentation linéaire. Cela peut-être fait, par exemple, en incluant le fichier de définition de la classe ou en utilisant la fonction spl_autoload_register().
<?php
// class_a.inc.php:
class A {
public $one = 1;
public function show_one() {
echo $this->one;
}
}
// page1.php:
include("class_a.inc.php");
$a = new A;
$s = serialize($a);
// enregistre $s quelque part où page2.php peut le retrouver
file_put_contents('store', $s);
// page2.php:
// nous avons besoin de la définition de la classe
// pour qu'unserialize() fonctionne
include("class_a.inc.php");
$s = file_get_contents('store');
$a = unserialize($s);
// appel de show_one() sur l'objet $a, affiche 1
$a->show_one();
?>
Si une application utilise le système de sessions et enregistre des objets, ces objets sont sérialisés automatiquement à la fin de chaque page PHP, et sont désérialisés automatiquement à chaque page suivante. Cela signifie qu'une fois mis en session, chaque objet peut apparaître dans n'importe quelle page de l'application où la session est démarrée. Notez cependant que la fonction session_register() est supprimée depuis PHP 5.4.0
Si une application sérialise des objets, il est fortement recommandé, pour son usage futur, que l'application inclut les définitions de classe des objets sérialisés à chaque page. Ne pas faire ainsi aboutirait à un objet désérialisé sans sa définition de classe. PHP donnerait alors à cet objet une classe de type __PHP_Incomplete_Class_Name, qui n'a pas de méthode et produirait un objet inutile.
Dans l'exemple ci-dessus, si $a est enregistré dans la session en exécutant session_register("a"), vous devriez inclure le fichier class_a.inc.php dans toutes vos pages, et non seulement dans page1.php et page2.php
Les changements du modèle objet de PHP5 sont recensés ici. Plus d'informations et quelques notes peuvent être trouvées dans la documentation sur la POO en PHP5.
| Version | Description |
|---|---|
| 5.4.0 | Modification : Si une classe abstraite définit une signature pour le constructeur, elle sera désormais appliquée. |
| 5.3.3 | Changement : Les méthodes ayant le même nom que la classe dans un espace de noms ne sont plus considérées comme constructeur. Ce changement n'affecte pas les classes sans espace de nom. |
| 5.3.0 | Changement : Les interfaces définissant des méthodes ayant un prototype avec des arguments obligatoires peuvent être implémentées dans les classes avec un argument facultatif sans erreur. |
| 5.3.0 | Changement : Il est maintenant possible de référencer une classe en utilisant une variable (ex: echo $classname::constant;). La valeur de la variable ne peut être un mot-clé (ex: self, parent ou static). |
| 5.3.0 |
Changement : Une erreur de niveau E_WARNING est levée si les méthodes
magiques de surcharge
sont déclarées statiques.
La visibilité publique est aussi requise.
|
| 5.3.0 | Changement : Avant 5.3.0, les exceptions lancées dans la fonction __autoload() ne pouvaient être traitées dans un bloc catch et résultaient en une erreur fatale. Maintenant les exceptions levées dans la fonction __autoload peuvent être attrapées dans un bloc catch et traitées. Si une exception personnalisée est lancée, alors sa classe doit être disponible. La fonction __autoload peut par contre être utilisée recursivement pour autocharger la classe d'exception personnalisée. |
| 5.3.0 | Ajout de la méthode magique __callStatic. |
| 5.3.0 | Ajout : heredoc et nowdoc sont supportées pour définir les constantes de classes et les propriétés. Note: Les valeurs heredoc ne doivent pas contenir de variables. |
| 5.3.0 | Ajout du Late Static Bindings (résolution statique tardive). |
| 5.3.0 | Ajout de la méthode magique __invoke(). |
| 5.2.0 |
Changement: La méthode magique __toString()
n'était appelée que lors des appels à
echo ou
print.
Maintenant, elle l'est dans n'importe quel contexte de
chaîne (ex: dans printf() avec %s) mais pas dans
les autres contextes (ex: avec le modificateur %d).
Depuis PHP 5.2.0, convertir un objet en chaîne sans méthode __toString
émet une erreur E_RECOVERABLE_ERROR.
|
| 5.1.3 |
Changement: Dans les versions antérieures de PHP 5, l'utilisation de var
était considérée comme obsolète et envoyait une erreur E_STRICT.
Ce n'est plus le cas.
|
| 5.1.0 | Changement: La méthode magique statique __set_state() est maintenant appelée pour les classes exportées via var_export(). |
| 5.1.0 | Ajout des méthodes magiques __isset() et __unset(). |
(PHP 5 >= 5.3.0)
Que sont les espaces de noms ? Dans leur définition la plus large, ils représentent un moyen d'encapsuler des éléments. Cela peut être conçu comme un concept abstrait, à différents endroits. Par exemple, dans un système de fichiers, les dossiers représentent un groupe de fichiers associés, et sert d'espace de noms pour les fichiers qu'il contient. Un exemple concret est que le fichier foo.txt peut exister dans les deux dossiers /home/greg et /home/other, mais que les deux copies de foo.txt ne peuvent pas co-exister dans le même dossier. De plus, pour accéder au fichier foo.txt depuis l'extérieur du dossier /home/greg, il faut préciser le nom du dossier en utilisant un séparateur de dossier, tel que /home/greg/foo.txt. Le même principe applique les espaces de noms au monde de la programmation.
Dans le monde PHP, les espaces de noms sont conçus pour résoudre deux problèmes que les auteurs de bibliothèques et applications rencontrent lors de la réutilisation d'éléments tels que des classes ou des bibliothèques de fonctions :
Les espaces de noms PHP fournissent un moyen pour regrouper des classes, interfaces, fonctions ou constantes. Voici un exemple de syntaxe des espaces de noms PHP :
Exemple #1 Exemple de syntaxe des espaces de noms
<?php
namespace mon\nom; // Voyez la section "Définition des espaces de noms"
class MaClasse {}
function mafonction() {}
const MACONSTANTE = 1;
$a = new MaClasse;
$c = new \mon\nom\MaClasse; // Voyez la section "Espace global"
$a = strlen('bonjour'); // Voyez "Utilisation des espaces de noms : retour
// à l'espace global
$d = namespace\MACONSTANTE; // Voyez "L'opérateur namespace et la constante __NAMESPACE__
$d = __NAMESPACE__ . '\MACONSTANTE';
echo constant($d); // Voyez "Espaces de noms et fonctionnalités dynamiques"
?>
Note:
Les espaces de noms PHP et php, mais aussi les noms composés commençant par ces noms (comme PHP\Classes) sont réservés pour l'utilisation interne du langage, et ne doivent pas être utilisés dans le code de l'espace utilisateur.
(PHP 5 >= 5.3.0)
Bien que du code PHP valide puisse être contenu dans un espace de noms, seuls quatre types de code peuvent être affectés par les espaces de noms : les classes, les interfaces, les fonctions et les constantes.
Les espaces de noms sont déclarés avec le mot-clé namespace. Un fichier contenant un espace de noms doit déclarer l'espace au début du fichier, avant tout autre code, avec une seule exception : le mot clé declare.
Exemple #1 Déclaration d'un espace de noms
<?php
namespace MonProjet;
const CONNEXION_OK = 1;
class Connexion { /* ... */ }
function connecte() { /* ... */ }
?>
Exemple #2 Erreur de déclaration d'un espace de noms
<html>
<?php
namespace MonProjet; // erreur fatale : l'espace de noms doit être le premier élément du script
?>
De plus, contrairement à d'autres structures PHP, le même espace de noms peut être défini dans plusieurs fichiers, ce qui permet de scinder le contenu d'un espace de noms sur plusieurs fichiers.
(PHP 5 >= 5.3.0)
Comme pour les fichiers et les dossiers, les espaces de noms sont aussi capables de spécifier une hiérarchie d'espaces de noms. Ainsi, un nom d'espace de noms peut être défini avec ses sous-niveaux :
Exemple #1 Déclaration d'un espace de noms avec hiérarchie
<?php
namespace MonProjet\Sous\Niveau;
const CONNEXION_OK = 1;
class Connexion { /* ... */ }
function connecte() { /* ... */ }
?>
(PHP 5 >= 5.3.0)
Plusieurs espaces de noms peuvent aussi être déclarés dans le même fichier. Il y a deux syntaxes autorisées.
Exemple #1 Déclaration de plusieurs espaces de noms, syntaxe à combinaison simple
<?php
namespace MonProjet;
const CONNEXION_OK = 1;
class Connexion { /* ... */ }
function connecte() { /* ... */ }
namespace AutreProjet;
const CONNEXION_OK = 1;
class Connexion { /* ... */ }
function connecte() { /* ... */ }
?>
Cette syntaxe n'est pas recommandée pour combiner des espaces de noms dans un seul fichier. Au lieu de cela, il est recommandé d'utiliser la syntaxe à accolades.
Exemple #2 Déclaration de plusieurs espaces de noms, syntaxe à accolades
<?php
namespace MonProjet {
const CONNEXION_OK = 1;
class Connexion { /* ... */ }
function connecte() { /* ... */ }
}
namespace AutreProjet {
const CONNEXION_OK = 1;
class Connexion { /* ... */ }
function connecte() { /* ... */ }
}
?>
Il est fortement recommandé, en tant que pratique de codage, de ne pas mélanger plusieurs espaces de noms dans le même fichier. L'utilisation recommandée est de combiner plusieurs scripts PHP dans le même fichier.
Pour combiner plusieurs codes sans espaces de noms dans du code avec espace de noms, seule la syntaxe à accolades est supportée. Le code global doit être encadré par un espace de noms sans nom, tel que celui-ci :
Exemple #3 Déclaration de plusieurs espaces de noms avec un espace sans nom
<?php
namespace MonProjet {
const CONNEXION_OK = 1;
class Connexion { /* ... */ }
function connecte() { /* ... */ }
}
namespace { // code global
session_start();
$a = MonProjet\connecte();
echo MonProjet\Connexion::start();
}
?>
Aucun code PHP ne peut exister hors des accolades de l'espace de noms, sauf pour ouvrir une nouvelle instruction declare.
Exemple #4 Déclaration de plusieurs espaces de noms avec un espace sans nom (2)
<?php
declare(encoding='UTF-8');
namespace MonProjet {
const CONNEXION_OK = 1;
class Connexion { /* ... */ }
function connecte() { /* ... */ }
}
namespace { // code global
session_start();
$a = MonProjet\connecte();
echo MonProjet\Connexion::start();
}
?>
(PHP 5 >= 5.3.0)
Avant de discuter de l'utilisation des espaces de noms, il est important de comprendre comment PHP devine quel espace de noms votre code utilise. Une analogie simple peut être faite entre les espaces de noms de PHP et un système de fichiers. Il y a trois moyens d'accéder à un fichier dans un système de fichiers :
Voici un exemple des trois syntaxes, dans du code réel :
file1.php
<?php
namespace Foo\Bar\sousespacedenoms;
const FOO = 1;
function foo() {}
class foo
{
static function methodestatique() {}
}
?>
file2.php
<?php
namespace Foo\Bar;
include 'file1.php';
const FOO = 2;
function foo() {}
class foo
{
static function methodestatique() {}
}
/* nom non qualifié */
foo(); // Devient Foo\Bar\foo
foo::methodestatique(); // Devient Foo\Bar\foo, méthode methodestatique
echo FOO; // Devient la constante Foo\Bar\FOO
/* nom qualifié */
sousespacedenoms\foo(); // Devient la fonction Foo\Bar\sousespacedenoms\foo
sousespacedenoms\foo::methodestatique(); // devient la classe Foo\Bar\sousespacedenoms\foo,
// méthode methodestatique
echo sousespacedenoms\FOO; // Devient la constante Foo\Bar\sousespacedenoms\FOO
/* nom absolu */
\Foo\Bar\foo(); // Devient la fonction Foo\Bar\foo
\Foo\Bar\foo::methodestatique(); // Devient la classe Foo\Bar\foo, méthode methodestatique
echo \Foo\Bar\FOO; // Devient la constante Foo\Bar\FOO
?>
Notez que pour accéder à n'importe quelle classe, fonction ou constante globale, un nom absolu peut être utilisé, tel que \strlen() ou \Exception ou \INI_ALL.
Exemple #1 Accès aux classes, fonctions et constantes globales depuis un espace de noms
<?php
namespace Foo;
function strlen() {}
const INI_ALL = 3;
class Exception {}
$a = \strlen('hi'); // appel la fonction globale strlen
$b = \INI_ALL; // accès à une constante INI_ALL
$c = new \Exception('error'); // instantie la classe globale Exception
?>
(PHP 5 >= 5.3.0)
L'implémentation des espaces de noms de PHP est influencée par sa nature dynamique de langage de programmation. Par conséquent, pour convertir du code tel que le code de l'exemple suivant, en un espace de noms :
Exemple #1 Accès dynamique aux éléments
example1.php:
<?php
class classname
{
function __construct()
{
echo __METHOD__,"\n";
}
}
function funcname()
{
echo __FUNCTION__,"\n";
}
const constname = "global";
$a = 'classname';
$obj = new $a; // affiche classname::__construct
$b = 'funcname';
$b(); // affiche funcname
echo constant('constname'), "\n"; // affiche global
?>
Exemple #2 Accès dynamique à des espaces de noms
<?php
namespace nomdelespacedenoms;
class classname
{
function __construct()
{
echo __METHOD__,"\n";
}
}
function funcname()
{
echo __FUNCTION__,"\n";
}
const constname = "namespaced";
include 'example1.php';
$a = 'classname';
$obj = new $a; // affiche classname::__construct
$b = 'funcname';
$b(); // affiche funcname
echo constant('constname'), "\n"; // affiche global
/* Note que si vous utilisez des guillemets doubles, "\\nomdelespacedenoms\\classname" doit être utilisé */
$a = '\nomdelespacedenoms\classname';
$obj = new $a; // affiche nomdelespacedenoms\classname::__construct
$a = 'nomdelespacedenoms\classname';
$obj = new $a; // affiche aussi nomdelespacedenoms\classname::__construct
$b = 'nomdelespacedenoms\funcname';
$b(); // affiche nomdelespacedenoms\funcname
$b = '\nomdelespacedenoms\funcname';
$b(); // affiche aussi nomdelespacedenoms\funcname
echo constant('\nomdelespacedenoms\constname'), "\n"; // affiche namespaced
echo constant('nomdelespacedenoms\constname'), "\n"; // affiche aussi namespaced
?>
Il est recommandé de lire la note au sujet de la protection des espaces de noms dans les chaînes.
(PHP 5 >= 5.3.0)
PHP supporte deux moyens pour accéder de manière abstraite aux éléments
dans l'espace de nom courant, à savoir la constante magique
__NAMESPACE__ et la commande namespace.
La valeur de __NAMESPACE__ est une chaîne qui contient le nom
de l'espace de noms courant. Dans l'espace global, sans nom, elle contient
une chaîne vide.
Exemple #1 Exemple avec __NAMESPACE__, dans un code avec espace de noms
<?php
namespace MonProjet;
echo '"', __NAMESPACE__, '"'; // affiche "MonProjet"
?>
Exemple #2 Exemple avec __NAMESPACE__, dans un code avec espace de noms global
<?php
echo '"', __NAMESPACE__, '"'; // affiche ""
?>
__NAMESPACE__ est utile pour construire
dynamiquement des noms, tels que :
Exemple #3 Utilisation de __NAMESPACE__ pour une construction dynamique de noms
<?php
namespace MonProjet;
function get($classname)
{
$a = __NAMESPACE__ . '\\' . $classname;
return new $a;
}
?>
La commande namespace peut aussi être utilisée pour demander explicitement un élément de l'espace de noms courant, ou d'un sous-espace. C'est l'équivalent pour les espaces de noms de l'opérateur self des classes.
Exemple #4 l'opérateur namespace, dans un espace de noms
<?php
namespace MonProjet;
use blah\blah as mine; // Voyez "Utilisation des espaces de noms : importation et alias"
blah\mine(); // appelle la fonction MonProjet\blah\mine()
namespace\blah\mine(); // appelle la fonction MonProjet\blah\mine()
namespace\func(); // appelle la fonction MonProjet\func()
namespace\sub\func(); // appelle la fonction MonProjet\sub\func()
namespace\cname::method(); // appelle la méthode statique "method" de la classe MonProjet\cname
$a = new namespace\sub\cname(); // instantie un objet de la classe MonProjet\sub\cname
$b = namespace\CONSTANT; // assigne la valeur de la constante MonProjet\CONSTANT à $b
?>
Exemple #5 l'opérateur namespace, dans l'espace de noms global
<?php
namespace\func(); // appelle la fonction func()
namespace\sub\func(); // appelle la fonction sub\func()
namespace\cname::method(); // appelle la méthode statique "method" de la classe cname
$a = new namespace\sub\cname(); // instantie un objet de la classe sub\cname
$b = namespace\CONSTANT; // assigne la valeur de la constante CONSTANT à $b
?>
(PHP 5 >= 5.3.0)
La capacité de faire référence à un nom absolu avec un alias ou en important un espace de noms est stratégique. C'est un avantage similaire aux liens symboliques dans un système de fichiers.
Les espaces de noms PHP supportent trois types d'alias ou d'importation : l'alias de nom de classe, l'alias de nom d'interface, et l'alias d'espace de noms. Notez que l'importation de constantes ou fonctions n'est pas supportée.
En PHP, l'alias est créé avec l'opérateur use. Voici un exemple qui présente les trois types d'importation :
Exemple #1 importation et alias avec l'opérateur use
<?php
namespace foo;
use My\Full\Classname as Another;
// Ceci est la même chose que use My\Full\NSname as NSname
use My\Full\NSname;
// importation d'une classe globale
use ArrayObject;
$obj = new namespace\Another; // instantie un objet de la classe foo\Another
$obj = new Another; // instantie un objet de la classe My\Full\Classname
NSname\subns\func(); // appelle la fonction My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // instantie un objet de la classe ArrayObject
// Sans l'instruction "use ArrayObject" nous aurions instantié un objet de la classe foo\ArrayObject
?>
De plus, PHP supporte des raccourcis pratiques, tels que les commandes use multiples.
Exemple #2 importation et alias multiples avec l'opérateur use
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // instantie un objet de la classe My\Full\Classname
NSname\subns\func(); // appelle la fonction My\Full\NSname\subns\func
?>
L'importation est réalisée à la compilation, ce qui fait que cela n'affecte pas les classes, fonctions et constantes dynamiques.
Exemple #3 Importation et noms d'espaces dynamiques
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // instantie un objet de la classe My\Full\Classname
$a = 'Another';
$obj = new $a; // instantie un objet de la classe Another
?>
De plus, l'importation n'affecte que les noms sans qualification. Les noms absolus restent absolus, et inchangés par un import.
Exemple #4 Importation et noms d'espaces absolus
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // instantie un objet de la classe My\Full\Classname
$obj = new \Another; // instantie un objet de la classe Another
$obj = new Another\untruc; // instantie un objet de la classe My\Full\Classname\untruc
$obj = new \Another\untruc; // instantie un objet de la classe Another\untruc
?>
Le mot-clé use doit être déclaré dans le contexte le plus externe d'un fichier (le contexte global) ou alors dans les déclarations d'espace de noms. Ceci car l'importation est effectuée à la compilation et non durant l'éxecution, donc on ne peut empiler les contextes. L'exemple qui suit montre des utilisation incorrectes du mot-clé use:
Exemple #5 Règles d'importation incorrectes
<?php
namespace Languages;
class Greenlandic
{
use Languages\Danish;
...
}
?>
Note:
Les règles d'importation sont basées sur les fichiers, ce qui signifie que les fichiers inclus n'hériteront PAS des règles d'importation du fichier parent.
(PHP 5 >= 5.3.0)
Sans aucune définition d'espace de noms, toutes les classes et les fonctions sont placées dans l'espace de noms global : comme en PHP avant que les espaces de noms aient été introduits. En préfixant un nom avec un anti-slash \, on peut demander l'utilisation de l'espace de noms global, même dans un contexte d'espace de noms spécifique.
Exemple #1 Spécification d'espace de noms global
<?php
namespace A\B\C;
/* Cette fonction est A\B\C\fopen */
function fopen() {
/* ... */
$f = \fopen(...); // appel à fopen global
return $f;
}
?>
(PHP 5 >= 5.3.0)
Dans un espace de noms, lorsque PHP rencontre un nom sans qualification, que ce soit une classe, une fonction ou une constante, il le résout avec différentes priorités. Les noms de classes sont toujours résolus avec l'espace de noms courant. Pour accéder à des classes internes ou à des classes qui ne sont pas dans un espace de noms, il faut les représenter avec leur nom absolu, tel que :
Exemple #1 Accès aux classes globales depuis un espace de noms
<?php
namespace A\B\C;
class Exception extends \Exception {}
$a = new Exception('hi'); // $a est un objet de la classe A\B\C\Exception
$b = new \Exception('hi'); // $b est un objet de la classe Exception
$c = new ArrayObject; // erreur fatale, classe A\B\C\ArrayObject non trouvée
?>
Pour les fonctions et constantes, PHP va aller les chercher dans l'espace global s'il ne peut les trouver dans l'espace de noms courant.
Exemple #2 Accès aux fonctions et constantes globales dans un espace de noms
<?php
namespace A\B\C;
const E_ERROR = 45;
function strlen($str)
{
return \strlen($str) - 1;
}
echo E_ERROR, "\n"; // affiche "45"
echo INI_ALL, "\n"; // affiche "7" : accès dans l'espace de noms global INI_ALL
echo strlen('hi'), "\n"; // affiche "1"
if (is_array('hi')) { // affiche "n'est pas un tableau"
echo "est un tableau\n";
} else {
echo "n'est pas un tableau\n";
}
?>
(PHP 5 >= 5.3.0)
Dans le cadre des règles de résolution, il y a plusieurs définitions importantes :
Ceci est un identifiant ne contenant pas un séparateur d'espace de noms. Par exemple : Foo
Ceci est un identifiant contenant un séparateur d'espace de noms. Par exemple : Foo\Bar
Ceci est un identifiant qui commence par un séparateur d'espace de noms. Par exemple : \Foo\Bar. namespace\Foo est aussi un nom absolu.
Les noms sont résolus en suivant les règles suivantes :
Exemple #1 Exemples de résolutions d'espaces de noms
<?php
namespace A;
use B\D, C\E as F;
// appels de fonctions
foo(); // tente d'appeler la fonction "foo" dans l'espace de noms "A"
// puis appelle la fonction globale "foo"
\foo(); // appelle la fonction "foo" définie dans l'espace de noms global
my\foo(); // appelle la fonction "foo" définie dans l'espace de noms "A\my"
F(); // tente d'appeler la fonction "F" définie dans l'espace "A"
// puis tente d'appeler la fonction globale "F"
// référence de classes references
new B(); // crée un objet de la classe "B" définie dans l'espace de noms "A"
// si non trouvé, il essaie l'autoload sur la classe "A\B"
new D(); // crée un objet de la classe "D" définie dans l'espace de noms "B"
// si non trouvé, il essaie l'autoload sur la classe "B\D"
new F(); // crée un objet de la classe "E" définie dans l'espace de noms "C"
// si non trouvé, il essaie l'autoload sur la classe "C\E"
new \B(); // crée un objet de la classe "B" définie dans l'espace de noms global
// si non trouvé, il essaie l'autoload sur la classe "B"
new \D(); // crée un objet de la classe "D" définie dans l'espace de noms global
// si non trouvé, il essaie l'autoload sur la classe "D"
new \F(); // crée un objet de la classe "F" définie dans l'espace de noms global
// si non trouvé, il essaie l'autoload sur la classe "F"
// méthodes statiques et fonctions d'espace de noms d'un autre espace
B\foo(); // appelle la fonction "foo" de l'espace de noms "A\B"
B::foo(); // appelle la méthode "foo" de la classe "B" définie dans l'espace de noms "A"
// si la classe "A\B" n'est pas trouvée, il essaie l'autoload sur la classe "A\B"
D::foo(); // appelle la méthode "foo" de la classe "D" définie dans l'espace de noms "B"
// si la classe "B\D" n'est pas trouvée, il essaie l'autoload sur la classe "B\D"
\B\foo(); // appelle la fonction "foo" de l'espace de noms "B"
\B::foo(); // appelle la méthode "foo" de la classe "B" située dans l'espace de noms global
// si la classe "B" n'est pas trouvée, il essaie l'autoload sur la classe "B"
// méthodes statiques et fonctions d'espace de noms de l'espace courant
A\B::foo(); // appelle la méthode "foo" de la classe "B" de l'espace de noms "A\A"
// si la classe "A\A\B" n'est pas trouvée, il essaie l'autoload sur la classe "A\A\B"
\A\B::foo(); // appelle la méthode "foo" de la classe "B" de l'espace de noms "A"
// si la classe "A\B" n'est pas trouvée, il essaie l'autoload sur la classe "A\B"
?>
(PHP 5 >= 5.3.0)
Cette FAQ est décomposée en deux sections : les questions courantes, et les points particuliers de l'implémentation, qui peuvent être utiles à la compréhension globale.
D'abord, les questions courantes.
Voici les points particuliers de l'implémentation, qui peuvent être utiles à la compréhension globale.
Non, les espaces de noms n'affectent pas le code existant, d'une manière ou d'une autre, ni le code qui sera produit et qui n'utilise pas les espaces de noms. Vous pouvez écrire ceci si vous voulez :
Exemple #1 Accès à une classe globale de l'extérieur d'un espace de noms
<?php
$a = new \stdClass;
?>
C'est une fonctionnalité équivalente à :
Exemple #2 Accéder à des classes globales hors d'un espace de noms
<?php
$a = new stdClass;
?>
Exemple #3 Accès aux classes internes depuis un espace de noms
<?php
namespace foo;
$a = new \stdClass;
function test(\ArrayObject $typehintexample = null) {}
$a = \DirectoryIterator::CURRENT_AS_FILEINFO;
// extension d'une classe interne ou globale
class MyException extends \Exception {}
?>
Exemple #4 Accès aux classes, fonctions et constantes internes dans un espace de noms
<?php
namespace foo;
class MaClasse {}
// utilisation d'une classe dans l'espace de noms courant, sous forme de type d'argument
function test(MaClasse $typehintexample = null) {}
// une autre manière d'utiliser une classe dans l'espace de noms courant
function test(\foo\MaClasse $typehintexample = null) {}
// extension d'une classe dans l'espace de noms courant
class Extended extends MaClasse {}
// accès à une fonction globale
$a = \globalfunc();
// accès à une constante globale
$b = \INI_ALL;
?>
Les noms qui commencent par \ sont toujours résolus en ce à quoi ils ressemblent, ce qui fait que \mon\nom est en fait mon\nom, et \Exception est Exception.
Exemple #5 Noms d'espaces absolus
<?php
namespace foo;
$a = new \mon\nom(); // instantie la classe "mon\nom"
echo \strlen('hi'); // appelle la fonction "strlen"
$a = \INI_ALL; // $a reçoit la valeur de la constante "INI_ALL"
?>
Les noms qui contiennent un anti-slash mais ne commencent par par un anti-slash, comme mon\nom peuvent être résolus de deux manières différentes.
S'il y a eu une commande d'importation qui fait un alias de mon, alors l'alias importé est appliqué à la place de mon, et l'espace de noms devient mon\nom.
Sinon, l'espace de noms courant est ajouté avant le chemin de la classe mon\nom.
Exemple #6 Noms qualifiés
<?php
namespace foo;
use blah\blah as foo;
$a = new mon\nom(); // instantie la classe "foo\mon\nom"
foo\bar::name(); // appelle la méthode statique "name" dans la classe "blah\blah\bar"
mon\bar(); // appelle la fonction "foo\mon\bar"
$a = mon\BAR; // affecte à $a la valeur de la constante "foo\mon\BAR"
?>
Les noms de classes qui ne contiennent pas d'anti-slash comme nom peuvent être résolus de deux manières différentes.
S'il y a une instruction d'importation qui définit un alias pour nom, alors l'alias est appliqué.
Sinon, l'espace de noms courant est utilisé et préfixé à nom.
Exemple #7 Classes sans qualification
<?php
namespace foo;
use blah\blah as foo;
$a = new nom(); // instantie la classe "foo\nom"
foo::nom(); // appelle la méthode statique "nom" dans la classe "blah\blah"
?>
Les fonctions et constantes qui n'ont pas d'anti-slash dans leur nom comme nom sont résolues de deux manières différentes :
D'abord, l'espace de noms courant est préfixé à nom.
Ensuite, si la constante ou la fonction nom n'existe pas dans l'espace de nom courant, la version globale de la constante ou la fonction nom est utilisée.
Exemple #8 Fonctions et constantes sans espace de noms
<?php
namespace foo;
use blah\blah as foo;
const FOO = 1;
function mon() {}
function foo() {}
function sort(&$a)
{
sort($a);
$a = array_flip($a);
return $a;
}
mon(); // appelle "foo\mon"
$a = strlen('hi'); // appelle la fonction globale "strlen" car "foo\strlen" n'existe pas
$arr = array(1,3,2);
$b = sort($arr); // appelle la fonction "foo\sort"
$c = foo(); // appelle la fonction "foo\foo" : l'importation n'est pas appliquée
$a = FOO; // assigne à $a la valeur de la constante "foo\FOO" : l'importation n'est pas appliquée
$b = INI_ALL; // assigne à $b la valeur de la constante "INI_ALL"
?>
La combinaison de scripts suivante est valide :
file1.php
<?php
namespace mes\trucs;
class MaClasse {}
?>
another.php
<?php
namespace another;
class untruc {}
?>
file2.php
<?php
namespace mes\trucs;
include 'file1.php';
include 'another.php';
use another\untruc as MaClasse;
$a = new MaClasse; // instantie la classe "untruc" de l'espace de noms another
?>
Il n'y a pas de conflit de noms, même si la classe MaClasse existe dans l'espace de noms mes\trucs, car la définition de MaClasse est dans un fichier séparé. Cependant, l'exemple suivant produit une erreur fatale à cause d'un conflit de noms, car MaClasse est définie dans le même fichier que l'instruction use.
<?php
namespace mes\trucs;
use another\untruc as MaClasse;
class MaClasse {} // erreur fatale: MaClasse est en conflit avec la commande d'importation
$a = new MaClasse;
?>
PHP ne permet pas d'imbriquer des espaces de noms.
<?php
namespace mes\trucs {
namespace nested {
class foo {}
}
}
?>
<?php
namespace mes\trucs\nested {
class foo {}
}
?>
Les seuls éléments qui sont affectés par la commande use sont les espaces de noms et les classes. Afin de réduire le nom d'une constante ou d'une fonction, il faut l'importer dans un espace de noms.
<?php
namespace mine;
use ultra\long\ns\nom;
$a = nom\CONSTANT;
nom\func();
?>
Il est très important de réaliser que, comme les anti-slash sont utilisés comme caractères de protection dans les chaînes, il faut toujours les doubler pour pouvoir les utiliser dans une chaîne. Sinon, il y a un risque d'utilisation inattendue :
Exemple #9 Dangers de l'utilisation des espaces de noms dans une chaîne
<?php
$a = new "dangereux\nom"; // \n est une nouvelle ligne dans une chaîne!
$obj = new $a;
$a = new 'pas\vraiment\dangereux'; // aucun problème ici
$obj = new $a;
?>
Toute constante indéfinie qui est sans qualificatif telle que FOO va produite une alerte : PHP supposait que FOO était la valeur de la constante. Toute constante, qualifiée partiellement ou totalement, qui contient un anti-slash, produite une erreur fatale si indéfinie.
Exemple #10 Constantes indéfinies
<?php
namespace bar;
$a = FOO; // produit une alerte : constante indéfinie "FOO", qui prend la valeur de "FOO";
$a = \FOO; // erreur fatale, constante d'espace de noms indéfinie FOO
$a = Bar\FOO; // erreur fatale, constante d'espace de noms indéfinie bar\Bar\FOO
$a = \Bar\FOO; // erreur fatale, constante d'espace de noms indéfinie Bar\FOO
?>
Toute tentative dans un espace de noms de remplacer les constantes natives ou spéciales, engendre une erreur fatale.
Exemple #11 Constantes qui ne peuvent être redéfinies
<?php
namespace bar;
const NULL = 0; // erreur fatale;
const true = 'stupid'; // encore une erreur fatale;
// etc.
?>
PHP a une gestion des exceptions similaire à ce qu'offrent les autres langages de programmation. Une exception peut être lancée ("throw") et attrapée ("catch") dans PHP. Le code devra être entouré d'un bloc try pour faciliter la saisie d'une exception potentielle. Chaque try doit avoir au moins un bloc catch correspondant. Plusieurs blocs catch peuvent être utilisés pour attraper différentes classes d'exceptions. L'exécution normale (lorsqu'aucune exception n'est lancée dans le bloc try ou lorsqu'un catch correspondant à l'exception lancée n'est pas présent) continue après le dernier bloc catch défini dans la séquence. Les exceptions peuvent être lancées (ou relancées) dans un bloc catch.
Lorsqu'une exception est lancée, le code suivant le traitement ne sera pas exécuté et PHP tentera de trouver le premier bloc catch correspondant. Si une exception n'est pas attrapée, une erreur fatale issue de PHP sera envoyée avec un message spécifiant que l'exception n'a pu être attrapée à moins qu'un gestionnaire d'exceptions ne soit défini avec la fonction set_exception_handler().
L'objet lancé doit être une instance de la classe Exception ou une sous-classe de la classe Exception. Tenter de lancer un objet qui ne correspond pas à cela résultera en une erreur fatale émise par PHP.
Note:
Les fonctions internes de PHP utilisent principalement l' Error reporting, seules les extensions orientées objet utilisent les exceptions. Quoiqu'il en soit, des erreurs peuvent facilement être traduites en exceptions avec ErrorException.
La bibliothèque standard PHP (SPL) fournit un bon nombre d'exceptions additionnelles.
Exemple #1 Lancer une exception
<?php
function inverse($x) {
if (!$x) {
throw new Exception('Division par zéro.');
}
else return 1/$x;
}
try {
echo inverse(5) . "\n";
echo inverse(0) . "\n";
} catch (Exception $e) {
echo 'Exception reçue : ', $e->getMessage(), "\n";
}
// Continue execution
echo 'Bonjour le monde !';
?>
L'exemple ci-dessus va afficher :
0.2 Exception reçue : Division par zéro. Bonjour le monde !
Exemple #2 Héritage d'une exception
<?php
class MyException extends Exception { }
class Test {
public function testing() {
try {
try {
throw new MyException('foo!');
} catch (MyException $e) {
/* on la relance */
throw $e;
}
} catch (Exception $e) {
var_dump($e->getMessage());
}
}
}
$foo = new Test;
$foo->testing();
?>
L'exemple ci-dessus va afficher :
string(4) "foo!"
Une classe d'exception écrite par l'utilisateur peut être définie en étendant la classe Exception interne. Les membres et les propriétés suivants montrent ce qui est accessible dans la classe enfant qui est dérivée de la classe Exception interne.
Exemple #1 La classe Exception interne
<?php
class Exception
{
protected $message = 'exception inconnu'; // message de l'exception
private $string; // __toString cache
protected $code = 0; // code de l'exception défini par l'utilisateur
protected $file; // nom du fichier source de l'exception
protected $line; // ligne de la source de l'exception
private $trace; // backtrace
private $previous; // exception précédente (depuis PHP 5.3)
public function __construct($message = null, $code = 0, Exception $previous = null);
final private function __clone(); // Inhibe le clonage des exceptions.
final public function getMessage(); // message de l'exception
final public function getCode(); // code de l'exception
final public function getFile(); // nom du fichier source
final public function getLine(); // ligne du fichier source
final public function getTrace(); // un tableau de backtrace()
final public function getPrevious(); // exception précédente (depuis PHP 5.3)
final public function getTraceAsString(); // chaîne formatée de trace
/* Remplacable */
public function __toString(); // chaîne formatée pour l'affichage
}
?>
Si une classe étend la classe Exception interne et redéfinit le constructeur, il est vivement recommandé qu'elle appelle aussi parent::__construct() pour s'assurer que toutes les données disponibles ont été proprement assignées. La méthode __toString() peut être réécrite pour fournir un affichage personnalisé lorsque l'objet est présenté comme une chaîne.
Note:
Les exceptions ne peuvent pas être clônées. Si vous tentez de clôner une exception, une erreur fatale (
E_ERROR) sera émise.
Exemple #2 Étendre la classe Exception (PHP 5.3.0+)
<?php
/**
* Définition d'une classe d'exception personnalisée
*/
class MyException extends Exception
{
// Redéfinissez l'exception ainsi le message n'est pas facultatif
public function __construct($message, $code = 0, Exception $previous = null) {
// traitement personnalisé que vous voulez réaliser ...
// assurez-vous que tout a été assigné proprement
parent::__construct($message, $code, $previous);
}
// chaîne personnalisée représentant l'objet
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
}
public function customFunction() {
echo "Une fonction personnalisée pour ce type d'exception\n";
}
}
/**
* Création d'une classe pour tester l'exception
*/
class TestException
{
public $var;
const THROW_NONE = 0;
const THROW_CUSTOM = 1;
const THROW_DEFAULT = 2;
function __construct($avalue = self::THROW_NONE) {
switch ($avalue) {
case self::THROW_CUSTOM:
// lance une exception personnalisée
throw new MyException('1 est un paramètre invalide', 5);
break;
case self::THROW_DEFAULT:
// lance l'exception par défaut.
throw new Exception('2 n\'est pas autorisé en tant que paramètre', 6);
break;
default:
// Aucune exception, l'objet sera créé.
$this->var = $avalue;
break;
}
}
}
// Exemple 1
try {
$o = new TestException(TestException::THROW_CUSTOM);
} catch (MyException $e) { // Devrait être attrapée
echo "Capture mon exception\n", $e;
$e->customFunction();
} catch (Exception $e) { // Sauté
echo "Capture l'exception par défaut\n", $e;
}
// Continue l'exécution
var_dump($o); // Null
echo "\n\n";
//Exemple 2
try {
$o = new TestException(TestException::THROW_DEFAULT);
} catch (MyException $e) { // Ne correspond pas à ce type
echo "Capture mon exception\n", $e;
$e->customFunction();
} catch (Exception $e) { // Devrait être attrapée
echo "Capture l'exception par défaut\n", $e;
}
// Continue l'exécution
var_dump($o); // Null
echo "\n\n";
// Exemple 3
try {
$o = new TestException(TestException::THROW_CUSTOM);
} catch (Exception $e) { // Devrait être attrapée
echo "Capture l'exception par défaut\n", $e;
}
// Continue l'exécution
var_dump($o); // Null
echo "\n\n";
// Exemple 4
try {
$o = new TestException();
} catch (Exception $e) { // sauté, aucune exception
echo "Capture l'exception par défaut\n", $e;
}
// Continue l'exécution
var_dump($o); // TestException
echo "\n\n";
?>
Note:
Dans PHP, avant PHP 5.3.0 les exceptions ne pouvaient être nichées. Le code suivant montre un exemple d'extension de la classe d'Exception avant PHP 5.3.0.
<?php
/**
* Définition d'une classe d'exception personnalisée
*/
class MyException extends Exception
{
// Redéfinition du constructeur pour rendre le message obligatoire
public function __construct($message, $code = 0) {
// du code ici
// Appel du parent
parent::__construct($message, $code);
}
// Représentation de l'objet sous forme de chaine personnalisée
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
}
public function customFunction() {
echo "Une méthode personnalisée pour cette exception\n";
}
}
?>
En PHP, les références sont destinées à appeler le contenu d'une variable avec un autre nom. Ce n'est pas comme en C ; vous ne pouvez pas effectuer des opérations arithmétiques comme sur des pointeurs, ce ne sont pas des adresses mémoires. Voyez Ce que les références ne sont pas pour plus d'informations. Les références sont des alias dans la table des symboles. Le nom de la variable et son contenu ont des noms différents, ce qui fait que l'on peut donner plusieurs noms au même contenu. On peut faire l'analogie avec les fichiers sous Unix, et leur nom de fichier : les noms des variables sont les entrées dans un répertoire, tandis que le contenu de la variable est le contenu même du fichier. Faire des références en PHP revient alors à faire des liens sous Unix.
Il y a 3 utilisations principales des références: assignation par référence, passage par référence, et retourner par référence. Cette section introduit ces opérations, avec des liens vers plus de précision.
Dans ce premier cas, les références PHP vous permettent de faire en sorte que 2 variables référencent le même contenu. Ainsi :
<?php
$a =& $b;
?>
Note:
$a et $b sont complètement égales ici : ce n'est pas $a qui pointe sur $b, ou vice-versa. C'est bien $a et $b qui pointent sur le même contenu.
Note:
Si vous assignez, passez ou retournez une variable indéfinie par référence, elle sera créée automatiquement.
Exemple #1 Utilisation des références avec des variables indéfinies
<?php
function foo(&$var) { }
foo($a); // $a est "créée" et assignée à NULL
$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)
$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>
La même syntaxe peut être utilisée avec les fonctions qui retournent des références, et avec l'opérateur new (depuis PHP 4.0.4 et avant PHP 5.0.0) :
<?php
$foo =& find_var($bar);
?>
E_DEPRECATED
à partir de PHP 5.3, et un message E_STRICT dans les versions
antérieures. (Techniquement, la difference est qu'en PHP 5, les objets comme les
ressources sont des pointeurs vers la donnée réelle. La notion de "référence" ici
est donc un peu différente (alias). Pour plus d'informations, voyez
Les objects et les références.)
Si vous assignez une référence à une variable déclarée global dans une fonction, la référence ne sera visible qu'au sein de la fonction. Vous pouvez éviter cela en utilisant le tableau $GLOBALS.
Exemple #2 Référencer des variables globales depuis fonction
<?php
$var1 = "Variable Exemple";
$var2 = "";
function global_references($use_globals)
{
global $var1, $var2;
if (!$use_globals) {
$var2 =& $var1; // visible uniquement dans la fonction
} else {
$GLOBALS["var2"] =& $var1; // visible également dans un contexte global
}
}
global_references(false);
echo "var2 est défini à '$var2'\n"; // var2 est défini à ''
global_references(true);
echo "var2 est défini à '$var2'\n"; // var2 est défini à 'Variable Exemple'
?>
Note:
Si vous assignez des valeurs par références dans une structure foreach, les références seront également modifiées.
Exemple #3 Références et structure foreach
<?php
$ref = 0;
$row =& $ref;
foreach (array(1, 2, 3) as $row) {
// faites quelque chose
}
echo $ref; // 3 - le dernier élément du tableau itéré
?>
Même si ce n'est pas strictement une assignation par référence, les expressions créees avec la structure de langage array() peuvent aussi se comporter comme tel en préfixant par & l'élément du tableau. Exemple:
<?php
$a = 1;
$b = array(2, 3);
$arr = array(&$a, &$b[0], &$b[1]);
$arr[0]++; $arr[1]++; $arr[2]++;
/* $a == 2, $b == array(3, 4); */
?>
Notez par contre que les références à l'intérieur des tableaux peuvent s'avérer dangereuses. Utiliser une assignation normale (pas par référence) avec une référence à droite de l'opérateur ne transforme pas la partie gauche de l'expression en référence, mais les références dans les tableaux sont préservées. Ceci s'applique aussi aux appels de fonctions avec un tableau passé par valeur. Exemple:
<?php
/* Assignation de variables scalaires */
$a = 1;
$b =& $a;
$c = $b;
$c = 7; //$c n'est pas une référence; pas de changement à $a ou $b
/* Assignation de variables de type tableau */
$arr = array(1);
$a =& $arr[0]; //$a et $arr[0] sont des références vers la même valeur
$arr2 = $arr; //PAS une assignation par référence!
$arr2[0]++;
/* $a == 2, $arr == array(2) */
/* Les contenus de $arr sont changés même si ce n'était pas une référence! */
?>
Le deuxième intérêt des références est de pouvoir passer des variables par référence. On réalise ceci en faisant pointer des variables locales vers le contenu des variables de fonction. Exemple :
<?php
function foo(&$var) {
$var++;
}
$a=5;
foo($a);
?>
Le troisième intérêt des références est de retourner des valeurs par référence.
Comme précisé ci-dessus, les références ne sont pas des pointeurs. Cela signifie que le script suivant ne fera pas ce à quoi on peut s'attendre :
<?php
function foo(&$var) {
$var =& $GLOBALS["baz"];
}
foo($bar);
?>
Il va se passer que $var dans foo sera lié à $bar, mais il sera aussi relié à $GLOBALS["baz"]. Il n'y a pas moyen de lier $bar à quelque chose d'autre en utilisant le mécanisme de référence, car $bar n'est pas accessible dans la fonction foo (certes, il est représenté par $var et $var possède la même valeur, mais n'est pas relié par la table des symboles). Vous pouvez utiliser les références arrières pour référencer les variables sélectionnées par la fonction.
Vous pouvez passer des variables par référence, de manière à ce que la fonction modifie ces variables. La syntaxe est la suivante :
<?php
function foo(&$var) {
$var++;
}
$a=5;
foo ($a);
// $a vaut 6 maintenant
?>
Note: Il n'y a pas de signe de référence dans l'appel de la fonction, uniquement sur sa définition. La définition de la fonction est suffisante pour passer correctement des arguments par référence. Dans les versions récentes de PHP, vous devriez recevoir une alerte disant que "Call-time pass-by-reference" est obsolète lorsque vous utilisez un & dans foo(&$a);.
Les objets suivants peuvent être passés par référence :
Une référence, retournée par une fonction :
<?php
function foo(&$var)
{
$var++;
}
function &bar()
{
$a = 5;
return $a;
}
foo(bar());
?>
Toutes les autres expressions ne doivent pas être passées par référence, car le résultat sera indéfini. Par exemple, les passages par référence suivants sont invalides :
<?php
function foo(&$var)
{
$var++;
}
function bar() // Notez l'absence de &
{
$a = 5;
return $a;
}
foo(bar()); // Produit une erreur fatale depuis PHP 5.0.5
foo($a = 5); // Expression, pas une variable
foo(5); // Produit une erreur fatale
?>
Retourner des références est toujours utile lorsque vous voulez utiliser une fonction pour savoir à quoi est liée une variable. N'utilisez pas le retour par référence pour améliorer les performances, le moteur est suffisamment robuste pour optimiser cela en interne. Retournez uniquement des références lorsque vous avez techniquement une bonne raison de le faire ! Pour retourner des références, utilisez cette syntaxe :
<?php
class foo {
public $value = 42;
public function &getValue() {
return $this->value;
}
}
$obj = new foo;
$myValue = &$obj->getValue(); // $myValue est une référence de $obj->value, qui vaut 42.
$obj->value = 2;
echo $myValue; // affiche la nouvelle valeur de $obj->value, i.e. 2.
?>
Note: Contrairement au passage de paramètre, vous devez utiliser & aux deux endroits, à la fois pour indiquer que vous retournez par référence (pas une copie habituelle), et pour indiquer que vous assignez aussi par référence (pas la copie habituelle) pour la variable $myValue.
Note: Si vous tentez de retourner une référence depuis une fonction avec la syntaxe :return ($this->value);, cela ne fonctionnera pas comme vous l'attendez et retournera le résultat de l'expression, mais pas de la variable, par référence. Vous ne pouvez retourner des variables par référence que depuis une fonction - rien d'autre. Depuis PHP 4.4.0 dans la branche PHP 4 et PHP 5.1.0 dans la branche PHP 5, une alerte
E_NOTICEest envoyée si le code tente de retourner une expression dynamique ou un résultat de l'opérateur new.
Pour utiliser la référence retournée, vous devez utiliser l'assignement par référence :
<?php
function &collector() {
static $collection = array();
return $collection;
}
$collection = &collector();
$collection[] = 'foo';
?>
<?php
function &collector() {
static $collection = array();
return $collection;
}
array_push(collector(), 'foo');
?>
Note: Notez que array_push(&collector(), 'foo'); ne fonctionnera pas, et résultera en une erreur fatale.
Lorsque vous détruisez une référence, vous ne faites que casser le lien entre le nom de la variable et son contenu. Cela ne signifie pas que le contenu est détruit. Par exemple :
<?php
$a = 1;
$b =& $a;
unset($a);
?>
Encore une fois, on peut comparer cette action avec la fonction unlink d'Unix.
De nombreuses syntaxes de PHP sont implémentées via le mécanisme de référence, et tout ce qui a été vu concernant les liaisons entre variables s'applique à ces syntaxes. Par exemple, le passage et le retour d'arguments par référence. Quelques autres exemples de syntaxes :
Lorsque vous déclarez une variable global $var, vous créez en fait une référence sur une variable globale. Ce qui signifie que
<?php
$var =& $GLOBALS["var"];
?>
Et que, si vous détruisez la variable $var, la variable globale ne sera pas détruite.
Dans une méthode d'objet, $this est toujours une référence sur l'objet courant.
PHP fournit un très grand nombre de variables prédéfinies accessibles à tous vos scripts. Ces variables représentent à peu près tout, allant des variables externes aux variables d'environnement intégrées à PHP, en passant par les derniers messages d'erreur ou les en-têtes récupérés.
Voir la FAQ intitulée "Comment la directive register_globals affecte-t-elle mes scripts ?"
Les Superglobales — Les Superglobales sont des variables internes qui sont toujours disponibles, quel que soit le contexte
Plusieurs variables prédéfinies en PHP sont "superglobales", ce qui signifie qu'elles sont disponibles quel que soit le contexte du script. Il est inutile de faire global $variable; avant d'y accéder dans les fonctions ou les méthodes.
Les variables superglobales sont :
| Version | Description |
|---|---|
| 4.1.0 | Les superglobales sont introduites en PHP. |
Note: Disponibilité des variables
Par défaut, toutes les superglobales sont disponibles, et seules les directives de configuration peuvent les rendre indisponibles. Pour plus d'informations, reportez-vous à la documentation sur l'ordre des variables.
Note: Gérer la directive register_globals
Si la directive obsolète register_globals est définie à on, alors les variables simples seront également disponibles dans le contexte global du script. Par exemple, $_POST['foo'] existera également sous la forme $foo.
Pour plus d'informations, voir la FAQ intitulée "Comment la directive register_globals affecte-t-elle mes scripts ?"
Note: Variable variables
Les superglobales ne peuvent pas être utilisées comme variables variables dans une fonction ou une méthode d'une classe.
(PHP 4, PHP 5)
$GLOBALS — Référence toutes les variables disponibles dans un contexte global
Un tableau associatif contenant les références sur toutes les variables globales actuellement définies dans le contexte d'exécution global du script. Les noms des variables sont les index du tableau.
Exemple #1 Exemple avec $GLOBALS
<?php
function test() {
$foo = "variable locale";
echo '$foo dans le contexte global : ' . $GLOBALS["foo"] . "\n";
echo '$foo dans le contexte courant : ' . $foo . "\n";
}
$foo = "Exemple de contenu";
test();
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
$foo dans le contexte global : Exemple de contenu $foo dans le contexte courant : variable locale
Note:
Ceci est une 'superglobale', ou variable globale automatique. Cela signifie simplement que cette variable est disponible dans tous les contextes du script. Il n'est pas nécessaire de faire global $variable; pour y accéder dans les fonctions ou les méthodes.
Note: Disponibilité des variables
Contrairement à toutes les autres superglobales, $GLOBALS a toujours été disponible en PHP.
(PHP 4 >= 4.1.0, PHP 5)
$_SERVER -- $HTTP_SERVER_VARS [Obsolète] — Variables de serveur et d'exécution
$_SERVER est un tableau contenant des informations comme les en-têtes, dossiers et chemins du script. Les entrées de ce tableau sont créées par le serveur web. Il n'y a aucune garantie que tous les serveurs les rempliront tous ; certains en oublieront quelques-unes et en rajouteront de nouvelles non mentionnées ici. Cependant, un grand nombre de ces variables fait partie des » spécifications CGI/1.1, et vous pouvez donc vous attendre à les retrouver.
$HTTP_SERVER_VARS contient les mêmes informations, mais n'est pas superglobale. (Notez que $HTTP_SERVER_VARS et $_SERVER sont des variables différentes et que PHP les traite en tant que telles.)
Vous pouvez éventuellement trouver les éléments suivants dans la variable $_SERVER. Notez que certains, n'auront pas de sens si vous utilisez PHP en ligne de commande.
Note:
Le script PHP se termine après avoir envoyé les en-têtes (après avoir produit n'importe quelle sortie sans avoir affiché le buffer) si la méthode de la requête était HEAD.
Note: Noter que lors de l'utilisation de ISAPI avec IIS, la valeur sera off si la demande n'a pas été faite via le protocole HTTPS.
Note: Votre serveur web doit être configuré pour créer cette variable. Par exemple, pour Apache, vous devez ajouter la directive HostnameLookups On dans le fichier httpd.conf, pour que cette variable existe. Voyez aussi gethostbyaddr().
Le chemin absolu vers le fichier contenant le script en cours d'exécution.
Note:
Si un script est exécuté avec le CLI, avec un chemin relatif, comme file.php ou ../file.php, $_SERVER['SCRIPT_FILENAME'] contiendra le chemin relatif spécifié par l'utilisateur.
Note: Depuis PHP 4.3.2, la variable PATH_TRANSLATED n'est plus seulement définie implicitement sous Apache 2 SAPI contrairement à la situation sous Apache 1 où elle est définie avec la même valeur que la variable serveur SCRIPT_FILENAME lorsqu'elle n'est pas fournie par Apache. Ce changement a été effectué pour être conforme aux spécifications CGI qui fait que la variable PATH_TRANSLATED doit exister seulement si la variable PATH_INFO est définie. Les utilisateurs d'Apache 2 devraient utiliser AcceptPathInfo = On dans leur httpd.conf pour définir PATH_INFO.
| Version | Description |
|---|---|
| 4.1.0 | Introduction de $_SERVER, rendant obsolète $HTTP_SERVER_VARS. |
Exemple #1 Exemple avec $_SERVER
<?php
echo $_SERVER['SERVER_NAME'];
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
www.example.com
Note:
Ceci est une 'superglobale', ou variable globale automatique. Cela signifie simplement que cette variable est disponible dans tous les contextes du script. Il n'est pas nécessaire de faire global $variable; pour y accéder dans les fonctions ou les méthodes.
(PHP 4 >= 4.1.0, PHP 5)
$_GET -- $HTTP_GET_VARS [Obsolète] — Variables HTTP GET
Un tableau associatif des valeurs passées au script courant via les paramètres d'URL.
$HTTP_GET_VARS contient les mêmes informations, mais n'est pas superglobale. (Notez que $HTTP_GET_VARS et $_GET sont des variables différentes et que PHP les traite comme telles.)
| Version | Description |
|---|---|
| 4.1.0 | Introduction de $_GET, rendant obsolète $HTTP_GET_VARS. |
Exemple #1 Exemple avec $_GET
<?php
echo 'Bonjour ' . htmlspecialchars($_GET["name"]) . '!';
?>
En assumant que l'utilisateur a entré http://example.com/?name=Yannick
L'exemple ci-dessus va afficher quelque chose de similaire à :
Bonjour Yannick !
Note:
Ceci est une 'superglobale', ou variable globale automatique. Cela signifie simplement que cette variable est disponible dans tous les contextes du script. Il n'est pas nécessaire de faire global $variable; pour y accéder dans les fonctions ou les méthodes.
Note:
Les variables GET sont passées via urldecode().
(PHP 4 >= 4.1.0, PHP 5)
$_POST -- $HTTP_POST_VARS [Obsolète] — Variables HTTP POST
Un tableau associatif des valeurs passées au script courant via le protocole HTTP et la méthode POST.
$HTTP_POST_VARS contient les mêmes informations, mais n'est pas superglobale. (Notez que $HTTP_POST_VARS et $_POST sont des variables différentes et que PHP les traite comme telles.)
| Version | Description |
|---|---|
| 4.1.0 | Introduction de $_POST, rendant obsolète $HTTP_POST_VARS. |
Exemple #1 Exemple avec $_POST
<?php
echo 'Bonjour ' . htmlspecialchars($_POST["name"]) . '!';
?>
En assumant que l'utilisateur a POSTé name=Yannick
L'exemple ci-dessus va afficher quelque chose de similaire à :
Bonjour Yannick !
Note:
Ceci est une 'superglobale', ou variable globale automatique. Cela signifie simplement que cette variable est disponible dans tous les contextes du script. Il n'est pas nécessaire de faire global $variable; pour y accéder dans les fonctions ou les méthodes.
(PHP 4 >= 4.1.0, PHP 5)
$_FILES -- $HTTP_POST_FILES [Obsolète] — Variable de téléchargement de fichier via HTTP
Un tableau associatif des valeurs téléchargées au script courant via le protocole HTTP et la méthode POST.
$HTTP_POST_FILES contient les mêmes informations, mais n'est pas superglobale. (Notez que $HTTP_POST_FILES et $_FILES sont des variables différentes et que PHP les traite comme telles)
| Version | Description |
|---|---|
| 4.1.0 | Introduction de $_FILES, rendant obsolète $HTTP_POST_FILES. |
Note:
Ceci est une 'superglobale', ou variable globale automatique. Cela signifie simplement que cette variable est disponible dans tous les contextes du script. Il n'est pas nécessaire de faire global $variable; pour y accéder dans les fonctions ou les méthodes.
(PHP 4 >= 4.1.0, PHP 5)
$_REQUEST — Variables de requête HTTP
Un tableau associatif qui contient par défaut le contenu des variables $_GET, $_POST et $_COOKIE.
| Version | Description |
|---|---|
| 5.3.0 | Introduction de request_order. Cette directive affecte le contenu de la variable $_REQUEST. |
| 4.3.0 | Les informations de $_FILES ont été supprimées de la variable $_REQUEST. |
| 4.1.0 | Introduction de $_REQUEST. |
Note:
Ceci est une 'superglobale', ou variable globale automatique. Cela signifie simplement que cette variable est disponible dans tous les contextes du script. Il n'est pas nécessaire de faire global $variable; pour y accéder dans les fonctions ou les méthodes.
Note:
En ligne de commande, cette variable n'inclut pas les variables argv et argc : elles sont stockées dans le tableau $_SERVER.
Note:
Les variables contenues dans $_REQUEST sont fournies au script via les mécanismes d'entrée GET, POST, et COOKIE et donc, peuvent être modifiées par l'utilisateur final ; aussi, vous ne pouvez faire confiance à leur contenu. La présence ainsi que l'ordre de ces variables dans ce tableau sont définis suivant la directive de configuration variables_order.
(PHP 4 >= 4.1.0, PHP 5)
$_SESSION -- $HTTP_SESSION_VARS [obsolète] — Variables de session
Un tableau associatif des valeurs stockées dans les sessions, et accessible au script courant. Voyez l'extension Sessions pour plus de détails sur comment est utilisée cette variable.
$HTTP_SESSION_VARS contient les mêmes informations, mais n'est pas superglobale. (Notez que $HTTP_SESSION_VARS et $_SESSION sont des variables différentes et que PHP les traite comme telles)
| Version | Description |
|---|---|
| 4.1.0 | Introduction de $_SESSION, rendant obsolète $HTTP_SESSION_VARS. |
Note:
Ceci est une 'superglobale', ou variable globale automatique. Cela signifie simplement que cette variable est disponible dans tous les contextes du script. Il n'est pas nécessaire de faire global $variable; pour y accéder dans les fonctions ou les méthodes.
(PHP 4 >= 4.1.0, PHP 5)
$_ENV -- $HTTP_ENV_VARS [Obsolète] — Variables d'environnement
Un tableau associatif de variable passé au script courant, via la méthode d'environnement.
Cette variable est importée dans l'espace de nom global de PHP, depuis l'environnement dans lequel l'exécutable PHP fonctionne. De nombreuses valeurs sont fournies par le shell qui exécute PHP, et différents systèmes pouvant disposer de différents shell, même un début de liste serait ici impossible. Reportez-vous à la documentation de votre shell pour connaître une liste de variables pré-définies.
Les autres variables d'environnement incluent les variables CGI, placées ici, indépendamment du fait que PHP fonctionne en tant que CGI ou bien que module du serveur.
$HTTP_ENV_VARS contient les mêmes informations, mais n'est pas superglobale. (Notez que $HTTP_ENV_VARS et $_ENV sont des variables différentes et que PHP les traite comme telles.)
| Version | Description |
|---|---|
| 4.1.0 | Introduction de $_ENV, rendant obsolète $HTTP_ENV_VARS. |
Exemple #1 Exemple avec $_ENV
<?php
echo 'Mon nom d\'utilisateur est ' .$_ENV["USER"] . '!';
?>
En assumant que "yannick" exécute ce script
L'exemple ci-dessus va afficher quelque chose de similaire à :
Mon nom d'utilisateur est yannick !
Note:
Ceci est une 'superglobale', ou variable globale automatique. Cela signifie simplement que cette variable est disponible dans tous les contextes du script. Il n'est pas nécessaire de faire global $variable; pour y accéder dans les fonctions ou les méthodes.
(PHP 4, PHP 5)
$php_errormsg — Le dernier message d'erreur
$php_errormsg est une variable qui contient le texte de la dernière erreur générée par PHP. Cette variable sera uniquement accessible dans le même contexte d'exécution que celui de la ligne qui a généré l'erreur, et uniquement si la directive de configuration track_errors est activée (elle est désactivée par défaut).
Note: Cette variable n'est disponible que lorsque track_errors a été activé dans le fichier php.ini.
Si un gestionnaire d'erreurs définit par l'utilisateur est actif
(set_error_handler()), $php_errormsg ne sera
définit que si le gestionnaire d'erreur retourne FALSE.
Exemple #1 Exemple avec $php_errormsg
<?php
@strpos();
echo $php_errormsg;
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Wrong parameter count for strpos()
(PHP 4, PHP 5)
$HTTP_RAW_POST_DATA — Données POST brutes
$HTTP_RAW_POST_DATA contient les données POST brutes. Voir always_populate_raw_post_data.
(PHP 4 >= 4.0.4, PHP 5)
$http_response_header — En-têtes de réponse HTTP
Le tableau $http_response_header est similaire à la fonction get_headers(). Lors de l'utilisation du gestionnaire HTTP, $http_response_header sera rempli avec les en-têtes de réponses HTTP. $http_response_header sera crée avec une portée locale.
Exemple #1 Exemple avec $http_response_header
<?php
function get_contents() {
file_get_contents("http://example.com");
var_dump($http_response_header);
}
get_contents();
var_dump($http_response_header);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
array(9) {
[0]=>
string(15) "HTTP/1.1 200 OK"
[1]=>
string(35) "Date: Sat, 12 Apr 2008 17:30:38 GMT"
[2]=>
string(29) "Server: Apache/2.2.3 (CentOS)"
[3]=>
string(44) "Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT"
[4]=>
string(27) "ETag: "280100-1b6-80bfd280""
[5]=>
string(20) "Accept-Ranges: bytes"
[6]=>
string(19) "Content-Length: 438"
[7]=>
string(17) "Connection: close"
[8]=>
string(38) "Content-Type: text/html; charset=UTF-8"
}
NULL
(PHP 4, PHP 5)
$argc — Le nombre d'arguments passés au script
Contient le nombre d'arguments passés au script courant lorsqu'il est exécuté depuis la ligne de commande.
Note: Le nom du fichier contenant le script est toujours passé en tant qu'argument au script, toutefois, la valeur minimale de $argc est 1.
Note: Cette variable n'est pas disponible lorsque register_argc_argv est désactivé.
Exemple #1 Exemple avec $argc
<?php
var_dump($argc);
?>
Lorsque l'on exécute l'exemple avec la commande : php script.php arg1 arg2 arg3
L'exemple ci-dessus va afficher quelque chose de similaire à :
int(4)
(PHP 4, PHP 5)
$argv — Tableau d'arguments passés au script
Contient un tableau de tous les arguments passés au script lorsqu'il est appelé depuis la ligne de commande.
Note: Le premier argument $argv[0] est toujours le nom qui a été utilisé pour exécuter le script.
Note: Cette variable n'est pas disponible lorsque register_argc_argv est désactivé.
Exemple #1 Exemple avec $argv
<?php
var_dump($argv);
?>
Lorsque l'on exécute l'exemple avec la commande : php script.php arg1 arg2 arg3
L'exemple ci-dessus va afficher quelque chose de similaire à :
array(4) {
[0]=>
string(10) "script.php"
[1]=>
string(4) "arg1"
[2]=>
string(4) "arg2"
[3]=>
string(4) "arg3"
}
Voir aussi les exceptions SPL.
(PHP 5 >= 5.1.0)
Exception est la classe de base pour toutes les exceptions.
Le message de l'exception
Le code de l'exception
Le nom du fichier dans lequel l'exception a été créée
La ligne où l'exception a été créée
(PHP 5 >= 5.1.0)
Exception::__construct — Construit l'exception
$message = ""
[, int $code = 0
[, Exception $previous = NULL
]]] )Construit l'exception.
message
Le message de l'exception à lancer.
code
Le code de l'exception.
previous
L'exception précédente, utilisée pour le chaînage d'exception.
| Version | Description |
|---|---|
| 5.3.0 |
Le paramètre previous a été ajouté.
|
Note:
Le
messagen'est PAS binary safe.
(PHP 5 >= 5.1.0)
Exception::getMessage — Récupère le message de l'exception
Retourne le message de l'exception.
Cette fonction ne contient aucun paramètre.
Retourne le message de l'exception, sous la forme d'une chaîne de caractères.
Exemple #1 Exemple avec Exception::getMessage()
<?php
try {
throw new Exception("Un message d'erreur");
} catch(Exception $e) {
echo $e->getMessage();
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Un message d'erreur
(PHP 5 >= 5.3.0)
Exception::getPrevious — Retourne l'exception précédente
Retourne l'exception précédente (le troisième paramètre de la méthode Exception::__construct()).
Cette fonction ne contient aucun paramètre.
Retourne la précédente Exception si disponible,
NULL sinon.
Exemple #1 Exemple avec Exception::getPrevious()
Une boucle, on affiche et on capture les exceptions.
<?php
class MyCustomException extends Exception {}
function doStuff() {
try {
throw new InvalidArgumentException("Vous avez fais une erreur !", 112);
} catch(Exception $e) {
throw new MyCustomException("Un problème est survenu", 911, $e);
}
}
try {
doStuff();
} catch(Exception $e) {
do {
printf("%s:%d %s (%d) [%s]\n", $e->getFile(), $e->getLine(), $e->getMessage(), $e->getCode(), get_class($e));
} while($e = $e->getPrevious());
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
/home/bjori/ex.php:8 Un problème est survenu (911) [MyCustomException] /home/bjori/ex.php:6 Vous avez fais une erreur ! (112) [InvalidArgumentException]
(PHP 5 >= 5.1.0)
Exception::getCode — Récupère le code de l'exception
Cette fonction ne contient aucun paramètre.
Retourne le code de l'exception, sous la forme d'un entier dans la classe Exception mais aussi sous la forme d'un autre type de données dans les classes héritant de Exception (par exemple, sous la forme d'une chaîne de caractères dans la classe PDOException).
Exemple #1 Exemple avec Exception::getCode()
<?php
try {
throw new Exception("Un message d'erreur", 30);
} catch(Exception $e) {
echo "Le code de l'exception est : " . $e->getCode();
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Le code de l'exception est : 30
(PHP 5 >= 5.1.0)
Exception::getFile — Récupère le fichier dans lequel l'exception est survenue
Récupère le nom du fichier dans lequel l'exception a été créée.
Cette fonction ne contient aucun paramètre.
Retourne le nom du fichier dans lequel l'exception a été créée.
Exemple #1 Exemple avec Exception::getFile()
<?php
try {
throw new Exception;
} catch(Exception $e) {
echo $e->getFile();
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
/home/bjori/tmp/ex.php
(PHP 5 >= 5.1.0)
Exception::getLine — Récupère la ligne dans laquelle l'exception est survenue
Récupère le numéro de la ligne où l'exception a été créée.
Cette fonction ne contient aucun paramètre.
Retourne le numéro de la ligne où l'exception a été créée.
Exemple #1 Exemple avec Exception::getLine()
<?php
try {
throw new Exception("Un message d'erreur");
} catch(Exception $e) {
echo "L'exception a été créée depuis la ligne : " . $e->getLine();
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
L'exception a été créée depuis la ligne : 3
(PHP 5 >= 5.1.0)
Exception::getTrace — Récupère la trace de la pile
Retourne la trace de la pile de l'exception.
Cette fonction ne contient aucun paramètre.
Retourne la trace de la pile de l'exception sous la forme d'un tableau.
Exemple #1 Exemple avec Exception::getTrace()
<?php
function test() {
throw new Exception;
}
try {
test();
} catch(Exception $e) {
var_dump($e->getTrace());
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
array(1) {
[0]=>
array(4) {
["file"]=>
string(22) "/home/bjori/tmp/ex.php"
["line"]=>
int(7)
["function"]=>
string(4) "test"
["args"]=>
array(0) {
}
}
}
(PHP 5 >= 5.1.0)
Exception::getTraceAsString — Récupère la trace de la pile en tant que chaîne
Retourne la trace de la pile de l'exception, sous la forme d'une chaîne de caractères.
Cette fonction ne contient aucun paramètre.
Retourne la trace de la pile de l'exception, sous la forme d'une chaîne de caractères.
Exemple #1 Exemple avec Exception::getTraceAsString()
<?php
function test() {
throw new Exception;
}
try {
test();
} catch(Exception $e) {
echo $e->getTraceAsString();
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
#0 /home/bjori/tmp/ex.php(7): test()
#1 {main}
(PHP 5 >= 5.1.0)
Exception::__toString — Représente l'exception sous la forme d'une chaîne
Retourne une représentation de l'exception sous forme d'une chaîne de caractères.
Cette fonction ne contient aucun paramètre.
Retourne la représentation de l'exception, sous la forme d'une chaîne de caractères.
Exemple #1 Exemple avec Exception::__toString()
<?php
try {
throw new Exception("Message d'erreur");
} catch(Exception $e) {
echo $e;
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
exception 'Exception' with message 'Message d'erreur' in /home/bjori/tmp/ex.php:3
Stack trace:
#0 {main}
(PHP 5 >= 5.1.0)
Exception::__clone — Clone l'exception
Tenter de cloner l'exception, qui résulte en une erreur fatale.
Cette fonction ne contient aucun paramètre.
Aucune valeur n'est retournée.
Les exceptions ne sont pas clonables.
(PHP 5 >= 5.1.0)
Une exception pour les erreurs.
$message = ""
[, int $code = 0
[, int $severity = 1
[, string $filename = __FILE__
[, int $lineno = __LINE__
[, Exception $previous = NULL
]]]]]] )La sévérité de l'exception
Exemple #1 Utilisation de set_error_handler() pour changer tous les messages d'erreurs en ErrorException
<?php
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");
/* Lance l'exception */
strpos();
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Fatal error: Uncaught exception 'ErrorException' with message 'Wrong parameter count for strpos()' in /home/bjori/tmp/ex.php:8
Stack trace:
#0 [internal function]: exception_error_handler(2, 'Wrong parameter...', '/home/bjori/php...', 8, Array)
#1 /home/bjori/php/cleandocs/test.php(8): strpos()
#2 {main}
thrown in /home/bjori/tmp/ex.php on line 8
(PHP 5 >= 5.1.0)
ErrorException::__construct — Construit l'exception
$message = ""
[, int $code = 0
[, int $severity = 1
[, string $filename = __FILE__
[, int $lineno = __LINE__
[, Exception $previous = NULL
]]]]]] )Construit l'exception.
message
Le message de l'exception à lancer.
code
Le code de l'exception.
severity
Le degré de sévérité de l'exception.
filename
Le fichier depuis lequel l'exception est lancée.
lineno
Le numéro de ligne depuis laquelle l'exception est lancée.
previous
La précédente exception utilisée pour le chaînage des exceptions.
(PHP 5 >= 5.1.0)
ErrorException::getSeverity — Récupère la sévérité de l'exception
Retourne la sévérité de l'exception.
Cette fonction ne contient aucun paramètre.
Retourne le degré de sévérité de l'exception.
Exemple #1 Exemple avec ErrorException::ErrorException()
<?php
try {
throw new ErrorException("Exception message", 0, 75);
} catch(ErrorException $e) {
echo "La sévérité de l'exception est : " . $e->getSeverity();
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
La sévérité de l'exception est : 75
Voir aussi les interfaces SPL.
(No version information available, might only be in SVN)
Interface permettant de détecter si une classe peut être parcourue en utilisant foreach.
L'interface de base est abstraite et ne peut être implémentée seule. Elle doit être implémentée par soit IteratorAggregate, soit Iterator.
Note:
Les classes internes qui implémentent cette interface peuvent être utilisées dans une constructeur foreach et n'ont pas besoin d'implémenter IteratorAggregate ou Iterator.
Note:
Ceci est une interface du moteur interne qui ne peut être implémentée dans des scripts PHP. Vous devez utiliser à la place IteratorAggregate ou Iterator.
Cette interface n'a pas de méthode ; son seul but est d'être l'interface de base pour toutes les classes permettant de parcourir des objets.
(PHP 5 >= 5.0.0)
Interface pour les itérateurs ou les objets externes qui peuvent être itérés eux-mêmes en interne.
PHP fournit quelques itérateurs pour certaines tâches. Voir les itérateurs SPL pour une liste complète.
Exemple #1 Exemple simple
Cet exemple montre l'ordre d'appel des méthodes lors d'un appel à l'instruction foreach sur un itérateur.
<?php
class myIterator implements Iterator {
private $position = 0;
private $array = array(
"premierelement",
"secondelement",
"dernierelement",
);
public function __construct() {
$this->position = 0;
}
function rewind() {
var_dump(__METHOD__);
$this->position = 0;
}
function current() {
var_dump(__METHOD__);
return $this->array[$this->position];
}
function key() {
var_dump(__METHOD__);
return $this->position;
}
function next() {
var_dump(__METHOD__);
++$this->position;
}
function valid() {
var_dump(__METHOD__);
return isset($this->array[$this->position]);
}
}
$it = new myIterator;
foreach($it as $key => $value) {
var_dump($key, $value);
echo "\n";
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
string(18) "myIterator::rewind" string(17) "myIterator::valid" string(19) "myIterator::current" string(15) "myIterator::key" int(0) string(12) "premierelement" string(16) "myIterator::next" string(17) "myIterator::valid" string(19) "myIterator::current" string(15) "myIterator::key" int(1) string(13) "secondelement" string(16) "myIterator::next" string(17) "myIterator::valid" string(19) "myIterator::current" string(15) "myIterator::key" int(2) string(11) "dernierelement" string(16) "myIterator::next" string(17) "myIterator::valid"
(PHP 5 >= 5.0.0)
Iterator::current — Retourne l'élément courant
Cette fonction ne contient aucun paramètre.
Peut retourner tout type.
(PHP 5 >= 5.0.0)
Iterator::key — Retourne la clé de l'élément courant
Retourne la clé de l'élément courant.
Cette fonction ne contient aucun paramètre.
Retourne un scalaire en cas de succès, ou
NULL si une erreur survient.
Émet une alerte de type E_NOTICE si une erreur survient.
(PHP 5 >= 5.0.0)
Iterator::next — Se déplace sur l'élément suivant
Se déplace de la position courant à l'élément suivant.
Note:
Cette méthode est appelée après chaque boucle foreach.
Cette fonction ne contient aucun paramètre.
Les valeurs retournées seront ignorées.
(PHP 5 >= 5.0.0)
Iterator::rewind — Replace l'itérateur sur le premier élément
Replace l'itérateur sur le premier élément.
Note:
C'est la première méthode appelée lors du départ d'une boucle foreach. Elle ne sera pas exécutée après la boucle foreach.
Cette fonction ne contient aucun paramètre.
Toutes les valeurs retournées sont ignorées.
(PHP 5 >= 5.0.0)
Iterator::valid — Vérifie si la position courante est valide
Cette méthode est appelée après Iterator::rewind() et Iterator::next() pour vérifier si la position courante est valide.
Cette fonction ne contient aucun paramètre.
La valeur retournée sera transtypée en booléen, puis, évaluée.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PHP 5 >= 5.0.0)
Interface pour créer un itérateur externe.
Exemple #1 Exemple simple
<?php
class myData implements IteratorAggregate {
public $property1 = "Propriété publique numéro un";
public $property2 = "Propriété publique numéro deux";
public $property3 = "Propriété publique numéro trois";
public function __construct() {
$this->property4 = "dernière propriété";
}
public function getIterator() {
return new ArrayIterator($this);
}
}
$obj = new myData;
foreach($obj as $key => $value) {
var_dump($key, $value);
echo "\n";
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
string(9) "property1" string(19) "Propriété publique numéro un" string(9) "property2" string(19) "Propriété publique numéro deux" string(9) "property3" string(21) "Propriété publique numéro trois" string(9) "property4" string(13) "dernière propriété"
(PHP 5 >= 5.0.0)
IteratorAggregate::getIterator — Retourne un itérateur externe
Retourne un itérateur externe.
Cette fonction ne contient aucun paramètre.
Une instance d'un objet qui implémente un Iterator ou l'interface Traversable.
Émet une Exception en cas d'échec.
(PHP 5 >= 5.0.0)
Interface permettant d'accéder aux objets de la même façon que pour les tableaux.
Exemple #1 Exemple simple
<?php
class obj implements arrayaccess {
private $container = array();
public function __construct() {
$this->container = array(
"un" => 1,
"deux" => 2,
"trois" => 3,
);
}
public function offsetSet($offset, $value) {
if (is_null($offset)) {
$this->container[] = $value;
} else {
$this->container[$offset] = $value;
}
}
public function offsetExists($offset) {
return isset($this->container[$offset]);
}
public function offsetUnset($offset) {
unset($this->container[$offset]);
}
public function offsetGet($offset) {
return isset($this->container[$offset]) ? $this->container[$offset] : null;
}
}
$obj = new obj;
var_dump(isset($obj["deux"]));
var_dump($obj["deux"]);
unset($obj["deux"]);
var_dump(isset($obj["deux"]));
$obj["deux"] = "Une valeur";
var_dump($obj["deux"]);
$obj[] = 'Ajout 1';
$obj[] = 'Ajout 2';
$obj[] = 'Ajout 3';
print_r($obj);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
bool(true)
int(2)
bool(false)
string(10) "Une valeur"
obj Object
(
[container:obj:private] => Array
(
[un] => 1
[trois] => 3
[deux] => Une valeur
[0] => Ajout 1
[1] => Ajout 2
[2] => Ajout 3
)
)
(PHP 5 >= 5.0.0)
ArrayAccess::offsetExists — Indique si une position existe dans un tableau
Indique si une position existe.
Cette méthode est exécutée lorsque la fonction isset() ou empty() est appliquée à un objet qui implémente l'interface ArrayAccess.
Note:
Lors de l'utilisation de empty(), ArrayAccess::offsetGet() est appelé et vérifie si la valeur est vide, uniquement si ArrayAccess::offsetExists() retourne
TRUE.
offset
Une position à vérifier.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Note:
La valeur retournée sera transtypée en booléen si une valeur non booléenne est retournée.
Exemple #1 Exemple avec ArrayAccess::offsetExists()
<?php
class obj implements arrayaccess {
public function offsetSet($offset, $value) {
var_dump(__METHOD__);
}
public function offsetExists($var) {
var_dump(__METHOD__);
if ($var == "foobar") {
return true;
}
return false;
}
public function offsetUnset($var) {
var_dump(__METHOD__);
}
public function offsetGet($var) {
var_dump(__METHOD__);
return "value";
}
}
$obj = new obj;
echo "Exécute obj::offsetExists()\n";
var_dump(isset($obj["foobar"]));
echo "\nExécute obj::offsetExists() et obj::offsetGet()\n";
var_dump(empty($obj["foobar"]));
echo "\nExécute obj::offsetExists(), *et non pas* obj:offsetGet() car il n'y a rien à lire\n";
var_dump(empty($obj["foobaz"]));
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Exécute obj::offsetExists() string(17) "obj::offsetExists" bool(true) Exécute obj::offsetExists() et obj::offsetGet() string(17) "obj::offsetExists" string(14) "obj::offsetGet" bool(false) Exécute obj::offsetExists(), *et non pas* obj:offsetGet() car il n'y a rien à lire string(17) "obj::offsetExists" bool(true)
(PHP 5 >= 5.0.0)
ArrayAccess::offsetGet — Position à lire
Retourne la valeur à la position donnée.
Cette méthode est exécutée lorsque l'on vérifie si une position est empty().
offset
La position à lire.
Note:
Depuis PHP 5.3.4, la vérification du prototype a été supprimée et il devient possible de retourner par référence. Ceci permet les modifications indirectes des dimensions de l'objet ArrayAccess.
Une modification directe remplace complètement la valeur dans la dimension du tableau comme dans $obj[6] = 7. Une modification indirecte, par contre, ne change qu'une partie de la dimension ou intervient lors de l'assignation par référence vers une autres variable, comme dans $obj[6][7] = 7 ou encore $var =& $obj[6] suivi de l'incrémentation avec ++ et la décrémentation avec --.
Les modifications directes appellent ArrayAccess::offsetSet() alors que les modifications indirectes appellent ArrayAccess::offsetGet(). Dans ce cas, l'implémentation de ArrayAccess::offsetGet() doit retourner une référence sinon un message
E_NOTICEsera levé.
Peut retourner n'importe quel type de valeur.
(PHP 5 >= 5.0.0)
ArrayAccess::offsetSet — Position à assigner
Assigne une valeur à une position donnée.
offset
La position à laquelle assigner une valeur.
value
La valeur à assigner.
Aucune valeur n'est retournée.
Note:
Le paramètre
offsetsera définit àNULLsi une autre valeur n'est pas disponible, comme dans l'exemple suivant :<?php
$arrayaccess[] = "première valeur";
$arrayaccess[] = "seconde valeur";
print_r($arrayaccess);
?>L'exemple ci-dessus va afficher :
Array ( [0] => première valeur [1] => seconde valeur )
Note:
Cette fonction n'est pas appelée dans les assignations par référence et lors de changements de dimensions indirects (indirects dans le sens d'un changement d'une sous-dimension ou lors de l'assignation par référence à une autre variable). A la place, ArrayAccess::offsetGet() est appelée. Cette opération ne fonctionnera que si cette méthode retourne une référence, ceci n'étant possible que depuis PHP 5.3.4.
(PHP 5 >= 5.0.0)
ArrayAccess::offsetUnset — Position à supprimer
Supprime une position.
Note:
Cette méthode ne sera pas appelée lors du transtypage en (unset).
offset
La position à supprimer.
Aucune valeur n'est retournée.
(PHP 5 >= 5.1.0)
Interface permettant de personnaliser la linéarisation.
Les classes implémentant cette interface ne supportent plus __sleep() et __wakeup(). La méthode de linéarisation est appelée chaque fois qu'une instance doit être linéarisée. Elle n'appelle pas la méthode __destruct() et n'a aucun effet sur le contenu de cette méthode. Lorsque les données sont linéarisées, la classe est connue et la méthode unserialize() appropriée est appelée comme constructeur au lieu d'appeler __construct(). Si vous devez appeler le constructeur standard, vous pouvez le faire dans la méthode.
Exemple #1 Exemple simple
<?php
class obj implements Serializable {
private $data;
public function __construct() {
$this->data = "Mes données privées";
}
public function serialize() {
return serialize($this->data);
}
public function unserialize($data) {
$this->data = unserialize($data);
}
public function getData() {
return $this->data;
}
}
$obj = new obj;
$ser = serialize($obj);
var_dump($ser);
$newobj = unserialize($ser);
var_dump($newobj->getData());
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
string(38) "C:3:"obj":23:{s:15:"My private data";}"
string(15) "Mes données privées"
(PHP 5 >= 5.1.0)
Serializable::serialize — Représentation linéaire de l'objet
Retourne la représentation en chaîne de caractères de l'objet.
Note:
Cette méthode se comporte comme un destructeur de l'objet. La méthode __destruct() ne sera pas appelée après cette méthode.
Cette fonction ne contient aucun paramètre.
Retourne la représentation de l'objet en chaîne de caractères, ou bien NULL
Émet une Exception si un autre type que
chaîne de caractères ou NULL est retourné.
(PHP 5 >= 5.1.0)
Serializable::unserialize — Construit un objet
$serialized
)Appelé lors de la délinéarisation de l'objet.
Note:
Cette méthode se comporte comme un constructeur d'objet. La méthode __construct() ne sera pas appelée après cette méthode.
serialized
La représentation en chaîne de l'objet.
La valeur de retour est ignorée.
(No version information available, might only be in SVN)
Classe utilisée pour représenter les fonctions anonymes.
Les fonctions anonymes, implémentées depuis PHP 5.3, sont portées par des objets de ce type. Au départ il s'agissait d'un détail d'implémentation, mais maintenant cette classe prend du sens. Depuis PHP 5.4, cette classe possède des méthodes qui permettent de prendre le contrôle sur la fonction après sa création.
En plus des méthodes précisées ici, cette classe possède aussi une méthode __invoke. Ceci pour des raison de logique avec l'implémentation de la méthode magique d'appel.
(No version information available, might only be in SVN)
Closure::__construct — Constructeur empêchant l'instanciation
Cette méthode n'existe que pour interdire l'instanciation directe de la classe Closure. Des objets d'une telle classe sont crées au moyen des fonctions anonymes.
Cette fonction ne contient aucun paramètre.
Pas de retour. Elle emet par contre une erreur de type
E_RECOVERABLE_ERROR.
(No version information available, might only be in SVN)
Closure::bind — Duplique une fermeture avec un nouvel objet lié et un nouveau contexte de classe.
$closure
, object $newthis
[, mixed $newscope
= 'static'
] )Cette méthode est une version statique de Closure::bindTo(). Voyez sa documentation pour plus d'informations.
closure
La fonction anonyme à lier.
newthis
L'objet auquel lier la fonction anonyme ou NULL pour délier
newscope
Le contexte de classe à associer à la fermeture, ou 'static' pour conserver le contexte actuel. Si un objet est utilisé, son type sera utilisé. Ceci détermine les accès protégés et privés de l'objet lié.
Retourne un nouvel objet Closure ou FALSE si une erreur survient
Exemple #1 Exemple Closure::bind()
<?php
class A {
private static $sfoo = 1;
private $ifoo = 2;
}
$cl1 = static function() {
return A::$sfoo;
};
$cl2 = function() {
return $this->ifoo;
};
$bcl1 = Closure::bind($cl1, null, 'A');
$bcl2 = Closure::bind($cl2, new A(), 'A');
echo $bcl1(), "\n";
echo $bcl2(), "\n";
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
1 2
(No version information available, might only be in SVN)
Closure::bindTo — Duplique la fermeture avec un nouvel objet lié et un nouveau contexte de classe.
Crée et retourne une nouvelle fonction anonyme avec le même corps et les même variables que l'original, mais avec un objet lié et un contexte de classe différents.
L'objet lié détermine la valeur de $this dans le corps de la fonction
et le contexte de classe détermine une classe pour les ensembles privé/protégé auquels la
fonction aura accès. Les propriétés qui seront visibles seront les mêmes que si la
fonction anonyme était une méthode de la classe passée à newscope.
Les fermetures statiques ne peuvent avoir d'objet lié (la valeur du paramètre
newthis doit alors être NULL), mais le contexte de classe peut
lui, être changé.
Cette fonction va vérifier qu'une fermeture non statique à qui on passe
un contexte d'objet deviendra liée à cet objet (et ne sera donc plus non statique),
et vice-versa. Dans ce but, les fermetures non statiques à qui l'on passe un
contexte de classe mais NULL comme contexte objet, deviendront statiques et
inversement.
Note:
Si vous voulez seulement dupliquer la fonction anonyme, utilisez le clonage à la place.
newthis
L'objet auquel lier la fonction anonyme ou NULL pour une fermeture statique.
newscope
Le contexte de classe à associer à la fermeture, ou 'static' pour conserver le contexte actuel. Si un objet est utilisé, son type sera utilisé. Ceci determine les accès protégés et privés.
Retourne la nouvelle fermeture sous forme d'objet Closure,
ou FALSE si une erreur survient
Exemple #1 Exemple Closure::bindTo()
<?php
class A {
function __construct($val) {
$this->val = $val;
}
function getClosure() {
//retourne une fermeture liée à cet objet et ce contexte
return function() { return $this->val; };
}
}
$ob1 = new A(1);
$ob2 = new A(2);
$cl = $ob1->getClosure();
echo $cl(), "\n";
$cl = $cl->bindTo($ob2);
echo $cl(), "\n";
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
1 2
PHP offre divers options et paramètres de contexte, qui peuvent être utilisés avec tous les systèmes de fichiers et gestionnaires de flux. Le contexte est créé avec la fonction stream_context_create(). Les options sont définies avec la fonction stream_context_set_option() et les paramètres, avec la fonction stream_context_set_params().
Options de contexte des sockets — Liste des options de contexte des sockets
Les options de contexte des sockets sont disponibles pour tous les gestionnaires fonctionnant via les sockets, comme tcp, http et ftp.
| Version | Description |
|---|---|
| 5.1.0 | Ajout du paramètre bindto. |
| 5.3.3 | Ajout du paramètre backlog. |
Exemple #1 Exemple d'utilisation du paramètre bindto
<?php
// Connexion à Internet en utilisant l'IP '192.168.0.100'
$opts = array(
'socket' => array(
'bindto' => '192.168.0.100:0',
),
);
// Connexion à Internet en utilisant l'IP '192.168.0.100' et le port '7000'
$opts = array(
'socket' => array(
'bindto' => '192.168.0.100:7000',
),
);
// Connexion à Internet en utilisant le port '7000'
$opts = array(
'socket' => array(
'bindto' => '0:7000',
),
);
// Création du contexte...
$context = stream_context_create($opts);
// ...et l'utilise pour récupérer les données
echo file_get_contents('http://www.example.com', false, $context);
?>
Options de contexte HTTP — Liste des options de contexte HTTP
Options de contexte pour les protocoles http:// et https://.
| Version | Description |
|---|---|
| 5.3.4 |
Ajout du paramètre follow_location.
|
| 5.3.0 |
Le paramètre protocol_version supporte les
transferts chunked lorsqu'on lui assigne
la valeur 1.1.
|
| 5.2.10 |
Ajout du paramètre ignore_errors.
|
| 5.2.10 |
Le paramètre header peut désormais être
un tableau indexé numériquement.
|
| 5.2.1 |
Ajout du paramètre timeout.
|
| 5.1.0 | Ajout de la possibilité d'utiliser des proxy HTTPS. |
| 5.1.0 |
Ajout du paramètre max_redirects.
|
| 5.1.0 |
Ajout du paramètre protocol_version.
|
Exemple #1 Récupération d'une page et envoi de données POST
<?php
$postdata = http_build_query(
array(
'var1' => 'du contenu',
'var2' => 'doh'
)
);
$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $postdata
)
);
$context = stream_context_create($opts);
$result = file_get_contents('http://example.com/submit.php', false, $context);
?>
Exemple #2 Ignore les redirections mais récupère les en-têtes et le contenu
<?php
$url = "http://www.example.org/header.php";
$opts = array('http' =>
array(
'method' => 'GET',
'max_redirects' => '0',
'ignore_errors' => '1'
)
);
$context = stream_context_create($opts);
$stream = fopen($url, 'r', false, $context);
// informations sur les en-têtes et métadonnées du flux
var_dump(stream_get_meta_data($stream));
// données actuelles de $url
var_dump(stream_get_contents($stream));
fclose($stream);
?>
Note: Options de contexte du flux sous-jacent
Des options de contexte supplémentaires peuvent être supportées par le transport sous-jacent. Pour les flux http://, référez-vous aux options de contexte du transport tcp://. Pour les flux https://, référez-vous aux options de contexte du transport ssl://.
Note: Ligne de statut HTTP
Lorsque ce gestionnaire de flux suit une redirection, wrapper_data, retourné par la fonction stream_get_meta_data() ne doit pas contenir obligatoirement la ligne de statut HTTP qui s'applique à des données de contenu à l'index 0.La première requête retourne une 301 (redirection permanente), ainsi, le gestionnaire de flux suit automatiquement la redirection pour récupérer une réponse 200 (index = 4).array ( 'wrapper_data' => array ( 0 => 'HTTP/1.0 301 Moved Permantenly', 1 => 'Cache-Control: no-cache', 2 => 'Connection: close', 3 => 'Location: http://example.com/foo.jpg', 4 => 'HTTP/1.1 200 OK', ...
Options de contexte FTP — Liste des options de contexte FTP
Options de contexte pour les protocoles ftp:// et ftps://.
| Version | Description |
|---|---|
| 5.1.0 |
Ajout du paramètre proxy.
|
| 5.0.0 |
Ajout des paramètres overwrite et
resume_pos.
|
Note: Options de contexte du flux sous-jacent
Des options de contexte supplémentaires peuvent être supportées par le transport sous-jacent. Pour les flux ftp://, référez-vous aux options de contexte du transport tcp://. Pour les flux ftps://, référez-vous aux options de contexte du transport ssl://.
Options de contexte SSL — Liste des options de contexte SSL
Options de contexte pour les protocoles ssl:// et tls://.
| Version | Description |
|---|---|
| 5.3.2 |
Ajout de SNI_enabled et de
SNI_server_name.
|
| 5.0.0 |
Ajout des paramètres capture_peer_cert,
capture_peer_chain et
ciphers.
|
Note: Vu que ssl:// est un protocole sous-jacent pour les gestionnaires https:// et ftps://, toutes les options de contexte appliquées à ssl:// seront également appliquées à https:// et ftps://.
Note: Afin que SNI (Server Name Indication) soit disponible, PHP doit être compilé avec OpenSSL 0.9.8j ou supérieur. Utilisez la constante
OPENSSL_TLSEXT_SERVER_NAMEpour déterminer si SNI est supporté ou non.
Options de contexte CURL — Liste des options de contexte CURL
Les options de contexte CURL sont disponibles lorsque l'extension CURL a été compilée en utilisant l'option de configuration --with-curlwrappers .
Exemple #1 Récupère une page et envoie des données avec la méthode POST
<?php
$postdata = http_build_query(
array(
'var1' => 'du contenu',
'var2' => 'doh'
)
);
$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $postdata
)
);
$context = stream_context_create($opts);
$result = file_get_contents('http://example.com/submit.php', false, $context);
?>
Les options du contexte Phar — Liste des options du contexte Phar
Les options de contexte pour le gestionnaire phar://.
Paramètres de contexte — Liste des paramètres de contexte
Ces paramètres peuvent être définis sur un contexte, en utilisant la fonction stream_context_set_params().
PHP dispose de nombreux protocoles natifs, pour différents styles d'URL, à utiliser avec des fonctions de fichiers telles que fopen(), copy(), file_exists() et filesize(). En plus de ces gestionnaires, vous pouvez écrire vos propres gestionnaires et les enregistrer avec la fonction stream_wrapper_register().
Note: La syntaxe de l'URL utilisée pour décrire un gestionnaire est exclusivement de la forme scheme://.... Les syntaxes de la forme scheme:/ et scheme: ne sont pas supportées.
file:// — Système de fichiers
Filesystem est le gestionnaire par défaut de PHP et il représente les fichiers locaux. Lorsqu'un chemin relatif est spécifié (un chemin qui ne commence pas par /, \, \\, ou une lettre de lecteur Windows), le chemin sera calculé relativement à la position courante. Dans de nombreux cas, c'est le dossier de résidence du script, à moins qu'il n'ait été modifié. En utilisant la version CLI, le chemin sera calculé par rapport au dossier d'appel du script.
Avec certaines fonctions comme fopen() et file_get_contents(), include_path peut être analysé pour y trouver les fichiers, si un chemin relatif est fourni.
| Version | Description |
|---|---|
| 5.0.0 | Ajout de file://. |
http:// -- https:// — Accès aux URLs HTTP(s)
Permet des accès en lecture uniquement, pour des fichiers accessibles sur le réseau avec la méthode GET de HTTP 1.0. Un en-tête Host: est envoyé avec la requête, pour gérer les hôtes virtuels, basés sur des noms. Si vous avez configuré une version de navigateur avec l'option user_agent dans votre fichier php.ini, ou via le contexte de flux, il sera aussi utilisé dans votre requête.
Le flux donne l'accès au corps (body) de la ressource. Les en-têtes sont stockés dans la variable $http_response_header.
Si il vous est important de savoir l'URL de la ressource depuis laquelle votre document provient (après l'exécution de toutes les redirections), vous devrez analyser toutes les en-têtes retournés par le flux.
La directive from sera utilisée pour l'en-tête From: si elle a été définie, et non écrasée par les Options et paramètres de contexte.
| Version | Description |
|---|---|
| 4.3.7 | Détecte les serveurs IIS bogués pour éviter les erreurs "SSL: Fatal Protocol Error". |
| 4.3.0 | Ajout de https://. |
| 4.0.5 | Ajout du support des redirections. |
Exemple #1 Détecte la dernière URL après des redirections
<?php
$url = 'http://www.example.com/redirecting_page.php';
$fp = fopen($url, 'r');
$meta_data = stream_get_meta_data($fp);
foreach ($meta_data['wrapper_data'] as $response) {
/* Où sommes-nous redirigés ? */
if (strtolower(substr($response, 0, 10)) == 'location: ') {
/* mise à jour de $url avec le chemin après redirection */
$url = substr($response, 10);
}
}
?>
Exemple #2 Envoi d'en-têtes personnalisés avec la requête HTTP
Les en-têtes personnalisés peuvent être envoyés en utilisant des options de context. Il est également possible d'utiliser ce contournement : Les en-têtes personnalisés peuvent être envoyés avec une requête HTTP en tirant avantage d'un effet de bord dans la gestion de la configuration INI de user_agent. Définissez user_agent en n'importe quelle chaîne valide (comme la chaîne par défaut, PHP/version) suivi d'un caractère de retour chariot et d'un caractère de nouvelle ligne, suivis des entêtes additionnels.
<?php
ini_set('user_agent', "PHP\r\nX-MyCustomHeader: Foo");
$fp = fopen('http://www.example.com/index.php', 'r');
?>
La requête suivante sera émise :
GET /index.php HTTP/1.0 Host: www.example.com User-Agent: PHP X-MyCustomHeader: Foo
Note: HTTPS n'est supporté que si l'extension openssl est active.
Les connexions HTTP sont en lecture seule ; l'écriture de données ou la copie de fichier vers une ressource HTTP n'est pas supportée.
L'envoi de requêtes POST et PUT, peut être effectué, par exemple, avec l'aide des contextes HTTP.
ftp:// -- ftps:// — Accès aux URLs FTP(s)
Permet l'accès aux fichiers existants, et la création de fichiers via FTP. Si le serveur ne supporte pas les connexions en mode passif, la connexion échouera.
Vous pouvez ouvrir des fichiers en lecture ou en écriture, mais pas les deux en même temps. Si le fichier distant existe déjà sur le serveur ftp et que vous tentez de l'ouvrir en écriture alors que vous n'avez pas spécifié l'option overwrite dans le contexte, la connexion échouera. Si vous devez réécrire des fichiers existants en utilisant ftp, spécifiez l'option overwrite dans le contexte et ouvrez le fichier en écriture. Alternativement, vous pouvez utiliser l'extension FTP.
Si vous avez définie la directive from dans le fichier php.ini, alors cette valeur sera émise en tant que mot de passe pour les FTP anonymes.
| Version | Description |
|---|---|
| 4.3.0 | Ajout de ftps://. |
Note:
FTPS n'est supporté que lorsque l'extension openssl est active.
Si le serveur ne supporte pas SSL, alors la connexion passera automatiquement en connexion ftp non chiffrée.
Note: L'ajout
Depuis PHP 5.0.0, les fichiers peuvent être ajoutés avec le gestionnaire d'URL ftp://. Dans les précédentes versions, si vous tentez d'ajouter un fichier avec ce gestionnaire, une erreur sera émise.
php:// — Accès aux divers flux I/O
PHP fournit un nombre important de flux I/O qui permettent d'accéder aux flux d'entrée et de sortie de Php, à l'entrée standart, à l'entrée et la sortie des descripteurs de fichiers, aux flux représentant les fichiers temporaires en mémoire vive ou sur le disque, ainsi qu'aux filtres qui peuvent manipuler d'autres ressources de fichiers en lecture ou en écriture.
php://stdin, php://stdout et
php://stderr permettent des accès directs aux flux d'entrée
ou de sortie correspondant du processus PHP. Le flux représente une copie
du descripteur de fichier, aussi, si vous ouvrez php://stdin
et le fermez plus tard, vous ne fermez que votre copie du descripteur ; le
flux actuel, référencé par STDIN n'est pas affecté. Notez
que PHP avez un comportement relativement bogué jusqu'à la version PHP 5.2.1.
Il est recommandé d'utiliser uniquement les constantes STDIN,
STDOUT et STDERR au lieu
d'ouvrir manuellement les flux en utilisant ces gestionnaires.
php://stdin est en lecture seule, alors que php://stdout et php://stderr sont en écriture seule.
php://input est un flux en lecture seule qui permet de lire des données brutes depuis la requête. Dans le cas de requêtes POST, il est préférable d'utiliser le flux php://input au lieu de la variable $HTTP_RAW_POST_DATA vu qu'elle ne dépend d'aucune directive de configuration du php.ini. De plus, dans les cas où $HTTP_RAW_POST_DATA n'est pas peuplé par défaut, il est potentiellement plus intéressant en terme de mémoire d'activer la directive always_populate_raw_post_data. php://input n'est pas disponible avec enctype="multipart/form-data".
Note: Un flux ouvert avec php://input ne peut être lu qu'une seule fois ; le flux ne supporte pas les opérations de rembobinage. Cependant, suivant l'implémentation du SAPI, il peut être possible d'ouvrir un autre flux php://input et recommencer à lire. Ceci n'est possible que si la requête des données a été sauvegardée. Typiquement, c'est le cas pour les requêtes POST, mais pas pour les autres méthodes comme PUT ou PROPFIND.
php://output est un flux en écriture seule qui permet d'écrire dans le mécanisme de buffer de sortie de la même façon que les fonctions print et echo.
php://fd permet un accès direct au descripteur de fichier fourni. Par exemple, php://fd/3 correspond au descripteur de fichier numéro 3.
php://memory et php://temp sont des flux en lecture/écriture qui permettent de sauvegarder des données temporaires dans un gestionnaire de fichiers. La seule différence entre ces deux flux est que php://memory autorise la sauvegarde des données en mémoire, alors que php://temp utilisera un fichier temporaire une fois que la quantité de données sauvegardées aura dépassé une limite prédéfinie (par défaut, 2 Mo). L'endroit de stockage de ce fichier temporaire est déterminé de la même manière que pour la fonction sys_get_temp_dir().
La limite mémoire de php://temp peut être contrôlée en ajoutant /maxmemory:NN, où NN est la quantité de mémoire maximale à conserver en mémoire avant d'utiliser un fichier temporaire, en octets.
php://filter est une sorte de gestionnaire prévu pour permettre l'application de filtres sur un flux au moment de l'ouverture. Ceci est très pratique avec des fonctions sur des fichiers toutes-en-un comme les fonctions readfile(), file() et file_get_contents() où il n'est pas opportun d'appliquer un filtre au flux avant d'avoir lu le contenu.
La cible de php://filter prend les paramètres suivants sous la forme de partie du chemin. Reportez-vous aux exemples spécifiques pour une utilisation correcte de ces paramètres.
| Nom | Description |
|---|---|
| resource=<flux à filtrer> | Ce paramètre est requis. Il spécifie le flux que vous souhaitez filtrer. |
| read=<liste des filtres à appliquer à la lecture> | Ce paramètre est optionnel. Un ou plusieurs noms de filtres peuvent être fournis ici, séparés par un caractère pipe (|). |
| write=<liste des filtres à appliquer à l'écriture> | Ce paramètre est optionnel. Un ou plusieurs noms de filtres peuvent être fournis ici, séparés par un caractère pipe (|). |
| <liste de filtre à appliquer à la fois lors de la lecture et de l'écriture> | Tous les filtres fournis sans être préfixés par read= ou write= seront appliqués à la fois lors de la lecture et lors de l'écriture. |
| Version | Description |
|---|---|
| 5.3.6 | php://fd a été ajouté. |
| 5.1.0 | php://memory et php://temp ont été ajoutés. |
| 5.0.0 | php://filter a été ajouté. |
Exemple #1 php://temp/maxmemory
Le paramètre optionnel autorise la configuration de la limitation mémoire avant que php://temp commence à utiliser un fichier temporaire.
<?php
// Définit la limite à 5 Mo.
$fiveMBs = 5 * 1024 * 1024;
$fp = fopen("php://temp/maxmemory:$fiveMBs", 'r+');
fputs($fp, "hello\n");
// Lit ce que nous venons d'écrire.
rewind($fp);
echo stream_get_contents($fp);
?>
Exemple #2 php://filter/resource=<flux à filtrer>
Ce paramètre doit se situer à la fin de votre spécification de php://filter et doit pointer sur le flux que vous souhaitez filtrer.
<?php
/* Ceci est équivalent à
readfile("http://www.example.com");
vu qu'aucun filtre n'est spécifié */
readfile("php://filter/resource=http://www.example.com");
?>
Exemple #3 php://filter/read=<liste de filtres à appliquer lors de la lecture>
Ce paramètre prend un ou plusieurs noms de filtres séparés par un caractère pipe |.
<?php
/* Ceci affichera le contenu complet de
www.example.com en majuscule */
readfile("php://filter/read=string.toupper/resource=http://www.example.com");
/* Ceci fera la même chose que le précédent,
mais encodera en ROT13 le résultat */
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.example.com");
?>
Exemple #4 php://filter/write=<liste des filtres à appliquer lors de l'écriture>
Ce paramètre prend un ou plusieurs noms de filtres séparés par un caractère pipe |.
<?php
/* Ceci va filtrer la chaîne "Hello World"
via le filtre rot13, puis, écrit le résultat
dans le fichier example.txt du dossier courant */
file_put_contents("php://filter/write=string.rot13/resource=example.txt","Hello World");
?>
zlib:// -- bzip2:// -- zip:// — Flux compressés
zlib: PHP 4.0.4 - PHP 4.2.3 (systèmes avec fopencookie uniquement)
compress.zlib:// et compress.bzip2:// PHP 4.3.0 et suivant
zlib: fonctionne comme gzopen(), hormis le fait que le flux peut être utilisé directement avec fread() et les autres fonctions de système de fichiers. Cette notation est obsolète depuis PHP 4.3.0, étant données les ambiguïtés dues aux noms de fichiers contenant des deux points ':'. Utilisez plutôt compress.zlib://.
compress.zlib:// et compress.bzip2:// sont respectivement équivalents à gzopen() et bzopen(), et ils opèrent même sur les systèmes qui ne supportent pas fopencookie.
L'extension ZIP enregistre le gestionnaire zip:.
data:// — Données (RFC 2397)
Le gestionnaire de flux data: (» RFC 2397) est disponible depuis PHP 5.2.0.
Exemple #1 Affichage du contenu de data://
<?php
// Affiche "I love PHP"
echo file_get_contents('data://text/plain;base64,SSBsb3ZlIFBIUAo=');
?>
Exemple #2 Récupération du type de média
<?php
$fp = fopen('data://text/plain;base64,', 'r');
$meta = stream_get_meta_data($fp);
// Affiche "text/plain"
echo $meta['mediatype'];
?>
glob:// — Trouve des noms de fichiers correspondant à un masque donné
Le gestionnaire de flux glob: est disponible depuis PHP 5.3.0.
Exemple #1 Utilisation simple
<?php
// Boucle sur tous les fichiers *.php du dossier ext/spl/examples/ et
// affiche le nom du fichier ainsi que sa taille
$it = new DirectoryIterator("glob://ext/spl/examples/*.php");
foreach($it as $f) {
printf("%s: %.1FK\n", $f->getFilename(), $f->getSize()/1024);
}
?>
tree.php: 1.0K findregex.php: 0.6K findfile.php: 0.7K dba_dump.php: 0.9K nocvsdir.php: 1.1K phar_from_dir.php: 1.0K ini_groups.php: 0.9K directorytree.php: 0.9K dba_array.php: 1.1K class_tree.php: 1.8K
phar:// — Archive PHP
Le gestionnaire de flux phar:// est disponible depuis PHP 5.3.0. Voyez gestionnaire de flux Phar pour une description détaillée.
ssh2:// — Shell sécurisé 2
ssh2.shell:// ssh2.exec:// ssh2.tunnel:// ssh2.sftp:// ssh2.scp:// PHP 4.3.0 et suivants (PECL)
Note: Ce gestionnaire n'est pas activé par défaut
Pour utiliser le gestionnaire ssh2.*://, vous devez installer l'extension » SSH2 disponible dans » PECL.
En plus d'accepter les traditionnelles identifications via l'URI, le gestionnaire ssh2 réutilisera les connexions ouvertes en passant la ressource de connexion dans la partie hôte de l'URL.
Exemple #1 Ouverture d'un flux depuis une connexion active
<?php
$session = ssh2_connect('example.com', 22);
ssh2_auth_pubkey_file($session, 'username', '/home/username/.ssh/id_rsa.pub',
'/home/username/.ssh/id_rsa', 'secret');
$stream = fopen("ssh2.tunnel://$session/remote.example.com:1234", 'r');
?>
rar:// — RAR
Ce gestionnaire prend un chemin encodé URL vers l'archive RAR (relatif ou absolu), puis, optionnellement, un astérisque (*), puis, optionnellement, un signe dièse (#), puis, optionnellement, un nom d'entrée encodé URL, tel que stocké dans l'archive. Le fait de spécifier un nom d'entrée nécessite la présence du signe dièse ; la présence d'un slash final est optionnel.
Ce gestionnaire peut ouvrir à la fois des fichiers ou des dossiers. Lors de l'ouverture de dossiers, l'astérisque force les noms des dossiers à être retournés non encodés. S'il n'est pas spécifié, ils seront retournés sous la forme encodée URL - ceci permet au gestionnaire d'être utilisé correctement avec les fonctionnalités internes comme RecursiveDirectoryIterator en présence de noms de fichiers qui semblent être encodés URL.
Si le signe dièse et le nom de l'entrée ne sont pas inclus, la racine de l'archive sera affiché. Cet affichage est différent des dossiers réguliers dans le sens où le flux résultant ne contiendra pas d'informations comme la date et heure de modification, vu que la racine du dossier n'est pas stocké comme une entrée individuelle dans l'archive. L'utilisation de ce gestionnaire avec RecursiveDirectoryIterator nécessite la présence du signe dièse dans l'URL lors de l'accès à la racine afin de construire correctement les URLs des fils.
Note: Ce gestionnaire n'est pas activé par défaut
Afin d'utiliser le gestionnaire rar://, vous devez installer l'extension » rar disponible depuis » PECL.
rar:// est disponible depuis PECL rar 3.0.0
Exemple #1 Parcours d'une archive RAR
<?php
class MyRecDirIt extends RecursiveDirectoryIterator {
function current() {
return rawurldecode($this->getSubPathName()) .
(is_dir(parent::current())?" [DIR]":"");
}
}
$f = "rar://" . rawurlencode(dirname(__FILE__)) .
DIRECTORY_SEPARATOR . 'dirs_and_extra_headers.rar#';
$it = new RecursiveTreeIterator(new MyRecDirIt($f));
foreach ($it as $s) {
echo $s, "\n";
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
|-allow_everyone_ni [DIR]
|-file1.txt
|-file2_אּ.txt
|-with_streams.txt
\-אּ [DIR]
|-אּ\%2Fempty%2E [DIR]
| \-אּ\%2Fempty%2E\file7.txt
|-אּ\empty [DIR]
|-אּ\file3.txt
|-אּ\file4_אּ.txt
\-אּ\אּ_2 [DIR]
|-אּ\אּ_2\file5.txt
\-אּ\אּ_2\file6_אּ.txt
Exemple #2 Ouverture d'un fichier crypté (en-tête crypté)
<?php
$stream = fopen("rar://" .
rawurlencode(dirname(__FILE__)) . DIRECTORY_SEPARATOR .
'encrypted_headers.rar' . '#encfile1.txt', "r", false,
stream_context_create(
array(
'rar' =>
array(
'open_password' => 'samplepassword'
)
)
)
);
var_dump(stream_get_contents($stream));
/* Les date de création et du dernier accès sont fournies par WinRAR,
* mais la plupart des autres logiciels ne la fournisse pas */
var_dump(fstat($stream));
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
string(26) "Encrypted file 1 contents."
Array
(
[0] => 0
[1] => 0
[2] => 33206
[3] => 1
[4] => 0
[5] => 0
[6] => 0
[7] => 26
[8] => 0
[9] => 1259550052
[10] => 0
[11] => -1
[12] => -1
[dev] => 0
[ino] => 0
[mode] => 33206
[nlink] => 1
[uid] => 0
[gid] => 0
[rdev] => 0
[size] => 26
[atime] => 0
[mtime] => 1259550052
[ctime] => 0
[blksize] => -1
[blocks] => -1
)
ogg:// — Flux Audio
Les fichiers ouverts pour lecture avec le gestionnaire ogg://
sont traités comme de l'audio compressée en utilisant le codec OGG/Vorbis.
De la même façon, les fichiers ouverts pour écriture ou pour ajout avec le gestionnaire
ogg:// sont écrits comme étant des données audio compressées.
La fonction stream_get_meta_data(), lorsqu'elle est utilisée sur un
fichier OGG/Vorbis ouvert pour lecture retournera de nombreux détails
concernant ce flux, incluant l'en-tête vendor, tous les commentaires
comments, le nombre de canaux
channels, le taux d'échantillonnage rate
ainsi que le taux d'encodage décrit par :
bitrate_lower, bitrate_upper,
bitrate_nominal et bitrate_window.
ogg:// PHP 4.3.0 et suivant (PECL)
Note: Ce gestionnaire n'est pas activé par défaut
Pour utiliser le gestionnaire ogg://, vous devez installer l'extension » OGG/Vorbis disponible sur » PECL.
expect:// — Gestionnaire de flux
Les flux ouverts avec le gestionnaire expect:// permettent d'accéder à stdio, stdout et stderr via PTY.
Note: Ce gestionnaire n'est pas activé par défaut
Pour pouvoir utiliser le gestionnaire expect://, vous devez installer l'extension » Expect disponible depuis » PECL.
expect:// PHP 4.3.0 et supérieur (PECL)
PHP est un langage puissant et l'interpréteur, qu'il soit inclus dans le serveur web ou bien compilé en version CGI, est capable d'accéder aux fichiers, d'exécuter des commandes et d'ouvrir des connexions réseaux. Toutes ces propriétés rendent fragile la sécurité d'un serveur web. Le langage PHP a été pensé afin d'être un langage beaucoup plus sécurisé pour écrire des CGI que le Perl ou le langage C. De plus, une sélection rigoureuse des options de compilation et d'exécution vous permettra d'obtenir un équilibre parfait entre liberté et sécurité.
Étant donné qu'il y a de nombreux moyens d'utiliser le langage PHP, il y a de nombreuses directives de configuration afin d'en contrôler le comportement. Un grand nombre d'options permettent d'utiliser PHP dans de nombreuses situations, mais cela signifie aussi qu'il y a certaines combinaisons d'options de compilation et d'exécution qui fragilisent la sécurité du serveur. Ce chapitre explique comment les différentes options de configuration peuvent être combinées, tout en conservant une sécurité maximum.
La flexibilité de configuration de PHP est épaulée par la flexibilité du code. PHP peut être compilé pour constituer une application serveur complète, avec toutes les fonctionnalités d'un shell, ou il peut encore être utilisé comme simple SSI (server side include) avec peu de risque, dans un environnement à sécurité renforcée. La création de cet environnement et sa sécurité est largement à la charge du développeur PHP.
Ce chapitre commence par expliquer les différentes options de configuration et les situations dans lesquelles elles peuvent être utilisées en toute sécurité. Puis, viennent les considérations de niveaux de sécurité, et les conseils généraux.
Un système complètement sûr est une impossibilité virtuelle. L'approche souvent utilisée par les professionnels de la sécurité est d'équilibrer les risques et l'ergonomie. Si chaque variable fournie par l'utilisateur demandait deux formes de validation biométrique (un scan de la rétine et une empreinte digitale), on obtiendrait un système avec un niveau de sécurité d'un bon niveau. Il faudrait aussi une bonne heure pour remplir un formulaire simple, ce qui encouragerait les utilisateurs à trouver un moyen de contourner cette sécurité.
La meilleure sécurité est suffisamment discrète pour assurer un maximum de sécurité sans ajouter de contraintes insurmontables pour l'utilisateur ou de systèmes complexes de programmation. Souvent, les attaques sur un script sont des exploitations des systèmes de sécurité trop complexes, qui s'érodent au cour du temps.
Un principe qu'il est bon de retenir : Un système est aussi sur que son maillon le plus faible. Si toutes les transactions sont bien notées dans une base, avec confirmation mais que l'utilisateur est identifié uniquement par un cookie, la robustesse de votre système est sévèrement réduite.
Lorsque vous testez votre site, gardez en tête que vous ne pourrez jamais tester toutes les situations, même pour les pages les plus simples. Les valeurs que vous attendez seront toujours complètement différentes des valeurs entrées par un employé négligent, un hacker qui a toute la nuit devant lui ou encore le chat de la maison qui marche sur le clavier. C'est pourquoi il est préférable de regarder le code d'un point de vue logique, pour repérer les points d'entrée des données inattendues, puis de voir comment elles pourront être modifiées, amplifiées ou réduites.
L'Internet est rempli d'individus qui tentent de se faire une renommée en piratant vos programmes, en bloquant votre site, en envoyant des contenus inappropriés, qui rendent vos journées si "spéciales". Peu importe que vous ayez un grand portail ou un petit web, vous pouvez être la cible pour tout quidam avec une connexion. Vous êtes une cible potentielle dès que vous êtes connecté vous-même. Certains programmes de piratage ne font pas dans la demi-mesure, et testent systématiquement des millions d'IP, à la recherche de victimes : ne soyez pas la prochaine.
Utiliser PHP comme un CGI exécutable vient la majorité du temps du fait que l'on ne veut pas l'utiliser comme un module du serveur web, (comme Apache), ou bien que l'on souhaite l'utiliser en combinaison d'un CGI complémentaire, afin de créer un environnement de script sécurisé (en utilisant des techniques de chroot ou setuid). Une telle décision signifie habituellement que vous installez votre exécutable dans le répertoire cgi-bin de votre serveur web. » CERT CA-96.11 recommande effectivement de ne placer aucun interpréteur à l'intérieur du répertoire cgi-bin. Même si le programme PHP peut être utilisé comme interpréteur indépendant, PHP a été pensé afin de rendre impossible les attaques que ce type d'installation induit.
Si votre serveur n'a aucun document dont l'accès est restreint par un mot de passe ou un système de vérification de l'adresse IP, vous n'avez aucun besoin de ce type de configuration. Si votre serveur web ne permet pas les redirections, ou si votre serveur web n'a aucun besoin de communiquer avec le binaire PHP de manière sécurisée, vous pouvez utiliser l'option de compilation --disable-force-cgi-redirect. Vous devez quand même vérifier qu'aucun script ne fait appel au PHP, de manière directe, http://my.host/cgi-bin/php/dir/script.php ou bien de manière indirecte, par redirection, http://my.host/dir/script.php.
Les redirections peuvent être configurées dans les fichiers de configuration d'Apache en utilisant les directives "AddHandler" et "Action" (voir ci-dessous).
La directive de configuration cgi.force_redirect évite qu'un appel direct à un script PHP avec une URL comme http://my.host/cgi-bin/php/secretdir/script.php soit possible. Dans ce cas-là, PHP analysera le fichier uniquement s'il y a eu redirection. En PHP antérieur à la version 4.2.0, vous deviez utiliser l'option de compilation --enable-force-cgi-redirect pour faire la même chose.
Habituellement, le serveur web Apache réalise une redirection grâce aux directives suivantes :
Action php-script /cgi-bin/php AddHandler php-script .php
Cette option a uniquement été testée avec Apache et compte sur Apache pour affecter la variable d'environnement non-standard REDIRECT_STATUS pour les requêtes redirigées. Dans le cas où votre serveur web ne supporte pas le renseignement de PHP, pour savoir si la requête a été redirigée ou non, vous ne pouvez pas utiliser cette option de compilation. Vous devez alors utiliser une des autres méthodes d'exploitation de la version binaire CGI de PHP, comme exposé ci-dessous.
Ajouter un contenu interactif dans votre serveur web, comme des scripts ou des exécutables, est souvent considéré comme une pratique non-sécurisée. Si, par erreur, le script n'est pas exécuté mais affiché comme une page HTML classique, il peut en résulter un vol de propriété intellectuelle ou des problèmes de sécurité à propos des mots de passe notamment. Donc, la majorité des administrateurs préfèrent mettre en place un répertoire spécial pour les scripts qui soit uniquement accessible par le biais du binaire CGI de PHP, et donc, tous les fichiers de ce répertoire seront interprétés et non affichés tels quels.
Aussi, si vous ne pouvez pas utiliser la méthode présentée ci-dessus, il est nécessaire de mettre en place un répertoire "doc_root" différent de votre répertoire "document root" de votre serveur web.
Vous pouvez utiliser la directive doc_root
dans le fichier de configuration,
ou vous pouvez affecter la variable d'environnement
PHP_DOCUMENT_ROOT. Si cette variable d'environnement
est affectée, le binaire CGI de PHP construira
toujours le nom de fichier à ouvrir avec doc_root
et le "path information" de la requête, et donc vous serez sûr
qu'aucun script n'est exécuté en dehors du répertoire
prédéfini (à l'exception du répertoire
désigné par la directive user_dir
Voir ci-dessous).
Une autre option possible ici est la directive
user_dir. Lorsque la directive n'est pas
activée, seuls les fichiers contenus dans le répertoire
doc_root peuvent être ouverts.
Ouvrir un fichier possédant l'url
http://my.host/~user/doc.php ne correspond
pas à l'ouverture d'un fichier sous le répertoire racine de
l'utilisateur mais à l'ouverture du fichier
~user/doc.php sous le répertoire
"doc_root" (oui, un répertoire commence par un tilde
[~]).
Si la directive "user_dir" est activée à la valeur public_php par exemple, une requête du type http://my.host/~user/doc.php ouvrira un fichier appelé doc.php sous le répertoire appelé public_php sous le répertoire racine de l'utilisateur. Si le répertoire racine des utilisateurs est /home/user, le fichier exécuté sera /home/user/public_php/doc.php.
user_dir et doc_root sont
deux directives totalement indépendantes et donc vous pouvez
contrôler l'accès au répertoire "document root"
séparément des répertoires "user directory".
Une solution extrêmement sécurisée consiste à mettre l'exécutable PHP à l'extérieur de l'arborescence du serveur web. Dans le répertoire /usr/local/bin, par exemple. Le problème de cette méthode est que vous aurez à rajouter la ligne suivante :
Exemple #1 Ligne d'invocation de PHP
#!/usr/local/bin/php
Pour que l'exécutable PHP prenne en compte les variables d'environnement PATH_INFO et PATH_TRANSLATED correctement avec cette configuration, vous devez utiliser l'option de compilation --enable-discard-path.
Lorsque PHP est compilé en tant que module Apache, ce module hérite des permissions accordées à l'utilisateur faisant tourner Apache (par défaut, l'utilisateur "nobody"). Cela à plusieurs impacts sur la sécurité et les autorisations. Par exemple, si vous utilisez PHP pour accéder à une base de données, à moins que la base n'ait un système de droits d'accès interne, vous devrez rendre la base accessible à l'utilisateur "nobody". Cela signifie qu'un script mal intentionné peut accéder à la base, la modifier sans identification. Il est aussi possible qu'un robot accède à la page d'administration, et détruise toutes les pages. Vous devez aussi protéger vos bases de données avec les autorisations Apache, ou définir votre propre modèle d'accès avec LDAP, .htaccess, etc. et inclure ce code dans tous vos scripts : PHP.
Souvent, lorsqu'on a établi les droits de l'utilisateur PHP (ici, l'utilisateur Apache) pour minimiser les risques, on s'aperçoit que PHP ne peut plus écrire de virus dans les fichiers des utilisateurs. Ou encore, modifier une base de données privée. Il est aussi incapable de modifier des fichiers qu'il devrait pouvoir modifier, ou effectuer certaines transactions.
Une erreur fréquente de sécurité est de donner à l'utilisateur Apache les droits de superadministrateur ou d'améliorer les possibilités d'Apache d'une autre façon.
Donner de telles permissions à l'utilisateur Apache est extrêmement dangereux, et peut compromettre tout le système, telle que l'utilisation des sudo ou du chroot. Pour les novices de la sécurité, une telle utilisation est à exclure d'office.
Il existe des solutions plus simples. En utilisant open_basedir vous pouvez contrôler et restreindre l'accès à certains dossiers qui pourront être utilisés par PHP. Vous pouvez aussi créer des aires de restrictionsApache, pour restreindre les activités anonymes liées aux internautes.
PHP est soumis aux règles de sécurité intrinsèques de la plupart des systèmes serveurs : il respecte notamment les droits des fichiers et des dossiers. Une attention particulière doit être portée aux fichiers ou dossiers qui sont accessibles à tout le monde, afin de s'assurer qu'ils ne divulguent pas d'informations critiques.
Puisque PHP a été fait pour permettre aux utilisateurs d'accéder aux fichiers, il est possible de créer un script PHP qui vous permet de lire des fichiers tels que /etc/password, de modifier les connexions ethernet, lancer des impressions de documents, etc. Cela implique notamment que vous devez vous assurer que les fichiers manipulés par les scripts sont bien ceux qu'il faut.
Considérez le script suivant, où l'utilisateur indique qu'il souhaite effacer un fichier dans son dossier racine. Nous supposons que PHP est utilisé comme interface web pour gérer les fichiers, et que l'utilisateur Apache est autorisé à effacer les fichiers dans le dossier racine des utilisateurs.
Exemple #1 Une erreur de vérification de variable conduit à un gros problème
<?php
// Efface un fichier dans un dossier racine
$username = $_POST['user_submitted_name'];
$userfile = $_POST['user_submitted_filename'];
$homedir = "/home/$username";
unlink("$homedir/$userfile");
echo "Ce fichier a été effacé !";
?>
Exemple #2 Une attaque du système de fichiers!
<?php
// efface un fichier n'importe où sur le disque dur,
// où l'utilisateur PHP a accès. Si PHP a un accès root :
$username = $_POST['user_submitted_name']; // "../etc"
$userfile = $_POST['user_submitted_filename']; // "passwd"
$homedir = "/home/$username"; // "/home/../etc"
unlink("$homedir/$userfile"); // "/home/../etc/passwd"
echo "Ce fichier a été effacé !";
?>
Exemple #3 Une vérification renforcée
<?php
// Efface un fichier sur le disque où l'utilisateur a le droit d'aller
$username = $_SERVER['REMOTE_USER']; // utilisation d'un mécanisme d'identification
$userfile = basename($_POST['user_submitted_filename']);
$homedir = "/home/$username";
$filepath = "$homedir/$userfile";
if (file_exists($filepath) && unlink($filepath)) {
$logstring = "$filepath effacé\n";
} else {
$logstring = "Échec lors de l'effacement de $filepath\n";
}
$fp = fopen("/home/logging/filedelete.log", "a");
fwrite($fp, $logstring);
fclose($fp);
echo htmlentities($logstring, ENT_QUOTES);
?>
Exemple #4 Vérification renforcée de noms de fichiers
<?php
$username = $_SERVER['REMOTE_USER']; // utilisation d'un mécanisme d'identification
$userfile = $_POST['user_submitted_filename'];
$homedir = "/home/$username";
$filepath = "$homedir/$userfile";
if (!ctype_alnum($username) || !preg_match('/^(?:[a-z0-9_-]|\.(?!\.))+$/iD', $userfile)) {
die("Mauvais utilisateur/nom de fichier");
}
//etc...
?>
Suivant votre système d'exploitation, vous devrez protéger un grand nombre de fichiers, notamment les entrées de périphériques, (/dev/ ou COM1), les fichiers de configuration (fichiers /etc/ et .ini), les lieux de stockage d'informations (/home/, My Documents), etc. Pour cette raison, il est généralement plus sûr d'établir une politique qui interdit TOUT sauf ce que vous autorisez.
Comme PHP utilise des fonctions C pour les opérations sous-jacentes, notamment au niveau du système de fichiers, il peut gérer les octets nuls d'une façon inattendue. Sachant que les octets nuls dénotent la fin d'une chaîne de caractères en C, certaines fonctions vont donc considérer ces chaînes jusqu'à la première occurrence d'un octet nul. L'exemple suivant présente un code vulnérable qui montre ce problème :
Exemple #1 Script vulnérable aux octets nuls
<?php
$file = $_GET['file']; // "../../etc/passwd\0"
if (file_exists('/home/wwwrun/'.$file.'.php')) {
// file_exists retournera true sachant que le fichier /home/wwwrun/../../etc/passwd existe
include '/home/wwwrun/'.$file.'.php';
// le fichier /etc/passwd sera inclu
}
?>
Ainsi, toute chaîne utilisée dans des opérations sur le système de fichiers doit toujours être validée proprement. Voici une meilleure solution de l'exemple précédent :
Exemple #2 Validation correcte de l'entrée
<?php
$file = $_GET['file'];
// Whitelisting possible values
switch ($file) {
case 'main':
case 'foo':
case 'bar':
include '/home/wwwrun/include/'.$file.'.php';
break;
default:
include '/home/wwwrun/include/main.php';
}
?>
De nos jours, les bases de données sont des composants incontournables des serveurs web et des applications en ligne, qui fournissent du contenu dynamique. Des données secrètes ou critiques peuvent être stockées dans les bases de données : il est donc important de les protéger efficacement.
Pour lire ou stocker des informations, vous devez vous connecter au serveur de bases de données, envoyer une requête valide, lire le résultat et refermer la connexion. De nos jours, le langage le plus courant pour ce type de communication est le langage SQL (Structured Query Language). Voyez comment un pirate peut s'introduire dans une requête SQL.
Comme vous pouvez le réaliser, PHP ne peut pas protéger vos bases de données pour vous. La section suivante vous introduira aux notions de base pour protéger vos bases de données, lors de la programmation de vos scripts PHP.
Gardez bien cette règle simple en tête : la défense se fait par couches. Plus vous ajouterez de tests pour protéger votre base, plus faible sera la probabilité de réussite d'un pirate. Ajoutez à cela un bon schéma de base de données, et vous aurez une application réussie.
La première étape est de créer une base de données, à moins que vous ne souhaitiez utiliser une base de données déjà créée. Lorsque la base de données est créée, un utilisateur propriétaire en est responsable. Généralement, seul le propriétaire et le super utilisateur peuvent intervenir avec les tables de cette base, et il faut que ce dernier donne des droits à tous les intervenants qui auront à travailler sur cette base.
Les applications ne doivent jamais se connecter au serveur de bases de données sous le nom du propriétaire ou de l'administrateur, car ces utilisateurs ont des droits très importants, et pourront exécuter n'importe quelle requête, comme la modification de tables, l'effacement de lignes ou même encore, la destruction de la base.
Vous pouvez créer différents utilisateurs de bases de données pour chaque aspect de votre application, avec des droits limités aux seules actions planifiées. Il faut alors éviter que le même utilisateur dispose des droits de plusieurs cas d'utilisation. Cela permet que si des intrus obtiennent l'accès à la base avec l'un de ces jeux de droits, ils ne puissent pas affecter toute l'application.
Il est recommandé de ne pas implémenter toute la logique fonctionnelle dans l'application web (c'est-à-dire dans vos scripts), mais d'en reporter une partie dans la base en utilisant les déclencheurs, vues et règles. Si le système évolue, les nouvelles versions vous feront réécrire toute la logique et donc tous vos scripts. De plus, l'utilisation de déclencheurs permet de gérer de manière transparente des données, et fournit des indications pour déboguer votre application.
Il est recommandé d'établir des connexions au serveur avec le protocole SSL, pour chiffrer les échanges clients/serveur, afin d'améliorer la sécurité. Vous pouvez aussi utiliser un client SSH pour chiffrer la connexion entre les clients et le serveur de bases de données. Si l'une de ces deux protections est mise en place, il sera difficile de surveiller votre trafic et de comprendre les informations échangées.
Les protocoles SSL/SSH protègent les données qui circulent entre le serveur et le client : SSL/SSH ne protège pas les données une fois dans la base. SSL est un protocole en ligne.
Une fois que le pirate a obtenu l'accès direct à votre base de données (en contournant le serveur web), les données sensibles, stockées dans votre base sont accessibles directement, à moins que les données de la base ne soient protégées par la base. Chiffrer les données est une bonne solution pour réduire cette menace, mais très peu de bases de données offrent ce type de chiffrement.
Le moyen le plus simple pour contourner ce problème est de créer votre propre logiciel de chiffrement, et de l'utiliser dans vos scripts PHP. PHP peut vous aider dans cette tâche grâce aux nombreuses extensions dont il dispose, comme Mcrypt et Mhash, qui connaissent un large éventail de méthodes de chiffrement. Le script PHP va chiffrer les données qui seront stockées, et les déchiffrer lorsqu'elles seront relues. Voyez la suite pour des exemples d'utilisation de ce chiffrement.
Dans le cas de données vraiment sensibles, si la représentation originale n'est pas nécessaire (pour affichage, ou comparaison), utiliser un hash est une bonne solution. L'exemple classique est le stockage de mots de passe dans les bases de données, après les avoir passés au en hashage de cryptage. Voyez la fonction crypt().
Exemple #1 Utiliser un mot de passe et MD5
<?php
// Stockage du mot de passe hashé
$query = sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');",
pg_escape_string($username), crypt($password, '$2a$07$usesomesillystringforsalt$'));
$result = pg_query($connection, $query);
// interroger le serveur pour comparer le mot de passe soumis
$query = sprintf("SELECT 1 FROM users WHERE name='%s' AND pwd='%s';",
pg_escape_string($username), crypt($password, '$2a$07$usesomesillystringforsalt$'));
$result = pg_query($connection, $query);
if (pg_num_rows($result) > 0) {
echo "Bienvenue, $username!";
} else {
echo "Identification échouée pour $username.";
}
?>
De nombreux développeurs web ne sont pas conscients des possibilités de manipulation des requêtes SQL, et supposent que les requêtes SQL sont des commandes sûres. Cela signifie qu'une requête SQL est capable de contourner les contrôles et vérifications, comme les identifications, et parfois, les requêtes SQL ont accès aux commandes d'administration.
L'injection SQL directe est une technique où un pirate modifie une requête SQL existante pour afficher des données cachées, ou pour écraser des valeurs importantes, ou encore exécuter des commandes dangereuses pour la base. Cela se fait lorsque l'application prend les données envoyées par l'internaute, et l'utilise directement pour construire une requête SQL. Les exemples ci-dessous sont basés sur une histoire vraie, malheureusement.
Avec le manque de vérification des données de l'internaute et la connexion au serveur avec des droits de super utilisateur, le pirate peut créer des utilisateurs, et créer un autre super utilisateur.
Exemple #1 Séparation des résultats en pages, et créer des administrateurs (PostgreSQL et MySQL)
<?php
$offset = $argv[0]; // Attention, aucune validation!
$query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
// avec PostgreSQL
$result = pg_query($conn, $query);
// avec MySQL
$result = mysql_query($query);
?>
Exemple #2 Exemple d'injection SQL
<?php
// cas de PostgreSQL
0;
insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd)
select 'crack', usesysid, 't','t','crack'
from pg_shadow where usename='postgres';
--
// cas de MySQL
0;
UPDATE user SET Password=PASSWORD('crack') WHERE user='root';
FLUSH PRIVILEGES;
?>
Note:
C'est une technique répandue que de forcer l'analyseur SQL à ignorer le reste de la requête, en utilisant les symboles -- pour mettre en commentaires.
Un moyen disponible pour accéder aux mots de passe est de contourner la recherche de page. Ce que le pirate doit faire, c'est simplement voir si une variable du formulaire est utilisée dans la requête, et si elle est mal gérée. Ces variables peuvent avoir été configurées dans une page précédente pour être utilisées dans les clauses WHERE, ORDER BY, LIMIT et OFFSET des requêtes SELECT. Si votre base de données supporte les commandes UNION, le pirate peut essayer d'ajouter une requête entière pour lister les mots de passe dans n'importe quelle table. Utiliser la technique des mots de passe chiffrés est fortement recommandé.
Exemple #3 Liste d'articles ... et ajout de mot de passe
<?php
$query = "SELECT id, name, inserted, size FROM products
WHERE size = '$size'
ORDER BY $order LIMIT $limit, $offset;";
$result = odbc_exec($conn, $query);
?>
Exemple #4 Révélation des mots de passe
<?php ' union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable; -- ?>
Les commandes UPDATE sont aussi sujettes à des attaques de votre base de données. Ces requêtes peuvent aussi introduire toute une nouvelle requête dans votre commande initiale. Mais en plus, le pirate peut jouer sur la commande SET. Dans ce cas, il doit connaître un peu votre base de données. Cela peut se deviner en examinant les noms de variables dans les formulaires, ou simplement, en testant les cas les plus classiques. Il n'y a pas beaucoup de conventions de noms pour stocker des noms d'utilisateurs et des mots de passe.
Exemple #5 Modifier un mot de passe ... et gain de droits!
<?php
$query= "UPDATE usertable SET pwd='$pwd' WHERE uid='$uid';";
?>
Exemple #6 Une requête et son injection
<?php
// $uid == ' or uid like'%admin%'; --
$query = "UPDATE usertable SET pwd='...' WHERE uid='' or uid like '%admin%'; --";
// $pwd == "hehehe', admin='yes', trusted=100 "
$query = "UPDATE usertable SET pwd='hehehe', admin='yes', trusted=100 WHERE ...;"
?>
C'est un exemple terrible d'acquisition de droits d'administrateur sur un serveur de base de données.
Exemple #7 Attaque d'un serveur de bases de données (MSSQL Server)
<?php
$query = "SELECT * FROM products WHERE id LIKE '%$prod%'";
$result = mssql_query($query);
?>
Exemple #8 Attaque d'un serveur de base de données (MSSQL Server) - 2
<?php
$query = "SELECT * FROM products
WHERE id LIKE '%a%'
exec master..xp_cmdshell 'net user test testpass /ADD'--";
$result = mssql_query($query);
?>
Note:
Certains des exemples ci-dessus sont spécifiques à certains serveurs de bases de données. Cela n'empêche pas des attaques similaires d'être possibles sur d'autres produits. Votre base de données sera alors vulnérable d'une autre manière.
Bien qu'il semble évident qu'un pirate doit posséder quelques connaissances de l'architecture de la base de données afin de conduire avec succès une attaque, il est souvent très simple de les obtenir. Par exemple, si la base de données fait partie d'un paquet open source ou disponible publiquement, ces informations sont complètement ouvertes et disponibles. Ces informations peuvent aussi être divulgués pour des codes sources fermés - y compris si ce code est encodé, occulté, ou compilé - aux travers des messages d'erreurs. D'autres méthodes consistent à deviner l'utilisateur de table commune ainsi que des noms des colonnes. Par exemple, un formulaire d'identification qui utilise la table 'users' avec les colonnes de noms 'id', 'username', et 'password'.
Ces attaques sont généralement basées sur l'exploitation de code qui n'est pas écrit de manière sécuritaire. N'ayez aucune confiance dans les données qui proviennent de l'utilisateur, même si cela provient d'un menu déroulant, d'un champ caché ou d'un cookie. Le premier exemple montre comment une requête peut causer un désastre.
Si l'application attend une entrée numérique, vérifiez vos données avec la fonction is_numeric(), ou bien modifiez automatiquement le type avec la fonction settype(), ou encore avec sprintf().
Exemple #9 Une navigation de fiches plus sécuritaire
<?php
settype($offset, 'integer');
$query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
// notez que %d dans la chaîne de format : %s serait inutile
$query = sprintf("SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET %d;",
$offset);
?>
À côté de ces conseils, il est recommandé d'enregistrer vos requêtes, soit dans vos scripts, soit dans la base elle-même, si elle le supporte. Évidemment, cet enregistrement ne sera pas capable d'empêcher une attaque, mais vous permettra de retrouver la requête qui a fauté. L'historique n'est pas très utile par lui-même, mais au niveau des informations qu'il contient. Plus vous avez de détails, mieux c'est.
En termes de sécurité, il y a deux conséquences au rapport d'erreur. D'un coté, cela améliore la sécurité, mais d'un autre, cela la réduit aussi.
Une tactique d'attaque standard consiste à faire faire des erreurs au système, et lire les variables d'environnement et de contexte qui sont retournées. Cela permet au pirate de lire de nombreuses informations sur le serveur, et de détecter des faiblesses du serveur. Par exemple, si un intrus a glané des informations sur votre page, avec une première utilisation de votre site, il peut essayer de remplacer les variables par ses propres valeurs :
Exemple #1 Attaque de site avec une page HTML personnalisée
<form method="post" action="http://www.site.cible.com/?username=badfoo&password=badfoo">
<input type="hidden" name="username" value="badfoo">
<input type="hidden" name="password" value="badfoo">
</form>
Les erreurs PHP qui sont normalement retournées peuvent être très pratiques pour un développeur qui essaie de déboguer un script, car elles donnent de précieux renseignements tels que quelle fonction a échoué, quel fichier n'a pas été trouvé, quel script PHP a un bug, et quelle ligne est en faute. Toutes ces informations sont exploitables. Il est commun aux développeurs PHP d'utiliser les fonctions show_source(), highlight_string(), ou highlight_file() comme outils de déboguage, mais sur un site en production, cela expose des variables cachées, des syntaxes non vérifiées ou d'autres informations critiques. Il est particulièrement dangereux d'exécuter du code de sources connues, avec les gestionnaires de débogage. Si l'intrus peut comprendre votre technique habituelle d'utilisation, il peut tenter une attaque frontale sur une page, en envoyant des chaînes de débogage :
Exemple #2 Exploiter des variables classiques de débogage
<form method="post" action="http://www.site.cible.com/?errors=Y&showerrors=1"&debug=1">
<input type="hidden" name="errors" value="Y">
<input type="hidden" name="showerrors" value="1">
<input type="hidden" name="debug" value="1">
</form>
Indépendamment de la gestion des erreurs, la possibilité de tester la gestion des erreurs d'un système conduit à un trou de sécurité, et la diffusion de plus d'informations sur votre système.
Si un pirate affiche une page html, et essaye de la tester (pour rechercher des faiblesses du système), il peut déterminer sur quel système PHP a été compilé.
Une erreur de fonction indique si un système supporte une base de données spécifique, ou bien indique comment la page a été générée. Cela peut orienter l'intrus vers les ports de cette base de données ou bien vers une attaque liée à cette application. En envoyant des données erronées, par exemple, un pirate peut déterminer l'ordre d'identification dans un script, à partir des lignes d'erreurs, et essayer de les exploiter ailleurs, dans le script.
Une erreur de fichier, ou une erreur générale PHP peut indiquer quelles sont les permissions du serveur web, ainsi que la structure et l'organisation des fichiers. Les gestionnaires d'erreurs utilisateurs peuvent aussi aggraver ce problème, en permettant l'exploitation facile d'informations préalablement cachées.
Il y a trois solutions majeures à ces problèmes : la première est de scruter toutes les fonctions, et d'essayer de traiter toutes les erreurs. La deuxième est de désactiver le rapport d'erreur, dès que le script est en production. La troisième est d'utiliser les fonctions de gestion des erreurs. Suivant votre politique de sécurité, vous pouvez utiliser un panachage savant des trois méthodes.
Une méthode pour gagner du temps est d'utiliser la fonction
error_reporting(), pour vous aider à
sécuriser le code, et détecter les utilisations dangereuses de variables.
Vous testez votre code en béta test avec la valeur
E_ALL, et vous pouvez rapidement repérer les variables
qui ne sont pas protégées. Une fois que le code est prêt à être déployé,
vous devez soit désactiver complètement le rapport d'erreur en affectant 0 à
la fonction error_reporting(), soit en désactivant
l'affichage des erreurs en utilisant l'option de configuration
display_errors du php.ini. Si vous choisissez la
dernière solution, vous devez également définir le chemin de votre fichier
de log en utilisant la directive de configuration
error_log, et en activant la directive
log_errors.
Exemple #3 Détecter des variables non protégées avec E_ALL
<?php
if ($username) {
// Non initialisée, ou vérifée avant utilisation
$good_login = 1;
}
if ($good_login == 1) {
// Si le test ci-dessus échoue, les valeurs n'ont pas été testées
fpassthru ("/données/très/très/sensibles/index.html");
}
?>
Cette fonctionnalité est devenue OBSOLETE depuis PHP 5.3.0 et a été SUPPRIMEE depuis PHP 5.4.0.
L'une des évolutions les plus controversées de PHP a été le changement de valeur par défaut de la directive PHP register_globals, qui est passée de On à Off en PHP » 4.2.0. Beaucoup d'applications dépendaient de cette directive, et de nombreux programmeurs ne savaient même pas qu'elle existait, et supposait que c'était le fonctionnement normal de PHP. Cette page explique comment on peut écrire du code peu sécuritaire en utilisant cette directive. Gardez bien en tête que cette directive, par elle-même, n'est pas un trou de sécurité, mais qu'elle facilite leur création.
Lorsqu'elle est activée, register_globals va injecter vos scripts avec toutes sortes de variables, comme les variables issues des formulaires HTML. Ceci, couplé au fait que PHP ne requiert pas d'initialisation de variable signifie que la programmation de script peu sûr est possible. Ce fut une décision difficile de la communauté PHP, mais finalement, il a été décidé de désactiver par défaut cette variable. Lorsqu'elle est active, le programmeur ne sait pas exactement d'où provient le contenu de la variable, et ne peut que faire des suppositions. Les variables internes définies dans le script sont mélangées avec les données envoyées par les utilisateurs, et en désactivant register_globals, on empêche cela. Voyons avec un exemple le fonctionnement de register_globals :
Exemple #1 Exemple de mauvaise utilisation de register_globals
<?php
// $authorized = true uniquement si l'utilisateur est identifié
if (authenticated_user()) {
$authorized = true;
}
// Comme nous n'avons pas initialisé $authorized avec false, cette dernière
// peut être définie via register_globals, comme avec l'URL GET auth.php?authorized=1
// Tout le monde peut facilement être reconnu comme identifié!
if ($authorized) {
include "/donnees/critiques/data.php";
}
?>
Lorsque register_globals est activé, la logique ci-dessus peut être prise en défaut. Lorsque register_globals est désactivée $authorized ne peut plus être assignée via la requête, et le script est maintenant sûr, même s'il reste recommandé de toujours initialiser ses variables. Par exemple, dans notre programme ci-dessus, nous pourrions ajouter $authorized = false. En faisant cela, le script peut fonctionner avec register_globals on ou off, car les utilisateurs seront par défaut non-identifiés.
Un autre exemple implique les sessions. Lorsque register_globals est activé, on peut aussi utiliser $username dans notre exemple, mais, encore une fois, vous devez garder en tête que $username peut aussi provenir d'autres biais, tels que GET (via l'URL).
Exemple #2 Exemple d'abus de sessions avec register_globals on ou off
<?php
// Nous ne savons pas d'où provient $username mais nous savons que
// $_SESSION contient les données de session
if (isset($_SESSION['username'])) {
echo "Bonjour <strong>{$_SESSION['username']}</strong>";
} else {
echo "Bonjour <strong>visiteur</strong><br />";
echo "Voulez-vous vous identifier?";
}
?>
Il est même possible de prendre des mesures préventives, pour être alerté lorsqu'une tentative d'usurpation est faite. Si vous savez à l'avance de quelle variable le nom d'utilisateur doit provenir, vous pouvez vérifier si les données que vous manipulez sont d'une origine contrôlée. Même si cela ne garantit pas que les données ne puissent être falsifiées, cela complique la tache du faussaire. Si vous ne vous préoccupez pas de l'origine des données, vous pouvez utiliser la variable $_REQUEST qui contient un mélange de données GET, POST et COOKIE. Voyez aussi la section du manuel concernant les variables de sources externes à PHP.
Exemple #3 Détection simple de fausses variables
<?php
if (isset($_COOKIE['MAGIC_COOKIE'])) {
// MAGIC_COOKIE provient d'un cookie.
// Assurez-vous de valider les données du cookie!
} elseif (isset($_GET['MAGIC_COOKIE']) || isset($_POST['MAGIC_COOKIE'])) {
mail("admin@example.com", "Tentative possible d'attaque", $_SERVER['REMOTE_ADDR']);
echo "Alerte sécurité, l'admin a été prévenu.";
exit;
} else {
// MAGIC_COOKIE ne provient pas de REQUEST
}
?>
Bien sur, désactiver l'option register_globals ne signifie pas que votre
code est sécuritaire. Pour chaque donnée reçu, vous devez appliquer un
maximum de validations. Vérifiez toujours les données de votre visiteur,
et initialisez vos variables! Pour vérifier les variables non-initialisées,
voyez la fonction error_reporting(), qui peut afficher
les erreurs de niveau E_NOTICE.
Pour des informations sur l'émulation de register_globals On ou Off, voyez la FAQ.
Note: Superglobales : disponibilité
Depuis PHP 4.1.0, les tableaux superglobaux tels que $_GET, $_POST et $_SERVER, etc. sont disponibles. Pour plus d'informations, lisez la section superglobals
Les plus grandes faiblesses de nombreux programmes PHP ne viennent pas du langage lui-même, mais de son utilisation en omettant les caractéristiques de sécurité. Pour cette raison, vous devez toujours prendre le temps de prendre en compte les implications d'une fonction, et de cerner toutes les applications d'une utilisation exotiques des paramètres.
Exemple #1 Utilisation dangereuse de variables
<?php
// efface un fichier à la racine d'un utilisateur... ou peut être
// de quelqu'un d'autre?
unlink($evil_var);
// Note l'accès de ce fichier ... ou pas?
fputs($fp, $evil_var);
// Exécute une commande triviale... ou ajoute une entrée dans /etc/password ?
system($evil_var);
exec($evil_var);
?>
Il est vivement recommandé d'examiner minutieusement votre code pour vous assurer qu'il n'y a pas de variables envoyées par le client web, et qui ne sont pas suffisamment vérifiées avant utilisation.
En répondant de manière adéquate à ces questions lors de l'écriture de vos scripts (plutôt qu'après), vous éviterez une réécriture inopportune pour raison de sécurité. En commençant vos projets avec ces recommandations en tête, vous ne garantirez pas la sécurité de votre système, mais vous contribuerez à l'améliorer.
Vous pouvez aussi envisager de supprimer l'acquisition automatique des variables d'environnement, les guillemets magiques (magic_quotes), ou encore toute option qui pourrait vous conduire à vous tromper sur la validité, la source ou la valeur d'une variable. En travaillant avec avec PHP en error_reporting(E_ALL), vous pouvez être averti que certaines variables sont utilisées avant d'être exploitées, ou vérifiées (et donc, vous pourrez traiter des valeurs exotiques à la source).
Cette fonctionnalité est devenue OBSOLETE depuis PHP 5.3.0 et a été SUPPRIMEE depuis PHP 5.4.0.
Les guillemets magiques (littéralement, les Magic Quotes) est un processus qui protège automagiquement les données introduites dans un script PHP. Il est recommandé de développer les applications sans l'aide des guillemets magiques, et de protéger manuellement les données.
Cette fonctionnalité est devenue OBSOLETE depuis PHP 5.3.0 et a été SUPPRIMEE depuis PHP 5.4.0.
Lorsque cette directive est active, les guillemets simples ', les guillemets doubles ", les antislashs \ et les caractères nul NULL sont protégés automatiquement avec un antislash. C'est le même résultat que celui de la fonction addslashes().
Il y a trois directives de guillemets magiques différentes :
Cette fonctionnalité est devenue OBSOLETE depuis PHP 5.3.0 et a été SUPPRIMEE depuis PHP 5.4.0.
Cette fonctionnalité est devenue OBSOLETE depuis PHP 5.3.0 et a été SUPPRIMEE depuis PHP 5.4.0.
La directive magic_quotes_gpc ne peut être désactivée qu'au niveau du système, et non pas à l'exécution. En d'autres termes, utiliser ini_set() n'est pas possible.
Exemple #1 Désactiver les guillemets magiques du coté du serveur
Voici un exemple qui donne la valeur de Off à ces directives dans le fichier php.ini. Pour plus de détails, voyez la section Comment changer la configuration.
; Magic quotes ; ; Magic quotes for incoming GET/POST/Cookie data. magic_quotes_gpc = Off ; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc. magic_quotes_runtime = Off ; Use Sybase-style magic quotes (escape ' with '' instead of \'). magic_quotes_sybase = Off
Si vous n'avez pas accès au serveur, utilisez le fichier .htaccess. Par exemple :
php_flag magic_quotes_gpc Off
Afin d'écrire du code portable sur tous les environnements, et où vous ne pourrez pas forcément modifier la configuration du serveur, voici un exemple de désactivation de magic_quotes_gpc à l'exécution. Cette méthode est inefficace, et il est recommandé d'utiliser les autres solutions si possible.
Exemple #2 Désactivation des guillemets magiques à l'exécution
<?php
if (get_magic_quotes_gpc()) {
$process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
while (list($key, $val) = each($process)) {
foreach ($val as $k => $v) {
unset($process[$key][$k]);
if (is_array($v)) {
$process[$key][stripslashes($k)] = $v;
$process[] = &$process[$key][stripslashes($k)];
} else {
$process[$key][stripslashes($k)] = stripslashes($v);
}
}
}
unset($process);
}
?>
En général, la sécurité par l'obscurité est une des formes de sécurité les plus faibles. Mais dans certains cas, chaque action, aussi faible soit elle, concernant la sécurité, est souhaitable.
Quelques astuces permettent de masquer PHP, et cela entrave les pirates qui recherchent des faiblesses dans votre système. En règlant l'option expose_php à off dans votre fichier php.ini, vous pouvez réduire la quantité d'informations disponible.
Une autre astuce est de configurer le serveur web, comme Apache, pour qu'il utilise plusieurs types de fichiers différents avec PHP, soit localement avec le fichier .htaccess, soit dans le fichier de configuration lui-même. Vous pouvez utiliser des informations déroutantes comme ceci :
Exemple #1 Masquer PHP avec un autre langage
# Faire que le code PHP ressemble à un autre langage AddType application/x-httpd-php .asp .py .pl
Exemple #2 Masquer PHP avec des types inconnus
# Faire que le code PHP ressemble à un autre langage qui n'existe pas AddType application/x-httpd-php .bop .foo .133t
Exemple #3 Utiliser le type HTML pour les extensions PHP
# Faire que le code PHP ressemble à du html AddType application/x-httpd-php .htm .html
PHP, comme de nombreux systèmes de grande taille, est constamment testé et amélioré. Chaque nouvelle version rassemble des modifications majeures et mineures, aussi bien pour renforcer la sécurité, que pour réparer les problèmes de conception de configuration, et d'autres points qui peuvent affecter la sécurité globale et la stabilité de votre système.
Comme les autres langages de scripts systèmes, la meilleure approche est de mettre à jour souvent PHP, et de rester à l'écoute des dernières versions et des modifications qu'elles apportent.
Il est possible d'utiliser la fonction header() pour demander une identification ("Authentication Required") au client, générant ainsi l'apparition d'une fenêtre de demande d'utilisateur et de mot de passe. Une fois que les champs ont été remplis, l'URL sera de nouveau appelée, avec les variables prédéfinies PHP_AUTH_USER, PHP_AUTH_PW et AUTH_TYPE contenant respectivement le nom d'utilisateur, le mot de passe et le type d'identification. Ces variables prédéfinies sont trouvées dans les tableaux $_SERVER et $HTTP_SERVER_VARS. Les méthodes d'identification simple ("Basic") et de type "Digest" (depuis PHP 5.1.0) sont supportées. Reportez-vous à la fonction header() pour plus d'informations.
Note: Note de version PHP
Les Superglobales, comme $_SERVER, deviennent disponibles en PHP depuis la version » 4.1.0.
Voici un exemple de script qui force l'identification du client pour accéder à une page :
Exemple #1 Exemple d'identification HTTP simple
<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Texte utilisé si le visiteur utilise le bouton d\'annulation';
exit;
} else {
echo "<p>Bonjour, {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>Votre mot de passe est {$_SERVER['PHP_AUTH_PW']}.</p>";
}
?>
Exemple #2 Exemple d'identification HTTP Digest
Cet exemple montre comment appliquer l'utilisation d'un script d'identification HTTP de type "Digest". Pour plus d'informations, lisez la documentation » RFC 2617.
<?php
$realm = 'Restricted area';
//utilisateur => mot de passe
$users = array('admin' => 'mypass', 'guest' => 'guest');
if (empty($_SERVER['PHP_AUTH_DIGEST'])) {
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Digest realm="'.$realm.
'",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"');
die('Texte utilisé si le visiteur utilise le bouton d\'annulation');
}
// analyse la variable PHP_AUTH_DIGEST
if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) ||
!isset($users[$data['username']]))
die('Mauvaise Pièce d\'identité!');
// Génération de réponse valide
$A1 = md5($data['username'] . ':' . $realm . ':' . $users[$data['username']]);
$A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);
$valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2);
if ($data['response'] != $valid_response)
die('Mauvaise Pièce d\'identitée!');
// ok, utilisateur & mot de passe valide
echo 'Vous êtes identifié en tant que : ' . $data['username'];
// fonction pour analyser l'en-tête http auth
function http_digest_parse($txt)
{
// protection contre les données manquantes
$needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1);
$data = array();
$keys = implode('|', array_keys($needed_parts));
preg_match_all('@(' . $keys . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@', $txt, $matches, PREG_SET_ORDER);
foreach ($matches as $m) {
$data[$m[1]] = $m[3] ? $m[3] : $m[4];
unset($needed_parts[$m[1]]);
}
return $needed_parts ? false : $data;
}
?>
Note: Note de compatibilité
Soyez bien prudent lorsque vous utilisez des en-têtes HTTP avec PHP. Afin de garantir un maximum de compatibilité entre les navigateurs, le mot clé "Basic" doit être écrit avec un B majuscule, et le texte de présentation doit être placé entre guillemets simples, et exactement un espace doit précéder le code 401 dans l'en-tête HTTP/1.0 401. Les paramètres d'authentification doivent être séparés par des virgules comme montré dans l'exemple ci-dessus.
Au lieu d'afficher simplement les variables globales PHP_AUTH_USER et PHP_AUTH_PW, vous préférerez sûrement vérifier la validité du nom d'utilisateur et du mot de passe. Par exemple, en envoyant ces informations à une base de données, ou en recherchant dans un fichier dbm.
Méfiez-vous des navigateurs bogués, tels qu'Internet Explorer. Ils semblent très susceptibles en ce qui concerne l'ordre des en-têtes. Envoyer l'en-tête d'identification (WWW-Authenticate) avant le code de HTTP/1.0 401 semble lui convenir jusqu'à présent.
Depuis PHP 4.3.0, pour éviter que quelqu'un écrive un script qui révèle les mots de passe d'une page, à laquelle on a accédé par une identification traditionnelle, les variables globales PHP_AUTH ne seront pas assignées si l'identification externe a été activée pour cette page et que le safe mode est activé. Dans ce cas, la variable REMOTE_USER peut être utilisée pour identifier l'utilisateur à l'extérieur. De même que $_SERVER['REMOTE_USER'].
Note: Note de configuration
PHP utilise la présence de la directive AuthType pour déterminer si une identification externe est activée. Évitez donc cette directive de contexte si vous voulez utiliser l'identification de PHP (sinon, les deux identifications se contrediront, et échoueront).
Notez cependant que les manipulations ci-dessus n'empêchent pas quiconque possède une page non identifiée de voler les mots de passe des pages protégées, sur le même serveur.
Netscape et Internet Explorer effaceront le cache d'identification client s'ils reçoivent une réponse 401. Cela permet de déconnecter un utilisateur, pour le forcer à saisir à nouveau son nom de compte et son mot de passe. Certains programmeurs l'utilisent pour donner un délai d'expiration ou, alors, fournissent un bouton de déconnexion.
Exemple #3 Identification HTTP avec nom d'utilisateur/mot de passe forcé
<?php
function authenticate() {
header('WWW-Authenticate: Basic realm="Test Authentication System"');
header('HTTP/1.0 401 Unauthorized');
echo "Vous devez entrer un identifiant et un mot de passe valides pour accéder
à cette ressource.\n";
exit;
}
if ( !isset($_SERVER['PHP_AUTH_USER']) ||
($_POST['SeenBefore'] == 1 && $_POST['OldAuth'] == $_SERVER['PHP_AUTH_USER'])) {
authenticate();
} else {
echo "<p>Bienvenue : " . htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "<br />";
echo "Ancien : " . htmlspecialchars($_REQUEST['OldAuth']);
echo "<form action='' method='post'>\n";
echo "<input type='hidden' name='SeenBefore' value='1' />\n";
echo "<input type='hidden' name='OldAuth' value=\"" . htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "\" />\n";
echo "<input type='submit' value='Re Authenticate' />\n";
echo "</form></p>\n";
}
?>
Ce comportement n'est pas nécessaire par le standard d'identification HTTP Basic. Les tests avec Lynx ont montré qu'il n'affectait pas les informations de session lors de la réception d'un message de type 401. Ce qui fait que presser la touche "retour" à un client Lynx précédemment identifié donnera l'accès direct à la ressource. Cependant, l'utilisateur peut utiliser la touche '_' pour détruire les anciennes identifications.
Noter également que depuis PHP 4.3.3, l'authentification HTTP ne fonctionnera pas lors de l'utilisation de Microsoft IIS avec la version CGI de PHP en raison d'une limitation d'IIS. Pour retrouver un fonctionnement normal en PHP 4.3.3+, vous devez éditer votre configuration "Directory Security". Cliquez sur "Edit" et activez uniquement "Anonymous Access", tous les autres champs doivent être laissés non actifs.
Une autre limitation : si vous utilisez le module IIS (ISAPI) et PHP 4, vous ne pourrez pas utiliser les variables PHP_AUTH_* mais à la place, la variable HTTP_AUTHORIZATION est disponible. Par exemple, considérez le code suivant : list($user, $pw) = explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
Note: Note pour les utilisateurs de IIS :
Pour que l'identification HTTP fonctionne avec IIS, la directive PHP cgi.rfc2616_headers doit être définie à 0 (la valeur par défaut).
Note:
Si le safe mode est activé, le uid de ce script est ajouté à la partie realm des en-têtes WWW-Authenticate.
Le support des sessions de PHP est un mécanisme pour conserver des données entre différents accès. Cela vous permet de personnaliser les applications, et d'augmenter l'attrait de votre site. Toutes les informations sur les sessions sont disponibles dans la section sessions.
» XForms est une variation des formulaires web traditionnels, qui permet leur utilisation sur diverses plates-formes et navigateurs, et même sur des médias moins traditionnels comme les documents PDF.
La première différence des XForms est leur présentation au client. » XForms for HTML Authors contient une description détaillée de la création des XForms, complémentaire de notre tutoriel : nous allons nous consacrer à un exemple simple.
Exemple #1 Un simple formulaire XForms de recherche
<h:html xmlns:h="http://www.w3.org/1999/xhtml"
xmlns="http://www.w3.org/2002/xforms">
<h:head>
<h:title>Search</h:title>
<model>
<submission action="http://example.com/search"
method="post" id="s"/>
</model>
</h:head>
<h:body>
<h:p>
<input ref="q"><label>Find</label></input>
<submit submission="s"><label>Go</label></submit>
</h:p>
</h:body>
</h:html>
Le formulaire ci-dessus affiche une boîte de texte (appelée
q), et un bouton de soumission. Lorsque ce bouton
est utilisé, le formulaire est envoyé à la page d'action.
C'est là que la différence se fait sentir, du point de vue de l'application web. Dans un formulaire HTML, les données sont envoyées au format application/x-www-form-urlencoded. Pour un XForm, c'est en fait un format XML qui est utilisé.
Si vous avez décidé d'utiliser des XForms, vous attendez peut être des données au format XML, et dans ce cas, regardez dans la variable $HTTP_RAW_POST_DATA, où vous trouverez le document XML généré par le navigateur, que vous pourrez passer à votre moteur XSLT favori.
Si vous n'êtes pas intéressé par ce format, et que vous voulez simplement
exploiter vos données avec la variable $_POST, vous pouvez
demander au navigateur de les envoyer au format
application/x-www-form-urlencoded, en modifiant
l'attribut de méthode method et en lui donnant la
valeur de urlencoded-post.
Exemple #2 Utiliser des XForms pour remplir $_POST
<h:html xmlns:h="http://www.w3.org/1999/xhtml"
xmlns="http://www.w3.org/2002/xforms">
<h:head>
<h:title>Search</h:title>
<model>
<submission action="http://example.com/search"
method="urlencoded-post" id="s"/>
</model>
</h:head>
<h:body>
<h:p>
<input ref="q"><label>Find</label></input>
<submit submission="s"><label>Go</label></submit>
</h:p>
</h:body>
</h:html>
Note: Au moment de la rédaction de cet article, de nombreux navigateurs ne supportent pas les XForms. Vérifiez la version de votre navigateur si les exemples de ce tutoriel ne fonctionnent pas.
Cette fonctionnalité permet aux personnes de télécharger à la fois du texte et des fichiers binaires. Avec les fonctions d'identification et de manipulation de fichiers de PHP, vous avez le contrôle total pour définir qui a le droit de télécharger mais aussi ce qui sera fait du fichier une fois qu'il sera téléchargé.
PHP est capable de recevoir des fichiers émis par un navigateur conforme à la norme RFC-1867.
Note: Notes de configuration
Voir aussi les directives file_uploads, upload_max_filesize, upload_tmp_dir, post_max_size et max_input_time dans php.ini
PHP supporte aussi le chargement par la méthode PUT comme dans le navigateur Netscape Composer et Amaya du W3C. Reportez-vous au chapitre sur le support de la méthode PUT.
Exemple #1 Formulaire de chargement de fichier
Un formulaire de téléchargement de fichiers peut être construit en créant un formulaire spécifique comme ceci :
<!-- Le type d'encodage des données, enctype, DOIT être spécifié comme ce qui suit --> <form enctype="multipart/form-data" action="_URL_" method="post"> <!-- MAX_FILE_SIZE doit précéder le champ input de type file --> <input type="hidden" name="MAX_FILE_SIZE" value="30000" /> <!-- Le nom de l'élément input détermine le nom dans le tableau $_FILES --> Envoyez ce fichier : <input name="userfile" type="file" /> <input type="submit" value="Envoyer le fichier" /> </form>
_URL_ dans l'exemple précédent doit être remplacé et pointé vers un fichier PHP.
Le champ caché MAX_FILE_SIZE (mesuré en octets) doit précéder le champ input de type file et sa valeur représente la taille maximale acceptée du fichier par PHP. Cet élément de formulaire doit toujours être utilisé car il permet d'informer l'utilisateur que le transfert désiré est trop lourd avant d'atteindre la fin du téléchargement. Gardez à l'esprit que ce paramètre peut être "trompé" du côté du navigateur facilement, aussi ne faîtes pas confiance à ce dernier, ne s'agissant finalement que d'une fonctionnalité de convenance côté client. Le paramètre PHP (côté serveur) à propos de la taille maximale d'un fichier téléchargé, ne peut, lui, être trompé.
Note:
Assurez-vous que votre formulaire de téléchargement de fichier contienne enctype="multipart/form-data", sinon, le fichier se sera pas téléchargé.
La variable globale $_FILES existe depuis PHP 4.1.0 (utilisez $HTTP_POST_FILES à la place si vous utilisez une version plus ancienne). Ces tableaux devraient contenir toutes les informations du fichier téléchargé.
Le contenu du tableau $_FILES est détaillé dans notre exemple ci-dessous. Notez que l'on suppose que le nom de la variable du fichier téléchargé est userfile, tel que défini dans le formulaire ci-dessus, mais peut être n'importe quel nom.
Le nom original du fichier, tel que sur la machine du client web.
Le type MIME du fichier, si le navigateur a fourni cette information. Par exemple, cela pourra être "image/gif". Ce type mime n'est cependant pas vérifié du côté de PHP et, donc, ne prend pas sa valeur pour se synchroniser.
La taille, en octets, du fichier téléchargé.
Le nom temporaire du fichier qui sera chargé sur la machine serveur.
Le code d'erreur associé au téléchargement de fichier.
Le fichier téléchargé sera stocké temporairement dans le dossier temporaire du système, à moins qu'un autre dossier soit fourni avec la directive upload_tmp_dir du php.ini. Le dossier par défaut du serveur peut être changé dans l'environnement via la variable TMPDIR. Modifier la valeur de cette variable avec la fonction putenv() dans un script PHP sera sans effet. Cette variable d'environnement peut aussi être utilisée pour s'assurer que d'autres opérations fonctionnent aussi sur les fichiers téléchargés.
Exemple #2 Validation de téléchargement de fichiers
Voyez aussi les fonctions is_uploaded_file() et move_uploaded_file() pour plus d'informations. L'exemple suivant va télécharger un fichier venant d'un formulaire.
<?php
// Dans les versions de PHP antiéreures à 4.1.0, la variable $HTTP_POST_FILES
// doit être utilisée à la place de la variable $_FILES.
$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "Le fichier est valide, et a été téléchargé
avec succès. Voici plus d'informations :\n";
} else {
echo "Attaque potentielle par téléchargement de fichiers.
Voici plus d'informations :\n";
}
echo 'Voici quelques informations de débogage :';
print_r($_FILES);
echo '</pre>';
?>
Le script PHP qui reçoit le fichier chargé doit pouvoir gérer le fichier de manière appropriée. Vous pouvez utiliser la variable $_FILES['userfile']['size'] pour recaler tous les fichiers qui sont trop gros ou trop petits. Vous pouvez utiliser la variable $_FILES['userfile']['type'] pour écarter les fichiers qui n'ont pas le bon type, mais l'utiliser uniquement pour une série de vérifications, car cette valeur est complètement sous le contrôle du client et n'est pas vérifiée du côté de PHP. Depuis PHP 4.2.0, vous pouvez utiliser l'information dans $_FILES['userfile']['error'] et adapter votre politique en fonction des codes d'erreur. Quelle que soit votre politique, vous devriez soit effacer le fichier du dossier temporaire, soit le déplacer.
Si aucun fichier n'est sélectionné dans le formulaire, PHP retournera 0 dans $_FILES['userfile']['size'] et rien du tout dans $_FILES['userfile']['tmp_name'].
Le fichier sera automatiquement effacé du dossier temporaire à la fin du script, s'il n'a pas été déplacé ou renommé.
Exemple #3 Envoi d'un tableau de fichiers
PHP supporte les tableaux en HTML ainsi qu'avec les fichiers.
<form action="" method="post" enctype="multipart/form-data"> <p>Images: <input type="file" name="pictures[]" /> <input type="file" name="pictures[]" /> <input type="file" name="pictures[]" /> <input type="submit" value="Send" /> </p> </form>
<?php
foreach ($_FILES["pictures"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["pictures"]["tmp_name"][$key];
$name = $_FILES["pictures"]["name"][$key];
move_uploaded_file($tmp_name, "data/$name");
}
}
?>
La barre de progression de téléchargement peut être implémentée en utilisant la progression du chargement via les sessions.
Depuis PHP 4.2.0, PHP retourne un code d'erreur approprié dans le tableau de fichiers. Ce code d'erreur est accessible à l'index ['error'] du tableau, qui est créé durant le téléchargement par PHP. En d'autres termes, le message d'erreur est accessible dans la variable $_FILES['userfile']['error'].
UPLOAD_ERR_OK
Valeur : 0. Aucune erreur, le téléchargement est correct.
UPLOAD_ERR_INI_SIZE
Valeur : 1. Le fichier téléchargé excède la taille de upload_max_filesize, configurée dans le php.ini.
UPLOAD_ERR_FORM_SIZE
Valeur : 2. Le fichier téléchargé excède la taille de MAX_FILE_SIZE, qui a été spécifiée dans le formulaire HTML.
UPLOAD_ERR_PARTIAL
Valeur : 3. Le fichier n'a été que partiellement téléchargé.
UPLOAD_ERR_NO_FILE
Valeur : 4. Aucun fichier n'a été téléchargé.
UPLOAD_ERR_NO_TMP_DIR
Valeur : 6. Un dossier temporaire est manquant. Introduit en PHP 5.0.3.
UPLOAD_ERR_CANT_WRITE
Valeur : 7. Échec de l'écriture du fichier sur le disque. Introduit en PHP 5.1.0.
UPLOAD_ERR_EXTENSION
Valeur : 8. Une extension PHP a arrêté l'envoi de fichier. PHP ne propose aucun moyen de déterminer quelle extension est en cause. L'examen du phpinfo() peut aider. Introduit en PHP 5.2.0.
Note:
Ces valeurs deviennent des constantes PHP en version 4.3.0.
La variable MAX_FILE_SIZE ne peut pas spécifier une taille de fichier plus grande que la taille qui a été fixée par upload_max_filesize, dans le php.ini. La valeur par défaut est 2 megaoctets.
Si une limite de mémoire est activée, une plus grande valeur de memory_limit peut être nécessaire. Assurez-vous d'avoir défini une valeur pour memory_limit assez grande.
Si la valeur de max_execution_time est trop petite, le temps d'exécution du script peut excéder cette valeur. Assurez-vous d'avoir défini une valeur pour max_execution_time assez grande.
Note: max_execution_time affecte uniquement le temps d'exécution du script. Le temps passé sur l'activité qui apparaît en dehors de l'exécution du script comme les appels systèmes avec la fonction system(), la fonction sleep(), les requêtes sur les bases de données, le temps mis pour effectuer le téléchargement du fichier, etc. n'est pas inclus lors du calcul du temps maximal de l'exécution du script.
max_input_time définit le temps maximal, en secondes, au script pour recevoir les données ; cela inclut le téléchargement du fichier. Pour les fichiers multiples, ou les gros fichiers, ou encore pour les utilisateurs sur des connexions lentes, la valeur par défaut de 60 secondes peut être dépassée.
Si post_max_size est défini de façon trop faible, les gros fichiers ne pourront pas être téléchargés. Assurez-vous de définir post_max_size avec une taille suffisante.
Depuis PHP 5.2.12, la configuration de max_file_uploads contrôle le nombre maximum de fichiers qui peuvent être envoyés en une requête. Si le nombre de fichiers envoyés dépasse cette limite, alors $_FILES arrêtera la réception. Par exemple, si max_file_uploads vaut 10, alors $_FILES ne contiendra jamais plus de 10 entités.
Ne pas valider les fichiers que vous manipulez peut donner l'accès aux utilisateurs à des fichiers sensibles dans d'autres dossiers !
Attention : il semble que CERN httpd supprime tout ce qui est après le premier caractère dans l'entête MIME. Tant que c'est le cas, CERN httpd ne pourra pas effectuer de chargements de fichiers.
Du fait de la grande diversité des systèmes, nous ne pouvons garantir que les fichiers avec des noms exotiques (par exemple, ceux contenant des espaces) seront traités correctement.
Le développeur ne doit pas mixer les champs input normaux et les champs de téléchargement dans une même variable (en utilisant un nom d'input comme foo[]).
Le téléchargement de plusieurs fichiers est possible en utilisant des noms différents dans l'attribut name de la balise input.
Il est aussi possible de télécharger plusieurs fichiers simultanément et d'obtenir les informations sous forme de tableau. Pour cela, vous devez utiliser la syntaxe de tableau dans les noms de balises HTML, comme vous l'avez fait avec les sélections multiples et les boîtes à cocher.
Exemple #1 Télécharger plusieurs fichiers simultanément
<form action="file-upload.php" method="post" enctype="multipart/form-data"> Envoyez plusieurs fichiers : <br /> <input name="userfile[]" type="file" /><br /> <input name="userfile[]" type="file" /><br /> <input type="submit" value="Envoyer les fichiers" /> </form>
Lorsque le formulaire ci-dessus a été envoyé, les tableaux $_FILES['userfile'], $_FILES['userfile']['name'], et $_FILES['userfile']['size'] seront initialisés (tout comme $HTTP_POST_FILES pour les versions PHP antérieures à 4.1.0). Lorsque register_globals est activé, les variables globales concernant les fichiers téléchargés sont aussi initialisées. Chacune d'entre elles contiendra un tableau numériquement indexé, avec les valeurs décrivant les fichiers téléchargés.
Par exemple, supposons que les fichiers /home/test/review.html et /home/test/xwp.out ont été téléchargés. Dans ce cas, $_FILES['userfile']['name'][0] contient review.html et $_FILES['userfile']['name'][1] contient xwp.out. Similairement, $_FILES['userfile']['size'][0] va contenir la taille du fichier review.html, etc.
$_FILES['userfile']['name'][0], $_FILES['userfile']['tmp_name'][0], $_FILES['userfile']['size'][0] et $_FILES['userfile']['type'][0] sont aussi créées.
Depuis PHP 5.2.12, le paramètre max_file_uploads limite le nombre de fichiers qui peuvent être envoyés en une requête. Vous devrez vérifier que votre formulaire ne tente pas d'envoyer plus de fichiers dans la requête que ne le tolère cette limite.
PHP supporte la méthode HTTP PUT utilisée par les navigateurs pour y stocker des fichiers sur un serveur. Les requêtes de type PUT sont beaucoup plus simples que les chargements de fichiers en utilisant le type POST, et elles ressemblent à :
Exemple #1 Méthode PUT pour les chargements de fichiers
PUT /path/filename.html HTTP/1.1
Normalement, cela signifie que le serveur distant va sauver les données qui suivent dans le fichier : /path/filename.html de son disque. Ce n'est évidemment pas très sécurisé de laisser Apache ou PHP écraser n'importe quel fichier de l'arborescence. Pour éviter ceci, il faut d'abord dire au serveur que vous voulez qu'un script PHP donné gère la requête. Avec Apache, il y a une directive pour cela : Script. Elle peut être placée n'importe où dans le fichier de configuration d'Apache. En général, les webmestres la placent dans le bloc <Directory>, ou peut-être dans le bloc <VirtualHost>. La ligne suivante fera très bien l'affaire :
Exemple #2 Directive Apache pour le chargement par méthode PUT
Script PUT /put.php
Elle indique à Apache qu'il doit envoyer les requêtes de chargement par méthode PUT au script put.php. Bien entendu, cela présuppose que vous avez activé PHP pour qu'il prenne en charge les fichiers de type .php, et que PHP est actif. La ressource de destination pour toutes les requêtes PUT de ce script doit être le script lui-même, et non le nom du fichier que le fichier téléchargé doit avoir.
Avec PHP, vous voudriez faire quelque chose comme ce qui suit dans votre put.php. Ceci va copier le contenu du fichier téléchargé dans le fichier myputfile.ext sur le serveur. Vous devez probablement vouloir effectuer quelques vérifications et/ou identifier l'utilisateur avant d'effectuer cette copie de fichier.
Exemple #3 Sauvegarde de fichiers HTTP PUT
<?php
/* Les données PUT arrivent du flux */
$putdata = fopen("php://input", "r");
/* Ouvre un fichier pour écriture */
$fp = fopen("myputfile.ext", "w");
/* Lecture des données, 1 Ko à la fois et écriture dans le fichier */
while ($data = fread($putdata, 1024))
fwrite($fp, $data);
/* Fermeture du flux */
fclose($fp);
fclose($putdata);
?>
Aussi longtemps que le support des gestionnaires d'URL ("URL fopen wrapper") est activé dans le php.ini, avec l'option allow_url_fopen , vous pouvez utiliser des URL (HTTP et FTP) avec la majorité des fonctions qui utilisent un nom de fichier comme paramètre. Cela inclut notamment include, include_once, require et require_once (depuis PHP 5.2.0, allow_url_include doit être actif pour les utiliser). Reportez-vous à Liste des protocoles et des gestionnaires supportés pour plus d'informations sur les protocoles supportés par PHP.
Note:
En PHP 4.0.3 et antérieures, afin d'utiliser les gestionnaires URL, vous devez configurer PHP en utilisant l'option de configuration --enable-url-fopen-wrapper .
Note:
Les versions Windows de PHP antérieures à PHP 4.3 ne supportent pas l'accès aux fichiers distantes avec les fonctions suivantes : include, include_once, require, require_once, et les fonctions imagecreatefromXXX de l'extension Fonctions GD et images.
Par exemple, vous pouvez suivre l'exemple suivant pour ouvrir un fichier sur un serveur web distant, analyser les résultats pour extraire les informations dont vous avez besoin, et ensuite l'utiliser dans une requête de base de données, ou simplement éditer les informations dans le style de votre site.
Exemple #1 Connaître le titre d'une page distante
<?php
$file = fopen ("http://www.example.com/", "r");
if (!$file) {
echo "<p>Impossible de lire la page.\n";
exit;
}
while (!feof ($file)) {
$line = fgets ($file, 1024);
/* Cela ne fonctionne que si les balises Title sont correctement utilisées */
if (preg_match ("@\<title\>(.*)\</title\>@i", $line, $out)) {
$title = $out[1];
break;
}
}
fclose($file);
?>
Vous pouvez aussi écrire des fichiers sur un serveur FTP aussi longtemps que vous êtes connecté avec un utilisateur ayant les bons droits d'accès, alors que le fichier n'existait pas encore.
Pour vous connecter avec un utilisateur autre qu'anonyme, vous devez spécifier un nom d'utilisateur (et certainement le mot de passe) dans l'URL, comme ftp://user:password@ftp.example.com/path/to/file. (Vous pouvez utiliser le même type de syntaxe pour accéder aux fichiers via HTTP lorsqu'ils nécessitent une identification simple).
Exemple #2 Stocker des données sur un serveur distant
<?php
$file = fopen ("ftp://ftp.example.com/incoming/outputfile", "w");
if (!$file) {
echo "<p>Impossible d'ouvrir le fichier distant pour écriture.\n";
exit;
}
/* Ecriture des données. */
fputs ($file, $_SERVER['HTTP_USER_AGENT'] . "\n");
fclose ($file);
?>
Note:
Remarque : vous pouvez avoir l'idée, à partir de l'exemple ci-dessus, d'utiliser la même technique pour écrire sur un log distant, mais comme mentionné ci-dessus vous ne pouvez qu'écrire sur un nouveau fichier en utilisant les fonctions fopen() avec une URL. Pour faire des log distribués, nous vous conseillons de regarder la partie syslog().
Le statut des connexions est conservé en interne par PHP. Il y a trois états possibles :
Lorsqu'un script PHP est en cours d'exécution, son état est NORMAL. Si le client distant se déconnecte, le statut devient ABORTED. En général, une telle déconnexion provient d'un arrêt temporaire. Si la durée maximale d'exécution de PHP est dépassée, (voir set_time_limit()), le script prend le statut TIMEOUT.
Vous pouvez en outre décider si vous voulez que la
déconnexion d'un client provoque l'arrêt de votre
script. Il est parfois pratique que vos scripts continuent
à s'exécuter jusqu'à la fin, même si le client n'est plus là
pour recevoir les informations. Cependant, par défaut, le script
s'arrêtera dès que le client se déconnecte.
Ce comportement peut être modifié avec la directive
ignore_user_abort
dans le fichier php.ini ou
bien avec la directive Apache php_value ignore_user_abort
du fichier Apache httpd.conf ou avec la fonction
ignore_user_abort(). Si vous
ne demandez pas à PHP d'ignorer la déconnexion, et que
l'utilisateur se déconnecte, le script sera terminé. La
seule exception est si vous avez enregistré une fonction
de fermeture, avec register_shutdown_function().
Avec une telle fonction, lorsque l'utilisateur interrompt sa
requête, à la prochaine exécution du script,
PHP va s'apercevoir que le dernier script n'a pas été
terminé, et il va déclencher la fonction de fermeture.
Cette fonction sera aussi appelée à la fin du script,
si celui-ci se termine normalement. Pour pouvoir avoir un comportement
différent suivant l'état du script lors de sa finalisation,
vous pouvez exécutez des commandes spécifiques à
la déconnexion grâce à la commande
connection_aborted(). Cette fonction retournera
TRUE si la connexion a été annulée.
Votre script peut aussi être automatiquement interrompu après une certaine durée. Par défaut, le délai est de 30 secondes. Cette valeur peut être changée en utilisant la directive PHP max_execution_time dans le fichier php.ini ou avec la directive php_value max_execution_time, dans le fichier Apache httpd.conf ou encore avec la fonction set_time_limit(). Lorsque le délai expire, le script est terminé, et comme pour la déconnexion du client, une fonction de terminaison sera appelée. Dans cette fonction, vous pouvez savoir si c'est le délai d'expiration qui a causé la fin du script, en appelant la fonction connection_status(). Cette fonction retournera 2 si le délai d'expiration a été dépassé.
Une chose à noter est que les deux cas ABORTED et TIMEOUT peuvent être appelés en même temps. Ceci est possible si vous demandez à PHP d'ignorer les déconnexions des utilisateurs. PHP va quand même noter le fait que l'utilisateur s'est déconnecté, mais le script va continuer. Puis, lorsqu'il atteint la limite de temps, le script va expirer. À ce moment-là, la fonction connection_status() retournera 3.
Les connexions persistantes aux bases de données SQL sont des connexions qui ne se referment pas à la fin du script. Lorsqu'une connexion persistante est demandée, PHP s'assure qu'il n'y a pas une autre connexion identique (qui serait ouverte précédemment, avec le même nom d'hôte, d'utilisateur et le même mot de passe), et si une telle connexion existe, elle est utilisée ; sinon, elle est créée. Une connexion identique est une connexion qui a ouvert le même hôte, avec le même nom et le même mot de passe (s'ils sont nécessaires).
Ceux qui ne sont pas rompus aux techniques des serveurs web et leur distribution de la charge de travail se font parfois une fausse idée de ces connexions persistantes. En particulier, les connexions persistantes ne permettent pas l'ouverture de plusieurs sessions avec le même lien ; elles ne permettent pas la réalisation de transactions efficaces et ne font pas le café. En fait, pour être extrêmement clair sur le sujet, les connexions persistantes ne vous donnent aucune fonctionnalité de plus que les connexions non persistantes.
Alors pourquoi les connexions persistantes ?
Cela s'explique par la manière avec laquelle les serveurs web fonctionnent. Il y a trois manières d'utiliser PHP pour générer des pages.
La première est d'utiliser PHP comme un CGI (Common Interface Gateway). Lorsque PHP fonctionne de cette manière, une instance de l'interpréteur PHP est créée puis détruite pour chaque page demandée. Étant donné que cet interpréteur est détruit après chaque requête, toutes les ressources acquises (comme une connexion à une base SQL), sont purement et simplement détruites.
La deuxième méthode, de loin la plus prisée, est d'exécuter PHP sous la forme d'un module sur un serveur multi-processus, ce qui revient à dire : Apache. Un tel serveur a typiquement un processus parent qui coordonne un ensemble de processus fils, qui servent les fichiers. Lorsque les requêtes parviennent depuis un client, elles sont transmises à un fils disponible. Cela signifie que si un client fait une deuxième requête, il peut être servi par un processus client différent du premier. Les connexions persistantes vous permettent alors de ne vous connecter à une base SQL que la première fois. Lors des connexions ultérieures, les processus fils pourront réutiliser la connexion ouverte précédemment.
La dernière méthode est d'utiliser PHP sous la forme d'un module de serveur multithread. Actuellement, PHP supporte ISAPI, WSAPI, et NSAPI (sous Windows), qui permettent tous d'utiliser PHP comme un module sur un serveur multithread tel que Netscape FastTrack (iPlanet), Microsoft Internet Information Server (IIS), et O'Reilly's WebSite Pro. Le comportement est essentiellement le même que pour les serveurs multi-processus décrits précédemment.
Si les connexions persistantes n'ont aucune fonctionnalité de plus, à quoi servent-elles ?
La réponse est extrêmement simple : efficacité. Les connexions persistantes sont un bon moyen d'accélérer les accès à une base SQL si le traitement de connexion à la base est long. Ce temps dépend de nombreux facteurs : le type de base de données, cette base est-elle sur le même serveur ou pas, quelle est la charge du serveur de base de données, etc. Si le temps de connexion est long, les connexions persistantes seront bien utiles, car une fois ouverte par un processus fils, la connexion est réutilisable sans avoir à se reconnecter. Si vous avez 20 processus fils, il suffit d'avoir 20 connexions persistantes ouvertes, une par fils.
Notez que les connexions persistantes ont quelques inconvénients si vous hébergez une base de données dont le nombre maximal de connexion risque d'être atteint par les connexions persistantes. Si votre base de données accepte jusqu'à 16 connexions simultanées et que 17 processus essaient de se connecter, le dernier restera sur la touche. S'il y a des erreurs dans les scripts qui ne permettent pas de fermer la connexion (par exemple, une boucle infinie), votre serveur sera rapidement engorgé. Vérifiez la documentation de votre base de données pour savoir comment elle traite les connexions inactives ou abandonnées.
Il y a quelques autres limitations à bien garder en tête lorsque vous utilisez les connexions persistantes. L'une est que lorsque vous posez un verrou avec une connexion persistante, si le script ne peut libérer le verrou pour une raison quelconque, alors les autres scripts qui réutiliseront la connexion seront bloqués indéfiniment, et vous imposeront le redémarrage du serveur ou de la base de données. Une autre limitation est, lors de l'utilisation des transactions, un bloc de transaction non fermé sera prolongé au script suivant, s'il n'est pas fermé par le script initiateur. Dans les deux cas, vous pouvez utiliser la fonction register_shutdown_function() pour enregistrer une fonction simple de nettoyage, pour déverrouiller les tables, et annuler les transactions en cours. Mieux encore, évitez le problème entièrement en n'utilisant pas les connexions persistantes dans les scripts qui ont besoin de verrous ou de transactions. Vous pourrez toujours les utiliser ailleurs.
Résumons-nous : les connexions persistantes ont été définies pour avoir les mêmes fonctionnalités que les connexions non persistantes. Les deux types de connexions sont parfaitement interchangeables, et n'affecteront pas le comportement de votre script : uniquement son efficacité.
Voir aussi fbsql_pconnect(), ibase_pconnect(), ifx_pconnect(), ingres_pconnect(), msql_pconnect(), mssql_pconnect(), mysql_pconnect(), ociplogon(), odbc_pconnect(), oci_pconnect(), pfsockopen(), pg_pconnect() et sybase_pconnect().
Le "Safe Mode" est le mode de sécurité de PHP : une solution au problème de partage de PHP sur un serveur. Ce système pêche au niveau de l'architecture car il n'est pas correct de tenter de résoudre ce problème au niveau de PHP, mais les solutions alternatives basées sur le serveur web et l'OS ne sont pas réalistes. De nombreux intervenants, notamment les fournisseurs d'hébergement, utilisent le "Safe Mode".
Cette fonctionnalité est devenue OBSOLETE depuis PHP 5.3.0 et a été SUPPRIMEE depuis PHP 5.4.0.
| Version | Description |
|---|---|
| 5.4.0 |
Supprimé de PHP, et génère une erreur fatale de niveau
E_CORE_ERROR lorsqu'activé.
|
| 5.3.0 |
Obsolète, et une erreur de niveau E_DEPRECATED a été ajoutée.
|
| Nom | Défaut | Modifiable | Historique |
|---|---|---|---|
| safe_mode | "0" | PHP_INI_SYSTEM | Supprimé en PHP 5.4.0. |
| safe_mode_gid | "0" | PHP_INI_SYSTEM | Disponible depuis PHP 4.1.0. Supprimé en PHP 5.4.0. |
| safe_mode_include_dir | NULL | PHP_INI_SYSTEM | Disponible depuis PHP 4.1.0. Supprimé en PHP 5.4.0. |
| safe_mode_exec_dir | "" | PHP_INI_SYSTEM | Supprimé en PHP 5.4.0. |
| safe_mode_allowed_env_vars | "PHP_" | PHP_INI_SYSTEM | Supprimé en PHP 5.4.0. |
| safe_mode_protected_env_vars | "LD_LIBRARY_PATH" | PHP_INI_SYSTEM | Supprimé en PHP 5.4.0. |
Voici un éclaircissement sur l'utilisation des directives de configuration.
safe_mode
booléen
Active ou non le mode de sécurité de PHP. Si PHP est compilé avec --enable-safe-mode, la valeur par défaut sera On, sinon Off.
Cette fonctionnalité est devenue OBSOLETE depuis PHP 5.3.0 et a été SUPPRIMEE depuis PHP 5.4.0.
safe_mode_gid
booléen
Par défaut, le safe mode fait une comparaison des
propriétaires, avant d'ouvrir un fichier. Si vous voulez
alléger un peu ce niveau de sécurité, vous pouvez
réaliser une comparaison de groupe, et activer cette
directive.
Si cette directive vaut FALSE (sa valeur par défaut),
c'est une comparaison sur les UID,
et, si elle vaut TRUE c'est une comparaison sur les
GID.
safe_mode_include_dir
chaîne de caractères
Les vérifications basées sur le UID ou GID sont ignorées lorsque les fichiers inclus sont placés dans le dossier indiqué par cette directive, ainsi que ses sous-dossiers. Les dossiers peuvent être aussi dans l'include_path ou bien il faut inclure le chemin complet.
Depuis PHP 4.2.0, cette directive utilise le point virgule de la même façon que le fait include_path, pour permettre de configurer plusieurs dossiers. La restriction spécifiée est en fait un préfixe, plus qu'un nom de dossier. Cela signifie que "safe_mode_include_dir = /dir/incl" autorise aussi bien "/dir/include" que "/dir/incls", s'ils existent. Lorsque vous souhaitez restreindre l'accès à un dossier spécifique, il faut terminer cette directive avec un slash. Par exemple "safe_mode_include_dir = /dir/incl/". Si la valeur de cette directive est vide, aucun fichier avec le UID/GID différent ne peut être inclus dans PHP 4.2.3 et dans les versions PHP 4.3.3 et plus récentes. Dans les versions antérieures, tous les fichiers pouvaient être inclus.safe_mode_exec_dir
chaîne de caractères
Si PHP est utilisé en safe mode, les fonctions comme system() et toutes celles qui permettent l'exécution en ligne de commande refuseront d'exécuter des programmes qui ne sont pas dans ce dossier. Vous devez utiliser / en tant que séparateur de dossier sous tous les environnements, y compris Windows.
safe_mode_allowed_env_vars
chaîne de caractères
Modifier certaines variables d'environnement est un trou de sécurité potentiel. Cette directive contient une liste de noms de variables d'environnement séparées par des virgules, ou de préfixes. En Safe mode, l'utilisateur ne pourra modifier que les variables d'environnement dont le nom commence par l'un des préfixes fourni ici. Par défaut, les utilisateurs ne peuvent modifier que les variables d'environnement qui commencent par PHP_ (e.g. PHP_FOO=BAR).
Note:
Si cette directive est vide, PHP autorisera la modification de TOUTES les variables d'environnement.
safe_mode_protected_env_vars
chaîne de caractères
Cette directive contient une liste de variables d'environnement que le programmeur ne pourra pas modifier en utilisant la fonction putenv(). Ces variables seront protégées, même si la directive safe_mode_allowed_env_vars autorise leur modification.
Voir aussi open_basedir, disable_functions, disable_classes, register_globals, display_errors, et log_errors.
Lorsque Safe Mode est actif, PHP vérifie que le propriétaire du script courant est le même que le propriétaire des fichiers ou dossiers qui seront manipulés par ce script. Par exemple, dans la situation suivante :
-rw-rw-r-- 1 rasmus rasmus 33 Jul 1 19:20 script.php -rw-r--r-- 1 root root 1116 May 26 18:01 /etc/passwd
<?php
readfile('/etc/passwd');
?>
Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2
Cependant, il arrive que la vérification faite avec le nom du propriétaire (UID) du fichier soit trop restrictive, et qu'une vérification sur le nom du groupe (GID) soit suffisante. C'est une autre fonctionnalité supportée par la directive safe_mode_gid. En lui donnant la valeur de On, les vérifications seront faites sur le GID, alors qu'en lui laissant sa valeur par défaut de Off, les vérifications seront faites sur le UID.
Si au lieu d'utiliser le Safe Mode, vous utilisez la directive open_basedir, alors les manipulations seront limitées aux fichiers situés dans les dossiers spécifiés. Par exemple (Apache httpd.conf) :
<Directory /docroot> php_admin_value open_basedir /docroot </Directory>
Warning: open_basedir restriction in effect. File is in wrong directory in /docroot/script.php on line 2
Vous pouvez également désactiver les fonctions particulières. Notez que la directive disable_functions ne peut être utilisée en dehors du fichier php.ini, ce qui signifie que vous ne pouvez pas désactiver des fonctions par virtualhost ou par dossiers, dans votre fichier httpd.conf. Si nous ajoutons ceci à notre fichier php.ini :
disable_functions = readfile,system
Warning: readfile() has been disabled for security reasons in /docroot/script.php on line 2
Ces restrictions de PHP sont bien sûr invalides en exécution binaire.
Voici une liste non-exhaustive des fonctions désactivées par le Safe Mode.
| Fonction | Limitations |
|---|---|
| dbmopen() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| dbase_open() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| filepro() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| filepro_rowcount() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| filepro_retrieve() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| Fonctions ifx_* | restrictions sql_safe_mode, (!= Safe Mode) |
| Fonctions ingres_* | restrictions sql_safe_mode, (!= Safe Mode) |
| Fonctions mysql_* | restrictions sql_safe_mode, (!= Safe Mode) |
| pg_lo_import() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| posix_mkfifo() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| putenv() | Obéit aux directives safe_mode_protected_env_vars et safe_mode_allowed_env_vars. Voir aussi la documentation de putenv() |
| move_uploaded_file() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| chdir() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| dl() | Cette fonction est désactivée par le safe-mode |
| opérateur guillemets obliques | Cette fonction est désactivée par le safe-mode |
| shell_exec() (équivalent fonctionnel des guillemets obliques) | Cette fonction est désactivée par le safe-mode |
| exec() | Vous ne pouvez exécuter que les programmes qui sont dans le dossier safe_mode_exec_dir. Pour des raisons pratiques, il n'est pas possible d'utiliser des jokers comme .. dans le chemin de ce dossier. escapeshellcmd() est exécuté sur les arguments de cette fonction. |
| system() | Vous ne pouvez exécuter que les programmes qui sont dans le dossier safe_mode_exec_dir. Pour des raisons pratiques, il n'est pas possible d'utiliser des jokers comme .. dans le chemin de ce dossier. escapeshellcmd() est exécuté sur les arguments de cette fonction. |
| passthru() | Vous ne pouvez exécuter que les programmes qui sont dans le dossier safe_mode_exec_dir. Pour des raisons pratiques, il n'est pas possible d'utiliser des jokers comme .. dans le chemin de ce dossier. escapeshellcmd() est exécuté sur les arguments de cette fonction. |
| popen() | Vous ne pouvez exécuter que les programmes qui sont dans le dossier safe_mode_exec_dir. Pour des raisons pratiques, il n'est pas possible d'utiliser des jokers comme .. dans le chemin de ce dossier. escapeshellcmd() est exécuté sur les arguments de cette fonction. |
| fopen() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| mkdir() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| rmdir() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| rename() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| unlink() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| copy() | Vérifie que le fichier/dossier que vous
allez utiliser a le même UID que le script qui est actuellement exécuté. Vérifie que le fichier/dossier que vous
allez utiliser a le même UID que le script qui est actuellement exécuté. (sur
source et
target) |
| chgrp() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| chown() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| chmod() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. De plus, vous ne pouvez pas modifier les SUID, SGID et le bit sticky |
| touch() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| symlink() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. (note : seule l'hôte cible est vérifié) |
| link() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. (note : seul le fichier de destination est vérifié.) |
| apache_request_headers() | En Safe Mode, les en-têtes commençant par authorization (sensible à la casse) ne seront pas retournés. |
| header() | Avec le safe mode, le uid du script est ajouté à la partie realm de l'en-tête WWW-Authenticate si vous utilisez cet en-tête pour l'identification. |
| variables PHP_AUTH | Avec le safe mode, les variables PHP_AUTH_USER, PHP_AUTH_PW et PHP_AUTH_TYPE ne sont pas disponibles dans la variable $_SERVER. Indépendamment, vous pouvez utiliser la variable REMOTE_USER pour connaître l'utilisateur. (note : affectée uniquement depuis PHP 4.3.0) |
| highlight_file(), show_source() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. (note : affectée uniquement depuis PHP 4.2.1) |
| parse_ini_file() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. (note : affectée uniquement depuis PHP 4.2.1) |
| set_time_limit() | N'a aucun effet lorsque PHP fonctionne avec le safe mode. |
| max_execution_time | N'a aucun effet lorsque PHP fonctionne avec le safe mode. |
| mail() | Si le Safe Mode est actif, le 5ème paramètre est désactivé (note : uniquement affecté depuis PHP 4.2.3) |
| session_start() | Le propriétaire d'un script doit être le même que celui que celui du répertoire session.save_path si le répertoire par défaut session.save_handler est utilisé. |
| Toutes les fonctions sur les flux et sur le système de fichiers. | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. (Voir l'option safe_mode_include_dir du php.ini. |
PHP supporte le CLI SAPI depuis PHP 4.3.0. Le but premier de ce SAPI est le développement d'applications shell avec PHP. Les différences entre le CLI SAPI et les autres SAPI sont expliqués dans ce chapitre. Il est important de mentionner que CLI et CGI sont des SAPI différents malgré le fait qu'ils puissent partager la majeure partie de leurs comportements.
Le CLI SAPI est activé par défaut en utilisant l'option --enable-cli , mais vous pouvez le désactiver en utilisant l'option --disable-cli lors de l'exécution de la commande ./configure.
Le nom, l'emplacement et l'existence des binaires CLI/CGI vont dépendre de la façon dont PHP est installé sur votre système. Par défaut, en exécutant make, les deux binaires CGI et CLI sont compilés et nommés respectivement sapi/cgi/php et sapi/cli/php dans votre répertoire source PHP. Vous remarquerez que les deux se nomment php. Ce qui se passe ensuite pendant le make install dépend de votre ligne de configuration. Si un module SAPI, apxs par exemple, a été choisi pendant la configuration, ou que l'option --disable-cgi a été activée, le CLI est copié dans {PREFIX}/bin/php pendant le make install sinon, le CGI sera placé ici. Si, par exemple, --with-apxs figure dans votre ligne de configuration, le CLI est copié dans {PREFIX}/bin/php pendant le make install. Si vous voulez forcer l'installation du binaire CGI, lancez make install-cli après le make install. Sinon, vous pouvez aussi spécifier --disable-cgi dans votre ligne de configuration.
Note:
Du fait que les deux options --enable-cli et --enable-cgi sont activées par défaut, avoir simplement --enable-cli dans votre ligne de configuration n'implique pas nécessairement que le CLI soit renommé en {PREFIX}/bin/php pendant le make install.
Depuis PHP 5, le binaire CLI est distribué dans le dossier principal sous le nom de php.exe sous Windows. La version CGI est distribuée sous le nom de php-cgi.exe. De plus, un fichier php-win.exe est distribué si PHP est configuré en utilisant l'option de configuration --enable-cli-win32 . Ce fichier fait la même chose que la version CLI, sauf qu'il n'affiche rien et qu'il ne fournit pas de console.
Note: Quel SAPI est installé ?
À partir d'un terminal, lancer php -v vous dira si php est en version CGI ou CLI. Vous pouvez aussi consulter la fonction php_sapi_name() et la constante
PHP_SAPI.
Note:
Une page man de manuel Unix est disponible en tapant man php dans l'interpréteur de commande.
Les différences les plus notables entre le CLI SAPI et les SAPI sont :
Contrairement au CGI SAPI, aucun en-tête HTTP n'est écrit dans le résultat.
Bien que le CGI SAPI fournisse un moyen de supprimer les en-têtes HTTP, il n'y a pas moyen d'activer les en-têtes HTTP dans le CLI SAPI.
CLI est lancé en mode silencieux par défaut, bien que les options -q et --no-header soient gardées pour rester compatible avec les anciennes versions CGI.
Il ne change pas le répertoire courant en celui du script. (les options -C et --no-chdir sont gardées par souci de compatibilité)
Messages d'erreurs en texte brut (pas de formatage HTML).
Il y a plusieurs directives du php.ini qui sont ignorées par le CLI SAPI, car elles n'ont pas de sens en environnement shell :
| Directive | Valeur par défaut pour CLI SAPI | Commentaire |
|---|---|---|
| html_errors | FALSE |
Par défaut à FALSE, vu qu'il peut être bien difficile de lire des messages
d'erreur sur un terminal lorsqu'ils sont noyés dans des balises HTML
non-interprétées.
|
| implicit_flush | TRUE |
Dans un terminal, il est généralement souhaitable que tout affichage en provenance de print, echo et autres, soit immédiatement affiché, et non pas placé dans un buffer quelconque. Néanmoins, il est toujours possible d'utiliser la bufferisation de sortie si vous voulez retarder un affichage, ou bien en manipuler le contenu une dernière fois. |
| max_execution_time | 0 (sans limite) | PHP dans un terminal est susceptible d'être utilisé pour des tâches bien plus diverses que dans des scripts web, et vu que cela prend généralement beaucoup de temps, ce paramètre sera défini par défaut à 0 permettant ainsi d'être illimité. |
| register_argc_argv | TRUE |
La définition à Les variables PHP $argc et $argv sont automatiquement définies et remplies avec les valeurs appropriées, lors de l'utilisation du SAPI CLI. Ces valeurs peuvent également être trouvées dans la variable $_SERVER, par exemple : $_SERVER['argv']. |
| output_buffering | FALSE |
Même si cette configuration INI est codée en dur à |
| max_input_time | FALSE |
Le PHP CLI ne supporte pas GET, POST et le téléchargement de fichiers. |
Note:
Ces directives ne peuvent pas être initialisées avec d'autres valeurs dans le fichier php.ini ou par une autre méthode. C'est une limitation, car ces valeurs par défaut s'appliquent une fois que tous les autres fichiers de configuration ont été analysés. Cependant, ces valeurs peuvent être modifiées durant l'exécution (ce qui n'est pas logique pour certaines directives, comme register_argc_argv).
Note:
Il est recommandé de définit ignore_user_abort pour les scripts en ligne de commande. Voir la fonction ignore_user_abort() pour plus d'informations.
Pour faciliter le travail en environnement shell, plusieurs constantes sont définies pour les flux I/O.
Le CLI SAPI ne transforme pas le dossier courant en dossier d'exécution du script.
Exemple #1 Exemple montrant la différence avec le SAPI CGI :
<?php
// Un test simple : affiche le dossier d'exécution */
echo getcwd(), "\n";
?>
Lorsque vous utilisez la version CGI, l'affichage sera :
$ pwd /tmp $ php -q autre_dossier/test.php /tmp/autre_dossier
Cela montre clairement que PHP modifie le dossier courant, et utilise le dossier du script exécuté.
En utilisant le CLI SAPI, on obtient :
$ pwd /tmp $ php -f autre_dossier/test.php /tmp
Cela donne beaucoup plus de souplesse lorsque vous rédigez des scripts shell avec PHP.
Note:
Le CGI SAPI se comporte de la même façon que le CLI SAPI, en lui passant l'option -C , lorsque vous l'invoquez en ligne de commande.
La liste des options de ligne de commande fournies par PHP est disponible à n'importe quel moment en exécutant PHP avec l'option -h :
Usage: php [options] [-f] <file> [--] [args...]
php [options] -r <code> [--] [args...]
php [options] [-B <begin_code>] -R <code> [-E <end_code>] [--] [args...]
php [options] [-B <begin_code>] -F <file> [-E <end_code>] [--] [args...]
php [options] -- [args...]
php [options] -a
-a Run interactively
-c <path>|<file> Look for php.ini file in this directory
-n No php.ini file will be used
-d foo[=bar] Define INI entry foo with value 'bar'
-e Generate extended information for debugger/profiler
-f <file> Parse and execute <file>.
-h This help
-i PHP information
-l Syntax check only (lint)
-m Show compiled in modules
-r <code> Run PHP <code> without using script tags <?..?>
-B <begin_code> Run PHP <begin_code> before processing input lines
-R <code> Run PHP <code> for every input line
-F <file> Parse and execute <file> for every input line
-E <end_code> Run PHP <end_code> after processing all input lines
-H Hide any passed arguments from external tools.
-S <addr>:<port> Run with built-in web server.
-t <docroot> Specify document root <docroot> for built-in web server.
-s Output HTML syntax highlighted source.
-v Version number
-w Output source with stripped comments and whitespace.
-z <file> Load Zend extension <file>.
args... Arguments passed to script. Use -- args when first argument
starts with - or script is read from stdin
--ini Show configuration file names
--rf <name> Show information about function <name>.
--rc <name> Show information about class <name>.
--re <name> Show information about extension <name>.
--rz <name> Show information about Zend extension <name>.
--ri <name> Show configuration for extension <name>.
| Option | Option longue | Description |
|---|---|---|
| -a | --interactive |
Lance PHP de façon interactive. Pour plus d'informations, reportez-vous à la documentation concernant le shell intéractif. |
| -b | --bindpath |
Lie le chemin pour les externes, en mode serveur FASTCGI (CGI uniquement). |
| -C | --no-chdir |
Ne pas aller dans le dossier du script (CGI uniquement). |
| -q | --no-header |
Mode silencieux. Supprime la sortie des en-têtes HTTP (CGI uniquement). |
| -T | --timing |
Mesure le temps d'exécution du script, répété count fois (CGI uniquement). |
| -c | --php-ini |
Spécifie le nom du dossier dans lequel se trouve le fichier php.ini, ou encore spécifie un fichier de configuration (INI) directement (qui ne s'appelle pas obligatoirement php.ini) :
$ php -c /custom/directory/ mon_script.php $ php -c /custom/directory/custom-file.ini mon_script.php Si cette option n'est pas spécifiée, php.ini est recherché dans les endroits par défaut. |
| -n | --no-php-ini |
Ignore totalement php.ini. |
| -d | --define |
Définit une valeur personnalisée pour n'importe quelle directive de configuration du fichier php.ini. La syntaxe est : -d configuration_directive[=value]
# L'omission de la valeur conduit à donner la valeur de "1"
$ php -d max_execution_time
-r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(1) "1"
# Passer une valeur vide conduit à donner la valeur de ""
php -d max_execution_time=
-r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(0) ""
# La directive de configuration sera n'importe quelle valeur passée après le caractère '='
$ php -d max_execution_time=20
-r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(2) "20"
$ php
-d max_execution_time=doesntmakesense
-r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(15) "doesntmakesense"
|
| -e | --profile-info |
Génère des informations étendues pour le profilage et le débogage. |
| -f | --file |
Analyse et exécute le fichier spécifié. L'option -f est facultative, et peut être omise. Le seul nom du fichier est suffisant.
|
| -h et -? | --help et --usage | Affiche des informations sur la liste courante des options de la ligne de commande, ainsi que leur description. |
| -i | --info | Appelle la fonction phpinfo(), et affiche le résultat. Si PHP ne fonctionne pas correctement, il est recommandé d'utiliser la commande php -i et de voir s'il n'y a pas d'erreurs affichées avant ou après la table d'information. N'oubliez pas que le résultat de cette option, si vous utilisez le mode CGI, est au format HTML, et donc de taille conséquente. |
| -l | --syntax-check |
Vérifie syntaxiquement le code PHP fourni. En cas de réussite, le message No syntax errors detected in <filename> (Littéralement, aucune erreur de syntaxe n'a été détectée dans le fichier) est affiché sur la sortie standard, et le script shell retourne 0. En cas d'erreur, le message Errors parsing <filename> (Littéralement, erreur d'analyse dans le fichier filename) est affiché, en plus des messages d'erreurs détectés par l'analyseur lui-même. Le script Shell retourne le code -1. Cette option ne détecte pas les erreurs fatales (par exemple les fonctions non définies). Utilisez l'option -f pour tester aussi les erreurs fatales.
|
| -m | --modules |
Exemple #1 Affichage des modules internes (et chargés) de PHP et Zend $ php -m [PHP Modules] xml tokenizer standard session posix pcre overload mysql mbstring ctype [Zend Modules] |
| -r | --run |
Permet l'exécution de PHP directement dans la ligne de commande. Les balises de PHP (<?php et ?>) ne sont pas nécessaires, et causeront une erreur d'analyse si elles sont présentes.
|
| -B | --process-begin |
Code PHP à exécuter avant le traitement de stdin. |
| -R | --process-code |
Code PHP à exécuter pour chaque ligne en entrée. Il y a deux variables spéciales de disponibles dans ce mode : $argn et $argi. $argn doit contenir la ligne PHP traitée à ce moment donné, tandis que $argi doit contenir le numéro de la ligne. |
| -F | --process-file |
Fichier PHP à exécuter pour chaque ligne en entrée. |
| -E | --process-end |
Code PHP à exécuter après avoir effectué l'entrée.
Exemple #4 Exemple d'utilisation des options -B , -R et -E pour compter le nombre de lignes d'un projet. $ find my_proj | php -B '$l=0;' -R '$l += count(@file($argn));' -E 'echo "Total Lines: $l\n";' Total Lines: 37328 |
| -S | --server |
Démarre le serveur web interne. Disponible depuis 5.4.0. |
| -t | --docroot | Spécifie la racine des documents pour le serveur web interne. Disponible depuis PHP 5.4.0. |
| -s | --syntax-highlight et --syntax-highlighting |
Affiche le code avec la colorisation syntaxique. Cette option utilise le mécanisme interne pour analyser le fichier, et écrire au format HTML une version colorisée du code source. Notez que cette option ne fait que générer un bloc HTML, avec les balises HTML <code> [...] </code>, sans en-têtes HTML.
|
| -v | --version |
Exemple #5 Utilisation de l'option -v pour récupérer le nom du SAPI ainsi que la version de PHP et de Zend $ php -v PHP 5.3.1 (cli) (built: Dec 11 2009 19:55:07) Copyright (c) 1997-2009 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies |
| -w | --strip |
Affiche la source sans les commentaires ni les espaces.
|
| -z | --zend-extension |
Charge une extension Zend. Si et seulement si un fichier est fourni, PHP essaie de charger cette extension dans le dossier courant par défaut des bibliothèque sur votre système (généralement spécifié avec /etc/ld.so.conf sous Linux par exemple). Passer un nom de fichier avec le chemin complet fera que PHP utilisera ce fichier, sans recherche dans les dossiers classiques. Un chemin de dossier relatif, incluant les informations sur le dossier, indiquera à PHP qu'il doit chercher les extensions uniquement dans ce dossier. |
| --ini |
Affiche les noms des fichiers de configuration et des dossiers analysés. Disponible depuis PHP 5.2.3. Exemple #6 Exemple avec --ini $ php --ini Configuration File (php.ini) Path: /usr/dev/php/5.2/lib Loaded Configuration File: /usr/dev/php/5.2/lib/php.ini Scan for additional .ini files in: (none) Additional .ini files parsed: (none) |
|
| --rf | --rfunction |
Affiche des informations sur la fonction donnée ou la méthode d'une classe (i.e. nombre et nom des paramètres). Disponible depuis PHP 5.1.2. Cette option n'est disponible que si PHP a été compilé avec le support Reflection.
Exemple #7 Exemple avec --rf $ php --rf var_dump
Function [ <internal> public function var_dump ] {
- Parameters [2] {
Parameter #0 [ <required> $var ]
Parameter #1 [ <optional> $... ]
}
}
|
| --rc | --rclass |
Affiche des informations sur la classe donnée (liste des constantes, propriétés et méthodes). Disponible depuis PHP 5.1.2. Cette option n'est disponible que si PHP a été compilé avec le support Reflection.
Exemple #8 Exemple avec --rc $ php --rc Directory
Class [ <internal:standard> class Directory ] {
- Constants [0] {
}
- Static properties [0] {
}
- Static methods [0] {
}
- Properties [0] {
}
- Methods [3] {
Method [ <internal> public method close ] {
}
Method [ <internal> public method rewind ] {
}
Method [ <internal> public method read ] {
}
}
}
|
| --re | --rextension |
Affiche les informations sur l'extension donnée (liste les options du php.ini, les fonctions définies, les constantes et les classes). Disponible depuis PHP 5.1.2. Cette option n'est disponible que si PHP a été compilé avec le support Reflection.
Exemple #9 Exemple avec --re $ php --re json
Extension [ <persistent> extension #19 json version 1.2.1 ] {
- Functions {
Function [ <internal> function json_encode ] {
}
Function [ <internal> function json_decode ] {
}
}
}
|
| --rz | --rzendextension |
Affiche les informations de configuration pour l'extension Zend fourni (les mêmes informations que celles retournées par la fonction phpinfo()). Disponible depuis PHP 5.4.0. |
| --ri | --rextinfo |
Affiche les informations de configuration pour l'extension donnée (les mêmes informations retournées par la fonction phpinfo()). Disponible depuis PHP 5.2.2. Les informations de configurations internes sont disponibles en utilisant le nom d'extension "main" ou "core".
Exemple #10 Exemple avec --ri $ php --ri date date date/time support => enabled "Olson" Timezone Database Version => 2009.20 Timezone Database => internal Default timezone => Europe/Oslo Directive => Local Value => Master Value date.timezone => Europe/Oslo => Europe/Oslo date.default_latitude => 59.930972 => 59.930972 date.default_longitude => 10.776699 => 10.776699 date.sunset_zenith => 90.583333 => 90.583333 date.sunrise_zenith => 90.583333 => 90.583333 |
Note:
Les options -rBRFEH, --ini et --r[fcezi] ne sont disponibles qu'en mode CLI.
Il y a 3 façons différentes d'appeler le CLI SAPI avec du code PHP à exécuter :
Indiquer à PHP d'exécuter un fichier donné :
php mon_script.php php -f mon_script.php
Les deux méthodes (en utilisant -f ou pas) exécutent le script contenu dans le fichier mon_script.php. Notez qu'il n'existe pas de restriction sur les fichiers pouvant être exécutés ; en particulier, il n'est pas nécessaire que l'extension du fichier soit .php.
Note:
Si les arguments doivent être passés au script lors de l'utilisation de l'option -f , le premier argument doit être --.
Donner du code PHP à exécuter directement en ligne de commande.
php -r 'print_r(get_defined_constants());'
Une attention particulière doit alors être apportée aux variables d'environnement, qui seront remplacées, et aux guillemets, qui ont des significations spéciales en ligne de commande.
Note:
Lisez l'exemple attentivement, il n'y a ni balise d'ouverture, ni balise de fermeture ! L'option -r rend caduque l'utilisation de celles-ci, et les ajouter conduirait alors à une erreur d'analyse syntaxique.
Alimenter l'entrée standard en code PHP (stdin).
Cela donne la possibilité de créer dynamiquement du code PHP, puis de le fournir à PHP, et enfin, de le traiter à nouveau en shell. Voici un exemple fictif :
$ some_application | some_filter | php | sort -u > final_output.txt
Comme toute application shell, l'exécutable PHP accepte des arguments ; cependant, le script PHP peut aussi en recevoir. Le nombre d'arguments pouvant être passés à votre script n'est pas limité par PHP (le shell a une limite en terme de nombre de caractères qui peuvent être passés. Généralement, vous n'atteindrez pas cette limite). Les arguments passés au script seront transmis via la variable tableau $argv. Le premier index (zéro) contient toujours le nom du script appelé depuis la ligne de commande. Notez que, si le code est exécuté en ligne en utilisant l'option de ligne commande -r , la valeur de $argv[0] sera simplement un tiret (-). Cela est aussi vrai si le code est exécuté via un pipe depuis STDIN.
Une seconde variable globale, $argc, contient le nombre d'éléments du tableau $argv (et non pas le nombre d'arguments passés à votre script).
Tant que les arguments passés au script ne commencent pas par le caractère -, il n'y a rien de spécial à surveiller. Le fait de passer des arguments au script qui commencent par - pose des problèmes car PHP va penser qu'il doit les interpréter. Pour éviter cela, utilisez le séparateur --. Après cet argument, tous les arguments suivants seront passés au script sans être modifiés ou analysés par PHP.
# Cela ne va pas exécuter le code, mais afficher l'aide de PHP
$ php -r 'var_dump($argv);' -h
Usage: php [options] [-f] <file> [args...]
[...]
# Cela va passer l'argument '-h' au script, et éviter que PHP ne le traite
$ php -r 'var_dump($argv);' -- -h
array(2) {
[0]=>
string(1) "-"
[1]=>
string(2) "-h"
}
Cependant, il y a une autre méthode pour utiliser PHP en script shell ; la première ligne du script devra être #!/usr/bin/php (à remplacer par le chemin vers le binaire PHP CLI sur le système sous-jacent). Le reste du fichier doit contenir le code PHP normal, compris entre les balises ouvrantes/fermantes. Après avoir mis les droits d'exécution sur le script (chmod +x test), il peut être exécuté comme un script shell ou perl habituel :
Exemple #1 Exécute un script PHP en tant que script shell
#!/usr/bin/php
<?php
var_dump($argv);
?>
En supposant que ce fichier s'appelle test, dans le dossier courant, il est alors possible de faire ceci :
$ chmod +x test
$ ./test -h -- foo
array(4) {
[0]=>
string(6) "./test"
[1]=>
string(2) "-h"
[2]=>
string(2) "--"
[3]=>
string(3) "foo"
}
Comme vous pouvez le voir, dans ce cas, vous n'avez pas besoin de faire attention lors du passage de paramètres qui commencent par - à votre script.
L'exécutable PHP peut être utilisé pour exécuter des scripts indépendants du serveur web. Si vous êtes sur un système Unix, il est recommandé d'ajouter la ligne spéciale en début de script, de le rendre exécutable de manière à ce que le système sache quel programme doit exécuter le script. Sous Windows, vous pouvez associer l'exécutable php.exe avec le double-clic sur les fichiers d'extension .php, ou bien vous pouvez faire un fichier batch pour exécuter le script grâce à PHP. La première ligne utilisée dans le monde Unix ne perturbera pas l'exécution sous Windows, ce qui rend les scripts facilement portables. Un exemple complet est disponible ci-dessous :
Exemple #2 Script prévu pour être exécuté en ligne de commande (script.php)
#!/usr/bin/php
<?php
if ($argc != 2 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
?>
C'est une ligne de commande à une option.
Utilisation :
<?php echo $argv[0]; ?> <option>
<option> peut être un mot que vous souhaitez afficher.
Avec les options --help, -help, -h,
et -?, vous obtiendrez cette aide.
<?php
} else {
echo $argv[1];
}
?>
Le script ci-dessus inclut la première ligne spéciale indiquant que ce fichier doit être exécuté par PHP. Nous travaillons ici avec la version CLI, aussi, aucun en-tête HTTP ne sera affiché.
Le programme commence par vérifier que l'argument requis est spécifié (en plus du nom du script, qui est aussi compté). S'il n'est pas présent, ou si l'argument est --help , -help , -h ou -? , un message d'aide sera affiché, en utilisant $argv[0] pour afficher dynamiquement le nom du script tel qu'entré dans la ligne de commande. Sinon, l'argument est affiché tel qu'il a été entré dans le terminal.
Pour exécuter le script ci-dessus sous Unix, vous devez le rendre exécutable, puis l'appeler avec une commande comme : script.php echothis ou script.php -h. Sous Windows, vous pouvez faire un fichier batch pour cela :
Exemple #3 Fichier batch pour exécuter un script PHP en ligne de commande (script.bat)
@echo OFF "C:\php\php.exe" script.php %*
En supposant que le programme ci-dessus est nommé script.php, et que l'exécutable CLI php.exe se trouve dans C:\php\php.exe, ce fichier batch l'exécutera avec les options que vous lui passez : script.bat echothis ou script.bat -h.
Voir aussi l'extension Readline, qui dispose de nombreuses fonctions pour améliorer la convivialité de des applications PHP en ligne de commande.
Sous Windows, PHP peut être configuré pour fonctionner sans avoir besoin de fournir les extensions C:\php\php.exe ou .php, tel que décrit dans la ligne de commande PHP sous Microsoft Windows.
Le CLI SAPI définit quelques constantes pour les flux I/O pour rendre la programmation en ligne de commande plus facile.
| Constante | Description |
|---|---|
STDIN |
Un flux déjà ouvert vers stdin. Ceci évite de l'ouvrir explicitement avec
<?php
<?php |
STDOUT |
Un flux déjà ouvert vers stdout. Ceci évite de l'ouvrir explicitement avec
<?php |
STDERR |
Un flux déjà ouvert vers stderr. Ceci évite de l'ouvrir explicitement avec
<?php |
Ainsi, vous n'avez pas besoin d'ouvrir un flux spécifique pour, par exemple, stderr mais vous pouvez simplement utiliser la constante correspondante à ce flux :
php -r 'fwrite(STDERR, "stderr\n");'
Note:
Ces constantes ne sont pas disponibles lors d'une lecture d'un script PHP depuis stdin.
Depuis PHP 5.1.0, le CLI SAPI fournit un shell intéractif lors de l'utilisation de l'option -a si PHP a été compilé avec l'option --with-readline .
En utilisant le shell interactif, vous avez la possibilité de taper du code PHP et qu'il soit exécuté directement.
Exemple #1 Exécution de code en utilisant le shell interactif
$ php -a
Interactive shell
php > echo 5+8;
13
php > function addTwo($n)
php > {
php { return $n + 2;
php { }
php > var_dump(addtwo(2));
int(4)
php >
Le shell interactif fournit également une auto-complétion des fonctions, des constantes, des noms de classes, des variables, des appels aux méthodes statiques, et des constantes de classes en utilisant la touche de tabulation.
Exemple #2 Auto-complétion en utilisant la touche de tabulation
Le fait de presser deux fois la touche de tabulation lorsqu'il y a plusieurs complétions possibles affichera une liste de ces complétions :
php > strp[TAB][TAB] strpbrk strpos strptime php > strp
Lorsqu'il n'y a qu'une seul complétion possible, presser la touche de tabulation une seule fois complétera le reste sur la même ligne :
php > strpt[TAB]ime(
La complétion fonctionnera aussi pour les noms qui ont été définis lors de la session courante du shell interactif :
php > $fooThisIsAReallyLongVariableName = 42; php > $foo[TAB]ThisIsAReallyLongVariableName
Le shell interactif stocke votre historique et peut y accéder en utilisant les touches haut et bas. L'historique est sauvegardé dans le fichier ~/.php_history.
Depuis PHP 5.4.0, le CLI SAPI fournit 2 nouvelles directives du php.ini :
cli.pager et cli.prompt.
La directive cli.pager permet la définition d'un programme
externe (comme less) à utiliser comme pager pour la sortie
au lieu d'afficher directement sur l'écran. La directive
cli.prompt autorise la modification du prompte
php >.
En PHP 5.4.0, il est également possible de définir des directives du php.ini dans un shell interactif en utilisant des notations raccourcies.
Exemple #3 Définition de directives du php.ini dans un shell interactif
La définition de la directive cli.prompt :
php > #cli.prompt=hello world :> hello world :>
En utilisant des backticks, il est possible d'exécuter du code PHP dans le prompte :
php > #cli.prompt=`echo date('H:i:s');` php >
15:49:35 php > echo 'hi';
hi
15:49:43 php > sleep(2);
15:49:45 php >
Définition du pager à less :
php > #cli.pager=less php > phpinfo(); (sortie affichée avec less) php >
La directive cli.prompt supporte quelques séquences d'échappements :
| Séquence : | Description : |
|---|---|
| \e | utilisé pour ajouter des couleurs au prompte. Exemple : \e[032m\v \e[031m\b \e[34m\> \e[0m |
| \v | La version de PHP. |
| \b | Indique dans quel bloc de PHP nous nous trouvons. Par exemple, /* permet d'indiquer que nous sommes dans un commentaire multi-lignes. Le scope externe est représenté par php. |
| \> | Indique le caractère utilisé pour le prompte. Par défaut, ce sera >, mais peut être modifié lorsque le shell se trouve dans un bloc indéterminé ou dans une chaîne de caractères. Les caractères possibles sont : ' " { ( > |
Note:
Les fichiers inclus via auto_prepend_file et auto_append_file sont analysés dans ce mode, mais avec quelques restrictions - i.e. les fonctions doivent avoir été définies avant l'appel.
Note:
L'autoloading n'est pas disponible si vous utilisez PHP en mode CLI interactif.
Depuis PHP 5.4.0, le CLI SAPI fournit un serveur web interne.
Ce serveur web est prévu uniquement dans un but de développement, et ne doit pas être utilisé en production.
Les requêtes URI sont servies depuis le dossier de travail courant où PHP a été démarré, tant que l'option -t est utilisé pour spécifier explicitement un document racine.
Si une requête URI ne spécifie pas un fichier, alors soit index.php, soit index.html du dossier courant sera retourné. Si aucun de ces fichiers n'existe, alors un code réponse 404 est retourné.
Si un fichier PHP est fourni dans la ligne de commande lorsque le serveur web
est démarré, il sera traité comme un script "routeur" pour le serveur web.
Le script sera exécuté au début de chaque requête HTTP. Si ce script retourne
FALSE, alors la ressource demandée est retournée telle quelle.
Sinon, la sortie du script est retournée au navigateur.
Exemple #1 Démarrage du serveur web
$ cd ~/public_html $ php -S localhost:8000
Le terminal affichera :
PHP 5.4.0 Development Server started at Thu Jul 21 10:43:28 2011 Listening on localhost:8000 Document root is /home/me/public_html Press Ctrl-C to quit
Après des requêtes URI sur http://localhost:8000/ et http://localhost:8000/myscript.html, le terminal affichera quelques choses comme :
PHP 5.4.0 Development Server started at Thu Jul 21 10:43:28 2011 Listening on localhost:8000 Document root is /home/me/public_html Press Ctrl-C to quit. [Thu Jul 21 10:48:48 2011] ::1:39144 GET /favicon.ico - Request read [Thu Jul 21 10:48:50 2011] ::1:39146 GET / - Request read [Thu Jul 21 10:48:50 2011] ::1:39147 GET /favicon.ico - Request read [Thu Jul 21 10:48:52 2011] ::1:39148 GET /myscript.html - Request read [Thu Jul 21 10:48:52 2011] ::1:39149 GET /favicon.ico - Request read
Exemple #2 Démarrage avec un dossier racine spécifique
$ cd ~/public_html $ php -S localhost:8000 -t foo/
Le terminal affichera :
PHP 5.4.0 Development Server started at Thu Jul 21 10:50:26 2011 Listening on localhost:8000 Document root is /home/me/public_html/foo Press Ctrl-C to quit
Exemple #3 Utilisation d'un script routeur
Le fait de demander des images les affichera, mais les requêtes pour les fichiers HTML afficheront "Bienvenue chez PHP !"
<?php
// router.php
if (preg_match('/\.(?:png|jpg|jpeg|gif)$/', $_SERVER["REQUEST_URI"]))
return false; // retourne la requête telle quelle.
else {
echo "<p>Bienvenue chez PHP !</p>";
}
?>
$ php -S localhost:8000 router.php
Après plusieurs requêtes URI, le terminal affichera quelques choses comme :
PHP 5.4.0 Development Server started at Thu Jul 21 10:53:19 2011 Listening on localhost:8000 Document root is /home/me/public_html Press Ctrl-C to quit. [Thu Jul 21 10:53:45 2011] ::1:55801 GET /mylogo.jpg - Request read [Thu Jul 21 10:53:52 2011] ::1:55803 GET /abc.html - Request read [Thu Jul 21 10:53:52 2011] ::1:55804 GET /favicon.ico - Request read
| Nom | Défaut | Modifiable | Historique |
|---|---|---|---|
| cli_server.color | "0" | PHP_INI_ALL | Disponible depuis PHP 5.4.0. |
Voici un éclaircissement sur l'utilisation des directives de configuration.
cli_server.color
boolean
Active le serveur web de développement interne à utiliser la coloration ANSI du code dans la sortie du terminal.
Cette section explique les mérites du nouveau mécanisme ramasse-miettes (aussi appelé GC) fourni avec PHP 5.3.
Une variable PHP est stockée en interne dans un conteneur appelé "zval". Un conteneur zval contient, outre le type de la variable et sa valeur, deux unités d'information additionnelles. La première se nomme "is_ref" et est une valeur booléenne qui indique si une variable fait partie d'une référence ou non. Grâce à cette information, le moteur de PHP sait différencier les variables normales des références. Comme PHP autorise le programmeur à utiliser des références, au moyen de l'opérateur &, un conteneur zval possède aussi un mécanisme de comptage des références afin d'optimiser l'utilisation de la mémoire. Cette seconde information, appelée "refcount", contient le nombre de variables (aussi appelées symboles) qui pointent vers ce conteneur zval. Tous les symboles sont stockés dans une table de symboles et il y a une table par espace de visibilité (scope). Il y a un espace global pour le script principal (celui appelé par exemple via le navigateur) et un espace par fonction ou méthode.
Un conteneur zval est crée lorsqu'une nouvelle variable est créee avec une valeur constante, par exemple:
Exemple #1 Création d'un nouveau conteneur zval
<?php
$a = "new string";
?>
Dans ce cas, le nouveau symbole a est crée dans le scope global,
et un nouveau conteneur est crée avec comme type string et comme valeur
new string. Le bit "is_ref" est mis par défaut à FALSE car aucune
référence n'a été créee par le programmeur. Le bit "refcount" iest mis à
1 car il n'y a qu'un seul symbole qui utilise ce conteneur. Notez que
si "refcount" vaut 1, "is_ref" vaut toujours FALSE. Si vous avez
installé » Xdebug, vous pouvez afficher cette
information en appelant xdebug_debug_zval().
Exemple #2 Affichage des informations zval
<?php
xdebug_debug_zval('a');
?>
L'exemple ci-dessus va afficher :
a: (refcount=1, is_ref=0)='new string'
Assigner cette variable à un autre symbole va incrémenter le refcount.
Exemple #3 Incrémentation du refcount d'une zval
<?php
$a = "new string";
$b = $a;
xdebug_debug_zval( 'a' );
?>
L'exemple ci-dessus va afficher :
a: (refcount=2, is_ref=0)='new string'
Le refcount vaut 2 ici, car le même conteneur est lié à a et b à la fois. PHP est suffisament intelligent pour ne pas dupliquer le conteneur lorsque ce n'est pas nécessaire. Les conteneurs sont détruits lorsque leur "refcount" atteint zéro. Le "refcount" est décrémenté de une unité lorsque n'importe quel symbole lié à un conteneur est détruit du scope (e.g. lorsque la fonction se termine) ou lorsque unset() est appelée sur un symbole. L'exemple qui suit le démontre:
Exemple #4 Decrémentation du refcount d'une zval
<?php
$a = "new string";
$c = $b = $a;
xdebug_debug_zval( 'a' );
unset( $b, $c );
xdebug_debug_zval( 'a' );
?>
L'exemple ci-dessus va afficher :
a: (refcount=3, is_ref=0)='new string' a: (refcount=1, is_ref=0)='new string'
Si maintenant nous appelons unset($a);, le conteneur zval, incluant le type et la valeur, va être détruit de la mémoire.
Les choses se compliquent dans le cas des types composés comme array et object. A la différence des valeurs scalaires, les array et object stockent leurs propriétés dans une table de symboles qui leur est propre. Ceci signifie que l'exemple qui suit crée trois conteneurs zval:
Exemple #5 Creation d'une zval array
<?php
$a = array( 'meaning' => 'life', 'number' => 42 );
xdebug_debug_zval( 'a' );
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
a: (refcount=1, is_ref=0)=array ( 'meaning' => (refcount=1, is_ref=0)='life', 'number' => (refcount=1, is_ref=0)=42 )
Ou graphiquement
Les trois conteneurs zval sont: a, meaning, et number. Les mêmes règles s'appliquent pour l'incrémentation et la décrémentation des "refcounts". Ci-après, nous ajoutons un élément au tableau et nous affectons son contenu à une valeur déja existante dans le tableau:
Exemple #6 Ajout d'un élément déja existant au tableau
<?php
$a = array( 'meaning' => 'life', 'number' => 42 );
$a['life'] = $a['meaning'];
xdebug_debug_zval( 'a' );
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
a: (refcount=1, is_ref=0)=array ( 'meaning' => (refcount=2, is_ref=0)='life', 'number' => (refcount=1, is_ref=0)=42, 'life' => (refcount=2, is_ref=0)='life' )
Ou graphiquement
La sortie Xdebug que nous voyons indique que les anciens et nouveaux éléments du tableau pointent maintenant vers un conteneur zval dont le "refcount" vaut 2. Même si la sortie XDebug montre 2 conteneurs zval avec comme valeur 'life', ils sont les mêmes. La fonction xdebug_debug_zval() ne montre pas cela, mais vous pourriez le voir en affichant le pointeur de mémoire.
Supprimer un élément du tableau est assimilable à la suppression d'un symbole depuis un espace. Ce faisant, le "refcount" du conteneur vers lequel l'élément du tableau pointe est décrémenté. Une fois encore, s'il atteind zéro, le conteneur zval est supprimé de la mémoire. Voici un exemple qui le démontre:
Exemple #7 Suppression d'un élément de tableau
<?php
$a = array( 'meaning' => 'life', 'number' => 42 );
$a['life'] = $a['meaning'];
unset( $a['meaning'], $a['number'] );
xdebug_debug_zval( 'a' );
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
a: (refcount=1, is_ref=0)=array ( 'life' => (refcount=1, is_ref=0)='life' )
Maintenant, les choses deviennent intéressantes si nous ajoutons le tableau comme élément de lui-même. Nous faisons ça dans l'exemple qui suit avec un opérateur de référence, sinon PHP va crée une copie:
Exemple #8 Ajout du tableau comme référence à lui-même en tant qu'élement
<?php
$a = array( 'one' );
$a[] =& $a;
xdebug_debug_zval( 'a' );
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
a: (refcount=2, is_ref=1)=array ( 0 => (refcount=1, is_ref=0)='one', 1 => (refcount=2, is_ref=1)=... )
Ou graphiquement
Vous pouvez voir que la variable tableau (a) tout comme le second élément (1) pointent désormais vers un conteneur dont le "refcount" vaut 2. Les "..." sur l'affichage indiquent une récursion et représentent donc le tableau lui-même.
Comme avant, supprimer une variable supprime son symbole et le refcount est décrémenté. Donc si nous supprimons la variable $a après son effectation, le refcount du conteneur sur lequel pointe $a et l'élément "1" sera décrémenté de une unité, de "2" vers "1". Ceci est représenté par:
Exemple #9 Suppression de $a
(refcount=1, is_ref=1)=array ( 0 => (refcount=1, is_ref=0)='one', 1 => (refcount=1, is_ref=1)=... )
Ou graphiquement
Bien qu'il n'y ait plus aucun symbole dans l'espace de variables courant qui pointe vers cette structure, elle ne peut être nettoyée car l'élément du tableau "1" pointe toujours vers ce même tableau. Comme il n'y a plus de symbole externe pointant vers cette structure, l'utilisateur ne peut plus la nettoyer manuellement, il y a donc fuite mémoire. Heureusement, PHP va détruire cette structure à la fin de la requête, mais avant cette étape, la mémoire n'est pas libérée. Cette situation se produit souvent lorsque qu'un enfant pointe vers son parent. Notamment avec les objets qui sont utilisés par référence implicitement.
Ceci ne devrait pas être un problème si ça arrive une ou deux fois, mais s'il y a des centaines ou des milliers de situations similaires dans un même programme, alors cela peut devenir un problème important. Ceci en particulier pour les scripts démons dans lesquels la requête ne termine jamais, ou encore dans une grosse suite de tests unitaires. Ce dernier cas a été rencontré en lançant les tests du composant Template de la bibliothèque eZ Components. Dans certains cas, la suite de tests nécessitait 2Go de mémoire, ce que le serveur ne pouvait alors fournir.
Traditionnellement, les mécanismes de comptage des références comme utilisés dans PHP auparavant ne pouvaient détecter les fuites mémoires dûes à des références circulaires. Depuis PHP 5.3.0, un algorithme synchrone issue de l'analyse » Concurrent Cycle Collection in Reference Counted Systems est utilisé pour répondre à ce problème particulier.
Une explication complète du fonctionnement de l'algorithme serait hors de portée pour cette section, mais nous allons ici détailler les principes de base. D'abord, nous allons établir quelques règles. Si un refcount est incrémenté, le conteneur est toujours utilisé, donc pas nettoyé. Si le refcount est décrémenté et atteint zéro, le conteneur zval peut être supprimé et la mémoire libérée. Ceci signifie que les cycles de nettoyages ne peuvent intervenir que lorsque le refcount est décrémenté vers une valeur différente de zéro. Ensuite, dans un cycle de nettoyage, il est possible de détecter les déchets en vérifiant s'il est possible ou non de décrémenter leur refcount de une unité en vérifiant quelles zvals ont un refcount à zéro.
Pour éviter d'appeler la routine de nettoyage à chaque décrémentation de refcount possible, l'algorithme place toutes les zval racines dans un "tampon de racines" (en les marquant). Il s'assure aussi que chaque racine n'apparait qu'une seule fois dans le tampon. Le mécanisme de nettoyage intervient alors lorsque le tampon est plein. Voyez l'étape A sur la figure ci-dessus.
A l'étape B, l'algorithme lance une recherche sur toutes les racines possibles afin de décrémenter de une unité les refcounts de toutes les zvals qu'il trouve, en faisant bien attention de ne pas décrémenter 2 fois le refcount de la même zval (en les marquant comme "grises"). Dans l'étape C, l'algorithme relance une recherche sur toutes les racines possibles et scrute la valeur de refcount de chaque zval. S'il trouve un refcount à zéro, la zval est marquée comme "blanche" (bleu sur la figure). S'il trouve autre chose que zéro, il annule sa décrémentation en refaisant une recherche à partir de ce noeud, et les marque comme "noires" à nouveau. Dans la dernière étape, D, l'algorithme parcours tout le tampon des racines et les supprime, tout en scrutant chaque zval, toute zval marquée comme "blanche" à l'étape précédente est alors supprimée de la mémoire.
Maintenant que vous savez globalement comment fonctionne l'algorithme, nous allons voir comment il a été intégré dans PHP. Par défaut, le ramasse-miettes de PHP est activé. Il existe cependant une options de php.ini pour changer cela : zend.enable_gc .
Lorsque le ramasse-miettes est activé, l'algorithme de recherche des cycles tel que décrit au dessus est exécuté à chaque fois que le tampon est plein. Le tampon de racines a une taille fixée à 10.000 racines (ce paramètre est changeable grâce à GC_ROOT_BUFFER_MAX_ENTRIES dans Zend/zend_gc.c dans le code source de PHP, une recompilation est donc nécessaire). Si le ramasse- miettes est désactivé, la recherche des cycles l'est aussi. Cependant, les racines probables seront toujours enregistrées dans le tampon, ceci ne dépend pas de l'activation du ramasse-miettes.
Si le tampon est plein alors que le mécanisme est désactivé, alors plus aucune racine ne pourra y être insérée. Ces racines ne seront donc pas analysées par l'algorithme au besoin, et si elles représentaient des références circulaires, il y aura fuite mémoire.
La raison pour laquelle les racines possibles sont tout de même enregistrées dans le tampon même si le mécanisme est désactivé est qu'il aurait été trop couteux de vérifier l'activation éventuelle du mécanisme à chaque tentative d'ajout d'une racine dans le tampon. Le mécanisme de ramasse-miettes et d'analyse peut être lui, couteux en temps.
En plus de pouvoir changer la valeur du paramètre de configuration zend.enable_gc , vous pouvez aussi activer ou désactiver le mécanisme de ramasse-miettes en appelant les fonctions gc_enable() ou gc_disable() respectivement. Ceci aura le même effet que de modifier le paramètre de configuration. Vous avez de plus la possibilité de forcer le passe du ramasse-miettes à un moment donné dans votre script, même si le tampon n'est pas encore complètement plein. Utilisez pour cela la fonction gc_collect_cycles(), cette fonction retournera le nombre de cycles alors collectés.
Vous pouvez prendre le contrôle en désactivant le ramasse-miettes ou en le forçant à passer à un moment donné car certaines parties de votre application peuvent être gourmandes en temps de traitement auquel cas vous pouvez désactiver le ramasse-miettes. Vous risquez à ce moment là des fuites mémoires. Vous pourriez vouloir déclencher manuellement le processus grâce à gc_collect_cycles() juste avant l'appel à gc_disable() pour libérer de la mémoire. Ceci laissera un tampon vidé et il y aura plus d'espace pour des racines probables (surtout lorsque le mécanisme est désactivé).
Nous avons déja vu dans les sections précédentes que la collecte des racines probables avait un impact très léger sur les performances, mais c'est lorsqu'on compare PHP5.2 à PHP5.3. Même si l'enregistrement des racines probables est plus lent que de pas les enregistrer du tout, comme dans PHP5.2, d'autres changements durant l'éxécution de PHP5.3 font de cette opération une opération quasi indolore au niveau des performances.
Il y a deux axes pour étudier les performances avec GC. D'abord l'empreinte mémoire et ensuite le temps d'éxécution pour nettoyer la mémoire. Nous allons étudier ces deux axes.
D'abord, la raison principale de l'implémentation du mécanisme de collecte des déchets est la réduction de la mémoire consommée en nettoyant les références circulaires aussitôt que possible. Dans PHP, ceci arrive lorsque le tampon de racines est plein, ou lorsque la fonction gc_collect_cycles() est appelée. Sur le graphe ci-après, nous affichons l'utilisation mémoire d'un script dans PHP5.2 et PHP5.3, en excluant la mémoire obligatoire que PHP consomme pour lui-même au démarrage.
Exemple #1 Exemple d'utilisation mémoire
<?php
class Foo
{
public $var = '3.141592654';
}
$baseMemory = memory_get_usage();
for ( $i = 0; $i <= 100000; $i++ )
{
$a = new Foo;
$a->self = $a;
if ( $i % 500 === 0 )
{
echo sprintf( '%8d: ', $i ), memory_get_usage() - $baseMemory, "\n";
}
}
?>
L'exemple est étuidé pour, nous allons créer un objet possédant un attribut le référençant lui-même. Lorsque la variable $a dans le script est réassignée à la prochaine itération, une fuite mémoire apparaitra. Dans ce cas, les deux conteneurs zval fuient (la zval de l'objet et celle de l'attribut), mais seulement une racine possible est trouvée : la variable qui a été supprimée. Lorsque le tampon de racines est plein après 10.000 itérations (un total de 10.000 racines possibles), le mécanisme de collection des déchets entre en jeu et libère la mémoire associée à ces racines probables. Cela se voit très clairement sur les graphes d'utilisation mémoire de PHP5.3. Après chaques 10.000 itérations, le mécanisme se déclenche et libère la mémoire associée aux variables références circulaires. Le diagramme montre que l'utilisation maximale de mémoire de PHP5.3 est d'environ 9Mo là où PHP5.2 n'arrête pas d'en consommer.
Le second point concernant les performances du mécanisme de collecte des déchets (GC) est le temps pris par le mécanisme pour libérer la mémoire "gaspillée". Pour voir cet impact, nous allons modifier le script précédent afin d'avoir un nombre d'itérations beaucoup plus élevé. Le script ressemble à:
Exemple #2 Impact de GC sur les performances
<?php
class Foo
{
public $var = '3.141592654';
}
for ( $i = 0; $i <= 1000000; $i++ )
{
$a = new Foo;
$a->self = $a;
}
echo memory_get_peak_usage(), "\n";
?>
Nous allons lancer ce script 2 fois, une fois avec zend.enable_gc à on, et une fois à off:
Exemple #3 Lancement du script ci-dessus
time php -dzend.enable_gc=0 -dmemory_limit=-1 -n example2.php # and time php -dzend.enable_gc=1 -dmemory_limit=-1 -n example2.php
Sur ma machine, la première commande semble durer tout le temps 10,7 secondes, alors que la seconde commande prend environ 11,4 secondes. Un ralentissement de 7% environ. Cependant, la quantité totale de mémoire utilisée par le script est réduite de 98% passant de 931Mo à 10Mo. Ce benchmark n'est pas très scientifique ou même représentatif d'applications réelles, mais il démontre concrètement en quoi le mécanisme de collecte des déchets peut être utile concernant la consommation mémoire. Le bon point est que le ralentissement est toujours de 7%, dans le cas particulier de ce script, alors que la mémoire restaurée sera de plus en plus importante au fur et à mesure que des références circulaires apparaitront durant l'éxécution.
Il est possible d'obtenir quelques informations concernant le mécanisme de collecte des déchets interne à PHP. Mais pour cela, il faut recompiler PHP avec le support du benchmarking et de la collection de données. Vous devrez passer la variable d'environnement CFLAGS avec -DGC_BENCH=1 avant de lancer ./configure. L'exemple suivant démontre cela:
Exemple #4 Recompiler PHP pour le support du benchmark du GC
export CFLAGS=-DGC_BENCH=1 ./config.nice make clean make
Lorsque vous ré-éxécutez le code du script ci-dessus avec un PHP fraichement reconstruit, vous devriez voir le résultat suivant après l'éxecution:
Exemple #5 Statistiques GC
GC Statistics
-------------
Runs: 110
Collected: 2072204
Root buffer length: 0
Root buffer peak: 10000
Possible Remove from Marked
Root Buffered buffer grey
-------- -------- ----------- ------
ZVAL 7175487 1491291 1241690 3611871
ZOBJ 28506264 1527980 677581 1025731
Les statistiques les plus descriptives sont affichées dans le premier bloc. Vous voyez que le mécanisme de collecte des dechets a été déclenché 110 fois, et au total ce sont plus de 2 millions d'allocations mémoires qui ont été libérées durant ces 110 passages. Dès lors que le mécanisme est intervenu une seule fois, le pic du buffer racine est toujours de 10000.
De manière générale, la collection des dechets en PHP ne causera un ralentissement que lorsque le cycle tournera, ainsi dans les scripts normaux il ne devrait pas y avoir de ressenti de ce ralentissement.
Cependant, lorsque le cycle de collection de déchets sera enclenché dans des scripts normaux, la réduction de l'empreinte mémoire permettra alors d'éxécuter plus de scripts en parallèle.
Les avantages se sentent plus dans le cas de scripts démons ou devant tourner longtemps. Aussi, concernant les applications » PHP-GTK qui souvent tournent plus longtemps que des scripts pour le Web, le nouveau mécanisme devrait réduire significativement les fuites mémoires sur le long terme.
Voir aussi Catégorie/Liste des extensions.
Le "Alternative PHP Cache" (APC) est un cache d'opcode libre et ouvert pour PHP. Son objectif est de fournir un framework libre, ouvert et robuste pour la mise en cache et l'optimisation de code intermédiaire PHP.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Cette extension » PECL n'est pas intégrée à PHP.
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/apc.
Aucune bibliothèque DLL pour cette extension PECL n'est actuellement disponible. Reportez-vous à la section Compilation sous Windows.
Note: Sous Windows, APC a besoin d'un chemin temporaire pour exister devant être accessible en écriture par le serveur Web. Il vérifie la valeur des variables d'environnement TMP, TEMP et USERPROFILE dans cet ordre, et tente finalement le dossier WINDOWS si aucune de ces variables n'est définie.
Note: Pour des détails techniques sur l'implémentation de ce framework, lisez le » fichier TECHNOTES fourni par les développeurs .
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
Bien que la configuration par défaut d'APC soit suffisante pour la plupart des installations, les utilisateurs avancés devraient affiner certains paramètres.
Il y a deux décisions importantes que vous devez prendre. D'abord, la quantité de mémoire partagée que vous voulez allouer à APC et ensuite, si vous voulez qu'APC vérifie si un fichier a été modifié à chaque requête. Les deux directives de configuration concernées sont apc.shm_size et apc.stat. Lisez avec attention la section suivante sur ces deux directives de configuration.
Une fois que vous avez un serveur qui fonctionne, vous devez copier le script apc.php fourni avec l'extension dans un endroit accessible par le serveur web, puis, appelez-le depuis votre navigateur. Il vous fournit tous les détails de votre cache. Si GD est actif sur votre configuration PHP, il y aura aussi de jolis graphiques. La première chose à vérifier est s'il y a actuellement des fichiers en cache. En supposant que cela fonctionne, vous devez donc faire attention au nombre Cache full count sur la gauche. Il indique le temps depuis lequel le cache a été créé et qui doit effacer les entrées non utilisées depuis apc.ttl secondes. Vous devriez configurer votre cache pour minimiser ce nombre. Si vous remplissez constamment votre cache, la génération du cache résultant va prendre beaucoup de ressources. Vous devriez soit allouer plus de mémoire pour APC, soit utiliser apc.filters pour mettre en cache moins de scripts.
Lorsque APC est compilé avec le support mmap (Memory Mapping), il n'utilisera qu'un seul segment mémoire alors que APC compilé avec le support SHM (SysV Shared Memory) utilisera plusieurs segments mémoires. MMAP n'a pas de limite maxi comme SHM dans /proc/sys/kernel/shmmax. En général MMAP est recommandé car il accèdera à la mémoire de manière plus rapide lorsque le serveur web est redémarré et il réduit aussi les allocations mémoire au démarrage.
| Nom | Défaut | Modifiable | Historique |
|---|---|---|---|
| apc.enabled | "1" | PHP_INI_SYSTEM | PHP_INI_SYSTEM avec APC 2. PHP_INI_ALL avec APC <= 3.0.12p2 |
| apc.shm_segments | "1" | PHP_INI_SYSTEM | |
| apc.shm_size | "32M" | PHP_INI_SYSTEM | |
| apc.optimization | "0" | PHP_INI_ALL | PHP_INI_SYSTEM avec APC 2. Supprimé depuis APC 3.0.13. |
| apc.num_files_hint | "1000" | PHP_INI_SYSTEM | |
| apc.user_entries_hint | "4096" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.0. |
| apc.ttl | "0" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.0. |
| apc.user_ttl | "0" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.0. |
| apc.gc_ttl | "3600" | PHP_INI_SYSTEM | |
| apc.cache_by_default | "1" | PHP_INI_ALL | PHP_INI_SYSTEM avec APC <= 3.0.12p2. Disponible depuis APC 3.0.0. |
| apc.filters | NULL | PHP_INI_SYSTEM | |
| apc.mmap_file_mask | NULL | PHP_INI_SYSTEM | |
| apc.slam_defense | "1" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.0. Avant la version 3.1.4 d'APC, la valeur par défaut était "0" (désactivé). |
| apc.file_update_protection | "2" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.6. |
| apc.enable_cli | "0" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.7. |
| apc.max_file_size | "1M" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.7. |
| apc.use_request_time | "1" | PHP_INI_ALL | Disponible depuis APC 3.1.3. |
| apc.stat | "1" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.10. |
| apc.write_lock | "1" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.11. |
| apc.report_autofilter | "0" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.11. |
| apc.include_once_override | "0" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.12. |
| apc.rfc1867 | "0" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.13. |
| apc.rfc1867_prefix | "upload_" | PHP_INI_SYSTEM | |
| apc.rfc1867_name | "APC_UPLOAD_PROGRESS" | PHP_INI_SYSTEM | |
| apc.rfc1867_freq | "0" | PHP_INI_SYSTEM | |
| apc.rfc1867_ttl | "3600" | PHP_INI_SYSTEM | Disponible depuis APC 3.1.1. |
| apc.localcache | "0" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.14. |
| apc.localcache.size | "512" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.14. |
| apc.coredump_unmap | "0" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.16. |
| apc.stat_ctime | "0" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.13. |
| apc.preload_path | NULL | PHP_INI_SYSTEM | Disponible depuis APC 3.1.1. |
| apc.file_md5 | "0" | PHP_INI_SYSTEM | Disponible depuis APC 3.1.1. |
| apc.canonicalize | "1" | PHP_INI_SYSTEM | Disponible depuis APC 3.1.1. |
| apc.lazy_functions | 0 | PHP_INI_SYSTEM | Disponible depuis APC 3.1.3. |
| apc.lazy_classes | 0 | PHP_INI_SYSTEM | Disponible depuis APC 3.1.3. |
Voici un éclaircissement sur l'utilisation des directives de configuration.
apc.enabled
booléen
apc.enabled peut être défini à 0 pour désactiver APC. Ceci est utile lorsque APC est compilé statiquement dans PHP, et qu'il n'y a donc aucun autre moyen de le désactiver (lorsque compilé en tant que DSO, la ligne extension dans le php.ini peut juste être commentée).
apc.shm_segments
entier
Le nombre de segments mémoire à allouer pour le cache compilé. Si APC fonctionne en dehors de la mémoire partagée, mais que vous avez déjà défini apc.shm_size aussi élevé que votre système le permet, vous pouvez tenter de relever cette valeur.
apc.shm_size
entier
La taille de chaque segment de mémoire partagé en MB. Par défaut, quelques systèmes (incluant la plupart des BSD) ont une limite basse de la taille d'un segment mémoire partagé.
apc.optimization
entier
Le degré d'optimisation. Zéro désactive l'optimiseur, et de hautes valeurs utilisent des optimisations agressives. Attendez-vous à des améliorations très modestes de vitesse. Ceci est expérimental.
apc.num_files_hint
entier
Un "conseil" au sujet du nombre de fichiers sources distincts qui seront inclus ou demandés sur votre serveur web. Placez à zéro ou omettez-le si vous n'êtes pas sûr ; cet arrangement est principalement utile pour les sites qui ont des milliers de fichiers sources.
apc.user_entries_hint
entier
Tout comme apc.num_files_hint, un "conseil" à propos du nombre de variables de cache utilisateur distinctes à stocker. Définissez le à 0 ou ne le définissez pas si vous n'êtes pas sûr.
apc.ttl
entier
Le nombre de secondes qu'une entrée de cache est autorisée à stagner dans un slot dans le cas où ce slot d'entrée de cache est nécessaire pour une autre entrée. Laisser à zéro signifie que votre cache pourrait potentiellement remplir d'autres entrées tant que d'autres entrées ne seront pas mises en cache.
apc.user_ttl
entier
Le nombre de secondes qu'une entrée utilisateur du cache est autorisée à résider dans un slot dans le cas où ce slot d'entrée de cache est demandé par une autre entrée. Laisser cette option à zéro signifie que votre cache peut potentiellement être rempli avec des entrées obsolètes lorsqu'il n'y a eu jamais d'entrées mises en cache. Dans le cas où le cache est à court d'espace, ce dernier sera totalement vidé si ttl vaut 0. Sinon, et si le ttl est supérieur à 0, APC va tenter de supprimer les entrées qui ont dépassé leur date d'expiration.
apc.gc_ttl
entier
Le nombre de secondes qu'une entrée de cache est autorisée à rester sans utilisation, au cas où cet espace pourrait être nécessaires à une autre entrée. La valeur de zéro fait que votre cache pourrait se remplir avec des entrées oisives, et que les nouvelles entrées ne soient pas mises en cache. Dans le cas où le cache est à court de mémoire, le cache sera totalement vidé si ttl vaut 0. Sinon, et si ttl est supérieur à 0, APC va tenter de supprimer les entrées qui ont dépassé leur date d'expiration.
apc.cache_by_default
booléen
Actif par défaut, mais peut être désactivé et utilisé en conjonction avec un apc.filters positif donc ces fichiers seront uniquement mis en cache s'ils correspondent à un filtre positif.
apc.filters
chaîne de caractères
Une liste séparée par des virgules d'expressions rationnelles POSIX. Si un seul masque correspond à un nom de fichier source, le fichier ne sera pas mis en cache. Notez que le nom du fichier utilisé pour le masque est celui passé aux instructions include require, et non un chemin absolu. Si le premier caractère de l'expression est un + alors l'expression sera additive dans le sens que chaque fichier correspondant à l'expression sera mis en cache, et si le premier caractère est un - alors tout ce qui correspond ne sera pas mis en cache. Le cas du - est celui par défaut, donc, il peut être omis.
apc.mmap_file_mask
chaîne de caractères
Si compilé avec le support MMAP en utilisant --enable-mmap, ce sera le style mktemp de masque de fichier à passer au module MMAP pour déterminer si votre région de mémoire MMAP va être mise dans un fichier ou en mémoire partagée. Dans le cas de la mise en cache dans un fichier MMAP, définissez ce paramètre comme /tmp/apc.XXXXXX (exactement 6 X). Pour utiliser le style POSIX shm_open/mmap, placez un .shm quelque part dans votre masque, e.g. /apc.shm.XXXXXX. Vous pouvez également définir ce paramètre à /dev/zero pour utiliser votre interface kernel /dev/zero pour la mémoire anonyme MMAP. Le laisser indéfini forcera un MMAP anonyme.
apc.slam_defense
entier
Sur les serveurs très surchargés lorsque vous démarrez le serveur ou modifiez des fichiers, vous pouvez créer une course de plusieurs processus pour mettre en cache le même fichier en même temps. Cette option définit le pourcentage de processus qui évitera de tenter de mettre en cache un fichier non mis en cache. Ou pensez à lui comme probabilité d'un processus simple pour éviter la mise en cache. Par exemple, définir apc.slam_defense à 75 signifie qu'il y a 75 % de chances que le processus ne mettra pas en cache un fichier qui ne s'y trouvera pas déjà. Définir à 0 pour désactiver cette fonctionnalité.
Obsolète avec apc.write_lock.
apc.file_update_protection
entier
Lorsque vous modifiez un fichier sur un serveur web, vous devriez le faire d'une façon atomique. Écrivez-le dans un fichier temporaire et renommez-le (mv) vers sa position permanente lorsqu'il est prêt. La plupart des éditeurs de texte, cp, tar et les autres programmes de ce genre ne font pas cela. Cela signifie qu'il y a une chance pour que le fichier soit accédé (et donc, mis en cache) alors qu'il est encore en cours d'écriture. Ce paramètre apc.file_update_protection fait intervenir un délai pour la mise en cache des nouveaux fichiers. Par défaut, il vaut 2 secondes, ce qui signifie que si le timestamp de modification (mtime) d'un fichier montre qu'il vaut moins de 2 secondes, ce fichier ne sera pas mis en cache. La personne malheureuse qui a accédé à ce fichier à moitié écrit verra une ébauche, mais au moins celui-ci ne persistera pas en cache. Si vous êtes certain de mettre toujours et automatiquement à jour vos fichiers en utilisant quelque chose comme rsync qui fait cela correctement, vous pouvez désactiver cette protection en le définissant à 0. Si vous avez une application très intensive sur le disque, qui force les procédures de mise à jour à prendre plus de 2 secondes, vous pourriez vouloir augmenter la valeur de cette directive.
apc.enable_cli
entier
Pour tester et déboguer. Définir ceci active APC pour la version CLI de PHP. Normalement, vous ne devriez pas vouloir créer, peupler et démonter le cache APC à chaque requête CLI, mais pour divers scénarios de test, elle est maniable afin de pouvoir activer facilement APC pour la version CLI d'APC.
apc.max_file_size
entier
Permet d'éviter la mise en cache des fichiers dont la taille est supérieure à cette valeur. Par défaut, 1Mo.
apc.stat
entier
Faites très attention si vous modifiez cette valeur. Par défaut, APC vérifie le script à chaque demande pour voir s'il a été modifié ou non. S'il a été modifié, il sera compilé à nouveau et la nouvelle version sera mise en cache. En désactivant cette option, aucune vérification n'aura lieu. Cela signifie que si vous voulez activer les modifications, vous devez redémarrer le serveur web. Sur un serveur de production où vous modifiez rarement le code, le fait de désactiver cette option permet de gagner en performances de manière significative.
Pour les fichiers inclus/requis, cette option est également appliquée, mais notez que si vous utilisez des chemins relatifs (n'importe quel chemin qui ne commence pas par un / sous Unix), APC doit identifier de manière unique le fichier à vérifier. Si vous utilisez des chemins absolus pour vos inclusions, APC peut éviter ces vérifications et utiliser ce chemin absolu en tant qu'identifiant unique du fichier.
apc.write_lock
booléen
Sur les serveurs très chargés, lorsque vous démarrez le serveur, ou
lorsque beaucoup de fichiers sont modifiés, vous pouvez en finir avec
les processus qui tentent de compiler et mettre en cache le même fichier.
Lorsque apc.write_lock est activé, uniquement un
seul processus à la fois
tentera de compiler un script de mise en cache tandis que les autres
processus exécuteront les fichiers non mis en cache au lieu d'attendre
que le verrou se libère.
apc.report_autofilter
booléen
Logs tous les scripts qui sont automatiquement exclus de la mise en cache à cause de problèmes de liaison.
apc.include_once_override
booléen
Optimise les appels aux fonctions include_once et require_once et évite ainsi de surcharger le système appelant.
Cette fonctionnalité est EXPERIMENTALE. Son comportement, son nom ainsi que sa documentation peuvent être modifiés sans avertissement dans une version future d'APC. Cette fonctionnalité doit être utilisée à votre propre risque.
apc.rfc1867
booléen
Le gestionnaire de progression de téléchargement de fichier RFC1867 n'est disponible que si vous avez compilé APC avec PHP 5.2.0 ou supérieur. Lors le support est actif, les fichiers téléchargés qui incluent un champ appelé APC_UPLOAD_PROGRESS avant le champ "file" d'un formulaire de téléchargement fera qu'APC créera automatiquement une entrée de cache utilisateur nommée upload_key où key est la valeur de l'entrée de formulaire APC_UPLOAD_PROGRESS.
Notez que les champs cachés spécifié par APC_UPLOAD_PROGRESS doivent être placés avant le champ de type file, sinon le suivi de l'upload ne fonctionnera pas correctement.
Notez que la surveillance du téléchargement de fichier n'est pas compatible avec les threads pour le moment, ainsi, les nouveaux téléchargements survenant tandis qu'un précédent est toujours en cours désactivera la surveillance précédente.
Notez que rate n'est disponible que lorsque tous les transferts sont terminés.
Exemple #1 Exemple avec apc.rfc1867
<?php
print_r(apc_fetch("upload_$_POST[APC_UPLOAD_PROGRESS]"));
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[total] => 1142543
[current] => 1142543
[rate] => 1828068.8
[filename] => test
[name] => file
[temp_filename] => /tmp/php8F
[cancel_upload] => 0
[done] => 1
)
apc.rfc1867_prefix
chaîne de caractères
Préfixe de la clé à utiliser pour l'entrée de cache utilisateur généré par la fonctionnalité de progression de téléchargement RFC1867.
apc.rfc1867_name
chaîne de caractères
Spécifie le nom du champ masqué du formulaire qui active la progression du téléchargement et spécifie le suffixe de la clé du cache utilisation.
apc.rfc1867_freq
chaîne de caractères
La fréquence à laquelle la mise à jour doit être effectuée pour l'entrée du cache utilisateur pour la progression du téléchargement. Peut prendre la forme d'un pourcentage de la taille totale du fichier ou une taille, en octets, optionnellement suffixée par "k", "m", ou "g" pour kilo-octets, méga-octets ou giga-octets (insensible à la casse). Si vous définissez cette option à 0, la mise à jour intervient aussi souvent que possible, ce qui peut rendre le téléchargement plus lent.
apc.rfc1867_ttl
bool
TTL pour les entrées rfc1867.
apc.localcache
booléen
Ceci active un processus d'interface locale libre de cache, ce qui réduit les controverses de verrous lorsque le cache est sur le point d'être écrit.
apc.localcache.size
entier
La taille du processus d'interface locale libre de cache, doit être définit à une valeur suffisamment élevée, soit approximativement la moitié de la valeur de apc.num_files_hint.
apc.coredump_unmap
booléen
Active la gestion APC des signaux, comme SIGSEGV, qui écrit les fichiers internes lorsqu'il est émis. Lorsque ces signaux sont reçus, APC tentera de détacher les segments de la mémoire partagée afin de les exclure du fichier interne. Cette configuration devrait rendre plus stable le système lorsque des signaux fatals sont reçus et qu'un gros segment APC de mémoire partagée est configuré.
Cette fonctionnalité est potentiellement dangereuse. Le détachement d'un segment de mémoire partagée dans un gestionnaire de signaux fatals peut produire à un comportement indéterminé si une erreur fatale survient.
Note:
Bien que quelques noyaux puissent ignorer divers types de mémoire partagée lors de la génération du fichier interne, ces implémentations peuvent également ignorer d'importants segments de mémoire partagée tel que le scoreboard d'Apache.
apc.stat_ctime
entier
Une vérification avec ctime prévient les problèmes causés par des programmes comme svn ou rsync en s'assurant que les inodes n'ont pas été modifiés depuis le dernier appel à stat. APC, normalement, n'utilise que mtime pour cela.
apc.canonicalize
bool
Si activé les chemins relatifs sont cononisés en mode no-stat. Si défini, alors les fichiers inclus via les gestionnaires de flux ne pourront pas être mis en cache, vu que la fonction realpath() ne supporte pas les gestionnaires de flux.
apc.preload_path
string
apc.use_request_time
bool
Utilise le temps de début derequête SAPI pour le TTL.
apc.file_md5
bool
Enregistre un hashage md5 pour les fichiers.
apc.lazy_functions
integer
Active le chargement à la demande pour les fonctions.
apc.lazy_classes
integer
Active le chargement à la demande pour les classes.
Cette extension ne définit aucune ressource.
Cette extension ne définit aucune constante.
APC_BIN_VERIFY_CRC32
(integer)
APC_BIN_VERIFY_MD5
(integer)
APC_ITER_ALL
(integer)
APC_ITER_ATIME
(integer)
APC_ITER_CTIME
(integer)
APC_ITER_DEVICE
(integer)
APC_ITER_DTIME
(integer)
APC_ITER_FILENAME
(integer)
APC_ITER_INODE
(integer)
APC_ITER_KEY
(integer)
APC_ITER_MD5
(integer)
APC_ITER_MEM_SIZE
(integer)
APC_ITER_MTIME
(integer)
APC_ITER_NONE
(integer)
APC_ITER_NUM_HITS
(integer)
APC_ITER_REFCOUNT
(integer)
APC_ITER_TTL
(integer)
APC_ITER_TYPE
(integer)
APC_ITER_VALUE
(integer)
APC_LIST_ACTIVE
(integer)
APC_LIST_DELETED
(integer)
(PECL apc >= 3.0.13)
apc_add — Met en cache une nouvelle variable dans le magasin de données
Met en cache une variable dans le magasin de données, uniquement si elle ne s'y trouve pas déjà.
Note: Contrairement aux autres mécanismes en PHP, les variables stockées en utilisant la fonction apc_add() seront persistantes entre les requêtes (jusqu'à ce que la valeur soit effacée du cache).
key
Stocke la variable en utilisant son nom. La clé key
est unique dans le cache, donc utilisez la fonction apc_add()
pour stocker une donnée avec une clé qui existe déjà n'efface pas la donnée
existante, mais retournera FALSE. (C'est la seule différence entre
la fonction apc_add() et la fonction apc_store().)
var
La variable à stocker
ttl
Durée de vie ; stocke la variable var dans le cache
pendant ttl secondes. Après ce délai, la variable
stockée sera effacée du cache (à la requête suivante). Si le
paramètre ttl n'est pas fourni (ou s'il vaut 0),
la valeur persistera tant qu'elle ne sera pas effacée manuellement du cache, ou si elle
n'existe plus dans le cache (effacement, redémarrage, etc.).
values
Les noms comme clés, les variables comme valeurs.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
La seconde syntaxe retourne un tableau avec les clés en erreur.
Exemple #1 Exemple avec apc_add()
<?php
$bar = 'BAR';
apc_add('foo', $bar);
var_dump(apc_fetch('foo'));
echo "\n";
$bar = 'NEVER GETS SET';
apc_add('foo', $bar);
var_dump(apc_fetch('foo'));
echo "\n";
?>
L'exemple ci-dessus va afficher :
string(3) "BAR" string(3) "BAR"
(PECL apc >= 3.1.4)
apc_bin_dump — Récupère une sortie binaire des fichiers fournis et des variables utilisateur
$files
[, array $user_vars
]] )
Retourne une sortie binaire des fichiers fournis et des variables utilisateur depuis le cache APC.
Passer NULL pour les fichiers ou les variables utilisateur signifie une sortie pour chaque entrée
alors que array() permettra de n'avoir aucune sortie.
Retourne une sortie binaire de chaque fichiers et chaque variables utilisateur depuis le cache
APC. FALSE est retourné si APC n'est pas activé et NULL si une erreur est survenue.
(PECL apc >= 3.1.4)
apc_bin_dumpfile — Envoi une sortie binaire des fichiers fournis et des variables utilisateur vers un fichier spécifique
$files
, array $user_vars
, string $filename
[, int $flags = 0
[, resource $context
]] )Envoi une sortie binaire des fichiers fournis et des variables utilisateur depuis le cache APC vers un fichier fourni.
files
Les noms de fichier à sortir.
user_vars
Les variables utilisateur à sortir.
filename
Le fichier vers lequel envoyer les sorties.
flags
Drapeaux passés au flux filename. Voyez la documentation de
file_put_contents() pour plus de détails.
context
Le contexte de flux à passer pour filename. Voyez la
documentation de file_put_contents() pour plus de détails.
Le nombre d'octets écrits dans le fichier, sinon FALSE si APC n'est pas activé, si
filename est invalide ou ne peut être ouvert, si la
sortie générée est incomplète (ex: le disque est plein) ou enfin si une erreur
quelconque est survenue.
(PECL apc >= 3.1.4)
apc_bin_load — Charge une sortie binaire dans le cache fichiers ou utilisateur d'APC
$data
[, int $flags = 0
] )Charge la sortie binaire fournie dans le cache fichiers ou utilisateur d'APC
data
La sortie binaire à charger, provenant de apc_bin_dump().
flags
Soit APC_BIN_VERIFY_CRC32, soit APC_BIN_VERIFY_MD5,
ou encore les deux combinés.
Retourne TRUE si la sortie binaire data a été chargée avec succès,
sinon FALSE est retourné. FALSE est retourné si APC n'est pas activé ou si
data n'est pas une sortie APC valide (ex: taille incorrecte).
Exemple #1 Exemple apc_bin_load()
<?php
$data = apc_bin_dump(NULL, NULL);
apc_bin_load($data, APC_BIN_VERIFY_MD5 | APC_BIN_VERIFY_CRC32);
?>
(PECL apc >= 3.1.4)
apc_bin_loadfile — Charge une sortie binaire depuis un fichier dans le cache fichiers ou utilisateur d'APC
$filename
[, resource $context
[, int $flags
]] )Charge une sortie binaire depuis un fichier dans le cache fichiers ou utilisateur d'APC
filename
Le nom du fichier contenant la sortie binaire, typiquement depuis apc_bin_dumpfile().
context
Le contexte des fichiers.
flags
Soit APC_BIN_VERIFY_CRC32, soit APC_BIN_VERIFY_MD5,
ou encore les deux combinés.
Retourne TRUE en cas de succès, ou alors FALSE Les raisons d'un retour FALSE incluent
la non activation de APC, filename invalide ou non ouvrable, le fichier
de sortie est incomplet ou encore si data n'est pas une sortie APC
valide (ex: taille incorrecte).
(PECL apc >= 2.0.0)
apc_cache_info — Récupère les informations du cache dans l'entrepôt APC
$cache_type
[, bool $limited = false
]] )Récupère les informations du cache et les métadonnées depuis le magasin APC.
cache_type
Si cache_type vaut "user",
les informations sur le cache utilisateur seront retournées.
Si cache_type vaut "filehits",
les informations sur les fichiers ayant été servis depuis le cache
pour la requête courante seront retournées. Cette fonctionnalité doit être
activé lors de la compilation, en utilisant l'option
--enable-filehits
.
Si cache_type est non spécifié ou invalide, l'information
à propos du cache système (fichiers mis en cache) est retournée.
limited
Si limited vaut TRUE, la valeur retournée
exclue les entrées de la liste individuelle du cache. Ceci est utile
lorsque l'on tente d'optimiser les appels pour la collecte de statistiques.
Un tableau de données mis en cache (et les métadonnées) ou FALSE si une erreur survient.
Note: apc_cache_info() émet une alerte s'il n'est pas capable de récupérer les données APC mises en cache. Ceci arrive typiquement lorsque APC n'est pas activé.
| Version | Description |
|---|---|
| 3.0.11 |
Le paramètre limited a été introduit.
|
| 3.0.16 |
L'option "filehits" du paramètre
cache_type a été introduite.
|
Exemple #1 Exemple avec apc_cache_info()
<?php
print_r(apc_cache_info());
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[num_slots] => 2000
[ttl] => 0
[num_hits] => 9
[num_misses] => 3
[start_time] => 1123958803
[cache_list] => Array
(
[0] => Array
(
[filename] => /chemin/vers/apc_test.php
[device] => 29954
[inode] => 1130511
[type] => file
[num_hits] => 1
[mtime] => 1123960686
[creation_time] => 1123960696
[deletion_time] => 0
[access_time] => 1123962864
[ref_count] => 1
[mem_size] => 677
)
[1] => Array (...itération pour chaque fichier mis en cache)
)
(PECL apc >= 3.1.1)
apc_cas — Met à jour une ancienne valeur par une nouvelle
$key
, int $old
, int $new
)
apc_cas() met à jour une valeur entière
existante (si le paramètre old correspond
à la valeur actuellement stockée), avec la valeur du paramètre
new.
key
La clé de la valeur à mettre à jour.
old
L'ancienne valeur (la valeur actuellement stockée).
new
La nouvelle valeur à utiliser.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple apc_cas()
<?php
apc_store('foobar', 2);
echo '$foobar = 2', PHP_EOL;
echo '$foobar == 1 ? 2 : 1 = ', (apc_cas('foobar', 1, 2) ? 'ok' : 'fail'), PHP_EOL;
echo '$foobar == 2 ? 1 : 2 = ', (apc_cas('foobar', 2, 1) ? 'ok' : 'fail'), PHP_EOL;
echo '$foobar = ', apc_fetch('foobar'), PHP_EOL;
echo '$f__bar == 1 ? 2 : 1 = ', (apc_cas('f__bar', 1, 2) ? 'ok' : 'fail'), PHP_EOL;
apc_store('perfection', 'xyz');
echo '$perfection == 2 ? 1 : 2 = ', (apc_cas('perfection', 2, 1) ? 'ok' : 'epic fail'), PHP_EOL;
echo '$foobar = ', apc_fetch('foobar'), PHP_EOL;
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
$foobar = 2 $foobar == 1 ? 2 : 1 = fail $foobar == 2 ? 1 : 2 = ok $foobar = 1 $f__bar == 1 ? 2 : 1 = fail $perfection == 2 ? 1 : 2 = epic fail $foobar = 1
(PECL apc >= 2.0.0)
apc_clear_cache — Efface le cache APC
$cache_type
] )Efface le cache utilisateur/système.
cache_type
Si cache_type vaut "user",
le cache utilisateur sera nettoyé ; sinon, le cache système (les fichiers
mis en cache) sera nettoyé.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL apc >= 3.0.13)
apc_compile_file — Stocke un fichier dans le cache, en évitant tous les filtres
Stocke un fichier dans le cache, en évitant tous les filtres.
filename
Chemin complet ou relatif vers un fichier PHP qui sera compilé et stocké dans le cache.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL apc >= 3.1.1)
apc_dec — Décrémente un nombre stocké
$key
[, int $step = 1
[, bool &$success
]] )Décrémente un nombre stocké
key
La clé de la valeur à décrémenter.
step
Le pas, ou la valeur à décrémenter.
success
Booléen optionnel pass/fail (par référence).
Retourne la valeur courante de key en cas de succès,
ou FALSE si une erreur survient
Exemple #1 Exemple apc_dec()
<?php
echo "Faisons les choses bien", PHP_EOL;
apc_store('anumber', 42);
echo apc_fetch('anumber'), PHP_EOL;
echo apc_dec('anumber'), PHP_EOL;
echo apc_dec('anumber', 10), PHP_EOL;
echo apc_dec('anumber', 10, $success), PHP_EOL;
var_dump($success);
echo "Maintenant, un échec", PHP_EOL, PHP_EOL;
apc_store('astring', 'foo');
$ret = apc_dec('astring', 1, $fail);
var_dump($ret);
var_dump($fail);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Faisons les choses bien 42 41 31 21 bool(true) Maintenant, un échec bool(false) bool(false)
(PECL apc >= 3.0.0)
apc_define_constants — Définit un jeu de constantes pour la récupération et la définition en masse
$key
, array $constants
[, bool $case_sensitive = true
] )define() est notoirement lent. Vu que le principal bénéfice d'APC est d'augmenter les performances des applications/scripts, ce mécanisme est fourni pour améliorer le processus de la définition de constantes en masse. Cependant, cette fonction n'effectue aucune opération anticipée.
Pour une solution plus performante, essayez l'extension PECL » hidef.
Note: Pour effacer plusieurs constantes stockées (sans effacer tout le cache), un tableau vide peut être passé en tant que paramètre
constants, ce qui effacera les valeurs stockées.
key
La clé key correspondant au nom du jeu de constantes
stockées. Ce paramètre key est utilisé pour récupérer
les constantes stockées avec la fonction apc_load_constants().
constants
Un tableau associatif de paires constant_name => value. Le constant_name doit suivre les règles de nommage normales des constantes. value doit être évaluée comme une valeur scalaire.
case_sensitive
Le comportement par défaut pour les constantes est d'être déclarées
en tenant compte de la casse ;
i.e. CONSTANT et Constant
représentent des valeurs différentes. Si ce paramètre est évalué à FALSE,
les constantes seront déclarées en tant que symboles insensibles à la casse.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec apc_define_constants()
<?php
$constants = array(
'UN' => 1,
'DEUX' => 2,
'TROIS' => 3,
);
apc_define_constants('numbers', $constants);
echo UN, DEUX, TROIS;
?>
L'exemple ci-dessus va afficher :
123
(PECL apc >= 3.1.1)
apc_delete_file — Efface un fichier depuis le cache opcode
Efface les fichiers indiqués depuis le cache opcode
keys
Les fichiers à effacer. Accepte une string, array de strings, ou un objet APCIterator.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Ou si keys est un array, alors un
tableau vide est retourné en cas de succès, ou un tableau contenant les
fichiers en échec sinon.
Exemple #1 Exemple apc_delete_file()
<?php
$filename = 'file.php';
if (apc_compile_file($filename)) {
if (apc_delete_file($filename)) {
echo "Fichier $filename supprimé avec succès depuis le cache APC.", PHP_EOL;
}
}
if (apc_compile_file($filename)) {
if ($good = apc_delete_file(array($filename, 'donotexist.php'))) {
var_dump($good);
}
}
$bad = apc_delete_file('donotexist.php');
var_dump($bad);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Fichier $filename supprimé avec succès depuis le cache APC
[Mon May 24 09:30:33 2010] [apc-warning] Could not stat file donotexist.php, unable to delete from cache. in /tmp/test.php on line 13.
array(1) {
[0]=>
string(14) "donotexist.php"
}
[Mon May 24 09:30:33 2010] [apc-warning] Could not stat file donotexist.php, unable to delete from cache. in /tmp/test.php on line 18.
bool(false)
(PECL apc >= 3.0.0)
apc_delete — Efface une variable stockée dans le cache
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec apc_delete()
<?php
$bar = 'BAR';
apc_store('foo', $bar);
apc_delete('foo');
// c'est évidemment inutile sous cette forme
?>
(PECL apc >= 3.1.4)
apc_exists — Vérifie si une clé APC existe
Retourne TRUE si la clé existe, sinon FALSE Ou si un
array était passé à keys, alors un tableau
est retourné, il contient toutes les clés existantes, ou un tableau vide si aucune
clé n'existait.
Exemple #1 Exemple apc_exists()
<?php
$fruit = 'apple';
$veggie = 'carrot';
apc_store('foo', $fruit);
apc_store('bar', $veggie);
if (apc_exists('foo')) {
echo "Foo existe: ";
echo apc_fetch('foo');
} else {
echo "Foo n'existe pas";
}
echo PHP_EOL;
if (apc_exists('baz')) {
echo "Baz existe.";
} else {
echo "Baz n'existe pas";
}
echo PHP_EOL;
$ret = apc_exists(array('foo', 'donotexist', 'bar'));
var_dump($ret);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Foo existe: apple
Baz n'existe pas
array(2) {
["foo"]=>
bool(true)
["bar"]=>
bool(true)
}
(PECL apc >= 3.0.0)
apc_fetch — Récupère une variable stockée dans le cache
Récupère une variable stockée dans le cache.
key
La clé key utilisée pour stocker la valeur (avec
apc_store()). Si un tableau est passé, chaque élément
sera récupéré et retourné.
success
Vaut TRUE en cas de succès, et FALSE si une erreur survient.
La variable stockée ou les variables du tableau en cas de succès, FALSE
si une erreur survient.
Exemple #1 Exemple avec apc_fetch()
<?php
$bar = 'BAR';
apc_store('foo', $bar);
var_dump(apc_fetch('foo'));
?>
L'exemple ci-dessus va afficher :
string(3) "BAR"
| Version | Description |
|---|---|
| 3.0.17 |
Le paramètre success est ajouté.
|
(PECL apc >= 3.1.1)
apc_inc — Incrémente un nombre stocké
$key
[, int $step = 1
[, bool &$success
]] )Incrémente un nombre stocké.
key
La clé de la valeur à incrémenter.
step
Le pas, ou la valeur à incrémenter.
success
Booléen optionnel pass/fail (par référence).
Retourne la valeur courante de key en cas de succès,
ou FALSE si une erreur survient
Exemple #1 Exemple apc_inc()
<?php
echo "Faisons les choses bien", PHP_EOL;
apc_store('anumber', 42);
echo apc_fetch('anumber'), PHP_EOL;
echo apc_inc('anumber'), PHP_EOL;
echo apc_inc('anumber', 10), PHP_EOL;
echo apc_inc('anumber', 10, $success), PHP_EOL;
var_dump($success);
echo "Maintenant, un échec", PHP_EOL, PHP_EOL;
apc_store('astring', 'foo');
$ret = apc_inc('astring', 1, $fail);
var_dump($ret);
var_dump($fail);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Faisons les choses bien 42 43 53 63 bool(true) Maintenant, un échec bool(false) bool(false)
(PECL apc >= 3.0.0)
apc_load_constants — Charge un jeu de constantes depuis le cache
$key
[, bool $case_sensitive = true
] )Charge un jeu de constantes depuis le cache.
key
Le nom du jeu de constantes (qui a été stocké avec la fonction apc_define_constants()) à récupérer.
case_sensitive
Le comportement par défaut pour les constantes est d'être déclarées
en tenant compte de la casse ;
i.e. CONSTANT et Constant
représentent des valeurs différentes. Si ce paramètre est évalué à FALSE,
les constantes seront déclarées en tant que symboles insensibles à la casse.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec apc_load_constants()
<?php
$constants = array(
'UN' => 1,
'DEUX' => 2,
'TROIS' => 3,
);
apc_define_constants('numbers', $constants);
apc_load_constants('numbers');
echo UN, DEUX, TROIS;
?>
L'exemple ci-dessus va afficher :
123
(PECL apc >= 2.0.0)
apc_sma_info — Récupère les informations d'allocation mémoire partagée d'APC
$limited = false
] )Récupère les informations d'allocation mémoire partagée d'APC.
limited
Lorsque défini à FALSE (défaut) apc_sma_info()
retournera une information détaillée de chaque segment.
Tableau de données d'allocation mémoire partagée ; FALSE si une erreur survient.
Exemple #1 Exemple avec apc_sma_info()
<?php
print_r(apc_sma_info());
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[num_seg] => 1
[seg_size] => 31457280
[avail_mem] => 31448408
[block_lists] => Array
(
[0] => Array
(
[0] => Array
(
[size] => 31448408
[offset] => 8864
)
)
)
)
(PECL apc >= 3.0.0)
apc_store — Met en cache une variable dans le magasin
Met en cache une variable en magasin.
Note: Contrairement à tous les autres mécanismes de PHP, les variables stockées en utilisant la fonction apc_store() persistent entre les requêtes (tant que la valeur n'est pas effacée du cache).
key
Stocke la variable en utilisant ce nom. Les clés key
sont uniques, donc, stocker une seconde valeur avec la même clé
effacera la valeur originale.
var
La variable à stocker.
ttl
Temps de vie : stocke la variable var
dans le cache pour ttl secondes.
Après que ttl soit passé, la variable stockée
sera supprimée du cache (à la requête suivante). Si aucun ttl
n'est fourni (ou si le ttl vaut 0),
la valeur persistera tant qu'elle ne sera pas effacée manuellement du cache, ou si elle
n'existe plus dans le cache (effacement, redémarrage, etc.).
values
Les noms comme clés, les variables comme valeurs.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
La seconde syntaxe retourne un tableau avec les clés en erreur.
Exemple #1 Exemple avec apc_store()
<?php
$bar = 'BAR';
apc_store('foo', $bar);
var_dump(apc_fetch('foo'));
?>
L'exemple ci-dessus va afficher :
string(3) "BAR"
(PECL apc >= 3.1.1)
La classe APCIterator simplifie l'itération des caches APC volumineux. C'est utile car cela permet d'itérer sur les gros caches par pas tout en récupérant un nombre défini d'entrées par instance de verrou, ainsi les verrous sont libérés pour des activités ultérieures plutôt que de bloquer tout le cache pour récupérer (par défaut) 100 entrées. Aussi, l'utilisation d'expression régulière est plus réactive car l'implémentation a été faite au niveau C.
$cache
[, mixed $search = null
[, int $format
[, int $chunk_size = 100
[, int $list
]]]] )(PECL apc >= 3.1.1)
APCIterator::__construct — Construit un objet d'itération APCIterator
$cache
[, mixed $search = null
[, int $format
[, int $chunk_size = 100
[, int $list
]]]] )Construit un objet APCIterator.
cache
Le type de cache, user ou file.
search
Une expression régulière PCRE pour établir la
correspondance avec les clés APC. Peut être une string pour une
expression régulière simple ou un array d'expressions
régulières. Passez optionnellement NULL pour sauter la recherche.
format
Le format désiré, configuré à partir d'une ou plusieurs constantes APC_ITER_*.
chunk_size
La taille du segment. Doit être une valeur supérieure à 0. La valeur par défaut est 100.
list
Le type de liste. Passez APC_LIST_ACTIVE
ou APC_LIST_DELETED.
Un objet APCIterator en cas de succès,
ou NULL si échec.
Exemple #1 Exemple avec APCIterator::__construct()
<?php
foreach (new APCIterator('user', '/^counter\./') as $counter) {
echo "$counter[key]: $counter[value]\n";
apc_dec($counter['key'], $counter['value']);
}
?>
(PECL apc >= 3.1.1)
APCIterator::current — Récupère l'élément en cours
Récupère l'élément en cours dans la pile APCIterator.
Cette fonction ne contient aucun paramètre.
Retourne l'élément en cours en cas de succès, ou FALSE si aucun élément supplémentaire
n'existe ou en cas d'échec.
(PECL apc >= 3.1.1)
APCIterator::getTotalCount — Récupère le nombre total d'éléments
Récupère le nombre total d'éléments.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Cette fonction ne contient aucun paramètre.
Le nombre total d'éléments.
(PECL apc >= 3.1.1)
APCIterator::getTotalHits — Récupère le nombre total de cache hits
Récupère le nombre total de cache hits.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Cette fonction ne contient aucun paramètre.
Le nombre de hits en cas de succès, ou FALSE si échec.
(PECL apc >= 3.1.1)
APCIterator::getTotalSize — Récupère la taille totale du cache
Récupère la taille totale du cache.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Cette fonction ne contient aucun paramètre.
La taille totale du cache.
(PECL apc >= 3.1.1)
APCIterator::key — Récupère la clé de l'itérateur
Récupère la clé de l'itérateur.
Cette fonction ne contient aucun paramètre.
Retourne la clé en cas de succès, ou FALSE si échec.
(PECL apc >= 3.1.1)
APCIterator::next — Déplace le pointeur vers l'élément suivant
Déplace le pointeur vers l'élément suivant.
Cette fonction ne contient aucun paramètre.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL apc >= 3.1.1)
APCIterator::rewind — Rembobine l'itérateur
Rembobine l'itérateur sur le premier élément.
Cette fonction ne contient aucun paramètre.
Aucune valeur n'est retournée.
(PECL apc >= 3.1.1)
APCIterator::valid — Vérifie si la position actuelle de l'itérateur est valide
Vérifie si la position actuelle de l'itérateur est valide
Cette fonction ne contient aucun paramètre.
Retourne TRUE si la position actuelle de l'itérateur est valide, sinon FALSE.
APD est un débogueur PHP avancé. Il a été écrit afin de fournir des possibilités de profilage et de déboguage pour le code PHP, mais aussi la possibilité d'afficher une trace complète. APD supporte le déboguage interactif, mais, par défaut, il écrit les données dans des fichiers de traces. Il fournit également des événements lors de la journalisation à différents niveaux (incluant les appels aux fonctions, les arguments passés, le temps passé, etc...) pouvant être activés ou non pour des scripts particuliers.
APD est une extension Zend, modifiant la façon dont les appels aux fonctions, en interne, s'effectue, et donc, peut ne pas être compatible avec les autres extensions Zend (par exemple, Zend Optimizer).
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/apd.
Aucune bibliothèque DLL pour cette extension PECL n'est actuellement disponible. Reportez-vous à la section Compilation sous Windows.
Dans votre fichier INI, ajoutez les lignes suivantes:
zend_extension = /absolute/path/to/apd.so apd.dumpdir = /absolute/path/to/trace/directory apd.statement_tracing = 0
En fonction de votre compilation de PHP, la directive zend_extension peut prendre l'une des formes suivantes :
zend_extension (non ZTS, non debug build) zend_extension_ts ( ZTS, non debug build) zend_extension_debug (non ZTS, debug build) zend_extension_debug_ts ( ZTS, debug build)
Pour compiler APD sous Windows, vous devez installer un environnement de compilation PHP, tel que décrit sur http://php.net/ : en fait, vous avez besoin de Microsoft Visual C++, win32build.zip, bison/flex, et d'un peu de savoir-faire pour le faire fonctionner. De plus, assurez-vous que adp.dsp utilise les nouvelles lignes de format DOS; si c'est le format Unix, Microsoft Visual C++ va s'en plaindre.
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
| Nom | Défaut | Modifiable | Historique |
|---|---|---|---|
| apd.dumpdir | NULL | PHP_INI_ALL | |
| apd.statement_tracing | "0" | PHP_INI_ALL | Disponible depuis apd 0.9. |
Voici un éclaircissement sur l'utilisation des directives de configuration.
apd.dumpdir
chaîne de caractères
Spécifie le dossier dans lequel APD écrit les fichiers de profilage. Vous pouvez spécifier un chemin absolu ou relatif.
Vous pouvez spécifier un dossier différent comme argument de apd_set_pprof_trace().
apd.statement_tracing
booléen
Active ou désactive les traces à la ligne. En activant cette option (valeur de 1), l'application sera considérablement ralentie.
Cette extension ne définit aucune ressource.
Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.
| Constante | Valeur | Description |
|---|---|---|
FUNCTION_TRACE
(entier)
|
1 | |
ARGS_TRACE
(entier)
|
2 | |
ASSIGNMENT_TRACE
(entier)
|
4 | |
STATEMENT_TRACE
(entier)
|
8 | |
MEMORY_TRACE
(entier)
|
16 | |
TIMING_TRACE
(entier)
|
32 | |
SUMMARY_TRACE
(entier)
|
64 | |
ERROR_TRACE
(entier)
|
128 | |
PROF_TRACE
(entier)
|
256 | |
APD_VERSION
(chaîne de caractères)
|
exemple : 1.0.2-dev |
À la première ligne de votre script PHP, appelez la fonction apd_set_pprof_trace() afin de commencer à enregistrer la trace :
<?php
apd_set_pprof_trace();
?>
Vous pouvez insérer la ligne n'importe où dans votre script, mais si vous ne commencez pas à enregistrer la trace au début de votre script, vous désactiverez les données du profile qui pourraient vous mener à trouver un goulot d'étranglement.
Maintenant, exécutez votre script. L'affichage sera écrit dans le fichier apd.dumpdir/pprof_pid.ext.
Si vous utilisez la version CGI de PHP, vous devrez utiliser l'option
"-e" afin d'activer les informations étendues d'APD.
Par exemple : php -e -f script.php
Pour afficher les données formatées du profil, exécutez la commande pprofp avec les options de tri et d'affichage de votre choix. Le formatage de la sortie ressemblera à :
bash-2.05b$ pprofp -R /tmp/pprof.22141.0 Trace for /home/dan/testapd.php Total Elapsed Time = 0.00 Total System Time = 0.00 Total User Time = 0.00 Real User System secs/ cumm %Time (excl/cumm) (excl/cumm) (excl/cumm) Calls call s/call Memory Usage Name -------------------------------------------------------------------------------------- 100.0 0.00 0.00 0.00 0.00 0.00 0.00 1 0.0000 0.0009 0 main 56.9 0.00 0.00 0.00 0.00 0.00 0.00 1 0.0005 0.0005 0 apd_set_pprof_trace 28.0 0.00 0.00 0.00 0.00 0.00 0.00 10 0.0000 0.0000 0 preg_replace 14.3 0.00 0.00 0.00 0.00 0.00 0.00 10 0.0000 0.0000 0 str_replace
L'option -R utilisé dans cet exemple trie la table de profil par la colonne "Real Time", représentant le temps mis par le script pour exécuter une fonction donnée. La colonne "cumm call" montre le nombre de fois que la fonction a été appelée et la colonne "s/call", le nombre de secondes chaque appel à la fonction nécessite, en moyenne.
Pour générer un fichier "calltree" que vous pourrez importer dans l'application d'analyse de profil KCacheGrind, exécutez la commande pprof2calltree.
Si vous avez des commentaires, des corrections de bogues ou si vous voulez développer des améliorations pour cette extension, vous pouvez envoyer un message à » apd@mail.communityconnect.com. Toute aide est vraiment la bienvenue.
(PECL apd >= 0.2)
apd_breakpoint — Stoppe l'interpréteur et attend un CR depuis le socket
$debug_level
)apd_breakpoint() peut être utilisé pour stopper l'exécution de votre script PHP et attend les réponses depuis le socket connecté. Pour reprendre l'exécution du programme, appuyez juste sur la touche ENTRER (une ligne vide) ou entrez une commande PHP à exécuter.
debug_levelUn entier qui est formé en ajoutant les constantes XXX_TRACE.
Il n'est pas recommandé
d'utiliser MEMORY_TRACE. C'est très lent et ne semble pas être précis.
ASSIGNMENT_TRACE n'est actuellement pas implémenté.
Pour activer toutes les traces fonctionnelles (TIMING, FUNCTIONS, ARGS SUMMARY (comme strace -c)), utilisez la valeur 99
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Session typique utilisant tcplisten
bash#tcplisten localhost 7777
APD - Advanced PHP Debugger Trace File
---------------------------------------------------------------------------
Process Pid (6118)
Trace Begun at Sun Mar 10 23:13:12 2002
---------------------------------------------------------------------------
( 0.000000): apd_set_session_trace called at /home/alan/Projects/project2/test.
php:5
( 0.074824): apd_set_session_trace_socket() at /home/alan/Projects/project2/tes
t.php:5 returned. Elapsed (0.074824)
( 0.074918): apd_breakpoint() /home/alan/Projects/project2/test.php:7
++ argv[0] $(??) = 9
apd_breakpoint() at /home/alan/Projects/project2/test.php:7 returned. Elapsed (
-2089521468.1073275368)
>\n
statement: /home/alan/Projects/project2/test.php:8
>\n
statement: /home/alan/Projects/project2/test.php:8
>\n
statement: /home/alan/Projects/project2/test.php:10
>apd_echo($i);
EXEC: apd_echo($i);
0
>apd_echo(serialize(apd_get_active_symbols()));
EXEC: apd_echo(serialize(apd_get_active_symbols()));
a:47:{i:0;s:4:"PWD";i:1;s:10:"COLORFGBG";i:2;s:11:"XAUTHORITY";i:3;s:14:"
COLORTERM_BCE";i:4;s:9:"WINDOWID";i:5;s:14:"ETERM_VERSION";i:6;s:16:"SE
SSION_MANAGER";i:7;s:4:"PS1";i:8;s:11:"GDMSESSION";i:9;s:5:"USER";i:10;s:5:"
MAIL";i:11;s:7:"OLDPWD";i:12;s:5:"LANG";i:13;s:10:"COLORTERM";i:14;s:8:"DISP
LAY";i:15;s:8:"LOGNAME";i:16;s:6:"
>apd_echo(system('ls /home/mydir'));
>apd_continue(0);
(PECL apd 0.2-0.4)
apd_callstack — Retourne la pile d'appel courante dans un tableau
apd_callstack() retourne la pile d'appel courante dans un tableau d'éléments.
Un tableau contenant la pile d'appel courante.
Exemple #1 Exemple avec apd_callstack()
<?php
print_r(apd_callstack());
?>
(PECL apd 0.2-0.4)
apd_clunk — Lance une alerte et un callstack
$warning
[, string $delimiter
] )
Cette fonction fonctionne de la même façon que
son homologue Perl Carp::cluck.
apd_clunk() lance une alerte et un callstack
en utilisant le paramètre delimiter comme
délimiteur.
warning
L'alerte à lancer.
delimiter
Le délimiteur. Par défaut, <BR />.
Aucune valeur n'est retournée.
Exemple #1 Exemple avec apd_clunk()
<?php
apd_clunk("Quelques alertes", "<br/>");
?>
(PECL apd >= 0.2)
apd_continue — Redémarre l'interpréteur
$debug_level
)apd_continue() envoie une instruction via le socket pour redémarrer l'interpréteur.
debug_levelUn entier qui est formé en ajoutant les constantes XXX_TRACE.
Il n'est pas recommandé
d'utiliser MEMORY_TRACE. C'est très lent et ne semble pas être précis.
ASSIGNMENT_TRACE n'est actuellement pas implémenté.
Pour activer toutes les traces fonctionnelles (TIMING, FUNCTIONS, ARGS SUMMARY (comme strace -c)), utilisez la valeur 99
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec apd_continue()
<?php
apd_continue(0);
?>
(PECL apd 0.2-0.4)
apd_croak — Lance une erreur, un callstack et sort
$warning
[, string $delimiter
] )Cette fonction fonctionne comme son homologue Perl Carp::croak. apd_croak() lance une erreur, un callstack et sort.
warning
L'alerte à lancer.
delimiter
Le délimiteur. Par défaut, <BR />.
Aucune valeur n'est retournée.
Exemple #1 Exemple avec apd_croak()
<?php
apd_croak("Quelques alertes","<P>");
?>
(Unknown)
apd_dump_function_table — Affiche la table courante de fonction
apd_dump_function_table() affiche la table courante de fonction.
Aucune valeur n'est retournée.
Exemple #1 Exemple avec apd_dump_function_table()
<?php
apd_dump_function_table();
?>
(PECL apd 0.2-0.4)
apd_dump_persistent_resources — Retourne toutes les ressources persistantes dans un tableau
apd_dump_persistent_resources() retourne toutes les ressources persistantes dans un tableau.
Un tableau contenant toutes les ressources persistantes.
Exemple #1 Exemple avec apd_dump_persistent_resources()
<?php
print_r(apd_dump_persistent_resources());
?>
(PECL apd 0.2-0.4)
apd_dump_regular_resources — Retourne toutes les ressources régulières courantes dans un tableau
Retourne toutes les ressources régulières courantes dans un tableau.
Un tableau contenant les ressources régulières courantes.
Exemple #1 Exemple avec apd_dump_regular_resources()
<?php
print_r(apd_dump_regular_resources());
?>
(PECL apd >= 0.2)
apd_echo — Écrit dans le socket de déboguage
$output
)apd_echo() envoie via le socket une demande d'information concernant le script exécuté.
output
La variable de déboguage.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec apd_echo()
<?php
apd_echo($i);
?>
(PECL apd 0.2)
apd_get_active_symbols — Récupère un tableau contenant les noms des variables courantes de portée locale
apd_get_active_symbols() récupère les noms de toutes les variables définies dans le contexte actif (et non leurs valeurs).
Un tableau multidimensionnel contenant toutes les variables.
Exemple #1 Exemple avec apd_get_active_symbols()
<?php
apd_echo(apd_get_active_symbols());
?>
(PECL apd >= 0.2)
apd_set_pprof_trace — Démarre la session de déboguage APD
$dump_directory
[, string $fragment = "pprof"
]] )
Démarre la session de déboguage dans le dossier
dump_directory/pprof_{process_id}.
dump_directory
Le dossier dans lequel le fichier sera écrit. S'il n'est pas fourni, la directive apd.dumpdir du php.ini sera utilisée.
fragment
Retourne le chemin du fichier de destination.
Exemple #1 Exemple avec apd_set_pprof_trace()
<?php
apd_set_pprof_trace();
?>
(PECL apd >= 0.2)
apd_set_session_trace_socket — Démarre la session de déboguage à distance
$tcp_server
, int $socket_type
, int $port
, int $debug_level
)Cette fonction se connecte au serveur TCP (e.g. tcplisten) spécifié par l'IP ou le socket Unix (comme un fichier) et envoie des données de déboguage au socket.
tcp_server
IP ou socket Unix (comme un fichier) du serveur TCP.
socket_type
Peut prendre les valeurs des constantes AF_UNIX,
pour un socket à base de fichiers, ou APD_AF_INET,
pour des sockets TCP/IP standard.
port
Vous pouvez utiliser n'importe quel port, mais les numéros de port les plus élevés sont plus recommandés que les moins élevés, qui risquent d'être utilisés par d'autres services du système.
debug_levelUn entier qui est formé en ajoutant les constantes XXX_TRACE.
Il n'est pas recommandé
d'utiliser MEMORY_TRACE. C'est très lent et ne semble pas être précis.
ASSIGNMENT_TRACE n'est actuellement pas implémenté.
Pour activer toutes les traces fonctionnelles (TIMING, FUNCTIONS, ARGS SUMMARY (comme strace -c)), utilisez la valeur 99
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec apd_set_socket_session_trace()
<?php
apd_set_socket_session_trace("127.0.0.1",APD_AF_INET,7112,0);
?>
(PECL apd 0.2-0.4)
apd_set_session_trace — Démarre la session de déboguage APD
$debug_level
[, string $dump_directory
] )
Démarre le déboguage de apd_dump_{process_id} dans le
dossier dump_directory.
debug_levelUn entier qui est formé en ajoutant les constantes XXX_TRACE.
Il n'est pas recommandé
d'utiliser MEMORY_TRACE. C'est très lent et ne semble pas être précis.
ASSIGNMENT_TRACE n'est actuellement pas implémenté.
Pour activer toutes les traces fonctionnelles (TIMING, FUNCTIONS, ARGS SUMMARY (comme strace -c)), utilisez la valeur 99
dump_directory
Le dossier dans lequel le fichier sera écrit. S'il n'est pas défini, la valeur du paramètre de configuration apd.dumpdir du php.ini sera utilisée.
Aucune valeur n'est retournée.
Exemple #1 Exemple avec apd_set_session_trace()
<?php
apd_set_session_trace(99);
?>
(PECL apd 0.2-0.4)
apd_set_session — Modifie ou définit le degré de déboguage courant
$debug_level
)apd_set_session() peut être utilisé pour augmenter ou diminuer le degré de déboguage dans un endroit particulier de votre application.
debug_levelUn entier qui est formé en ajoutant les constantes XXX_TRACE.
Il n'est pas recommandé
d'utiliser MEMORY_TRACE. C'est très lent et ne semble pas être précis.
ASSIGNMENT_TRACE n'est actuellement pas implémenté.
Pour activer toutes les traces fonctionnelles (TIMING, FUNCTIONS, ARGS SUMMARY (comme strace -c)), utilisez la valeur 99
Aucune valeur n'est retournée.
Exemple #1 Exemple avec apd_set_session()
<?php
apd_set_session(9);
?>
(PECL apd >= 0.2)
override_function — Surcharge les fonctions intégrées
$function_name
, string $function_args
, string $function_code
)override_function() surcharge les fonctions intégrées (les remplace dans la table des symboles).
function_name
La fonction à surcharger.
function_args
Les arguments de la fonction, séparés par une virgule.
Habituellement, vous voudriez passer ce paramètre, tout comme le paramètre
function_code, délimité par un guillemet simple.
La raison pour laquelle on utilise un guillemet simple est pour protéger le
nom de la variable lors de l'analyse, sinon, si vous utilisez des guillemets doubles,
il devient nécessaire d'échapper le nom de la variable, e.g.
\$votre_variable.
function_code
Le nouveau code pour la fonction.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec override_function()
<?php
override_function('test', '$a,$b', 'echo "DOING TEST"; return $a * $b;');
?>
(PECL apd >= 0.2)
rename_function — Renomme une fonction intégrée dans la table des fonctions globales
$original_name
, string $new_name
)rename_function() renomme une fonction intégrée dans la table des fonctions globales. Utile pour surcharger temporairement une fonction intégrée.
original_name
Le nom original de la fonction.
new_name
Le nouveau nom pour la fonction original_name.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec rename_function()
<?php
rename_function('mysql_connect', 'debug_mysql_connect' );
?>
Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez ce module à vos risques et périls.
Bcompiler a été écrit pour diverses raisons :
La deuxième raison est possible en utilisant les fonctions bcompiler_write_header(), bcompiler_write_class(), bcompiler_write_footer(), bcompiler_read(), et bcompiler_load(). Les fichiers bytecode peuvent être écrits compressés ou non. La fonction bcompiler_load() lit le fichier bytecode compressé, qui représente un tiers de la taille du fichier original.
Pour créer les fichiers de type EXE, bcompiler doit être utilisé avec un fichier sapi modifié ou une version de PHP qui a été compilé en tant que bibliothèque partagé. Dans ce cas, bcompiler lit le bytecode compressé depuis la fin du fichier EXE.
Bcompiler peut améliorer les performances d'environ 30% lors de l'utilisation de bytecode non compressé uniquement. Mais garder à l'esprit que le bytecode non compressé peut représenter une taille 5 fois plus large que le code source original. L'utilisation de bytecode compressé prendra moins de place, mais la décompression nécessite plus de temps que d'analyser le code source. De plus, Bcompiler n'effectue aucune optimisation du bytecode. Cette fonctionnalité devrait être ajoutée dans les futures versions...
D'un point de vue de la protection du code, l'on peut dire qu'il est absolument impossible de recréer le code source exact, tel qu'à l'origine, et sans les commentaires originaux. Cependant, il est possible de récupérer les données depuis un fichier bytecode Bcompiler - de ce fait, n'y incluez pas vos mots de passes personnels.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Cette extension » PECL n'est pas intégrée à PHP.
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/bcompiler.
Aucune bibliothèque DLL pour cette extension PECL n'est actuellement disponible. Reportez-vous à la section Compilation sous Windows.
Cette extension ne définit aucune directive de configuration.
Cette extension ne définit aucune ressource.
Cette extension ne définit aucune constante.
Si vous avez des commentaires, des corrections de bogues, des améliorations ou que vous voulez aider à rendre cette extension meilleure, vous pouvez envoyer un message à » alan_k@php.net. Toute aide est vraiment la bienvenue.
(PECL bcompiler >= 0.4)
bcompiler_load_exe — Lit et crée des classes depuis un fichier exe bcompiler
$filename
)
Lit les données depuis le fichier exe bcompiler appelé
filename et crée les classes à
partir du bytecode.
filename
Le chemin vers le fichier exe, sous la forme d'une chaîne de caractères.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec bcompiler_load_exe()
<?php
bcompiler_load_exe("/tmp/example.exe");
print_r(get_defined_classes());
?>
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
(PECL bcompiler >= 0.4)
bcompiler_load — Lit et crée les classes depuis un fichier compressé en bzip2
$filename
)
Lit les données depuis le fichier compressé en bzip2
filename et crée les classes
depuis le bytecode.
filename
Le chemin vers le fichier compressé avec bzip2, sous la forme d'une chaîne de caractères.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec bcompiler_load()
<?php
bcompiler_load("/tmp/example");
print_r(get_defined_classes());
?>
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Note:
Utiliser les instructions include ou require pour analyser les bytecodes : c'est plus portable et plus commode que d'utiliser cette fonction.
Notez que cette fonction n'exécute pas le corps du script contenu dans le fichier bytecode.
(PECL bcompiler >= 0.4)
bcompiler_parse_class — Lit le bytecode d'une classe et revient à une fonction utilisateur
$class
, string $callback
)Lit le bytecode d'une classe et revient à une fonction utilisateur.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec bcompiler_parse_class()
<?php
function readByteCodes($data) {
print_r($data);
}
bcompiler_parse_class("DB","readByteCodes");
?>
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Note:
Cette fonction a été supprimée de bcompiler et n'est plus disponible depuis bcompiler 0.5.
(PECL bcompiler >= 0.4)
bcompiler_read — Lit et crée les classes depuis un pointeur de fichier
$filehandle
)
Lit les données depuis un fichier ouvert représenté par la ressource
filehandle et crée les classes depuis le bytecode.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec bcompiler_read()
<?php
$fh = fopen("/tmp/example","r");
bcompiler_read($fh);
fclose($fh);
print_r(get_defined_classes());
?>
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Note:
Utiliser les instructions include ou require pour analyser les bytecodes : c'est plus portable et plus commode que d'utiliser cette fonction.
Notez que cette fonction n'exécute pas le corps du script contenu dans le fichier bytecode.
(PECL bcompiler >= 0.4)
bcompiler_write_class — Écrit une classe définie en bytecode
$filehandle
, string $className
[, string $extends
] )
Lit le bytecode d'une classe existante nommée className
depuis PHP et l'écrit dans le fichier ouvert désigné par la ressource
filehandle.
filehandle
Une ressource de fichier retournée par la fonction fopen().
className
Le nom de la classe, sous la forme d'une chaîne de caractères.
extends
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec bcompiler_write_class()
<?php
$fh = fopen("/tmp/example","w");
bcompiler_write_header($fh);
bcompiler_write_class($fh,"DB");
// vous devez écrire DB_common avant DB_mysql, car DB_mysql étend DB_common.
bcompiler_write_class($fh,"DB_common");
bcompiler_write_class($fh,"DB_mysql");
bcompiler_write_footer($fh);
fclose($fh);
?>
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Note:
Cette fonction n'effectue pas de vérification sur les dépendances, assurez-vous donc d'écrire les classes dans l'ordre pour éviter d'avoir une alerte du genre 'undefined class' lorsque vous les chargerez.
(PECL bcompiler >= 0.5)
bcompiler_write_constant — Écrit une constante définie comme bytecode
$filehandle
, string $constantName
)
Lit le bytecode depuis PHP pour une constante existante
constantName et écrit le bytecode
dans le fichier ouvert désigné par filehandle.
filehandle
Une ressource de fichier retournée par la fonction fopen().
constantName
Le nom de la constante définie, sous la forme d'une chaîne de caractères.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec bcompiler_write_constant()
<?php
define("MODULE_MAX", 30);
$fh = fopen("/tmp/example","w");
bcompiler_write_header($fh);
bcompiler_write_constant($fh,"MODULE_MAX");
bcompiler_write_footer($fh);
fclose($fh);
?>
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
(PECL bcompiler >= 0.6)
bcompiler_write_file — Écrit un code source PHP sous forme de bytecode
$filehandle
, string $filename
)
Cette fonction compile le fichier filename en
bytecodes, et écrit le résultat dans le fichier filename.
filehandle
Une ressource de fichier retournée par la fonction fopen().
filename
Le chemin vers le fichier source, sous la forme d'une chaîne de caractères.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec bcompiler_write_file()
<?php
$fh = fopen("example.phb", "w");
bcompiler_write_header($fh);
bcompiler_write_file($fh, "example.php");
bcompiler_write_footer($fh);
fclose($fh);
/* Ce qui suit doit être équivalent :
include "example.php";
et
include "example.phb";
*/
?>
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
(PECL bcompiler >= 0.5)
bcompiler_write_function — Écrit une fonction définie sous forme de bytecode
$filehandle
, string $functionName
)
Lit le bytecode d'une fonction existante depuis PHP et l'écrit dans le fichier désigné
par la ressource de fichier filehandle. L'ordre
n'est pas important (e.g. si la fonction b utilise la
fonction a et que vous compilez l'exemple ci-dessous,
cela fonctionnera très bien).
filehandle
Une ressource de fichier retournée par la fonction fopen().
functionName
Le nom de la fonction, sous la forme d'une chaîne de caractères.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec bcompiler_write_function()
<?php
$fh = fopen("/tmp/example","w");
bcompiler_write_header($fh);
bcompiler_write_function($fh,"my_function_a");
bcompiler_write_function($fh,"my_function_b");
bcompiler_write_footer($fh);
fclose($fh);
?>
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
(PECL bcompiler >= 0.5)
bcompiler_write_functions_from_file — Écrit toutes les fonctions définies dans un fichier sous forme de bytecode
$filehandle
, string $fileName
)
Recherche toutes les fonctions déclarées dans le fichier nommé
fileName et écrit leurs bytecodes correspondants
dans le fichier désigné par la ressource filehandle.
filehandle
Une ressource de fichier retournée par la fonction fopen().
fileName
Le fichier à compiler. Souvenez-vous de toujours inclure ou requérir les fichiers que vous tentez de compiler.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec bcompiler_write_functions_from_file()
<?php
require('module.php');
$fh = fopen("/tmp/example","w");
bcompiler_write_header($fh);
bcompiler_write_functions_from_file($fh,'module.php');
bcompiler_write_footer($fh);
fclose($fh);
?>
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
(PECL bcompiler >= 0.3)
bcompiler_write_header — Écrit l'en-tête bcompiler
$filehandle
[, string $write_ver
] )Écrit l'en-tête bcompiler.
filehandle
Une ressource de fichier retournée par la fonction fopen().
write_ver
Peut être utilisé pour écrire le bytecode dans un format utilisé précédemment, vous pouvez donc l'utiliser avec les anciennes versions de bcompiler.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec bcompiler_write_header()
<?php
$fh = fopen("/tmp/example","w");
bcompiler_write_header($fh);
bcompiler_write_class($fh,"DB");
bcompiler_write_footer($fh);
fclose($fh);
?>
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
(PECL bcompiler >= 0.5)
bcompiler_write_included_filename — Écrit un fichier inclus en tant que bytecode
$filehandle
, string $filename
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Voici des fonctions gérant les erreurs et les journaux. Elles vous permettent de définir vos propres règles de gestion des erreurs, mais aussi la façon dont les erreurs sont enregistrées ; ceci afin de répondre à vos besoins particuliers.
Avec les fonctions de journal, vous pouvez envoyer des messages directement à d'autres machines (ou des emails avec une passerelles), vers les logs du système, etc..., ainsi, vous pouvez sélectionner les messages et surveiller les parties les plus importantes de vos applications et de vos sites web.
Les fonctions sur le rapport d'erreurs vous permettent de personnaliser le degré et les erreurs désirées, en les catégorisant comme simple avertissement jusqu'à l'exécution de fonctions personnalisées lorsque des erreurs surviennent.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Il n'y pas d'installation nécessaire pour utiliser ces fonctions, elles font parties du coeur de PHP.
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
| Nom | Défaut | Modifiable | Historique |
|---|---|---|---|
| error_reporting | NULL | PHP_INI_ALL | |
| display_errors | "1" | PHP_INI_ALL | |
| display_startup_errors | "0" | PHP_INI_ALL | |
| log_errors | "0" | PHP_INI_ALL | |
| log_errors_max_len | "1024" | PHP_INI_ALL | Disponible depuis PHP 4.3.0. |
| ignore_repeated_errors | "0" | PHP_INI_ALL | Disponible depuis PHP 4.3.0. |
| ignore_repeated_source | "0" | PHP_INI_ALL | Disponible depuis PHP 4.3.0. |
| report_memleaks | "1" | PHP_INI_ALL | Disponible depuis PHP 4.3.0. |
| track_errors | "0" | PHP_INI_ALL | |
| html_errors | "1" | PHP_INI_ALL | PHP_INI_SYSTEM in PHP <= 4.2.3. |
| xmlrpc_errors | "0" | PHP_INI_SYSTEM | Disponible depuis PHP 4.1.0. |
| xmlrpc_error_number | "0" | PHP_INI_ALL | Disponible depuis PHP 4.1.0. |
| docref_root | "" | PHP_INI_ALL | Disponible depuis PHP 4.3.0. |
| docref_ext | "" | PHP_INI_ALL | Disponible depuis PHP 4.3.2. |
| error_prepend_string | NULL | PHP_INI_ALL | |
| error_append_string | NULL | PHP_INI_ALL | |
| error_log | NULL | PHP_INI_ALL |
Voici un éclaircissement sur l'utilisation des directives de configuration.
error_reporting
integer
Fixe le niveau d'erreur. Ce paramètre est un entier, représentant un champ de bits. Ajoutez les valeurs suivantes pour choisir le niveau que vous désirez, telles que décrites dans la section Constantes pré-définies, et dans le fichier php.ini. Pour modifier cette configuration durant l'exécution du script, utilisez la fonction error_reporting(). Voyez aussi la directive display_errors.
En PHP 4 et PHP 5, la configuration par défaut est
E_ALL & ~E_NOTICE. Elle montre toutes les erreurs, sauf
les E_NOTICE. Il est recommandé de les afficher
durant le développement.
Note:
Activer le rapport d'erreur de niveau
E_NOTICEdurant le développement a des avantages. En terme de déboguage, les message d'alertes vous signalent des bogues potentiels dans votre code. Par exemple, l'utilisation de valeurs non initialisées est signalée. Il est aussi plus pratique pour trouver des coquilles, et, ainsi, gagner du temps. Les messages NOTICE vous signaleront aussi les mauvaises pratiques de codage. Par exemple $arr[item] doit toujours être écrit $arr['item'] car PHP va considérer "item" comme une constante, au premier abord. Si cette constante n'est pas définie, alors il va l'utiliser comme une chaîne.
Note:
En PHP 5, un nouveau niveau d'erreur nommé
E_STRICTest disponible. CommeE_STRICTn'est pas inclus dansE_ALL, vous devez explicitement activer ce niveau d'erreur. ActiverE_STRICTpendant le développement peut être bénéfique. Les messages STRICT vous aideront à utiliser la dernière et meilleure suggestion de méthode de codage, par exemple, vous alertera de l'utilisation de fonctions non recommandées.
Note: Les constantes PHP en dehors de PHP
L'utilisation des constantes PHP en dehors de PHP, comme dans le fichier httpd.conf, n'a pas de signification utile mise à part dans les cas où des valeurs entières sont nécessaires. Et depuis que les niveaux d'erreurs ont été ajoutés, la valeur maximale (pour
E_ALL) devrait changer. Donc, à la place deE_ALL, utilisez plutôt une valeur plus grande pour couvrir tous les octets, une valeur numérique comme 2147483647 (incluant toutes les erreurs, et non juste les erreurs de typeE_ALL).
display_errors
string
Cette directive détermine si les erreurs doivent être affichées à l'écran ou non.
La valeur "stderr" envoie les erreurs vers stderr plutôt que vers stdout. La valeur est disponible depuis PHP 5.2.4. Dans les anciennes versions, cette directive était du type boolean.
Note:
C'est une directive nécessaire en développement mais qui ne doit jamais être utilisée sur un système en production. (e.g. systèmes connectés à Internet).
Note:
Bien que display_errors peut être défini en cours d'exécution (avec la fonction ini_set()), il n'aura aucun effet si le script a des erreurs fatales, car l'action désirée au moment de l'exécution ne sera pas exécutée.
display_startup_errors
boolean
Même si display_errors est activé, des erreurs peuvent survenir lors de la séquence de démarrage de PHP, et ces erreurs sont cachées. Avec cette option, vous pouvez les afficher, ce qui est recommandé pour le déboguage. En dehors de ce cas, il est fortement recommandé de laisser display_startup_errors à off.
log_errors
boolean
Indique où les messages d'erreur générés doivent être écrits : dans l'historique du serveur ou dans error_log. Cette fonction est spécifique aux serveurs.
Note:
Il est recommandé d'utiliser l'historique d'erreur, plutôt que d'afficher les erreurs sur les sites de production.
log_errors_max_len
integer
Configure la taille maximale des erreurs qui seront enregistrées dans l'historique, en kilo octets. Dans les informations de error_log, l'origine est ajoutée. La valeur par défaut est de 1024. 0 signifie qu'il n'y a pas de limite de taille. Cette longueur est appliquée pour enregistrer dans l'historique les erreurs, afficher les erreurs et également à $php_errormsg.
Lorsqu'un entier est utilisé, sa valeur est mesurée en octets. Vous pouvez également utiliser la notation sténographique comme décrit dans cette entrée de la FAQ..ignore_repeated_errors
boolean
Ne pas enregistrer des messages répétitifs. Les erreurs répétées
doivent survenir au même moment, à la même ligne et depuis le même fichier de script,
à moins que ignore_repeated_source
soit défini à TRUE.
ignore_repeated_source
boolean
Ignore la source du message lors des messages répétés. Lorsque vous avez configuré cette option à On, vous n'enregistrerez pas les erreurs répétées provenant de fichiers et lignes de code différents.
report_memleaks
boolean
Si ce paramètre est défini à On (par défaut), il affichera un rapport de fuite
mémoire détectée par le gestionnaire de mémoire Zend. Ce rapport sera envoyé à
stderr sur les plate-formes Posix. Sous Windows, il sera envoyé au débogueur
en utilisant OutputDebugString(), et pourra être lu avec des outils comme
» DbgView. Ce paramètre n'a d'effet que
lors d'une compilation de débogage, et si error_reporting inclut
E_WARNING dans sa liste autorisée.
track_errors
boolean
Si cette option est activée, le dernier message d'erreur sera placé dans la variable $php_errormsg.
html_errors
boolean
Désactive les balises HTML dans les messages d'erreurs. Le nouveau format d'erreurs HTML fournit des messages avec liens hypertexte, qui redirige l'utilisateur vers la documentation de l'erreur ou de la fonction. Ces références sont affectées par docref_root et docref_ext.
xmlrpc_errors
boolean
Désactive le rapport normal d'erreur et formate les erreurs comme des messages d'erreur XML-RPC.
xmlrpc_error_number
integer
Utilisé comme valeur de l'élément XML-RPC faultcode.
docref_root
string
Le nouveau format d'erreur contient une référence à une page décrivant
l'erreur, ou la fonction ayant causé l'erreur. Pour le manuel, vous pouvez
télécharger ce dernier dans votre langue, et configurer cette option pour qu'elle
pointe sur lui. Si votre copie du manuel est accessible à
"/manual/", vous pouvez simplement utiliser
docref_root=/manual/. De plus, vous devez configurer
docref_ext pour qu'elle corresponde aux extensions de votre manuel.
docref_ext=.html. Il est possible d'utiliser des
références externes. Par exemple, vous pouvez utiliser
docref_root=http://manual/en/ ou
docref_root="http://landonize.it/?how=url&theme=classic&filter=Landon&url=http%3A%2F%2Fwww.php.net%2F"
La plupart du temps, vous utilisez l'option docref_root avec un slash a la fin ("/"). Mais ce n'est pas obligatoire, comme le montre le second exemple ci-dessus.
Note:
Cette directive est destiné à vous aider dans votre développement en rendant facile la consultation de la description d'une fonction. Ne jamais l'utiliser sur un système de production (e.g. système connecté à Internet).
docref_ext
string
Voir aussi docref_root.
Note:
La valeur de docref_ext doit commencer par un point ".".
error_prepend_string
string
La chaîne à placer avant les messages d'erreur.
error_append_string
string
La chaîne à placer après les messages d'erreur.
error_log
string
Nom du fichier où seront enregistrées les erreurs. Le fichier doit être accessible en écriture par l'utilisateur exécutant le serveur web. Si la valeur spéciale syslog est utilisée, les erreurs seront envoyées au système d'historique du serveur. Sous Unix, cela correspond à syslog(3) et sous Windows NT, à l'historique d'événement. L'historique n'est pas supporté sous Windows 95. Voir aussi : syslog(). Si cette directive n'est pas fixée, les erreurs sont envoyées au journal d'erreurs SAPI. Par exemple, s'il s'agit d'une erreur de journal dans Apache ou stderr dans CLI.
Cette extension ne définit aucune ressource.
Les constantes listées ici sont toujours disponibles dans PHP.
Note: Vous pouvez utiliser ces constantes dans le fichier php.ini mais pas hors de PHP, comme dans le fichier httpd.conf, où vous devez utiliser les valeurs des champs de bits.
| Valeur | Constante | Description | Note |
|---|---|---|---|
| 1 |
E_ERROR
(entier)
|
Les erreurs sont aussi affichées par défaut, et l'exécution du script est interrompue. Elles indiquent des erreurs qui ne peuvent pas être ignorées, comme des problèmes d'allocation de mémoire, par exemple. | |
| 2 |
E_WARNING
(entier)
|
Les alertes sont affichées par défaut, mais n'interrompent pas l'exécution du script. Elles indiquent un problème qui doit être intercepté par le script durant l'exécution du script. Par exemple, appeler ereg() avec une expression rationnelle invalide. | |
| 4 |
E_PARSE
(entier)
|
Les erreurs d'analyse ne doivent être générées que par l'analyseur. Elles ne sont citées ici que dans le but d'être exhaustif. | |
| 8 |
E_NOTICE
(entier)
|
Les remarques ne sont pas affichées par défaut, et indiquent que le script a rencontré quelque chose qui peut être une erreur, mais peut aussi être un événement normal dans la vie du script. Par exemple, essayer d'accéder à une valeur qui n'a pas été déclarée, ou appeler stat() sur un fichier qui n'existe pas. | |
| 16 |
E_CORE_ERROR
(entier)
|
Elles sont similaires aux erreurs E_ERROR, mais
elles sont générées par le code source de PHP. Les fonctions
ne doivent pas générer ce genre d'erreur.
|
|
| 32 |
E_CORE_WARNING
(entier)
|
Elles sont similaires à E_WARNING, mais elles sont
générées par le code source de PHP. Les fonctions ne doivent
pas générer ce genre d'erreur.
|
|
| 64 |
E_COMPILE_ERROR
(entier)
|
Elles sont similaires à E_ERROR, mais elles sont générées
par le moteur Zend. Les fonctions ne doivent pas générer ce genre
d'erreur.
|
|
| 128 |
E_COMPILE_WARNING
(entier)
|
Elles sont similaires à E_WARNING, mais elles sont générées
par le moteur Zend. Les fonctions ne doivent pas générer ce genre
d'erreur.
|
|
| 256 |
E_USER_ERROR
(entier)
|
Message d'erreur généré par l'utilisateur. Comparable à
E_ERROR. Elle est générée par le programmeur en PHP
par l'utilisation de la fonction trigger_error().
Les fonctions de PHP ne doivent pas générer ce genre d'erreur.
|
|
| 512 |
E_USER_WARNING
(entier)
|
Message d'erreur généré par l'utilisateur. Comparable à
E_WARNING. Elle est générée par le programmeur en PHP
par l'utilisation de la fonction trigger_error().
Les fonctions de PHP ne doivent pas générer ce genre d'erreur.
|
|
| 1024 |
E_USER_NOTICE
(entier)
|
Message d'erreur généré par l'utilisateur. Comparable à
E_NOTICE. Elle est générée par le programmeur en PHP
par l'utilisation de la fonction trigger_error().
Les fonctions de PHP ne doivent pas générer ce genre d'erreur.
|
|
| 2048 |
E_STRICT
(entier)
|
Permet d'obtenir des suggestions de PHP pour modifier votre code, assurant ainsi une meilleure interopérabilité et compatibilité de celui-ci. | Depuis PHP 5 mais ne fais pas parti de
E_ALL jusqu'à PHP 5.4.0 |
| 4096 |
E_RECOVERABLE_ERROR
(entier)
|
Erreur fatale qui peut être captée. Ceci indique qu'une erreur
probablement dangereuse s'est produite, mais n'a pas laissé le moteur Zend
dans un état instable. Si l'erreur n'est pas attrapée par un
gestionnaire d'erreur défini par l'utilisateur (voyez aussi
set_error_handler(), l'application arrête
prématurément comme si cela était une E_ERROR.
|
Depuis PHP 5.2.0 |
| 8192 |
E_DEPRECATED
(entier)
|
Alertes d'exécution. Activer cette option pour recevoir des alertes sur les portions de votre code qui pourraient ne pas fonctionner avec les futures versions. | Depuis PHP 5.3.0 |
| 16384 |
E_USER_DEPRECATED
(entier)
|
Message d'alerte généré par l'utilisateur. Fonctionne de la même façon que
E_DEPRECATED, mise à part que le message est généré
par votre code PHP en utilisant la fonction trigger_error().
|
Depuis PHP 5.3.0 |
| 32767 |
E_ALL
(entier)
|
Toutes les erreurs et alertes supportées sauf le niveau
E_STRICT avant la version 5.4.0 de PHP.
|
32767 en PHP 5.4.x, 30719 en PHP 5.3.x, 6143 en PHP 5.2.x, et 2047 auparavant |
Les valeurs ci-dessus (numérique ou symbolique) sont utilisées pour constituer des champs de bits, qui spécifient le niveau de rapport d'erreur. Vous pouvez utiliser les opérateurs de bits pour combiner ces valeurs pour en faire des masques qui filtrent certaines erreurs. Notez bien que seuls '|', '~', '!', '^' et '&' seront compris dans le fichier php.ini.
Ci-dessous, vous trouverez un exemple de gestion des erreurs par PHP. Il y est défini un gestionnaire d'erreur, qui enregistre les informations dans un fichier (au format XML), et envoie un courriel au développeur si l'erreur est critique.
Exemple #1 Gestion d'erreurs avancées en PHP
<?php
// Nous allons faire notre propre gestion
error_reporting(0);
// Fonction spéciale de gestion des erreurs
function userErrorHandler($errno, $errmsg, $filename, $linenum, $vars)
{
// Date et heure de l'erreur
$dt = date("Y-m-d H:i:s (T)");
// Définit un tableau associatif avec les chaînes d'erreur
// En fait, les seuls niveaux qui nous interessent
// sont E_WARNING, E_NOTICE, E_USER_ERROR,
// E_USER_WARNING et E_USER_NOTICE
$errortype = array (
E_ERROR => 'Erreur',
E_WARNING => 'Alerte',
E_PARSE => 'Erreur d\'analyse',
E_NOTICE => 'Note',
E_CORE_ERROR => 'Core Error',
E_CORE_WARNING => 'Core Warning',
E_COMPILE_ERROR => 'Compile Error',
E_COMPILE_WARNING => 'Compile Warning',
E_USER_ERROR => 'Erreur spécifique',
E_USER_WARNING => 'Alerte spécifique',
E_USER_NOTICE => 'Note spécifique',
E_STRICT => 'Runtime Notice',
E_RECOVERABLE_ERROR => 'Catchable Fatal Error'
);
// Les niveaux qui seront enregistrés
$user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);
$err = "<errorentry>\n";
$err .= "\t<datetime>" . $dt . "</datetime>\n";
$err .= "\t<errornum>" . $errno . "</errornum>\n";
$err .= "\t<errortype>" . $errortype[$errno] . "</errortype>\n";
$err .= "\t<errormsg>" . $errmsg . "</errormsg>\n";
$err .= "\t<scriptname>" . $filename . "</scriptname>\n";
$err .= "\t<scriptlinenum>" . $linenum . "</scriptlinenum>\n";
if (in_array($errno, $user_errors)) {
$err .= "\t<vartrace>".wddx_serialize_value($vars,"Variables")."</vartrace>\n";
}
$err .= "</errorentry>\n\n";
// sauvegarde de l'erreur, et mail si c'est critique
error_log($err, 3, "/usr/local/php4/error.log");
if ($errno == E_USER_ERROR) {
mail("phpdev@example.com","Critical User Error",$err);
}
}
function distance($vect1, $vect2)
{
if (!is_array($vect1) || !is_array($vect2)) {
trigger_error("Incorrect parameters, arrays expected", E_USER_ERROR);
return NULL;
}
if (count($vect1) != count($vect2)) {
trigger_error("Vectors need to be of the same size", E_USER_ERROR);
return NULL;
}
for ($i=0; $i<count($vect1); $i++) {
$c1 = $vect1[$i]; $c2 = $vect2[$i];
$d = 0.0;
if (!is_numeric($c1)) {
trigger_error("Coordinate $i in vector 1 is not a number, using zero",
E_USER_WARNING);
$c1 = 0.0;
}
if (!is_numeric($c2)) {
trigger_error("Coordinate $i in vector 2 is not a number, using zero",
E_USER_WARNING);
$c2 = 0.0;
}
$d += $c2*$c2 - $c1*$c1;
}
return sqrt($d);
}
$old_error_handler = set_error_handler("userErrorHandler");
// constante non définie, qui génère une alerte
$t = I_AM_NOT_DEFINED;
// définition de quelques vecteurs
$a = array (2, 3, "foo");
$b = array (5.5, 4.3, -1.6);
$c = array (1, -3);
// génère une erreur utilisateur
$t1 = distance ($c, $b)."\n";
// génère une erreur utilisateur
$t2 = distance ($b, "i am not an array")."\n";
// Génère une alerte
$t3 = distance ($a, $b)."\n";
?>
Voir aussi la fonction syslog().
(PHP 4 >= 4.3.0, PHP 5)
debug_backtrace — Génère le contexte de déboguage
$options = DEBUG_BACKTRACE_PROVIDE_OBJECT
[, int $limit = 0
]] )debug_backtrace() génère un contexte de déboguage PHP.
options
Depuis PHP 5.3.6, ce paramètre est un masque d'options suivantes :
| DEBUG_BACKTRACE_PROVIDE_OBJECT | Si l'on doit ou non peupler l'index "object". |
| DEBUG_BACKTRACE_IGNORE_ARGS | Si l'on doit ou non omettre l'index "args" et donc tous les arguments de la fonction/méthode pour économiser de la mémoire. |
TRUE ou FALSE,
ce qui revenait à, respectivement, définir ou non l'option
DEBUG_BACKTRACE_PROVIDE_OBJECT.
limit
Depuis 5.4.0, ce paramètre peut être utilisé pour limiter
le nombre de trames dans la pile retournée. Par défaut
(limit=0), la
fonction retourne toutes les trames de la pile.
Retourne un tableau de tableaux associatifs. Les éléments de retour possibles sont les suivants :
| Nom | Type | Description |
|---|---|---|
| function | chaîne de caractères | Le nom de la fonction courante. Voir aussi __FUNCTION__. |
| line | entier | Le numéro de la ligne courante. Voir aussi __LINE__. |
| file | chaîne de caractères | Le nom du fichier courant. Voir aussi __FILE__. |
| class | chaîne de caractères | Le nom de la classe courante. Voir aussi __CLASS__. |
| object | objet | L'objet courant. |
| type | chaîne de caractères | Le type de classe courante. Si une méthode est appelée, "->" est retourné. Si une méthode statique est appelée, "::" est retourné. Si une fonction est appelée, rien ne sera retourné. |
| args | tableau | Si à l'intérieur d'une fonction, ceci liste des arguments. Si dans un fichier inclus, ceci liste des fichiers inclus. |
| Version | Description |
|---|---|
| 5.4.0 |
Le paramètre optionnel limit a été ajouté.
|
| 5.3.6 |
Le paramètre provide_object a été modifié en
options et d'autres options
DEBUG_BACKTRACE_IGNORE_ARGS ont été ajoutées.
|
| 5.2.5 |
Ajout du paramètre optionnel provide_object.
|
| 5.1.1 | Ajout de l'objet courant comme élément de retour possible. |
Exemple #1 Exemple avec debug_backtrace()
<?php
// filename: /tmp/a.php
function a_test($str)
{
echo "\nHi: $str";
var_dump(debug_backtrace());
}
a_test('friend');
?>
<?php
// filename: /tmp/b.php
include_once '/tmp/a.php';
?>
Résultat de l'exécution de /tmp/b.php :
Hi: friend
array(2) {
[0]=>
array(4) {
["file"] => string(10) "/tmp/a.php"
["line"] => int(10)
["function"] => string(6) "a_test"
["args"]=>
array(1) {
[0] => &string(6) "friend"
}
}
[1]=>
array(4) {
["file"] => string(10) "/tmp/b.php"
["line"] => int(2)
["args"] =>
array(1) {
[0] => string(10) "/tmp/a.php"
}
["function"] => string(12) "include_once"
}
}
(PHP 5)
debug_print_backtrace — Affiche la pile d'exécution PHP
$options = 0
[, int $limit = 0
]] )debug_print_backtrace() affiche la pile d'exécution de PHP. Elle affiche les appels aux fonctions, aux fichiers inclus / requis ainsi que les appels à eval().
options
Depuis 5.3.6, ce paramètre est un masque d'options suivantes :
| DEBUG_BACKTRACE_IGNORE_ARGS | Si l'on doit omettre l'index "args" et ainsi, tous les arguments de la méthode/fonction pour préserver la mémoire. |
limit
Depuis 5.4.0, ce paramètre peut être utilisé pour limiter le nombre de trames
de la pile à afficher. Par défaut (limit=0),
toutes les trames de la pile seront affichées.
Aucune valeur n'est retournée.
| Version | Description |
|---|---|
| 5.4.0 |
Ajout du paramètre optionnel limit.
|
| 5.3.6 |
Ajout du paramètre optionnel options.
|
Exemple #1 Exemple avec debug_print_backtrace()
<?php
// fichier include.php
function a() {
b();
}
function b() {
c();
}
function c(){
debug_print_backtrace();
}
a();
?>
<?php
// fichier test.php
// C'est le fichier que vous devez exécuter
include 'include.php';
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
#0 c() called at [/tmp/include.php:10] #1 b() called at [/tmp/include.php:6] #2 a() called at [/tmp/include.php:17] #3 include(/tmp/include.php) called at [/tmp/test.php:3]
(PHP 5 >= 5.2.0)
error_get_last — Récupère la dernière erreur survenue
Récupère la dernière erreur survenue.
Retourne un tableau associatif décrivant la dernière erreur avec les clés
"type", "message", "file" et "line". Si l'erreur a été causée par une fonctione
interne à PHP, le message commencera par le nom de cette fonction. Retourne NULL
s'il n'y a actuellement aucune erreur.
Exemple #1 Exemple avec error_get_last()
<?php
echo $a;
print_r(error_get_last());
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[type] => 8
[message] => Undefined variable: a
[file] => C:\WWW\index.php
[line] => 2
)
(PHP 4, PHP 5)
error_log — Stocke un message d'erreur
$message
[, int $message_type = 0
[, string $destination
[, string $extra_headers
]]] )Envoie un message d'erreur à l'historique d'erreur du serveur web ou à un fichier.
message
Le message d'erreur qui doit être stocké.
message_type
Spécifie la destination du message d'erreur. Les types possibles de messages sont :
| 0 |
message est envoyé à l'historique
PHP, qui est basé sur l'historique système ou un fichier,
en fonction de la configuration de error_log. C'est l'option par défaut.
|
| 1 |
message est envoyé par email à
l'adresse destination. C'est le seul type qui
utilise le quatrième paramètre
extra_headers.
|
| 2 | N'est plus une option. |
| 3 |
message est ajouté au fichier
destination. Aucune nouvelle ligne
(retour chariot) n'est automatiquement ajoutée à la fin de la chaîne
message.
|
| 4 |
message est envoyé directement au gestionnaire
d'identification SAPI.
|
destination
La destination. Cela dépend du paramètre
message_type décrit ci-dessus.
extra_headers
Les en-têtes supplémentaires. Ils sont utilisés lorsque le paramètre
message_type est défini à
1. Ce type de message utilise la même fonction interne
que la fonction mail().
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
| Version | Description |
|---|---|
| 5.2.7 |
La valeur possible pour 4 a été ajoutée à message_type.
|
Exemple #1 Exemples avec error_log()
<?php
// Envoie une notification par l'historique du serveur web,
// si la connexion à la base de données est impossible.
if (!Ora_Logon($username, $password)) {
error_log("Base Oracle indisponible !", 0);
}
// Indiquer à l'administrateur, par email, qu'il n'y a plus de FOO
if (!($foo = allocate_new_foo())) {
error_log("Aya!, Il ne reste plus de FOO disponibles !", 1,
"operateur@example.com");
}
// D'autres manières d'appeler error_log():
error_log("Grosse bourde !", 3, "/var/tmp/mes-erreurs.log");
?>
(PHP 4, PHP 5)
error_reporting — Fixe le niveau de rapport d'erreurs PHP
$level
] )
error_reporting() modifie la directive
error_reporting
pendant l'exécution du script. PHP possède plusieurs niveaux d'erreurs,
utiliser cette fonction configure ce niveau pendant la durée (d'exécution)
de votre script. Si le paramètre optionnel level
n'est pas défini, error_reporting() retournera
uniquement le niveau de rapport d'erreurs courant.
level
Le nouveau niveau error_reporting. Il peut être un champ de bits ou une combinaison de constantes. L'utilisation des constantes est vivement recommandée pour assurer une compatibilité maximale avec les futures versions. Au fur et à mesure que de nouveaux niveaux d'erreurs sont créés, les valeurs évoluent, c'est pourquoi les anciennes valeurs n'ont plus forcément la même signification.
Les constantes représentant les niveaux d'erreurs disponibles et la signification de ces niveaux d'erreurs est décrite dans le manuel sur les constantes prédéfinies.
Retourne l'ancien niveau
d'error_reporting ou
le niveau d'erreurs courant si le paramètre
level n'est pas fourni.
| Version | Description |
|---|---|
| 5.4.0 | E_STRICT devient une partie de E_ALL. |
| 5.3.0 |
E_DEPRECATED et E_USER_DEPRECATED
ont été introduits.
|
| 5.2.0 |
E_RECOVERABLE_ERROR est introduit.
|
| 5.0.0 |
E_STRICT est introduit (ne fait plus
partie de E_ALL).
|
Exemple #1 Exemple avec error_reporting()
<?php
// Désactiver le rapport d'erreurs
error_reporting(0);
// Rapporte les erreurs d'exécution de script
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// Rapporter les E_NOTICE peut vous aider à améliorer vos scripts
// (variables non initialisées, variables mal orthographiées..)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
// Rapporte toutes les erreurs à part les E_NOTICE
// C'est la configuration par défaut de php.ini
error_reporting(E_ALL ^ E_NOTICE);
// Reporte toutes les erreurs PHP (Voir l'historique des modifications)
error_reporting(E_ALL);
// Reporte toutes les erreurs PHP
error_reporting(-1);
// Même chose que error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);
?>
La plupart des erreurs E_STRICT sont
évaluées au moment de la compilation, comme les erreurs
qui ne sont pas reportées dans le fichier lorsque
error_reporting
est défini pour inclure les erreurs E_STRICT
(et vice-versa).
En passant la valeur -1, toutes les erreurs possibles
seront affichées, même lors de l'ajout d'autres niveaux et constantes
dans les futures versions de PHP. La constante E_ALL
fonctionne de la même façon depuis PHP 5.4.
(PHP 4 >= 4.0.1, PHP 5)
restore_error_handler — Réactive l'ancienne fonction de gestion des erreurs
Utilisée après avoir modifié la fonction de gestion des erreurs, grâce à set_error_handler(), restore_error_handler() permet de réutiliser l'ancienne version de gestion des erreurs (qui peut être la fonction PHP par défaut, ou une autre fonction utilisateur).
Cette fonction retourne toujours TRUE.
Exemple #1 Exemple avec restore_error_handler()
Si unserialize() cause une erreur, alors le gestionnaire d'erreurs original est restauré.
<?php
function unserialize_handler($errno, $errstr)
{
echo "Valeur incorrectement linéarisée.\n";
}
$serialized = 'foo';
set_error_handler('unserialize_handler');
$original = unserialize($serialized);
restore_error_handler();
?>
L'exemple ci-dessus va afficher :
Valeur incorrectement linéarisée.
Note:
L'appel de la fonction restore_error_handler() depuis la fonction error_handler est ignoré.
(PHP 5)
restore_exception_handler — Réactive l'ancienne fonction de gestion d'exceptions
restore_exception_handler() est utilisé, après le changement de la fonction de gestion d'exceptions avec la fonction set_exception_handler(), pour revenir à l'ancien gestionnaire d'exceptions (qui peut être la fonction interne ou une fonction définie par l'utilisateur).
Cette fonction retourne toujours TRUE.
Exemple #1 Exemple avec restore_exception_handler()
<?php
function exception_handler_1(Exception $e)
{
echo '[' . __FUNCTION__ . '] ' . $e->getMessage();
}
function exception_handler_2(Exception $e)
{
echo '[' . __FUNCTION__ . '] ' . $e->getMessage();
}
set_exception_handler('exception_handler_1');
set_exception_handler('exception_handler_2');
restore_exception_handler();
throw new Exception('Ceci utilise le premier gestionnaire d\'exception...');
?>
L'exemple ci-dessus va afficher :
[exception_handler_1] Ceci utilise le premier gestionnaire d'exception...
(PHP 4 >= 4.0.1, PHP 5)
set_error_handler — Spécifie une fonction utilisateur comme gestionnaire d'erreurs
set_error_handler() choisit la fonction utilisateur
error_handler pour gérer les erreurs dans un script.
set_error_handler() peut être utilisé pour définir votre propre manière de gérer les erreurs durant l'exécution, par exemple pour une application dans laquelle vous devez nettoyer les données/fichiers lorsqu'une erreur survient ou lorsque vous devez déclencher une erreur sous certaines conditions (en utilisant trigger_error()).
Il faut se rappeler que la fonction standard de traitement des erreurs
de PHP est alors complètement ignorée pour les erreurs de types
spécifiés par error_types à moins que la fonction
de rappel retourne FALSE.
error_reporting()
n'aura plus d'effet, et votre fonction de gestion des
erreurs sera toujours appelée. Vous pourrez toujours lire la valeur
de l'erreur courante de error_reporting et
faire réagir la fonction de gestion des erreurs en fonction.
Cette remarque est notamment valable si la commande a été
préfixée par @.
Notez aussi qu'il est alors confié à cette fonction de terminer le script (die()) si nécessaire. Si la fonction de gestion des erreurs se termine normalement, l'exécution du script se poursuivra avec l'exécution de la prochaine commande.
Les types d'erreur suivants ne peuvent pas être gérés avec cette fonction :
E_ERROR, E_PARSE,
E_CORE_ERROR, E_CORE_WARNING,
E_COMPILE_ERROR,
E_COMPILE_WARNING ainsi que la plupart des
E_STRICT d'un fichier lorsque
set_error_handler() est appelé.
Si une erreur survient avant que le script ne soit exécuté (par exemple un téléchargement de fichier), le gestionnaire d'erreurs personnalisé ne pourra pas être appelé, car il n'est pas encore enregistré.
error_handler
La fonction utilisateur doit accepter deux paramètres : le code d'erreur et une chaîne décrivant le code d'erreur. Depuis, trois paramètres optionnels sont fournis en même temps : le fichier dans lequel l'erreur est survenue, la ligne à laquelle l'erreur est survenue, et le contexte dans lequel l'erreur est survenue (un tableau contenant la liste des symboles lors de l'erreur). La fonction peut être décrite comme ceci :
$errno
, string $errstr
[, string $errfile
[, int $errline
[, array $errcontext
]]] )errno
errno, contient le
niveau d'erreur, sous la forme d'un entier.
errstr
errstr, contient le
message d'erreur, sous forme de chaîne.
errfile
errfile,
contient le nom du fichier dans lequel l'erreur a été identifiée.
errline
errline,
contient le numéro de ligne à laquelle l'erreur a été identifiée.
errcontext
errcontext,
est un tableau qui pointe sur la table des symboles actifs lors
de l'erreur. En d'autres termes, errcontext
contient un tableau avec toutes les variables qui existaient lorsque
l'erreur a été déclenchée.
La fonction de gestion d'erreurs de l'utilisateur ne doit pas
modifier le contexte d'erreur.
Si la fonction retourne FALSE, alors le gestionnaire d'erreurs normal continue.
error_types
Sert de masque pour appeler la fonction
error_handler de la même façon que l'option de
configuration error_reporting
contrôle les erreurs qui sont affichées. Sans le masque,
error_handler sera appelé pour toutes les erreurs,
quelle que soit la valeur de
error_reporting.
Retourne une chaîne contenant le dernier gestionnaire d'erreurs (s'il existe).
Si le gestionnaire d'erreurs natif est utilisé, NULL est retourné.
NULL est également retourné dans le cas d'une erreur, comme une fonction
de rappel incorrecte. Si le gestionnaire d'erreurs précédent est une méthode
d'une classe, cette fonction retournera un tableau indexé de la classe et du
nom de la méthode.
| Version | Description |
|---|---|
| 5.2.0 |
Le gestionnaire d'erreurs doit retourner FALSE pour
peupler la variable $php_errormsg.
|
| 5.0.0 |
Le paramètre error_types a été introduit.
|
| 4.3.0 |
Au lieu d'un nom de fonction, un tableau contenant une référence à un objet
ainsi qu'un nom de méthode peut aussi être passé au paramètre
error_handler.
|
| 4.0.2 |
Trois paramètres optionnels pour le paramètre error_handler
de la fonction utilisateur ont été introduits. C'est le nom du fichier, le numéro de ligne
ainsi que le contexte.
|
Exemple #1 Gestionnaire d'erreurs avec set_error_handler() et trigger_error()
L'exemple ci-dessous illustre l'interception d'erreurs internes avec génération d'erreur et son exploitation dans une fonction utilisateur :
<?php
// Gestionnaire d'erreurs
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
if (!(error_reporting() & $errno)) {
// Ce code d'erreur n'est pas inclus dans error_reporting()
return;
}
switch ($errno) {
case E_USER_ERROR:
echo "<b>Mon ERREUR</b> [$errno] $errstr<br />\n";
echo " Erreur fatale sur la ligne $errline dans le fichier $errfile";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
echo "Arrêt...<br />\n";
exit(1);
break;
case E_USER_WARNING:
echo "<b>Mon ALERTE</b> [$errno] $errstr<br />\n";
break;
case E_USER_NOTICE:
echo "<b>Mon AVERTISSEMENT</b> [$errno] $errstr<br />\n";
break;
default:
echo "Type d'erreur inconnu : [$errno] $errstr<br />\n";
break;
}
/* Ne pas exécuter le gestionnaire interne de PHP */
return true;
}
// Fonction pour tester la gestion d'erreur
function scale_by_log($vect, $scale)
{
if (!is_numeric($scale) || $scale <= 0) {
trigger_error("log(x) for x <= 0 is undefined, you used: scale = $scale", E_USER_ERROR);
}
if (!is_array($vect)) {
trigger_error("Type d'entrée incorrect, tableau de valeurs attendu", E_USER_WARNING);
return null;
}
$temp = array();
foreach($vect as $pos => $value) {
if (!is_numeric($value)) {
trigger_error("La valeur à la position $pos n'est pas un nombre, utilisation 0 (zéro)", E_USER_NOTICE);
$value = 0;
}
$temp[$pos] = log($scale) * $value;
}
return $temp;
}
// Configuration du gestionnaire d'erreurs
$old_error_handler = set_error_handler("myErrorHandler");
// Génération de quelques erreurs. Commençons par créer un tableau
echo "vector a\n";
$a = array(2, 3, "foo", 5.5, 43.3, 21.11);
print_r($a);
// Générons maintenant un second tableau
echo "----\nvector b - a notice (b = log(PI) * a)\n";
/* Valeur à la position $pos n'est pas un nombre, utilisation de 0 (zéro) */
$b = scale_by_log($a, M_PI);
print_r($b);
// Ceci est un problème, nous avons utilisé une chaîne au lieu d'un tableau
echo "----\nvector c - a warning\n";
/* Type d'entrée incorrect, tableau de valeurs attendu */
$c = scale_by_log("non un tablau", 2.3);
var_dump($c); // NULL
// Ceci est une erreur critique : le logarithme de zéro ou d'un nombre négatif est indéfini
echo "----\nvector d - fatal error\n";
/* log(x) pour x <= 0 est indéfini, vous utilisez : scale = $scale" */
$d = scale_by_log($a, -2.5);
var_dump($d); // Jamais atteint
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
vector a
Array
(
[0] => 2
[1] => 3
[2] => foo
[3] => 5.5
[4] => 43.3
[5] => 21.11
)
----
vector b - a notice (b = log(PI) * a)
<b>Mon AVERTISSEMENT</b> [1024] La valeur à la position 2 n'est pas un nombre, utilisation de 0 (zéro)<br />
Array
(
[0] => 2.2894597716988
[1] => 3.4341896575482
[2] => 0
[3] => 6.2960143721717
[4] => 49.566804057279
[5] => 24.165247890281
)
----
vector c - an warning
<b>Mon ALERTE</b> [512] Entrée incorrect, tableau de valeurs attendu<br />
NULL
----
vector d - fatal error
<b>Mon ERREUR</b> [256] log(x) for x <= 0 est indéfini, vous utilisez : scale = -2.5<br />
Erreur fatale sur la ligne 36 dans le fichier trigger_error.php, PHP 4.0.2 (Linux)<br />
Abandon...<br />
(PHP 5)
set_exception_handler — Définit une fonction utilisateur de gestion d'exceptions
set_exception_handler() définit le gestionnaire d'exceptions
par défaut si une exception n'est pas attrapée avec un bloc
d'essai/d'attrape. L'exécution sera stoppée après l'appel à la
fonction exception_handler.
exception_handler
Nom de la fonction à appeler lorsqu'une exception qui n'a pu être attrapée survient. Cette fonction doit être définie avant l'appel de la fonction set_exception_handler(). Ce gestionnaire doit accepter un paramètre qui sera l'objet représentant l'exception qui vient d'être lancée.
Note:
NULLpeut aussi être passé, pour réinitialiser ce gestionnaire en son statut par défaut.
Retourne le nom du gestionnaire précédemment défini ou NULL en cas d'erreur.
Si aucun gestionnaire n'a été précédemment défini, NULL est également
retourné. Si NULL est passé, le gestionnaire sera réinitialisé dans
son état par défaut, et TRUE sera retourné.
Exemple #1 Exemple avec set_exception_handler()
<?php
function exception_handler($exception) {
echo "Exception non attrapée : " , $exception->getMessage(), "\n";
}
set_exception_handler('exception_handler');
throw new Exception('Uncaught Exception');
echo "Non exécuté\n";
?>
(PHP 4 >= 4.0.1, PHP 5)
trigger_error — Déclenche une erreur utilisateur
$error_msg
[, int $error_type = E_USER_NOTICE
] )trigger_error() est utilisé pour déclencher une erreur utilisateur. Elle peut aussi être utilisée en conjonction avec un gestionnaire d'erreurs interne, ou un gestionnaire d'erreurs utilisateur qui a été choisi comme gestionnaire d'erreurs avec set_error_handler().
trigger_error() est pratique lorsque vous devez générer une réponse particulière lors de l'exécution.
error_msg
Le message d'erreur désigné pour cette erreur. Il est limité en longueur à 1024 caractères. Tous caractères après les 1024 seront ignorés.
error_type
Le type d'erreur désigné pour cette erreur. Cela ne fonctionne qu'avec
la famille de constantes E_USER et sera par défaut
E_USER_NOTICE.
Cette fonction retourne FALSE si un paramètre incorrect est passé à
error_type, TRUE sinon.
Exemple #1 Exemple avec trigger_error()
Voir set_error_handler() pour un exemple plus conséquent.
<?php
if ($divisor == 0) {
trigger_error("Impossible de diviser par zéro", E_USER_ERROR);
}
?>
Les entités HTML contenues dans le paramètre error_msg
ne sont pas échappées. Utilisez la fonction htmlentities()
sur le message si l'erreur doit être affichée dans un navigateur.
Cette fonction est un alias de : trigger_error().
L'extension htscanner donne la possibilité d'accéder à des fichiers au format .htaccess pour configurer PHP, dossier par dossier, comme c'est possible avec Apache. Cela est particulièrement utile avec fastcgi (ISS5/6/7, lighttpd, etc.).
PHP version 5.2.0 ou plus récent.
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/htscanner
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
| Nom | Défaut | Modifiable | Historique |
|---|---|---|---|
| htscanner.config_file | ".htscanner" | PHP_INI_SYSTEM | |
| htscanner.default_docroot | "/" | PHP_INI_SYSTEM | |
| htscanner.default_ttl | "300" | PHP_INI_SYSTEM | |
| htscanner.stop_on_error | "Off" | PHP_INI_SYSTEM |
Voici un éclaircissement sur l'utilisation des directives de configuration.
htscanner.config_file
string
Nom du fichier qui contient les configurations.
htscanner.default_docroot
string
Racine Web par défaut.
htscanner.default_ttl
int
Durée de vie des documents mis en cache, exprimé en secondes.
htscanner.stop_on_error
int
Arrêt sur erreur (erreur d'analyse, ou d'affectation d'une directive INI).
Cette extension ne définit aucune ressource.
Note les inclusions, et produire une arborescence d'inclusions et d'héritage de classes à la volée.
Les fichiers peuvent avoir été inclus avec les fonctions include, include_once, require, ou require_once.
Les héritages de classes sont aussi rapportés.
PHP version 5.1.0 ou plus récente.
Le fichier inclus gengraph.php utilise la bibliothèque » graphviz, mais elle n'est pas obligatoire.
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/inclued
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
| Nom | Défaut | Modifiable | Historique |
|---|---|---|---|
| inclued.enabled | Off | PHP_INI_SYSTEM | |
| inclued.dumpdir | NULL |
PHP_INI_SYSTEM |
Voici un éclaircissement sur l'utilisation des directives de configuration.
inclued.enabled
bool
Si oui ou non, inclued est activée.
inclued.dumpdir
string
Chemin du dossier qui stocke les fichiers inclued. Si configuré, chaque requête PHP va créer un fichier dans ce dossier. Ces fichiers représentent la version sérialisée de ce qu'aurait produit inclued_get_data(), leur contenu peut donc être désérialisé au moyen de unserialize().
Comme chaque requête crée un fichier, ce dossier risque de se remplir très vite!
Cette extension ne définit aucune ressource.
Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.
Cette extension ne définit aucune constante.
Cet exemple montre comment implémenter inclued dans une application existante, et afficher les résultats.
Exemple #1 Traitement des informations dans une application PHP
<?php
// Fichier de stockage des informations d'inclusion
$fp = fopen('/tmp/wp.ser', 'w');
if ($fp) {
$clue = inclued_get_data();
if ($clue) {
fwrite($fp, serialize($clue));
}
fclose($fp);
}
?>
Maintenant que nous avons des données, il est temps de prendre du recul et d'avoir un graphique. L'extension inclued inclut un fichier PHP appelé gengraph.php qui crée un fichier DOT, qui peut être passé à la bibliothèque » graphviz. Cependant, cette approche n'est pas obligatoire.
Exemple #2 Exemple d'utilisation de gengraph.php
Cet exemple crée une image appelée inclued.png qui montre les fichiers inclus.
# First, create the dot file $ php graphviz.php -i /tmp/wp.ser -o wp.dot # Next, create the image $ dot -Tpng -o inclued.png wp.dot
Exemple #3 Lister les données depuis une capture inclued
En utilisant la directive inclued.dumpdir , des fichiers (les traces include) sont écrits à chaque requête. Voici un moyen de lister ces fichiers et utiliser unserialize() avec.
<?php
$path = ini_get('inclued.dumpdir');
if ($path && is_dir($path)) {
echo "Path: $path", PHP_EOL;
$inclues = new GlobIterator($path . DIRECTORY_SEPARATOR . 'inclued*');
if ($inclues->count() === 0) {
echo 'Pas de traces', PHP_EOL;
exit;
}
foreach ($inclues as $inclue) {
echo 'Fichier Inclus: ', $inclue->getFilename(), PHP_EOL;
$data = file_get_contents($inclue->getPathname());
if ($data) {
$inc = unserialize($data);
echo ' -- fichier: ', $inc['request']['SCRIPT_FILENAME'], PHP_EOL;
echo ' -- nombre d\'inclusions: ', count($inc['includes']), PHP_EOL;
}
echo PHP_EOL;
}
} else {
echo 'Pas de traces.', PHP_EOL;
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
PATH: /tmp/inclued Fichier Inclus: inclued.56521.1 -- fichier: /Users/philip/test.php -- nombre d'inclusions: 1 Fichier Inclus: inclued.56563.1 -- fichier: /tmp/none.php -- nombre d'inclusions: 0 Fichier Inclus: inclued.56636.1 -- fichier: /tmp/three.php -- nombre d'inclusions: 3
(PECL inclued >= 0.1.0)
inclued_get_data — Lit les données incluses
Lit les données incluses.
Cette fonction ne contient aucun paramètre.
Les données incluses.
Exemple #1 Exemple avec inclued_get_data()
Voyez les exemples avec inclued pour une méthode de représentation de ces données.
<?php
include 'x.php';
$clue = inclued_get_data();
print_r($clue);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[includes] => Array
(
[0] => Array
(
[operation] => include
[op_type] => 2
[filename] => x.php
[opened_path] => /tmp/x.php
[fromfile] => /tmp/z.php
[fromline] => 2
)
)
)
Le but de cette extension est d'identifier les scripts et les fonctions les plus consommateurs de mémoire.
memtrack surveille la consommation de mémoire dans les scripts PHP, et produit un rapport d'alertes lorsque la consommation atteint un certain niveau, défini par l'utilisateur. Ceci est réussi en remplaçant les fonctions standard par une fonction spéciale qui compare l'utilisation de mémoire avant et après le passage par une fonction : de cette manière, on sait de combien la consommation de mémoire a changé.
Le Zend Engine fait fonctionner son exécuteur pour chaque tableau d'opcodes, ce qui représente généralement une fonction ou un script, ce qui fait que memtrack n'a pas d'impact notable sur les performances.
memtrack ne fournit aucune fonction, car il n'y a que des directives d'exécution pour configurer son fonctionnement.
Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez ce module à vos risques et périls.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/memtrack
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
| Nom | Défaut | Modifiable |
|---|---|---|
| memtrack.enabled | "0" | PHP_INI_SYSTEM |
| memtrack.soft_limit | "0" | PHP_INI_ALL |
| memtrack.hard_limit | "0" | PHP_INI_ALL |
| memtrack.vm_limit | "0" | PHP_INI_ALL |
| memtrack.ignore_functions | "" | PHP_INI_SYSTEM |
Voici un éclaircissement sur l'utilisation des directives de configuration.
memtrack.enabled
boolean
Active ou non l'extension. Par défaut, c'est 0, i.e. désactivé.
memtrack.soft_limit
int
Limite mémoire logicielle.
L'extension vérifie la consommation avant et après l'exécution d'un tableau d'opcode, puis produit une alerte si la différence entre les deux valeurs est égale ou supérieure à la limite logicielle, et que la fonction n'est pas ignorée.
En donnant à cette directive la valeur de 0, on désactive les limites logicielle et physique. Par défaut, cette directive vaut 0, ce qui fait qu'aucune alerte n'est produite.
memtrack.hard_limit
int
Limite mémoire physique.
L'extension vérifie la consommation avant et après l'exécution d'un tableau d'opcode, puis produit une alerte si la différence entre les deux valeurs est égale ou supérieure à la limite logicielle, même si la fonction est ignorée. En donnant à cette directive la valeur de 0, on désactive les limites physique. Par défaut, cette directive vaut 0, ce qui fait qu'aucune alerte n'est produite.
memtrack.vm_limit
int
Limite de mémoire virtuelle (par processus).
Cette limite est vérifiée à l'extinction du script, et une alerte est émise si la consommation de mémoire est plus grande que cette limite.
Cette option est uniquement supportée sur les OS où la fonction mallinfo() est disponible (i.e. Linux).
memtrack.ignore_functions
string
Une liste de fonctions qui seront ignorées par la limite logicielle. Les fonctions sont séparées par des virgules ou des espaces. Les valeurs sont insensibles à la casse, et pour les méthodes, il faut utiliser la syntaxe classe::méthode.
Cette extension ne définit aucune ressource.
Cette extension ne définit aucune constante.
Exemple simple d'utilisation de memtrack
Exemple #1 Création d'un grand tableau
<?php
/* /tmp/exemple.php */
function foo() {
$a = array();
for ($i = 0; $i < 10000; $i++) $a[] = "test";
return $a;
}
$arr = foo();
?>
Exécution de l'exemple avec la commande suivante :
php -d memtrack.enabled=1 -d memtrack.soft_limit=1M -d memtrack.vm_limit=3M /tmp/exemple.php
L'exemple ci-dessus va afficher quelque chose de similaire à :
Warning: [memtrack] [pid 26177] user function foo() executed in /tmp/example1.php on line 10 allocated 4194304 bytes in /tmp/example1.php on line 0 Warning: [memtrack] [pid 26177] virtual memory usage on shutdown: 32911360 bytes in Unknown on line 0
Les fonctions de bufferisation de sortie vous permettent de contrôler quand les données ont été envoyées par le script. Cela peut être utile dans certaines situations, notamment si vous devez envoyer des en-têtes au navigateur après avoir envoyé des données. Ces fonctions n'affectent pas les en-têtes envoyés par la fonction header() ou les cookies envoyés par setcookie(). Seules les fonctions telles que echo et les données entre blocs PHP sont affectées.
Note:
Lors de la mise à jour depuis PHP 4.1.x (et 4.2.x) vers 4.3.x, à cause d'un bogue dans les versions précédentes, vous devez vous assurer que implicit_flush vaut OFF dans votre php.ini, sinon, tout affichage avec la fonction ob_start() sera caché.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Il n'y pas d'installation nécessaire pour utiliser ces fonctions, elles font parties du coeur de PHP.
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
| Nom | Défaut | Modifiable | Historique |
|---|---|---|---|
| output_buffering | "0" | PHP_INI_PERDIR | |
| output_handler | NULL | PHP_INI_PERDIR | Disponible depuis PHP 4.0.4. |
| implicit_flush | "0" | PHP_INI_ALL | PHP_INI_PERDIR en PHP <= 4.2.3. |
Voici un éclaircissement sur l'utilisation des directives de configuration.
output_buffering
booléen/entier
Vous pouvez activer la bufferisation de sortie pour tous les fichiers avec cette directive, en lui passant la valeur On. Si vous souhaitez limiter la taille du buffer à une certaine taille, vous pouvez alors indiquer un nombre maximum d'octets à la place de On. Par exemple, output_buffering=4096). Depuis PHP 4.3.5, cette directive est toujours désactivée en ligne de commande.
output_handler
string
Vous pouvez rediriger le résultat de tous vos scripts à une fonction avant leur envoi au navigateur. Par exemple, si vous configurez output_handler à mb_output_handler(), l'encodage des caractères sera adapté de manière transparente. Configurer une telle fonction active automatiquement la bufferisation de sortie.
Note:
Vous ne pouvez pas utiliser simultanément mb_output_handler() avec ob_iconv_handler(), non plus que ob_gzhandler() avec zlib.output_compression.
Note:
Seules les fonctions internes peuvent être utilisées avec cette directive. Pour les fonctions utilisateurs, utilisez ob_start().
implicit_flush
booléen
FALSE par défaut. En changeant cette valeur pour TRUE vous indiquez
à PHP que le buffer de sortie doit être vidé automatiquement après
chaque fonction d'affichage. Cela revient à appeler la fonction
flush() après chaque appel à
print
ou echo
et pour tous les blocs HTML.
Lorsque vous utilisez PHP en environnement web, activer cette
option a de sérieuses implications et généralement, cela n'est conseillé
que pour les déboguages. Cette valeur est par défaut à TRUE lorsque PHP
fonctionne en mode CLI SAPI.
Voir aussi ob_implicit_flush().
Cette extension ne définit aucune ressource.
Cette extension ne définit aucune constante.
Exemple #1 Exemple de bufferisation de sortie
<?php
ob_start();
echo "Bonjour\n";
setcookie("cookiename", "cookiedata");
ob_end_flush();
?>
Dans l'exemple ci-dessus, l'instruction echo est stockée dans un buffer jusqu'à l'appel de la fonction ob_end_flush(). Dans le même temps, l'appel à setcookie() a réussi à créer un cookie, sans générer d'erreur. (D'habitude, vous devez envoyer les en-têtes avant les données).
Voir aussi header() et setcookie().
(PHP 4, PHP 5)
flush — Vide les tampons de sortie
Vide les tampons d'écriture de PHP et tous ceux que PHP utilisait (CGI, un serveur web, etc.). Cette fonction tente d'envoyer tout l'affichage courant au navigateur, sous quelques conditions.
flush() peut ne pas être capable d'écraser le schéma du buffer de votre serveur web et ceci n'aura aucun effet sur le buffer du navigateur côté client. De plus, cette fonction n'affecte pas le mécanisme d'affichage du buffer de l'espace utilisateur de PHP. Cela signifie que vous devez appeler à la fois la fonction ob_flush() et la fonction flush() pour vider les tampons de sortie si vous les utilisez.
De nombreux serveurs, essentiellement sous Windows, continueront à tamporiser l'affichage de votre script jusqu'à ce qu'il soit terminé, avant de transmettre les résultats à l'internaute.
Des modules Apache comme mod_gzip utilisent leur propre tamporisation, ce qui fait que flush() n'enverra pas les données jusqu'au navigateur client immédiatement.
Même le navigateur peut réaliser une tamporisation avant de l'afficher. Netscape, par exemple, met en cache le texte jusqu'à ce qu'il reçoive une fin de ligne, ou un début d'une balise et il n'affichera pas les tables tant que la balise </table> la plus externe ne soit vue.
Certaines versions de Microsoft Internet Explorer ne commenceront l'affichage de la page qu'après avoir reçu 256 octets d'affichage. Cela vous obligera à envoyer des espaces supplémentaires pour afficher la page.
Aucune valeur n'est retournée.
(PHP 4 >= 4.2.0, PHP 5)
ob_clean — Efface le tampon de sortie
Cette fonction vide le tampon de sortie sans l'envoyer au navigateur.
Cette fonction ne détruit pas le contenu du tampon de sortie comme peut le faire ob_end_clean().
Aucune valeur n'est retournée.
(PHP 4, PHP 5)
ob_end_clean — Détruit les données du tampon de sortie et éteint la tamporisation de sortie
Cette fonction vide le contenu du premier tampon de sortie et désactive la tamporisation de sortie. Si vous voulez traiter le contenu du tampon, vous devrez appeler ob_get_contents() avant ob_end_clean(), car le tampon est détruit par ob_end_clean().
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient. Les raisons d'un tel échec sont que la
tamporisation de sortie pouvait ne pas être activée, ou que, pour
une raison quelconque, le tampon n'a pu être détruit.
Si la fonction échoue, elle génère une note E_NOTICE.
| Version | Description |
|---|---|
| 4.2.0 | La valeur booléen retournée par la fonction a été ajoutée. |
L'exemple suivant montre comment se débarrasser de tous les tampons de sortie :
Exemple #1 Exemple avec ob_end_clean()
<?php
ob_start();
echo 'Texte qui ne sera pas affiché.';
ob_end_clean();
?>
(PHP 4, PHP 5)
ob_end_flush — Envoie les données du tampon de sortie et éteint la tamporisation de sortie
Envoie le contenu du tampon de sortie (s'il existe) et éteint la tamporisation de sortie. Si vous voulez continuer à manipuler la valeur du tampon, vous pouvez appeler ob_get_contents() avant ob_end_flush() car le contenu du tampon est détruit après un appel à ob_end_flush().
Note: Cette fonction est similaire à ob_get_flush(), excepté que ob_get_flush() retourne le tampon comme une chaîne de caractères.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient. Les raisons d'échec sont que vous pourriez avoir
appelé la fonction sans avoir de tampon actif, ou que, pour une
raison quelconque, le tampon n'a pu être effacé (possible pour un
tampon spécial).
Si la fonction échoue, elle émet une alerte de type E_NOTICE.
| Version | Description |
|---|---|
| 4.2.0 | La fonction retourne une valeur booléenne. |
Exemple #1 Exemple avec ob_end_flush()
L'exemple ci-dessous montre une méthode simple pour vider tous les tampons :
<?php
while (@ob_end_flush());
?>
(PHP 4 >= 4.2.0, PHP 5)
ob_flush — Envoie le tampon de sortie
Envoie le contenu du tampon de sortie (s'il y en a un). Si vous voulez contrôler le contenu du tampon, vous devez appeler la fonction ob_get_contents() avant ob_flush() car le contenu du tampon est effacé après l'appel de ob_flush().
ob_flush() ne désactive pas la temporisation de sortie comme peut le faire ob_end_flush().
Aucune valeur n'est retournée.
(PHP 4 >= 4.3.0, PHP 5)
ob_get_clean — Lit le contenu courant du tampon de sortie puis l'efface
Lit le contenu courant du tampon de sortie puis l'efface.
ob_get_clean() exécute successivement ob_get_contents() et ob_end_clean().
Retourne le contenu du tampon de sortie et termine la session de
tamporisation. Si la tamporisation n'est pas activée, alors FALSE
sera retourné.
Exemple #1 Exemple avec ob_get_clean()
<?php
ob_start();
echo "Bonjour le monde !";
$out = ob_get_clean();
$out = strtolower($out);
var_dump($out);
?>
L'exemple ci-dessus va afficher :
string(18) "bonjour le monde !"
(PHP 4, PHP 5)
ob_get_contents — Retourne le contenu du tampon de sortie
Retourne le contenu du tampon de sortie sans l'effacer.
Retourne le contenu du tampon de sortie sans l'effacer
ou FALSE, si la tamporisation de sortie n'est pas activée.
Exemple #1 Exemple avec ob_get_contents()
<?php
ob_start();
echo "Bonjour ";
$out1 = ob_get_contents();
echo "le monde !";
$out2 = ob_get_contents();
ob_end_clean();
var_dump($out1, $out2);
?>
L'exemple ci-dessus va afficher :
string(8) "Bonjour " string(18) "Bonjour le monde !"
(PHP 4 >= 4.3.0, PHP 5)
ob_get_flush — Vide le tampon, le retourne en tant que chaîne et stoppe la tamporisation
ob_get_flush() vide le tampon, le retourne en tant que chaîne et stoppe la tamporisation.
Note: ob_get_flush() est similaire à ob_end_flush(), sauf que cette fonction retourne le tampon en tant que chaîne.
Retourne le tampon de sortie ou FALSE s'il n'y en a aucun
d'actif.
Exemple #1 Exemple avec ob_get_flush()
<?php
//Utilisation de output_buffering=On
print_r(ob_list_handlers());
//Saugarde du tampon dans un fichier
$buffer = ob_get_flush();
file_put_contents('buffer.txt', $buffer);
print_r(ob_list_handlers());
?>
L'exemple ci-dessus va afficher :
Array
(
[0] => default output handler
)
Array
(
)
(PHP 4 >= 4.0.2, PHP 5)
ob_get_length — Retourne la longueur du contenu du tampon de sortie
Retourne la longueur du contenu du tampon de sortie.
Retourne la longueur du contenu du tampon de sortie si la
tamporisation est activée, et FALSE sinon.
Exemple #1 Exemple avec ob_get_length()
<?php
ob_start();
echo "Bonjour ";
$len1 = ob_get_length();
echo "le monde";
$len2 = ob_get_length();
ob_end_clean();
echo $len1 . ", ." . $len2;
?>
L'exemple ci-dessus va afficher :
8, 16
(PHP 4 >= 4.2.0, PHP 5)
ob_get_level — Retourne le nombre de niveaux d'imbrications du système de tamporisation de sortie
Retourne le nombre de niveaux d'imbrications du système de tamporisation de sortie.
Retourne le nombre de niveaux d'imbrications du système de tamporisation de sortie, et zéro s'il n'est pas actif.
(PHP 4 >= 4.2.0, PHP 5)
ob_get_status — Lit le statut du tampon de sortie
$full_status = FALSE
] )
ob_get_status() retourne les informations sur le statut
du tampon d'affichage de haut niveau ou de tous les tampons d'affichage si
full_status est défini à TRUE.
full_status
TRUE pour retourner tous les tampons d'affichage. Si vaut FALSE
ou non défini, seul le statut du tampon d'affichage de haut niveau
sera retourné.
Si la fonction est appelée sans le paramètre full_status
ou avec le paramètre full_status = FALSE, un tableau simple avec
les éléments suivants sera retourné :
Array
(
[level] => 2
[type] => 0
[status] => 0
[name] => URL-Rewriter
[del] => 1
)
Si la fonction est appelée avec le paramètre full_status
défini à TRUE, un tableau avec un élément par tampon de sortie actif est
retourné. Le niveau de sortie est utilisé en tant que clé du tableau de
niveau élevé et chaque élément du tableau est un autre tableau contenant les
informations sur le statut du niveau du tampon actif.
Array
(
[0] => Array
(
[chunk_size] => 0
[size] => 40960
[block_size] => 10240
[type] => 1
[status] => 0
[name] => default output handler
[del] => 1
)
[1] => Array
(
[chunk_size] => 0
[size] => 40960
[block_size] => 10240
[type] => 0
[buffer_size] => 0
[status] => 0
[name] => URL-Rewriter
[del] => 1
)
)
La sortie complète contient les éléments suivants :
(PHP 4 >= 4.0.4, PHP 5)
ob_gzhandler — Fonction de rappel pour la compression automatique des tampons
$buffer
, int $mode
)
ob_gzhandler() est destinée à être utilisée comme
fonction de rappel par ob_start() pour faciliter
l'envoi de données compressées aux navigateurs qui supportent les pages
compressées. Avant que ob_gzhandler() envoie les données
compressées, il détermine les types d'encodage qui sont supportés par le
navigateur ("gzip", "deflate" ou aucun)
et retourne le contenu des tampons
de manière appropriée. Tous les navigateurs sont traités, car c'est aux
navigateurs d'envoyer un en-tête indiquant les types de pages supportés.
Si le navigateur ne supporte pas les pages compressées, cette fonction
retournera FALSE.
buffer
mode
| Version | Description |
|---|---|
| 4.0.5 |
Ajout du paramètre mode.
|
Exemple #1 Exemple avec ob_gzhandler()
<?php
ob_start("ob_gzhandler");
?>
<html>
<body>
<p>Ceci devrait être une page compressée.</p>
</body>
</html>
Note:
ob_gzhandler() nécessite l'extension zlib.
Note:
Vous ne pouvez pas utiliser simultanément ob_gzhandler() et zlib.output_compression. De plus, notez bien que zlib.output_compression est préférable à ob_gzhandler().
(PHP 4, PHP 5)
ob_implicit_flush — Active/désactive l'envoi implicite
$flag = true
] )ob_implicit_flush() active/désactive l'envoi implicite. L'envoi implicite signifie que toute fonction qui envoie des données au navigateur verra ses données envoyées immédiatement (la fonction flush() est appelée automatiquement).
flag
TRUE pour activer, FALSE sinon.
Aucune valeur n'est retournée.
(PHP 4 >= 4.3.0, PHP 5)
ob_list_handlers — Liste les gestionnaires d'affichage utilisés
Liste les gestionnaires d'affichage utilisés.
Retourne un tableau avec le gestionnaire d'affichage en cours d'utilisation (s'il existe). Si output_buffering est activé ou si une fonction anonyme est utilisée avec ob_start(), ob_list_handlers() retournera un tableau avec comme valeur d'entrée : "default output handler".
Exemple #1 Exemple avec ob_list_handlers()
<?php
//Utilisation de output_buffering=On
print_r(ob_list_handlers());
ob_end_flush();
ob_start("ob_gzhandler");
print_r(ob_list_handlers());
ob_end_flush();
// Fonctions anonymes
ob_start(create_function('$string', 'return $string;'));
print_r(ob_list_handlers());
ob_end_flush();
?>
L'exemple ci-dessus va afficher :
Array
(
[0] => default output handler
)
Array
(
[0] => ob_gzhandler
)
Array
(
[0] => default output handler
)
(PHP 4, PHP 5)
ob_start — Enclenche la tamporisation de sortie
ob_start() démarre la tamporisation de sortie. Tant qu'elle est enclenchée, aucune donnée, hormis les en-têtes, n'est envoyée au navigateur, mais temporairement mise en tampon.
Le contenu de ce tampon peut être copié dans une chaîne avec la fonction ob_get_contents(). Pour afficher le contenu de ce tampon, utilisez ob_end_flush(). Au contraire, ob_end_clean() effacera le contenu de ce tampon.
Quelques serveurs web (par exemple Apache) modifient le dossier de travail d'un script lorsqu'il appelle une fonction de rappel. Vous pouvez revenir à un comportement normal en ajoutant chdir(dirname($_SERVER['SCRIPT_FILENAME'])) dans votre fonction de rappel.
Les tampons de sortie sont gérés par pile, c'est-à-dire que vous pouvez appeler plusieurs fois ob_start() simultanément. Assurez-vous que vous appelez ob_end_flush() suffisamment souvent. Si plusieurs fonctions de rappel sont actives, les contenus seront filtrés séquentiellement, dans l'ordre d'emboîtement.
output_callback
Une fonction optionnelle de rappel peut être spécifiée.
Cette fonction prend une chaîne comme paramètre, et
retourne une chaîne. Elle sera appelée lorsque le tampon sera envoyé
ou supprimé (avec les fonctions ob_flush(),
ob_clean() ou des fonctions similaires)
ou lorsque le tampon sera envoyé
au navigateur à la fin du script et recevra le contenu du tampon de
sortie. Lorsque la fonction output_callback est
appelée, elle doit retourner un nouveau contenu pour le tampon de sortie :
celui-ci sera envoyé au navigateur. Si output_callback
n'est pas une fonction accessible, la fonction retournera FALSE.
Si la fonction de rappel a deux paramètres, le second est composé
du champ bits constitué par
PHP_OUTPUT_HANDLER_START,
PHP_OUTPUT_HANDLER_CONT et
PHP_OUTPUT_HANDLER_END.
Si output_callback retourne FALSE,
l'entrée originale est envoyée au navigateur.
Le paramètre output_callback peut être annulé
en y passant la valeur NULL.
ob_end_clean(), ob_end_flush(), ob_clean(), ob_flush() et ob_start() ne doivent pas être appelés depuis une fonction de rappel. Si vous les appelez depuis une fonction de rappel, le comportement ne sera pas défini. Si vous voulez effacer le contenu du tampon, retournez "" (une chaîne vide) comme fonction de rappel. Vous ne pourrez jamais appeler les fonctions utilisant la fonction de tamporisation de sortie comme print_r($expression, true) ou highlight_file($filename, true) depuis une fonction de rappel.
Note:
En PHP 4.0.4, ob_gzhandler() a été introduite pour faciliter l'envoi de fichiers compressés avec gzip aux navigateurs web qui supportent les pages compressées. ob_gzhandler() détermine le type d'encodage accepté par un navigateur, et retourne le contenu le plus adéquat.
chunk_size
Si le paramètre optionnel chunk_size est passé,
la fonction de rappel est appelée à chaque nouvelle ligne après
chunk_size octets d'affichage. La valeur
par défaut 0 (zéro) signifie que l'affichage
de la fonction ne sera appelé que lorsque le buffer de sortie est clos.
Avant la version PHP 5.4.0, la valeur 1 était une valeur spéciale qui définissait la taille du morceau à 4096 octets.
erase
Si le paramètre optionnel erase est défini à
FALSE, le tampon ne sera pas effacé tant que le script ne sera pas terminé.
Ceci aura pour effet d'émettre une notice et de retourner FALSE
lors de l'appel aux fonctions d'affichage et de nettoyage.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
| Version | Description |
|---|---|
| 5.4.0 | Une taille de morceau de 1 résulte maintenant en 1 octet envoyé au buffer de sortie. |
| 4.3.2 |
Cette fonction a été modifiée pour retourner FALSE dans le cas
où output_callback ne peut être exécuté.
|
| 4.2.0 |
Ajout du paramètre erase.
|
Exemple #1 Exemple de gestion de sortie avec fonction de rappel
<?php
function rappel($buffer)
{
// remplace toutes les pommes par des carottes
return (ereg_replace("pommes de terre", "carottes", $buffer));
}
ob_start("rappel");
?>
<html>
<body>
<p>C'est comme comparer des carottes et des pommes de terre.</p>
</body>
</html>
<?php
ob_end_flush();
?>
L'exemple ci-dessus va afficher :
<html> <body> <p>C'est comme comparer des carottes et des carottes.</p> </body> </html>
(PHP 4 >= 4.3.0, PHP 5)
output_add_rewrite_var — Ajoute une règle de réécriture d'URL
$name
, string $value
)Cette fonction ajoute une nouvelle paire nom/valeur au mécanisme de réécriture d'URL. Le nom et la valeur sera ajouté aux URL (en tant que paramètre GET) et aux formulaires (en tant que champs cachés) de la même façon que pour les identifiants de session lorsque la réécriture d'URL est activée avec session.use_trans_sid. Notez que les URL absolues, telles http://example.com/, ne sont pas réécrites.
Ce comportement est contrôlé par l'option url_rewriter.tags du php.ini.
Note: L'appel à cette fonction démarre implicitement la tamporisation de sortie si elle n'est pas déjà activée.
name
Le nom de la variable.
value
La valeur de la variable.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec output_add_rewrite_var()
<?php
output_add_rewrite_var('var', 'value');
// Quelques liens
echo '<a href="file.php">link</a>
<a href="http://example.com">link2</a>';
// un formulaire
echo '<form action="script.php" method="post">
<input type="text" name="var2" />
</form>';
print_r(ob_list_handlers());
?>
L'exemple ci-dessus va afficher :
<a href="file.php?var=value">link</a>
<a href="http://example.com">link2</a>
<form action="script.php" method="post">
<input type="hidden" name="var" value="value" />
<input type="text" name="var2" />
</form>
Array
(
[0] => URL-Rewriter
)
(PHP 4 >= 4.3.0, PHP 5)
output_reset_rewrite_vars — Annule la réécriture d'URL
Cette fonction annule la règle de réécriture et efface toutes les variables de réécriture précédemment définies avec la fonction output_add_rewrite_var() ou par le mécanisme de session (si session.use_trans_sid a été défini lors de l'utilisation de la fonction session_start()).
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec output_reset_rewrite_vars()
<?php
session_start();
output_add_rewrite_var('var', 'value');
echo '<a href="file.php">link</a>';
ob_flush();
output_reset_rewrite_vars();
echo '<a href="file.php">link</a>';
?>
L'exemple ci-dessus va afficher :
<a href="file.php?PHPSESSID=xxx&var=value">link</a> <a href="file.php">link</a>
Le but de cette extension est de permettre de maîtriser les appels aux méthodes et aux membres d'un objet. Seule une fonction est définie dans cette extension, overload() qui demande le nom de la classe qui doit supporter cette fonctionnalité. Cette classe doit être pourvue des méthodes nécessaires au bon fonctionnement de l'extension, c'est-à-dire : __get(), __set() et __call(), qui servent respectivement à lire, à modifier un membre et à appeler une méthode. De cette manière, l'overloading assure un contrôle sur les fonctions appelées. À l'intérieur de ces méthodes, l'overloading est désactivé, pour que vous puissiez accéder à l'objet.
Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez ce module à vos risques et périls.
Cette extension ne fait pas partie de PHP 5. PHP 5 supporte __get(), __set() et __call() nativement. Voir la page traitant de la surcharge en PHP 5 pour plus d'informations.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Afin d'utiliser ces fonctions, vous devez compiler PHP avec l'option --enable-overload . Depuis PHP 4.3.0, cette extension est activée par défaut. Pour la désactiver, utilisez l'option --disable--overload .
La version Windows de PHP dispose du support automatique de cette extension. Vous n'avez pas à ajouter de bibliothèque supplémentaire pour disposer de ces fonctions.
Note: Le support par défaut de l'extension overload a été ajouté en PHP 4.3.0.
Cette extension ne définit aucune directive de configuration.
Cette extension ne définit aucune ressource.
Cette extension ne définit aucune constante.
Voici un exemple simple de fonctions utilisant overload() :
Exemple #1 Overload avec une classe PHP
<?php
class OO {
var $a = 111;
var $elem = array('b' => 9, 'c' => 42);
// Fonction de callback pour la lecture de membre
function __get($prop_name, &$prop_value)
{
if (isset($this->elem[$prop_name])) {
$prop_value = $this->elem[$prop_name];
return true;
} else {
return false;
}
}
// Fonction de callback pour l'écriture de membre
function __set($prop_name, $prop_value)
{
$this->elem[$prop_name] = $prop_value;
return true;
}
}
// Ici, l'initiation de l'overload
overload('OO');
$o = new OO;
echo "\$o->a: $o->a\n"; // print: $o->a: 111
echo "\$o->b: $o->b\n"; // print: $o->b: 9
echo "\$o->c: $o->c\n"; // print: $o->c: 42
echo "\$o->d: $o->d\n"; // print: $o->d:
// ajout d'une nouvelle valeur au membre $elem, en programmation OOP
$o->x = 56;
// instantiation de la classe stdclass (elle existe par défaut en PHP 4)
// $val n'est pas surchargée !
$val = new stdclass;
$val->prop = 555;
// Forcez "a" à être un tableau avec l'élément $val
// Mais _set() forcera cet élément dans le tableau $elem
$o->a = array($val);
var_dump($o->a[0]->prop);
?>
(PHP 4 >= 4.3.0)
overload — Active la couche de contrôle des membres et méthodes
$class_name
)
overload() active le contrôle des
accesseurs et appels de méthodes pour la classe
class_name.
class_name
Le nom de la classe surchargée, sous la forme d'une chaîne de caractères
Aucune valeur n'est retournée.
Voir un exemple dans la section d'introduction de cette partie.
Ces fonctions vous donnent accès à de nombreuses informations sur PHP lui-même, comme les configurations d'exécution, les extensions chargées, les versions, etc. Vous trouverez aussi des fonctions pour modifier des options. Ainsi que la star des fonctions PHP phpinfo().
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Il n'y pas d'installation nécessaire pour utiliser ces fonctions, elles font parties du coeur de PHP.
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
| Nom | Défaut | Modifiable | Historique |
|---|---|---|---|
| assert.active | "1" | PHP_INI_ALL | |
| assert.bail | "0" | PHP_INI_ALL | |
| assert.warning | "1" | PHP_INI_ALL | |
| assert.callback | NULL | PHP_INI_ALL | |
| assert.quiet_eval | "0" | PHP_INI_ALL | |
| enable_dl | "1" | PHP_INI_SYSTEM | Cette fonctionnalité obsolète sera certainement supprimée dans le futur. |
| max_execution_time | "30" | PHP_INI_ALL | |
| max_input_time | "-1" | PHP_INI_PERDIR | Disponible depuis PHP 4.3.0. |
| max_input_nesting_level | "64" | PHP_INI_PERDIR | Disponible depuis PHP 4.4.8 et PHP 5.2.3. |
| max_input_vars | 1000 | PHP_INI_PERDIR | Disponible depuis PHP 5.3.9. |
| magic_quotes_gpc | "1" | PHP_INI_PERDIR | PHP_INI_ALL en PHP <= 4.2.3. Supprimé en PHP 5.4.0. |
| magic_quotes_runtime | "0" | PHP_INI_ALL | Supprimé en PHP 5.4.0. |
| zend.enable_gc | "1" | PHP_INI_ALL | Disponible depuis PHP 5.3.0. |
Voici un éclaircissement sur l'utilisation des directives de configuration.
assert.active
boolean
Active les évaluations de type assert().
assert.bail
boolean
Termine le script si une assertion échoue.
assert.warning
boolean
Émet une alerte PHP pour chaque assertion qui échoue.
assert.callback
string
Fonction définie par le programmeur, à appeler pour chaque assertion échouée.
assert.quiet_eval
boolean
Utilise la configuration courante de error_reporting() durant les évaluations d'assertions. Si activée, aucune erreur n'est affichée (error_reporting(0) implicite) durant l'évaluation. Si désactivée, les erreurs sont affichées en fonction de la configuration de error_reporting()
enable_dl
boolean
Cette directive est réellement utile lorsque PHP est compilé comme module Apache. Vous pouvez activer le chargement dynamique d'extension avec la fonction PHP dl() au cas par cas, pour chaque serveur virtuel.
La raison principale pour désactiver ce système est la sécurité. Avec le chargement dynamique, il est possible de passer outre les configurations de safe mode et open_basedir. Par défaut, le chargement dynamique est autorisé, sauf avec le safe mode. En safe mode, il est toujours impossible d'utiliser la fonction dl().
max_execution_time
entier
Fixe le temps maximal d'exécution d'un script, en secondes. Cela permet d'éviter que des scripts en boucles infinies saturent le serveur. La configuration par défaut est de 30 secondes. Lorsque PHP fonctionne depuis la ligne de commande, la valeur par défaut est 0.
Le temps d'exécution maximum n'est pas affecté par des appels systèmes tels que sleep(). Reportez-vous à la fonction set_time_limit() pour plus de détails.
Vous ne pouvez pas modifier la valeur de cette directive avec ini_set() lorsque PHP est configuré en safe mode. Le seul moyen de le faire est de désactiver le safe mode ou de changer la valeur dans php.ini.
Votre serveur web peut avoir d'autres configurations de la durée limite d'exécution qui peuvent également interrompre PHP. Apache a une directive Timeout et IIS a une fonction CGI pour cela. Par défaut, elles valent toutes les deux 300 secondes. Reportez-vous à la documentation de votre serveur web pour plus de détails.
max_input_time
entier
Cette option spécifie la durée maximale pour analyser les données d'entrée, via POST et GET. Cette durée est mesurée depuis le moment où toutes les données sont reçues du serveur jusqu'à début de l'exécution du script.
max_input_nesting_level
entier
Définit la profondeur maximale des variables d'entrées (i.e. $_GET, $_POST..)
max_input_vars
integer
Le nombre de variables d'entrée
pouvant être acceptées. L'utilisation de cette directive
permet de limiter les possibilités d'attaque par déni de service
utilisant des collisions de hashages. S'il y a plusieurs de variables
en entrée que le nombre spécifié par cette directive, une
alerte de type E_WARNING sera émise, et les
variables en trop seront supprimées de la requête. Cette limite
ne s'applique qu'à chacun des niveaux imbriqués d'un tableau multi-dimensionnel
en entrée.
magic_quotes_gpc
boolean
Cette fonctionnalité est devenue OBSOLETE depuis PHP 5.3.0 et a été SUPPRIMEE depuis PHP 5.4.0.
Fixe le mode magic_quotes pour les opérations GPC (Get/Post/Cookie). Lorsque magic_quotes est activé, tous les caractères ' (guillemets simples), " (guillemets doubles), \ (antislash) et NUL sont échappés avec un antislash.
Note:
En PHP 4, la variable $_ENV est également échappée.
Note:
Si la directive magic_quotes_sybase est aussi activée, elle écrasera magic_quotes_gpc. Avec les deux directives activées, seuls les guillemets simples seront protégés avec un autre guillemet simple (''). Les guillemets doubles, les antislashs et les NUL ne seront pas protégés.
Voir aussi get_magic_quotes_gpc().
magic_quotes_runtime
boolean
Cette fonctionnalité est devenue OBSOLETE depuis PHP 5.3.0 et a été SUPPRIMEE depuis PHP 5.4.0.
Si magic_quotes_runtime est activé, toutes les
fonctions qui obtiennent des données auprès d'une source
externe, y compris les bases de données et les fichiers texte,
verront leur guillemets échappés avec un antislash. Si
magic_quotes_sybase
est aussi activé, les guillemets simples seront échappés avec un autre
guillemet simple, plutôt qu'un antislash.
Fonctions affectées par magic_quotes_runtime
(n'incluent pas les fonctions depuis PECL):
zend.enable_gc
boolean
Active ou désactive la collecte des références circulaires.
Cette extension ne définit aucune ressource.
Les constantes listées ici sont toujours disponibles dans PHP.
| Constante | Valeur | Description |
|---|---|---|
CREDITS_GROUP |
1 | Une liste des développeurs principaux |
CREDITS_GENERAL |
2 | Crédits généraux. Design du langage, concepts, auteurs de PHP et module SAPI. |
CREDITS_SAPI |
4 | Une liste des API de serveurs, et leurs auteurs. |
CREDITS_MODULES |
8 | Une liste des extensions de PHP, et leurs auteurs |
CREDITS_DOCS |
16 | Les crédits de l'équipe de documentation |
CREDITS_FULLPAGE |
32 | Généralement utilisé combiné avec d'autres options. Cette option indique qu'une page HTML complète doit être générée. |
CREDITS_QA |
64 | Les crédits pour le groupe d'assurance qualité. |
CREDITS_ALL |
-1 | Tous les crédits. C'est l'équivalent de : CREDITS_DOCS + CREDITS_GENERAL + CREDITS_GROUP + CREDITS_MODULES + CREDITS_QA CREDITS_FULLPAGE. Elle génère une page HTML complète et autonome. C'est la valeur par défaut. |
| Constante | Valeur | Description |
|---|---|---|
INFO_GENERAL |
1 | La ligne de configuration, le chemin du php.ini, la date de compilation, le système et plus encore. |
INFO_CREDITS |
2 | Crédits de PHP. Voir aussi phpcredits(). |
INFO_CONFIGURATION |
4 | Valeurs locales et serveurs des directives PHP. Voir aussi ini_get(). |
INFO_MODULES |
8 | Les modules chargés et leurs configurations respectives. |
INFO_ENVIRONMENT |
16 | Les variables d'environnement, qui sont aussi disponibles dans $_ENV. |
INFO_VARIABLES |
32 | Toutes les variables prédéfinies : EGPCS (Environnement, GET, POST, Cookie, Server). |
INFO_LICENSE |
64 | La licence PHP. Voir aussi la » FAQ de la licence. |
INFO_ALL |
-1 | Affiche toutes les valeurs citées ci-dessus. C'est la valeur par défaut. |
| Constante | Valeur | Description |
|---|---|---|
| INI_USER | 1 | Inutilisé |
| INI_PERDIR | 2 | Inutilisé |
| INI_SYSTEM | 4 | Inutilisé |
| INI_ALL | 7 | Inutilisé |
Les constantes d'assertions servent avec la fonction assert_options().
| Constante | Directive de configuration | Description |
|---|---|---|
ASSERT_ACTIVE |
assert.active | Active l'évaluation assert(). |
ASSERT_CALLBACK |
assert.callback | Fonction de rappel des assertions échouées. |
ASSERT_BAIL |
assert.bail | Termine l'exécution des assertions échouées. |
ASSERT_WARNING |
assert.warning | Émet une alerte PHP pour chaque assertion échouée. |
ASSERT_QUIET_EVAL |
assert.quiet_eval | Désactive le error_reporting durant l'évaluation des expressions d'assertion. |
Les constantes suivantes ne sont disponibles que si le système d'hébergement est sur Windows, et peut vous donner des informations sur les versions, qui vous permettront de détecter la présence de fonctionnalités. Elles sont disponibles depuis PHP 5.3.0.
| Constante | Description |
|---|---|
PHP_WINDOWS_VERSION_MAJOR |
La version majeure de Windows, qui peut être 4 (NT4/Me/98/95), 5 (XP/2003 R2/2003/2000) ou 6 (Vista/2008). |
PHP_WINDOWS_VERSION_MINOR |
La version mineure de Windows, qui peut être 0 (Vista/2008/2000/NT4/95), 1 (XP), 2 (2003 R2/2003/XP x64), 10 (98) ou 90 (ME). |
PHP_WINDOWS_VERSION_BUILD |
Le numéro de compilation de Windows (par exemple, Windows Vista avec SP1 a le numéro 6001) |
PHP_WINDOWS_VERSION_PLATFORM |
La plate-forme que PHP utilise actuellement : cette valeur peut être 2 sur Windows Vista/XP/2000/NT4, Server 2008/2003 et sur Windows ME/98/95 cette valeur est 1. |
PHP_WINDOWS_VERSION_SP_MAJOR |
La version majeure du paquet de service installé : cette valeur vaut 0 si aucun paquet de service n'est disponible. Par exemple, Windows XP avec le paquet de service 3 donne la valeur 3 à cette constante. |
PHP_WINDOWS_VERSION_SP_MINOR |
La version mineur du paquet de service installé. Cette valeur est 0 si aucun paquet de service n'est installé. |
PHP_WINDOWS_VERSION_SUITEMASK |
Le masque est un champ de bits qui permet de connaître la présence de différentes fonctionnalités de Windows. Voyez la table ci-dessous pour connaître les différents champs. |
PHP_WINDOWS_VERSION_PRODUCTTYPE |
Cette constante contient la valeur utilisée pour déterminer la valeur des constantes PHP_WINDOWS_NT_*. Cette valeur peut être l'une des constantes PHP_WINDOWS_NT_*, indiquant le type de plate-forme. |
PHP_WINDOWS_NT_DOMAIN_CONTROLLER |
Le contrôleur de domaine. |
PHP_WINDOWS_NT_SERVER |
Un serveur système (eg. Server 2008/2003/2000). Notez que
si c'est un contrôleur de domaine, il est indiqué dans
PHP_WINDOWS_NT_DOMAIN_CONTROLLER.
|
PHP_WINDOWS_NT_WORKSTATION |
Un poste de travail (eg. Vista/XP/2000/NT4) |
La table ci-desous présente les fonctionnalités qui peuvent être
vérifiées dans le champ de bit de la constante
PHP_WINDOWS_VERSION_SUITEMASK.
| Bits | Description |
|---|---|
| 0x00000004 | Les composants Microsoft BackOffice sont installés. |
| 0x00000400 | Windows Server 2003, Web Edition est installé. |
| 0x00004000 | Windows Server 2003, Compute Cluster Edition est installé. |
| 0x00000080 | Windows Server 2008 Datacenter, Windows Server 2003, Datacenter Edition ou Windows 2000 Datacenter Server est installé. |
| 0x00000002 | Windows Server 2008 Enterprise, Windows Server 2003, Enterprise Edition, Windows 2000 Advanced Server, ou Windows NT Server 4.0 Enterprise Edition est installé. |
| 0x00000040 | Windows XP Embedded est installé. |
| 0x00000200 | Windows Vista Home Premium, Windows Vista Home Basic, ou Windows XP Home Edition est installé. |
| 0x00000100 | Remote Desktop est supporté, mais une seule session interactive est supportée. Cette valeur est présente, à moins que le système ne fonctionne en mode serveur d'application. |
| 0x00000001 | Microsoft Small Business Server a été installé sur le système, mais a été mis à joru vers une nouvelle version de Windows. |
| 0x00000020 | Microsoft Small Business Server est installé avec la licence cliente restreinte. |
| 0x00002000 | Windows Storage Server 2003 R2 ou Windows Storage Server 2003 est installé. |
| 0x00000010 | Terminal Services est installé. Cette valeur est toujours activée. Si cette valeur est activée, mais 0x00000100 ne l'est pas, alors le système fonctionne en mode de serveur d'application. |
| 0x00008000 | Windows Home Server est installé. |
(PHP 4, PHP 5)
assert_options — Fixe et lit différentes options d'assertions
assert_options() permet de modifier les diverses options de la fonction assert(), ou simplement connaître la configuration actuelle.
what
| Option | Directive | Valeur par défaut | Description |
|---|---|---|---|
| ASSERT_ACTIVE | assert.active | 1 | Active l'évaluation de la fonction assert() |
| ASSERT_WARNING | assert.warning | 1 | Génère une alerte PHP pour chaque assertion fausse |
| ASSERT_BAIL | assert.bail | 0 | Termine l'exécution en cas d'assertion fausse |
| ASSERT_QUIET_EVAL | assert.quiet_eval | 0 | Désactive le rapport d'erreur durant l'évaluation d'une assertion |
| ASSERT_CALLBACK | assert.callback | (NULL) |
Fonction de rappel utilisateur, pour le traitement des assertions fausses |
value
Une nouvelle valeur, optionnelle, pour l'option.
Retourne la valeur originale de l'option, ou bien FALSE en cas d'erreur.
Exemple #1 Exemple avec assert_options()
<?php
// Ceci est notre fonction pour gérer les
// erreurs d'assertion
function assert_failure()
{
echo 'Échec de l\'assertion';
}
// Ceci est notre fonction de test
function test_assert($parameter)
{
assert(is_bool($parameter));
}
// Définit nos options d'assertion
assert_options(ASSERT_ACTIVE, true);
assert_options(ASSERT_BAIL, true);
assert_options(ASSERT_WARNING, false);
assert_options(ASSERT_CALLBACK, 'assert_failure');
// Une assertion qui doit échouée
test_assert(1);
// Ceci n'est jamais atteint, car ASSERT_BAIL
// vaut true
echo 'Jamais atteint';
?>
(PHP 4, PHP 5)
assert — Vérifie si une assertion est fausse
assert() va vérifier l'assertion
assertion et prendre la mesure appropriée
si le résultat est FALSE.
Si assertion est donnée sous la forme
d'une chaîne, elle sera évaluée comme un code PHP
par la fonction assert(). Les avantages de ce type
d'assertion sont d'être moins lourd si la vérification
d'assertion est désactivée, et les messages contenant l'assertion
lorsque l'assertion échoue. Cela signifie que si vous passez une condition
booléenne en tant qu'assertion, cette condition ne sera pas considérée
comme un paramètre par la fonction d'assertion que vous avez définie avec
la fonction assert_options(), la condition est convertie
en chaîne de caractères avant l'appel à ce gestionnaire de fonction, et le booléen FALSE
sera converti en chaîne de caractères vide.
Il est recommandé de n'utiliser les assertions que comme outil de déboguage. Vous pouvez les utiliser pour les vérifications d'usage : ces conditions doivent normalement être vraies, et indiquer une erreur de programmation si ce n'est pas le cas. Vous pouvez aussi vérifier la présence de certaines extensions ou limitations du système.
Les assertions ne doivent pas être utilisées pour faire des opérations de vérifications en production, comme des vérifications de valeur d'argument. En conditions normales, votre code doit être en état de fonctionner si la vérification d'assertion est désactivée.
Le comportement de assert() peut être configuré par assert_options() ou par les directives de configuration décrites dans la page de manuel de cette fonction.
La fonction assert_options() et la directive ASSERT_CALLBACK permettent de configurer une fonction qui sera appelée lorsque l'assertion échoue.
Les fonctions de rappel pour assert() sont particulièrement utiles pour bâtir des suites de tests automatiques, car elles vous permettent de capturer facilement le code passé à l'assertion, ainsi que des informations sur le lieu et le moment de l'assertion. Même si ces informations peuvent être appelées par d'autres méthodes, les assertions sont plus rapides et plus faciles.
La fonction de rappel doit accepter trois arguments. Le premier contient le nom du fichier qui a vu l'assertion échouer. Le second contient le numéro de ligne dans le fichier précédent. Le troisième argument contient l'expression qui a échoué (s'il y en a : les valeurs littérales comme 1 ou "deux" ne seront pas passées par cet argument).
assertion
L'assertion.
FALSE si l'assertion est fausse, TRUE sinon.
Exemple #1 Gestion des assertions avec un gestionnaire personnalisé
<?php
// Activation des assertions et mise en mode discret
assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_WARNING, 0);
assert_options(ASSERT_QUIET_EVAL, 1);
// Création d'un gestionnaire d'assertions
function my_assert_handler($file, $line, $code)
{
echo "<hr>Échec de l'assertion :
File '$file'<br />
Line '$line'<br />
Code '$code'<br /><hr />";
}
// Configuration de la méthode de callback
assert_options(ASSERT_CALLBACK, 'my_assert_handler');
// Utilisation d'une assertion qui va échouer
assert('mysql_query("")');
?>
(PHP 4, PHP 5)
dl — Charge une extension PHP à la volée
$library
)
Charge l'extension PHP library
à la volée.
Utilisez la fonction extension_loaded() pour vérifier qu'une extension est chargée ou non. Cette fonction travaille aussi bien avec les extensions natives qu'avec les extensions dynamiquement chargées (via le php.ini ou dl()).
Cette fonction a été supprimée du SAPI en PHP 5.3.
library
Ce paramètre est seulement le nom de fichier de l'extension, qui dépend de votre plate-forme. Par exemple l'extension sockets (si compilée comme module partagé, et non par défaut), sera appelée sockets.so sous Unix, et php_sockets.dll sous Windows.
Le dossier à partir duquel sont chargées vos extensions dépend de votre plate-forme :
Windows - S'il n'est pas explicitement indiqué dans le fichier php.ini, le dossier des extensions est c:\php4\extensions\ (PHP 4) ou C:\php5\ (PHP 5) par défaut.
Unix - S'il n'est pas explicitement indiqué dans le fichier php.ini, le dossier des extensions dépend de
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient. Si la fonctionnalité de chargement de module n'est pas
disponible, ou a été désactivée (soit en désactivant la directive
enable_dl ou en activant le safe mode
dans le php.ini) une E_ERROR sera émise et
l'exécution du script sera stoppée. Si la fonction
dl() échoue parce que la bibliothèque n'a pu être
trouvée, dl() retournera FALSE et émettra un
message d'alerte E_WARNING.
Exemple #1 Exemples avec dl()
<?php
// Chargement pour toutes plates-formes
if (!extension_loaded('sqlite')) {
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
dl('php_sqlite.dll');
} else {
dl('sqlite.so');
}
}
// Mais la constante PHP_SHLIB_SUFFIX est disponible depuis PHP 4.3.0
if (!extension_loaded('sqlite')) {
$prefix = (PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : '';
dl($prefix . 'sqlite.' . PHP_SHLIB_SUFFIX);
}
?>
| Version | Description |
|---|---|
| 5.3.0 | dl() est maintenant désactivé dans quelques SAPIs en raison de son instabilité. Le seul SAPI qui active dl() sont CLI et Embed. Utilisez les directives de chargement d'extension à la place. |
Note:
dl() n'est pas supporté lorsque PHP est compilé avec le support ZTS. Utilisez les directives de chargement d'extension à la place.
Note:
dl() est sensible à la casse sur les plates-formes Unix.
Note: Cette fonction est désactivée par le safe-mode
(PHP 4, PHP 5)
extension_loaded — Détermine si une extension est chargée ou non
$name
)Détermine si une extension est chargée ou non.
name
Le nom de l'extension.
Vous pouvez connaître le nom des différentes extensions PHP en utilisant la fonction phpinfo() ou bien si vous utilisez la version CGI ou CLI de PHP, vous pouvez utiliser l'option de ligne de commande -m pour afficher toutes les extensions disponibles :
$ php -m [PHP Modules] xml tokenizer standard sockets session posix pcre overload mysql mbstring ctype [Zend Modules]
Retourne TRUE si l'extension
name a été chargée, FALSE sinon.
Exemple #1 Exemple avec extension_loaded()
<?php
if (!extension_loaded('gd')) {
if (!dl('gd.so')) {
exit;
}
}
?>
| Version | Description |
|---|---|
| 5.0.0 | extension_loaded() utilise le nom interne de l'extension pour vérifier si une extension est disponible ou pas. La plupart des extensions ont des noms internes écrits en minuscules, mais il peut arriver que certaines aient des noms en majuscules. Avant PHP 5, cette fonction comparait les noms en ne tenant pas compte de la casse. |
(PHP 5 >= 5.3.0)
gc_collect_cycles — Force le passage du collecteur de mémoire
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Force le passage du collecteur de mémoire.
Cette fonction ne contient aucun paramètre.
Retourne le nombre de cycles collectés.
(PHP 5 >= 5.3.0)
gc_disable — Désactive le collecteur de références circulaires
Désactive le collecteur de références circulaires, en configuration zend.enable_gc à 0.
Cette fonction ne contient aucun paramètre.
Aucune valeur n'est retournée.
(PHP 5 >= 5.3.0)
gc_enable — Active le collecteur de références circulaires
Active le collecteur de références circulaires, en définissant zend.enable_gc à 1.
Cette fonction ne contient aucun paramètre.
Aucune valeur n'est retournée.
(PHP 5 >= 5.3.0)
gc_enabled — Retourne le statut du collecteur de références circulaires
Retourne le statut du collecteur de références circulaires.
Cette fonction ne contient aucun paramètre.
Retourne TRUE si le collecteur est actif, et FALSE sinon.
Exemple #1 Exemple avec gc_enabled()
<?php
if(gc_enabled()) gc_collect_cycles();
?>
(PHP 4, PHP 5)
get_cfg_var — Retourne la valeur d'une option de PHP
$option
)
Retourne la valeur de l'option option de configuration PHP.
get_cfg_var() ne retourne pas les options qui ont été choisies lors de la compilation de PHP, ni ne lit dans le fichier de configuration d'Apache.
Pour vérifier si le système utilise le fichier de configuration, essayez de lire la valeur de cfg_file_path. Si cette valeur est disponible, alors le fichier de configuration est utilisé.
option
Le nom de l'option de configuration.
Retourne la valeur courante de l'option PHP
option ou bien FALSE si une erreur survient.
| Version | Description |
|---|---|
| 5.3.0 | get_cfg_var() a été modifié afin de permettre de retourner un tableau de directives. |
(PHP 4, PHP 5)
get_current_user — Retourne le nom du possesseur du script courant
Retourne le nom du possesseur du script courant.
Retourne le nom de l'utilisateur, sous la forme d'une chaîne de caractères.
Exemple #1 Exemple avec get_current_user()
<?php
echo 'Propriétaire du script courant : ' . get_current_user();
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Propriétaire du script courant : SYSTEM
(PHP 4 >= 4.1.0, PHP 5)
get_defined_constants — Retourne la liste des constantes et leurs valeurs
$categorize = false
] )Retourne les noms et valeurs des constantes déjà définies. Cela inclut les constantes créées par les extensions, et celles créées avec la fonction define().
categorize
Permet à cette fonction de retourner un tableau multidimensionnel avec les catégories en tant que clés de la première dimension et les constantes ainsi que leurs valeurs dans la seconde dimension.
<?php
define("MY_CONSTANT", 1);
print_r(get_defined_constants(true));
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[Core] => Array
(
[E_ERROR] => 1
[E_WARNING] => 2
[E_PARSE] => 4
[E_NOTICE] => 8
[E_CORE_ERROR] => 16
[E_CORE_WARNING] => 32
[E_COMPILE_ERROR] => 64
[E_COMPILE_WARNING] => 128
[E_USER_ERROR] => 256
[E_USER_WARNING] => 512
[E_USER_NOTICE] => 1024
[E_ALL] => 2047
[TRUE] => 1
)
[pcre] => Array
(
[PREG_PATTERN_ORDER] => 1
[PREG_SET_ORDER] => 2
[PREG_OFFSET_CAPTURE] => 256
[PREG_SPLIT_NO_EMPTY] => 1
[PREG_SPLIT_DELIM_CAPTURE] => 2
[PREG_SPLIT_OFFSET_CAPTURE] => 4
[PREG_GREP_INVERT] => 1
)
[user] => Array
(
[MY_CONSTANT] => 1
)
)
| Version | Description |
|---|---|
| 5.3.1 | Windows uniquement : Les constantes internes sont catégorisées sous Core, précédemment, elles l'étaient sous mhash. |
| 5.3.0 | Les constantes internes sont maintenant catégorisées sous Core alors qu'elles l'étaient sous internal auparavant. Sous WIndows, les constantes internes étaient catégorisées sous mhash. |
| 5.2.11 |
Le paramètre categorize agit maintenant comme entendu.
Avant, le paramètre categorize était interprété comme
!is_null($categorize), faisant que n'importe quelle valeur autre
que NULL forçait la constante a être catégorisée.
|
| 5.0.0 |
Le paramètre categorize a été ajouté.
|
Exemple #1 Exemple avec get_defined_constants()
<?php
print_r(get_defined_constants());
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[E_ERROR] => 1
[E_WARNING] => 2
[E_PARSE] => 4
[E_NOTICE] => 8
[E_CORE_ERROR] => 16
[E_CORE_WARNING] => 32
[E_COMPILE_ERROR] => 64
[E_COMPILE_WARNING] => 128
[E_USER_ERROR] => 256
[E_USER_WARNING] => 512
[E_USER_NOTICE] => 1024
[E_ALL] => 2047
[TRUE] => 1
)
(PHP 4, PHP 5)
get_extension_funcs — Liste les fonctions d'une extension
$module_name
)
Retourne le nom des fonctions définies dans le module
module_name.
module_name
Le nom du module.
Note:
Ce paramètre doit être en minuscule.
Retourne un tableau contenant toutes les fonctions, ou FALSE
si module_name n'est pas une extension valide.
Exemple #1 Affiche toutes les fonctions XML
<?php
print_r(get_extension_funcs("xml"));
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[0] => xml_parser_create
[1] => xml_parser_create_ns
[2] => xml_set_object
[3] => xml_set_element_handler
[4] => xml_set_character_data_handler
[5] => xml_set_processing_instruction_handler
[6] => xml_set_default_handler
[7] => xml_set_unparsed_entity_decl_handler
[8] => xml_set_notation_decl_handler
[9] => xml_set_external_entity_ref_handler
[10] => xml_set_start_namespace_decl_handler
[11] => xml_set_end_namespace_decl_handler
[12] => xml_parse
[13] => xml_parse_into_struct
[14] => xml_get_error_code
[15] => xml_error_string
[16] => xml_get_current_line_number
[17] => xml_get_current_column_number
[18] => xml_get_current_byte_index
[19] => xml_parser_free
[20] => xml_parser_set_option
[21] => xml_parser_get_option
[22] => utf8_encode
[23] => utf8_decode
)
(PHP 4 >= 4.3.0, PHP 5)
get_include_path — Lit la valeur de la directive de configuration include_path
Lit la valeur de la directive de configuration include_path.
Retourne le chemin, sous la forme d'une chaîne de caractères.
Exemple #1 Exemple avec get_include_path()
<?php
// Fonctionne depuis PHP 4.3.0
echo get_include_path();
// Fonctionne sur toutes les versions
echo ini_get('include_path');
?>
(PHP 4, PHP 5)
get_included_files — Retourne un tableau avec les noms des fichiers qui sont inclus dans un script
Retourne un tableau contenant les noms de tous les fichiers qui ont été ajoutés au script avec les fonctions include, include_once, require ou require_once.
Retourne un tableau contenant les noms de tous les fichiers.
Le script en cours est considéré comme fichier inclus, il sera donc listé avec les autres fichiers dont il est fait référence avec include et les fonctions assimilées.
Les fichiers inclus ou requis plusieurs fois ne s'affichent qu'une fois dans le tableau retourné.
| Version | Description |
|---|---|
| 4.0.1 | En PHP 4.0.1 et inférieure, cette fonction supposait que les fichiers requis utilisait l'extension .php ; les autres extensions ne fonctionnaient pas. Par ailleurs, dans cette version, le tableau retourné par la fonction get_included_files() était un tableau associatif et ne reprenait que les fichiers ajoutés avec include et include_once. |
Exemple #1 Exemple avec get_included_files()
<?php
// Ce fichier est abc.php
include 'test1.php';
include_once 'test2.php';
require 'test3.php';
require_once 'test4.php';
$included_files = get_included_files();
foreach ($included_files as $filename) {
echo "$filename\n";
}
?>
L'exemple ci-dessus va afficher :
abc.php test1.php test2.php test3.php test4.php
Note:
Les fichiers inclus en utilisant la directive de configuration auto_prepend_file ne sont pas listés.
(PHP 4, PHP 5)
get_loaded_extensions — Retourne la liste de tous les modules compilés et chargés
$zend_extensions = false
] )Retourne un tableau contenant les noms de tous les modules compilés et chargés par l'application PHP courante.
zend_extensions
Retourne uniquement les extensions Zend. Par défaut vaut FALSE
et ne liste que les extensions PHP classiques comme mysqli par exemple.
Retourne un tableau indexé des noms de tous les modules.
| Version | Description |
|---|---|
| 5.2.4 |
Le paramètre optionnel zend_extensions a été ajouté
|
Exemple #1 Exemple avec get_loaded_extensions()
<?php
print_r(get_loaded_extensions());
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array ( [0] => xml [1] => wddx [2] => standard [3] => session [4] => posix [5] => pgsql [6] => pcre [7] => gd [8] => ftp [9] => db [10] => calendar [11] => bcmath )
(PHP 4, PHP 5)
get_magic_quotes_gpc — Retourne la configuration actuelle de l'option magic_quotes_gpc
Retourne la configuration actuelle de l'option magic_quotes_gpc
Gardez en tête que vous ne pouvez pas définir magic_quotes_gpc au moment de l'exécution.
Pour plus d'informations sur magic_quotes, voir la section sur les guillemets magiques.
Retourne 0 si magic_quotes_gpc est désactivée, 1 sinon.
Exemple #1 Exemple avec get_magic_quotes_gpc()
<?php
echo get_magic_quotes_gpc(); // 1
echo $_POST['lastname']; // O\'reilly
echo addslashes($_POST['lastname']); // O\\\'reilly
if (get_magic_quotes_gpc()) {
$lastname = stripslashes($_POST['lastname']);
}
else {
$lastname = $_POST['lastname'];
}
// Si vous utilisez MySQL
$lastname = mysql_real_escape_string($lastname);
echo $lastname; // O\'reilly
$sql = "INSERT INTO lastnames (lastname) VALUES ('$lastname')";
?>
Note:
Si la directive magic_quotes_sybase est activée, elle remplacera complètement magic_quotes_gpc. Ce qui fait que même si get_magic_quotes() retourne
TRUEles guillemets doubles, les antislashs ou les caractères NULL ne seront pas protégés. Seul les guillemets simples le seront. Dans ce cas, ils ressembleront à ''.
(PHP 4, PHP 5)
get_magic_quotes_runtime — Retourne la configuration actuelle de l'option magic_quotes_runtime
Retourne la configuration actuelle de l'option magic_quotes_runtime.
Retourne 0 si magic_quotes_runtime est désactivée, 1 sinon.
Exemple #1 Exemple avec get_magic_quotes_runtime()
<?php
// Vérifie si magic_quotes_runtime est activé
if(get_magic_quotes_runtime())
{
// Désactivation
set_magic_quotes_runtime(false);
}
?>
Cette fonction est un alias de : get_included_files().
(PHP 4, PHP 5)
getenv — Retourne la valeur d'une variable d'environnement
$varname
)Retourne la valeur d'une variable d'environnement.
Vous pouvez voir une liste complète des variables d'environnement en utilisant la fonction phpinfo(). Vous pouvez trouver la signification de chacune d'entre elles en consultant la » RFC 3875, en particulier la section 4.1 "Request Meta-Variables".
varname
Le nom de la variable.
Retourne la valeur de la variable d'environnement
varname, ou FALSE si la
variable d'environnement varname
n'existe pas.
Exemple #1 Exemple avec getenv()
<?php
// Exemple d'utilisation de getenv()
$ip = getenv('REMOTE_ADDR');
// Ou utilisez simplement une Superglobale ($_SERVER ou $_ENV)
$ip = $_SERVER['REMOTE_ADDR'];
?>
(PHP 4, PHP 5)
getlastmod — Retourne la date de dernière modification de la page
Retourne la date de dernière modification de la page.
Si vous voulez récupérer la date de la dernière modification d'un fichier différent, utilisez la fonction filemtime().
Retourne la date de dernière modification de la page.
La valeur retournée est un timestamp UNIX, utilisable
comme paramètre avec la fonction date().
Retourne FALSE si une erreur survient.
Exemple #1 Exemple avec getlastmod()
<?php
// affiche par exemple 'Dernière modification: April 20 2004 20:43:59.'
echo "Dernière modification : " . date ("F d Y H:i:s.", getlastmod());
?>
(PHP 4 >= 4.1.0, PHP 5)
getmygid — Retourne le GID du propriétaire du script
Retourne le GID du propriétaire du script.
Retourne le GID du propriétaire du script courant, ou FALSE
si une erreur survient.
(PHP 4, PHP 5)
getmyinode — Retourne l'inode du script
Retourne l'inode du script courant.
Retourne l'inode du script courant, sous la forme d'un entier,
ou FALSE si une erreur survient.
(PHP 4, PHP 5)
getmypid — Retourne le numéro de processus courant de PHP
Retourne le numéro de processus courant de PHP.
Retourne le numéro de processus courant de PHP, ou FALSE
si une erreur survient.
Les identifiants de processus ne sont pas uniques, et forment une source d'entropie faible. Nous recommandons de ne pas utiliser les pid pour assurer la sécurité d'un système.
(PHP 4, PHP 5)
getmyuid — Retourne l'UID du propriétaire du script actuel
Retourne l'UID du propriétaire du script actuel.
Retourne l'identifiant du propriétaire
du script actuel (UID) ou FALSE en cas d'erreur.
(PHP 4 >= 4.3.0, PHP 5)
getopt — Lit des options passées dans la ligne de commande
$options
[, array $longopts
] )getopt() lit les options passées dans la ligne de commande.
options
longopts
Le paramètre options peut contenir les éléments suivants :
Note: Les valeurs optionnelles n'acceptent pas l'espace comme séparateur.
Note:
Le format des paramètres
optionsetlongoptsest identique ; la seule différence est quelongoptsprend un tableau en option (où chaque élément est une option) alors queoptionsprend une chaîne (où chaque caractère est une option).
Cette fonction retourne un tableau d'options/arguments, ou FALSE
si une erreur survient.
Note:
L'analyse des options s'arrêtera lorsque la première mauvaise option sera trouvée, et tout ce qui suivra sera ignoré.
| Version | Description |
|---|---|
| 5.3.0 | Ajout du support de "=" comme séparateur argument/valeur. |
| 5.3.0 | Ajout du support des valeurs optionnelles (spécifié par "::"). |
| 5.3.0 |
Le paramètre longopts
est disponible sur tous les systèmes.
|
| 5.3.0 | Cette fonction n'est plus dépendante du système et fonctionne maintenant également sous Windows. |
Exemple #1 Exemple avec getopt()
<?php
$options = getopt("f:hp:");
var_dump($options);
?>
L'exécution du script ci-dessus avec la commande php script.php -fvalue -h affichera :
array(2) {
["f"]=>
string(5) "value"
["h"]=>
bool(false)
}
Exemple #2 Second exemple avec getopt()
<?php
$shortopts = "";
$shortopts .= "f:"; // Valeur requise
$shortopts .= "v::"; // Valeur optionnelle
$shortopts .= "abc"; // Ces options n'acceptent pas de valeur
$longopts = array(
"required:", // Valeur requise
"optional::", // Valeur optionnelle
"option", // Aucune valeur
"opt", // Aucune valeur
);
$options = getopt($shortopts, $longopts);
var_dump($options);
?>
L'exécution du script ci-dessus avec la commande php script.php -f "value for f" -v -a --required value --optional="optional value" --option affichera :
array(6) {
["f"]=>
string(11) "value for f"
["v"]=>
bool(false)
["a"]=>
bool(false)
["required"]=>
string(5) "value"
["optional"]=>
string(14) "optional value"
["option"]=>
bool(false)
}
Exemple #3 Troisième exemple avec getopt()
Passage de plusieurs options
<?php
$options = getopt("abc");
var_dump($options);
?>
L'exécution du script ci-dessus avec la commande php script.php -aaac affichera :
array(2) {
["a"]=>
array(3) {
[0]=>
bool(false)
[1]=>
bool(false)
[2]=>
bool(false)
}
["c"]=>
bool(false)
}
(PHP 4, PHP 5)
getrusage — Retourne le niveau d'utilisation des ressources
$who = 0
] )C'est une interface à la fonction système getrusage(2). Elle retourne un tableau associatif contenant les informations renvoyées par cet appel système.
who
Si who est égal à 1,
getrusage() sera appelé avec
le paramètre RUSAGE_CHILDREN.
Retourne un tableau associatif contenant les données retournées depuis l'appel système. Toutes les entrées sont accessibles en utilisant leurs noms de champs documentés.
Exemple #1 Exemple avec getrusage()
<?php
$dat = getrusage();
echo $dat["ru_nswap"]; // Taille de la mémoire swap
echo $dat["ru_majflt"]; // Nombre de pages mémoires utilisées
echo $dat["ru_utime.tv_sec"]; // Temps utilisateur (en secondes)
echo $dat["ru_utime.tv_usec"]; // Temps utilisateur (en microsecondes)
?>
Note: Cette fonction n'est pas implémentée sous Windows.
Cette fonction est un alias de : ini_set().
(PHP 4 >= 4.2.0, PHP 5)
ini_get_all — Lit toutes les valeurs de configuration
$extension
[, bool $details = true
]] )Lit toutes les valeurs de configuration.
extension
Un nom d'extension, optionnel. S'il est défini, la fonction retournera uniquement les options spécifiques à cette extension.
details
Récupère les détails, ou uniquement la valeur courante de chaque
configuration. Par défaut, vaut TRUE (récupère les détails).
Retourne un tableau associatif dont les clés sont les noms des directives.
Lorsque le paramètre details vaut TRUE (défaut),
le tableau contiendra les valeurs global_value (définies dans
le fichier php.ini), local_value (définie éventuellement
avec la fonction ini_set() ou via un .htaccess), et
access (le degré d'accès).
Lorsque le paramètre details vaut FALSE, la valeur
sera la valeur courant de l'option.
Voir le manuel pour plus d'informations sur la signification du degré d'accès.
Note:
Il est possible pour une directive d'avoir plusieurs degrés d'accès, et c'est la raison pour laquelle access montre les valeurs du masque appropriées.
| Version | Description |
|---|---|
| 5.3.0 |
Ajout du paramètre details.
|
Exemple #1 Exemple avec ini_get_all()
<?php
print_r(ini_get_all("pcre"));
print_r(ini_get_all());
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[pcre.backtrack_limit] => Array
(
[global_value] => 100000
[local_value] => 100000
[access] => 7
)
[pcre.recursion_limit] => Array
(
[global_value] => 100000
[local_value] => 100000
[access] => 7
)
)
Array
(
[allow_call_time_pass_reference] => Array
(
[global_value] => 0
[local_value] => 0
[access] => 6
)
[allow_url_fopen] => Array
(
[global_value] => 1
[local_value] => 1
[access] => 4
)
...
)
Exemple #2 Désactive le paramètre details
<?php
print_r(ini_get_all("pcre", false)); // Ajouté en PHP 5.3.0
print_r(ini_get_all(null, false)); // Ajouté en PHP 5.3.0
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[pcre.backtrack_limit] => 100000
[pcre.recursion_limit] => 100000
)
Array
(
[allow_call_time_pass_reference] => 0
[allow_url_fopen] => 1
...
)
(PHP 4, PHP 5)
ini_get — Lit la valeur d'une option de configuration
$varname
)
Retourne la valeur de l'option de configuration
varname en cas de succès.
varname
Le nom de l'option de configuration.
Retourne la valeur de l'option de configuration
varname en cas de succès, ou une
chaîne de caractères vide pour les valeurs NULL. Retourne FALSE
si l'option de configuration n'existe pas.
Exemple #1 Exemples avec ini_get()
<?php
/*
Notre fichier php.ini contient les directives suivantes :
display_errors = On
register_globals = Off
post_max_size = 8M
*/
echo 'display_errors = ' . ini_get('display_errors') . "\n";
echo 'register_globals = ' . ini_get('register_globals') . "\n";
echo 'post_max_size = ' . ini_get('post_max_size') . "\n";
echo 'post_max_size+1 = ' . (ini_get('post_max_size')+1) . "\n";
echo 'post_max_size in bytes = ' . return_bytes(ini_get('post_max_size'));
function return_bytes($val) {
$val = trim($val);
$last = strtolower($val[strlen($val)-1]);
switch($last) {
// Le modifieur 'G' est disponible depuis PHP 5.1.0
case 'g':
$val *= 1024;
case 'm':
$val *= 1024;
case 'k':
$val *= 1024;
}
return $val;
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
display_errors = 1 register_globals = 0 post_max_size = 8M post_max_size+1 = 9 post_max_size in bytes = 8388608
Note: Lecture de valeurs booléennes
Une directive de configuration ayant la valeur de off sera retourné sous la forme d'une chaîne vide ou "0" alors que la valeur on retournera "1". Cette fonction peut également retourner la valeur littérale du fichier INI.
Note: Lors de la lecture des tailles de mémoire
Plusieurs directives traitant de taille mémoire, comme upload_max_filesize, sont stockées dans le fichier php.ini avec une notation courte. ini_get() retourne la chaîne exacte stockée dans le fichier php.ini et NON PAS son équivalent entier. Appliquer des opérations arithmétiques classiques sur ces valeurs ne conduira à rien de bon. L'exemple ci-dessous montre une façon de convertir la notation sténographique en octets, de la même façon dont le fait le source PHP.
(PHP 4, PHP 5)
ini_restore — Restaure la valeur de l'option de configuration
$varname
)
Restaure la valeur originale de l'option de configuration
varname.
varname
Le nom de l'option de configuration.
Aucune valeur n'est retournée.
Exemple #1 Exemple avec ini_restore()
<?php
$setting = 'y2k_compliance';
echo 'Valeur courante de \'' . $setting . '\': ' . ini_get($setting), PHP_EOL;
ini_set($setting, ini_get($setting) ? 0 : 1);
echo 'Nouvelle valeur de \'' . $setting . '\': ' . ini_get($setting), PHP_EOL;
ini_restore($setting);
echo 'Valeur originale de \'' . $setting . '\': ' . ini_get($setting), PHP_EOL;
?>
L'exemple ci-dessus va afficher :
Valeur courante de 'y2k_compliance': 1 Nouvelle valeur de 'y2k_compliance': 0 Valeur originale de 'y2k_compliance': 1
(PHP 4, PHP 5)
ini_set — Modifie la valeur d'une option de configuration
$varname
, string $newvalue
)
Change la valeur de l'option de configuration varname
et lui donne celle de newvalue.
La valeur de l'option de configuration sera modifiée durant toute
l'exécution du script et pour ce script spécifiquement. Elle reprendra
sa valeur par défaut dès la fin du script.
varname
Les options disponibles ne peuvent pas toutes être modifiées avec ini_set(). La liste de toutes les options disponibles se trouve dans l'annexe.
newvalue
La nouvelle valeur pour l'option.
Retourne l'ancienne valeur en cas de succès, FALSE si une erreur survient.
Exemple #1 Définit une option de configuration
<?php
echo ini_get('display_errors');
if (!ini_get('display_errors')) {
ini_set('display_errors', 1);
}
echo ini_get('display_errors');
?>
Cette fonction est un alias de : set_magic_quotes_runtime()
main — Fausse documentation pour main()
Il n'y a pas de fonction appelée main(), hormis dans les sources PHP. En PHP 4.3.0, un nouveau type de gestion d'erreur a été introduit dans les sources de PHP : php_error_docref. Une des fonctionnalité était de fournir un lien vers la page de manuel de PHP lorsque les directives html_errors (par défaut) et docref_root (par défaut jusqu'en PHP 4.3.2) sont activées.
Certains messages d'erreur faisaient référence à une page de manuel pour la fonction main() alors que cette page n'existe pas. Ajoutez alors un » rapport de bug, en anglais, où vous mentionnez la fonction PHP vous ayant conduite sur cette page. Cette erreur sera corrigée et documentée.
| Nom de la fonction | Ne pointe plus sur cette page depuis la version |
|---|---|
| include | 5.1.0 |
| include_once | 5.1.0 |
| require | 5.1.0 |
| require_once | 5.1.0 |
(PHP 5 >= 5.2.0)
memory_get_peak_usage — Retourne la quantité de mémoire maximale allouée par PHP
$real_usage = false
] )Retourne la quantité de mémoire maximale, en octets, qui a été allouée à votre script PHP.
real_usage
Définir à TRUE pour récupérer la taille réelle de la mémoire allouée
par le système. Si ce paramètre n'est pas défini ou vaut FALSE,
seule la mémoire utilisée par emalloc() sera retournée.
Retourne la quantité de mémoire, en octets.
| Version | Description |
|---|---|
| 5.2.1 | La compilation avec l'option de configuration --enable-memory-limit n'est plus nécessaire pour que cette fonction existe. |
| 5.2.0 |
Le paramètre real_usage a été ajouté.
|
(PHP 4 >= 4.3.2, PHP 5)
memory_get_usage — Indique la quantité de mémoire utilisée par PHP
$real_usage = false
] )Retourne la quantité de mémoire allouée à PHP à cet instant.
real_usage
Définir à TRUE pour récupérer la taille réelle de la mémoire allouée
par le système. Si ce paramètre n'est pas défini ou vaut FALSE,
seule la mémoire utilisée par emalloc() sera retournée.
Retourne la quantité de mémoire, en octets.
| Version | Description |
|---|---|
| 5.2.1 | La compilation avec l'option de configuration --enable-memory-limit n'est plus nécessaire pour que cette fonction existe. |
| 5.2.0 |
Le paramètre real_usage a été ajouté.
|
Exemple #1 Exemple avec memory_get_usage()
<?php
// Ceci n'est qu'un exemple. Les chiffres ci-dessous
// différeront suivant les systèmes et les configurations
echo memory_get_usage() . "\n"; // 36640
$a = str_repeat("Hello", 4242);
echo memory_get_usage() . "\n"; // 57960
unset($a);
echo memory_get_usage() . "\n"; // 36744
?>
(PHP 5 >= 5.2.4)
php_ini_loaded_file — Récupère le chemin d'un fichier php.ini chargé
Vérifie si un fichier php.ini est chargé, et récupère son chemin.
Cette fonction ne contient aucun paramètre.
Le chemin du fichier php.ini chargé, ou FALSE si aucun n'a été chargé.
Exemple #1 Exemple avec php_ini_loaded_file()
<?php
$inipath = php_ini_loaded_file();
if ($inipath) {
echo 'php.ini chargé : ' . $inipath;
} else {
echo 'Aucun fichier php.ini n\'a été chargé';
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
php.ini chargé : /usr/local/php/php.ini
(PHP 4 >= 4.3.0, PHP 5)
php_ini_scanned_files — Retourne la liste des fichiers .ini analysés dans les dossiers de configuration supplémentaires
php_ini_scanned_files() retourne une liste de noms de fichiers de configuration analysés, en plus de php.ini. Cette liste est au format CSV. Ces fichiers sont situés dans un dossier défini par l'option --with-config-file-scan-dir , définie au moment de la compilation.
Les fichiers retournés incluent le chemin, comme déclaré dans la directive --with-config-file-scan-dir . De plus, chaque virgule est suivie d'une nouvelle ligne.
Retourne une chaîne de caractères, où les noms de fichiers sont séparés par des virgules. Si
--with-config-file-scan-dir
n'était pas configuré,
FALSE est retourné. Si cette option était configurée, mais que le dossier
était vide, une chaîne vide est retournée. Si un fichier n'est pas lisible,
le nom du fichier sera inclus dans la liste, mais une erreur sera
générée. Cette erreur sera visible au moment de la compilation, et
lorsque vous appellerez la fonction php_ini_scanned_files().
Exemple #1 Un exemple de liste retournée par php_ini_scanned_files()
<?php
if ($filelist = php_ini_scanned_files()) {
if (strlen($filelist) > 0) {
$files = explode(',', $filelist);
foreach ($files as $file) {
echo "<li>" . trim($file) . "</li>\n";
}
}
}
?>
(PHP 4, PHP 5)
php_logo_guid — Retourne l'identifiant du logo PHP
Cette fonction retourne l'identifiant qui peut être utilisé pour afficher le logo PHP en utilisant une image incorporée dans les sources. Le logo est affiché uniquement si expose_php vaut On.
Retourne PHPE9568F34-D428-11d2-A769-00AA001ACF42.
Exemple #1 Exemple avec php_logo_guid()
<?php
echo '<img src="' . $_SERVER['PHP_SELF'] .
'?=' . php_logo_guid() . '" alt="Logo PHP !" />';
?>
(PHP 4 >= 4.0.1, PHP 5)
php_sapi_name — Retourne le type d'interface utilisée entre le serveur web et PHP
Retourne une chaîne en minuscule qui décrit le type d'interface (l'API, SAPI serveur) que PHP utilise. Par exemple, en PHP CLI, cette chaîne sera "cli" tandis qu'avec Apache, elle pourra avoir plusieurs valeurs différentes suivant le SAPI exact utilisé. Les valeurs possibles sont listées ci-dessous.
Retourne le type de l'interface, sous la forme d'une chaîne de caractères en minuscule.
Voici une liste non exhaustive des valeurs possibles : aolserver, apache, apache2filter, apache2handler, caudium, cgi (jusqu'en PHP 5.3), cgi-fcgi, cli, continuity, embed, isapi, litespeed, milter, nsapi, phttpd, pi3web, roxen, thttpd, tux et webjames.
Exemple #1 Exemple avec php_sapi_name()
Cet exemple cherche la sous-chaîne cgi car elle peut également valoir cgi-fcgi.
<?php
$sapi_type = php_sapi_name();
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Vous utilisez CGI PHP\n";
} else {
echo "Vous n'utilisez pas CGI PHP\n";
}
?>
Note: Une approche alternative
La constante PHP
PHP_SAPIa une valeur identique à php_sapi_name().
Le SAPI défini ne doit pas être ambigu, car par exemple, au lieu de apache, il peut être défini à apache2handler ou apache2filter.
(PHP 4 >= 4.0.2, PHP 5)
php_uname — Retourne les informations sur le système d'exploitation
$mode = "a"
] )
php_uname() retourne une description sur le système
d'exploitation sur lequel tourne PHP. C'est la même chaîne que celle
que vous voyez en haut du phpinfo().
Si vous voulez juste savoir le nom du système d'exploitation, utilisez
plutôt la constante PHP_OS mais gardez à l'esprit que cette
constante contient le nom du système sur lequel PHP a été compilé.
Sur certaines vieilles plate-formes Unix, il n'est pas possible de déterminer les informations courantes de l'OS, auquel cas cette fonction se contente de retourner le nom de l'OS sur lequel PHP a été compilé. Cela n'arrivera que si votre bibliothèque uname() n'existe pas ou ne fonctionne pas.
mode
mode est un seul caractère qui définit
quelles seront les informations à retourner :
Retourne la description, sous la forme d'une chaîne de caractères.
Exemple #1 Exemples avec php_uname()
<?php
echo php_uname();
echo PHP_OS;
/* Affichages possibles :
Linux localhost 2.4.21-0.13mdk #1 Fri Mar 14 15:08:06 EST 2003 i686
Linux
FreeBSD localhost 3.2-RELEASE #15: Mon Dec 17 08:46:02 GMT 2001
FreeBSD
Windows NT XN1 5.1 build 2600
WINNT
*/
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
echo 'Le serveur tourne sous Windows !';
} else {
echo 'Le serveur ne tourne pas sous Windows !';
}
?>
Il existe aussi des constantes PHP pré-définies liées qui peuvent s'avérer utiles, par exemple :
Exemple #2 Exemples avec quelques constantes liées au système
<?php
// *nix
echo DIRECTORY_SEPARATOR; // /
echo PHP_SHLIB_SUFFIX; // so
echo PATH_SEPARATOR; // :
// Win*
echo DIRECTORY_SEPARATOR; // \
echo PHP_SHLIB_SUFFIX; // dll
echo PATH_SEPARATOR; // ;
?>
(PHP 4, PHP 5)
phpcredits — Affiche les crédits de PHP
$flag = CREDITS_ALL
] )Affiche la liste des développeurs PHP, des modules, etc. Elle génère le code HTML approprié pour insérer les informations dans une page.
flag
Pour générer une page personnalisée sur les crédits, il faut utiliser le
paramètre flag.
| Nom | Description |
|---|---|
| CREDITS_ALL |
Tous les crédits, équivalent à : CREDITS_DOCS +
CREDITS_GENERAL + CREDITS_GROUP +
CREDITS_MODULES + CREDITS_FULLPAGE.
La fonction génère alors une page HTML complète.
|
| CREDITS_DOCS | Les crédits du groupe de documentation |
| CREDITS_FULLPAGE | En général, ce paramètre est utilisé avec d'autres constantes. Il indique que la page ainsi générée doit être une page HTML complète, avec toutes les balises nécessaires. |
| CREDITS_GENERAL | Crédits Généraux : conception et design du langage, auteurs de PHP et du module SAPI. |
| CREDITS_GROUP | Une liste des développeurs principaux |
| CREDITS_MODULES | Une liste des extensions de PHP, et leurs auteurs |
| CREDITS_SAPI | Une liste des API serveur pour PHP et leurs auteurs |
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec phpcredits()
<?php
phpcredits(CREDITS_GENERAL);
?>
Exemple #2 Affiche les développeurs principaux ansi que le groupe de documentation
<?php
phpcredits(CREDITS_GROUP | CREDITS_DOCS | CREDITS_FULLPAGE);
?>
Exemple #3 Affiche tous les crédits
<html>
<head>
<title>Ma page de crédits</title>
</head>
<body>
<?php
// Un peu de votre code
phpcredits(CREDITS_ALL - CREDITS_FULLPAGE);
// Encore un peu de votre code
?>
</body>
</html>
(PHP 4, PHP 5)
phpinfo — Affiche de nombreuses informations sur la configuration de PHP
$what = INFO_ALL
] )Affiche de nombreuses informations sur PHP, concernant sa configuration courante : options de compilation, extensions, version, informations sur le serveur, et l'environnement (lorsqu'il est compilé comme module), environnement PHP, informations sur le système, chemins, valeurs générales et locales de configuration, en-têtes HTTP et la licence PHP.
Comme tous les systèmes sont configurés différemment, phpinfo() sert généralement à vérifier la configuration ainsi que les variables prédéfinies, pour une plate-forme donnée.
phpinfo() est un bon outil de débogage, car il affiche le contenu de toutes les variables EGPCS (Environnement, GET, POST, Cookie, Serveur).
what
L'affichage peut être personnalisé en utilisant une ou plusieurs des
constantes suivantes. Elles sont combinables avec l'opérateur
or, et doivent être
passées dans le paramètre what. Vous pouvez aussi
additionner ces constantes.
| Nom de la constante | Valeur | Description |
|---|---|---|
| INFO_GENERAL | 1 | La ligne de configuration, le chemin du php.ini, la date de compilation, le serveur web, le système, etc. |
| INFO_CREDITS | 2 | Les crédits de PHP. Voir aussi phpcredits(). |
| INFO_CONFIGURATION | 4 | Valeurs courantes locales et générales des directives PHP. Voyez aussi la fonction ini_get(). |
| INFO_MODULES | 8 | Modules chargés et leur configuration spécifique. Voir aussi la fonction get_loaded_extensions(). |
| INFO_ENVIRONMENT | 16 | Informations sur les variables d'environnement, qui sont disponibles dans la variable $_ENV. |
| INFO_VARIABLES | 32 | Affiche toutes les variables prédéfinies, issues de l'environnement, la méthode GET, la méthode POST, les cookies et le serveur. |
| INFO_LICENSE | 64 | La licence PHP. Voir aussi » la FAQ de la licence. |
| INFO_ALL | -1 | Affiche toutes les informations suscitées. |
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
| Version | Description |
|---|---|
| 5.2.2 | L'information "Loaded Configuration File" a été ajoutée, alors qu'avant, seule l'information "Configuration File (php.ini) Path" existée. |
Exemple #1 Exemple avec phpinfo()
<?php
// Affiche toutes les informations, comme le ferait INFO_ALL
phpinfo();
// Affiche uniquement le module d'information.
// phpinfo(8) fournirait les mêmes informations.
phpinfo(INFO_MODULES);
?>
Note:
Une partie des informations affichées sont désactivées si la directive expose_php est configurée avec la valeur off. Cela inclus les logos PHP et Zend, ainsi que les crédits.
Note:
phpinfo() affiche du texte au lieu de HTML lorsque vous utilisez la version CLI.
(PHP 4, PHP 5)
phpversion — Retourne le numéro de la version courante de PHP
$extension
] )Retourne le numéro de la version courante de PHP.
extension
Un nom d'extension, optionnel.
Si le paramètre optionnel extension
est spécifié, la fonction phpversion() retournera
la version de cette extension ou FALSE s'il n'y a aucune information
sur la version associée ou si cette extension n'est pas disponible.
Exemple #1 Exemple avec phpversion()
<?php
// affiche le numéro de version courante du PHP.
echo 'Version PHP courante : ' . phpversion();
// affiche e.g. '2.0' ou rien du tout si cette extension n'est pas active
echo phpversion('tidy');
?>
Exemple #2 Exemple avec PHP_VERSION_ID
<?php
// PHP_VERSION_ID est disponible depuis PHP 5.2.7,
// si votre version est antérieure, émulez-le.
if (!defined('PHP_VERSION_ID')) {
$version = explode('.',PHP_VERSION);
define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));
}
// PHP_VERSION_ID est défini comme un nombre : plus il est grand, plus
// la version de PHP est récente. Il est défini comme illustré dans
// le code ci-dessous :
//
// $version_id = $major_version * 10000 + $minor_version * 100 + $release_version;
//
// Maintenant, avec PHP_VERSION_ID, il est possible de vérifier la disponibilité
// de fonctionnalités de PHP, sans passer par version_compare().
//
// Par exemple, on peut définir les constantes PHP_VERSION_* qui n'étaient pas
// disponibles avant 5.2.7
if (PHP_VERSION_ID < 50207) {
define('PHP_MAJOR_VERSION', $version[0]);
define('PHP_MINOR_VERSION', $version[1]);
define('PHP_RELEASE_VERSION', $version[2]);
// etc.
}
?>
Note:
Cette information est aussi disponible via la constante prédéfinie
PHP_VERSION. Plus d'informations sur les versions, avec les constantesPHP_VERSION_*.
(PHP 4, PHP 5)
putenv — Fixe la valeur d'une variable d'environnement
$setting
)Fixe la valeur d'une variable d'environnement. Cette valeur n'existera que durant la vie du script courant, et l'environnement initial sera restauré lorsque le script sera terminé.
Modifier la valeur de certaines variables système peut être un trou de sécurité considérable. La directive de configuration safe_mode_allowed_env_vars contient une liste de préfixes, séparés par des virgules. Lorsque le Safe Mode est actif, l'utilisateur ne peut que modifier les variables dont le nom commence par les préfixes fournis par cette directive. Par défaut, les utilisateurs ne peuvent modifier que les variables qui commencent par PHP_ (i.e. PHP_FOO=BAR). Note : Si cette directive est vide, PHP autorisera la modification de TOUTES les variables d'environnement !
La directive de configuration safe_mode_protected_env_vars contient une liste de variables d'environnement, séparées par des virgules. Les utilisateurs ne pourront pas modifier ces variables avec la fonction putenv(). Ces variables seront protégées même si safe_mode_allowed_env_vars permet leur modification.
setting
La configuration, comme "FOO=BAR"
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Modification d'une variable d'environnement
<?php
putenv("UNIQID=$uniqid");
?>
Les directives safe_mode_allowed_env_vars et safe_mode_protected_env_vars ne prennent effets que si le safe_mode est activé.
(PHP 4 >= 4.3.0, PHP 5)
restore_include_path — Restaure la valeur de la directive de configuration include_path
Restaure la valeur de la directive de configuration include_path à sa valeur originale de début de script, telle qu'inscrite dans le php.ini.
Aucune valeur n'est retournée.
Exemple #1 Exemple avec restore_include_path()
<?php
echo get_include_path(); // .:/usr/local/lib/php
set_include_path('/inc');
echo get_include_path(); // /inc
// Fonctionne depuis PHP 4.3.0
restore_include_path();
// Fonctionne sur toutes les versions
ini_restore('include_path');
echo get_include_path(); // .:/usr/local/lib/php
?>
(PHP 4 >= 4.3.0, PHP 5)
set_include_path — Modifie la valeur de la directive de configuration include_path
$new_include_path
)Modifie la valeur de la directive de configuration include_path, pour la durée du script en cours.
new_include_path
La nouvelle valeur pour la directive de configuration include_path
Retourne l'ancienne valeur de
include_path en cas de succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec set_include_path()
<?php
// Fonctionne depuis PHP 4.3.0
set_include_path('/usr/lib/pear');
// Fonctionne sur toutes les versions
ini_set('include_path', '/usr/lib/pear');
?>
Exemple #2 Ajout dans le chemin d'inclusion
En utilisant la constante PATH_SEPARATOR, il est
possible d'étendre le chemin d'inclusion au vu du système.
Dans cet exemple, nous ajoutons /usr/lib/pear à la fin de l'actuel include_path.
<?php
$path = '/usr/lib/pear';
set_include_path(get_include_path() . PATH_SEPARATOR . $path);
?>
(PHP 4, PHP 5)
set_magic_quotes_runtime — Active/désactive l'option magic_quotes_runtime
$new_setting
)Active/désactive l'option magic_quotes_runtime.
Cette fonction est OBSOLETE depuis PHP 5.3.0. Nous vous encourageons vivement à ne plus l'utiliser.
new_setting
0 l'option est désactivée, 1 l'option est activée.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec set_magic_quotes_runtime()
<?php
// Création d'un pointeur de fichier temporaire
$fp = tmpfile();
// Écriture de quelques données dans ce pointeur
fwrite($fp, '\'PHP\' est un acronyme récursif');
// Sans magic_quotes_runtime
rewind($fp);
set_magic_quotes_runtime(false);
echo 'Sans magic_quotes_runtime : ' . fread($fp, 64), PHP_EOL;
// Avec magic_quotes_runtime
rewind($fp);
set_magic_quotes_runtime(true);
echo 'Avec magic_quotes_runtime : ' . fread($fp, 64), PHP_EOL;
// Clean up
fclose($fp);
?>
L'exemple ci-dessus va afficher :
Sans magic_quotes_runtime: 'PHP' est un acronyme récursif Avec magic_quotes_runtime: \'PHP\' est un acronyme récursif
(PHP 4, PHP 5)
set_time_limit — Fixe le temps maximum d'exécution d'un script
$seconds
)Fixe le délai d'expiration d'un script, en secondes. Si cette limite est atteinte, le script s'interrompt, et renvoie une erreur fatale. La valeur par défaut est 30 secondes ou, si c'est le cas, la valeur de la directive max_execution_time définie dans le php.ini.
Lorsqu'elle est appelée, set_time_limit() remet le compteur à zéro. En d'autres termes, si la limite par défaut est à 30 secondes, et qu'après 25 secondes d'exécution du script l'appel set_time_limit(20) est fait, alors le script tournera pendant un total de 45 secondes avant de finir.
seconds
Le temps maximal d'exécution, en secondes. S'il vaut 0, aucune limite n'est imposée.
Aucune valeur n'est retournée.
Notez que set_time_limit() n'a pas d'effet lorsque PHP fonctionne en mode safe mode. Il n'y a pas d'autre solution que de changer de mode, ou de modifier la durée maximale d'exécution dans le php.ini.
Note:
La fonction set_time_limit() et la directive de configuration max_execution_time n'affectent que le temps d'exécution du script lui-même. Tout temps passé en dehors du script, comme un appel système utilisant system(), des opérations sur les flux, les requêtes sur base de données, etc. n'est pas pris en compte lors du calcul de la durée maximale d'exécution du script. Ceci est faux sous Windows où le temps mesuré est le temps réel.
(PHP 5 >= 5.2.1)
sys_get_temp_dir — Retourne le chemin du répertoire utilisé pour les fichiers temporaires
Retourne le chemin du répertoire PHP où sont enregistrés les fichiers temporaires par défaut.
Retourne le chemin du répertoire temporaire.
Exemple #1 Exemple avec sys_get_temp_dir()
<?php
// Création d'un fichier temporaire dans le dossier
// des fichiers temporaires, en utilisant la fonction sys_get_temp_dir()
$temp_file = tempnam(sys_get_temp_dir(), 'Tux');
echo $temp_file;
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
C:\Windows\Temp\TuxA318.tmp
(PHP 4 >= 4.1.0, PHP 5)
version_compare — Compare deux chaînes de version au format des versions PHP
version_compare() compare les deux versions de PHP standardisées. Cette fonction est pratique pour les programmes qui doivent vérifier la version de PHP qui les fait tourner.
version_compare() remplace dans un premier temps _, - et + par un point (.) dans les chaînes de version et insère aussi des points avant et après tout caractère non-numérique pour que, par exemple, '4.3.5RC1' devienne '4.3.5.RC.1'. Ensuite, elle découpe les résultats, similairement à explode('.', $ver). Puis, elle compare les morceaux en allant de gauche à droite. Si une part contient des caractères alphabétiques, ils sont gérés dans l'ordre suivant : any string not found in this list < dev < alpha = a < beta = b < RC = rc < # < pl = p. De cette façon, il est possible de comparer non seulement des versions de différents niveaux, comme '4.1' et '4.1.2', mais aussi des versions de développement à la mode de PHP, à n'importe quel stade.
version1
Premier numéro de version.
version2
Second numéro de version.
operator
Si troisième argument optionnel operator
est spécifié, il est possible de tester une relation particulière.
Les opérateurs possibles sont :
<,
lt, <=,
le, >,
gt, >=,
ge, ==,
=, eq,
!=, <>,
ne.
Ce paramètre est sensible à la casse, aussi les valeurs doivent être en minuscule.
Par défaut, version_compare() retourne -1 si la première version est inférieure à la seconde, 0 si elles sont égales, et 1 si la seconde est inférieure à la première.
Lorsque l'on utilise le paramètre optionnel operator,
la fonction retourne TRUE si la relation est celle spécifiée par l'opérateur,
FALSE sinon.
Les exemples ci-dessous utilisent la constante
PHP_VERSION, sachant qu'elle contient la valeur
de la version PHP utilisée pour exécuter le code.
Exemple #1 Exemple avec version_compare()
<?php
if (version_compare(PHP_VERSION, '6.0.0') >= 0) {
echo 'J\'ai au moins la version 6.0.0 de PHP ; ma version : ' . PHP_VERSION . "\n";
}
if (version_compare(PHP_VERSION, '5.3.0') >= 0) {
echo 'J\'ai au moins la version 5.3.0 de PHP ; ma version : ' . PHP_VERSION . "\n";
}
if (version_compare(PHP_VERSION, '5.0.0', '>=')) {
echo 'J\'utilise PHP 5 ; ma version : ' . PHP_VERSION . "\n";
}
if (version_compare(PHP_VERSION, '5.0.0', '<')) {
echo 'J\'utilise PHP 4 ; ma version : ' . PHP_VERSION . "\n";
}
?>
Note:
La constante
PHP_VERSIONcontient la version courante de PHP.
Note:
Notez que les versions intermédiaires, comme 5.3.0-dev, sont considérées comme inférieures à leurs versions finales (telle que 5.3.0).
(PHP 4, PHP 5)
zend_logo_guid — Retourne le logo de Zend
zend_logo_guid() retourne l'identifiant pouvant être utilisé pour afficher le logo Zend en utilisant l'image intégrée.
Retourne PHPE9568F35-D428-11d2-A769-00AA001ACF42.
Exemple #1 Exemple avec zend_logo_guid()
<?php
echo '<img src="' . $_SERVER['PHP_SELF'] .
'?=' . zend_logo_guid() . '" alt="Zend Logo !" />';
?>
(PHP 5)
zend_thread_id — Retourne un identifiant unique du thread courant
Cette fonction retourne un identifiant unique pour le thread courant.
Retourne l'identifiant du thread, sous la forme d'un entier.
Exemple #1 Exemple avec zend_thread_id()
<?php
$thread_id = zend_thread_id();
echo 'ID du thread courant : ' . $thread_id;
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
ID du thread courant : 7864
Note:
Cette fonction n'est disponible que si PHP a été compilé avec le support ZTS (Zend Thread Safety) et le mode de débogage (--enable-debug).
(PHP 4, PHP 5)
zend_version — Lit la version courante du moteur Zend
Retourne une chaîne contenant le numéro de version du moteur d'analyse Zend actuellement en cours d'utilisation.
Retourne le numéro de la version du moteur Zend, sous la forme d'une chaîne de caractères.
Exemple #1 Exemple avec zend_version()
<?php
echo "Version du moteur Zend : " . zend_version();
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Version du moteur Zend : 2.2.0
L'extension runkit fournit les moyens de modifier les constantes, les fonctions et les classes définies par l'utilisateur. Elle fournit aussi ces moyens pour les variables superglobales et les sous-interpréteurs par sandboxing.
Ce paquetage est signifié en tant que remplacement de fonctionnalités pour le paquetage » classkit. Lorsque compilé avec l'option --enable-runkit=classkit à ./configure, les définitions des fonctions et des constantes de classkit seront exportées.
Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.
RUNKIT_IMPORT_FUNCTIONS
(entier)
RUNKIT_IMPORT_CLASS_METHODS
(entier)
RUNKIT_IMPORT_CLASS_CONSTS
(entier)
RUNKIT_IMPORT_CLASS_PROPS
(entier)
RUNKIT_IMPORT_CLASSES
(entier)
RUNKIT_IMPORT_CLASS_*.
RUNKIT_IMPORT_OVERRIDE
(entier)
RUNKIT_ACC_PUBLIC
(entier)
RUNKIT_ACC_PROTECTED
(entier)
RUNKIT_ACC_PRIVATE
(entier)
CLASSKIT_ACC_PUBLIC
(entier)
CLASSKIT_ACC_PROTECTED
(entier)
CLASSKIT_ACC_PRIVATE
(entier)
CLASSKIT_AGGREGATE_OVERRIDE
(entier)
RUNKIT_VERSION
(chaîne de caractères)
CLASSKIT_VERSION
(chaîne de caractères)
Modification de Constantes, Fonctions, Classes et Méthodes fonctionne avec toutes les versions de PHP 4 et PHP 5. Aucune condition spéciale n'est nécessaire.
Les Superglobales Personnalisées sont seulement disponibles dans les versions PHP 4.2.0 et supérieures.
Sandboxing nécessite PHP 5.1.0 ou supérieur ou PHP 5.0.0 avec le patch spécial TSRM appliqué. Sans se soucier de quelle version de PHP est utilisé, sandboxing doit être compilé avec l'option --enable-maintainer-zts. Voyez le fichier README dans le paquetage de runkit pour plus d'informations.
Cette extension » PECL n'est pas intégrée à PHP.
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/runkit.
Aucune bibliothèque DLL pour cette extension PECL n'est actuellement disponible. Reportez-vous à la section Compilation sous Windows.
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
| Nom | Défaut | Modifiable | Historique |
|---|---|---|---|
| runkit.superglobal | "" | PHP_INI_PERDIR | |
| runkit.internal_override | "0" | PHP_INI_SYSTEM |
Voici un éclaircissement sur l'utilisation des directives de configuration.
runkit.superglobal
string
Exemple #1 Superglobales particulières avec runkit.superglobal=_FOO,_BAR dans php.ini
<?php
function montre_valeurs() {
echo "Foo est $_FOO\n";
echo "Bar est $_BAR\n";
echo "Baz est $_BAZ\n";
}
$_FOO = 'foo';
$_BAR = 'bar';
$_BAZ = 'baz';
/* Montre foo et bar mais pas baz */
montre_valeurs();
?>
runkit.internal_override
boolean
Cette extension ne définit aucune ressource.
(PECL runkit >= 0.7.0)
Runkit_Sandbox — Classe Runkit Sandbox -- Machine Virtuelle PHP
L'instanciation de la classe Runkit_Sandbox crée un nouveau thread avec sa propre portée et sa pile de programme. En utilisant les options passées au constructeur, cet environnement peut être restreint à un sous-ensemble pour lequel l'interpréteur primaire peut exécuter et fournir un environnement plus sûr pour l'exécution de code utilisateur.
Note: Support Sandbox (requis pour runkit_lint(), runkit_lint_file() et la classe Runkit_Sandbox) n'est seulement disponible qu'avec PHP 5.1 ou les versions de PHP 5.0 spécialement patché et nécessite que la protection de thread soit activée. Voyez le fichier README inclus dans le paquetage runkit pour plus d'informations.
$options
] )
options est un tableau associatif contenant n'importe
quelle combinaison des options ini listées ci-dessous.
safe_mode
Si un script extérieur qui est instancié avec la classe Runkit_Sandbox est configuré avec safe_mode = off, alors safe_mod devrait être activé pour l'environnement sandbox. Cette configuration ne peut être utilisée pour désactiver safe_mode lorsque safe_mode est déjà activé dans le script extérieur.
safe_mode_gid
Si le script extérieur qui est instancié avec la classe Runkit_Sandbox est configuré avec safe_mode_gid = on, alors safe_mod_gid devrait être désactivé pour l'environnement sandbox. Cette configuration ne peut être utilisée pour activer safe_mode_gid lorsque c'est déjà désactivé dans le script extérieur.
safe_mode_include_dir
Si le script extérieur qui est instancié avec la classe Runkit_Sandbox est configuré avec safe_mode_include_dir, alors un nouveau safe_mode_include_dir devrait être fixé pour les environnements de sandbox sous la valeur actuellement définie. safe_mode_include_dir peut aussi être supprimé pour indiquer que l'évitement de cette fonctionnalité est désactivé. Si safe_mode_include_dir était vide dans le script extérieur, mais safe_mod n'était pas activé, alors n'importe quel safe_mode_include_dir arbitraire peut être fixé en activant le safe_mode.
open_basedir
open_basedir peut être fixé à n'importe quel
chemin sous la configuration courante de
open_basedir. Si open_basedir n'est pas fixé dans
la portée globale, alors il est assumé qu'il est dans le répertoire
root et peut être fixé à n'importe quelle autre emplacement.
allow_url_fopen
Comme safe_mode, cette configuration peut
seulement être faite plus restrictive, dans ce cas, en mettant FALSE
lorsque la valeur était précédemment TRUE.
disable_functions
Liste de fonctions séparées par des virgules à désactiver dans le sous-interpréteur sandbox. Cette liste ne nécessite pas de contenir le nom des fonctions déjà désactivées, elles resteront désactivées même si elles ne sont pas listées.
disable_classes
Liste de classes séparées par des virgules à désactiver dans le sous-interpréteur sandbox. Cette liste ne nécessite pas de contenir le nom des classes déjà désactivées, elles resteront désactivées même si elles ne sont pas listées.
runkit.superglobal
Liste des variables qui seront traitées en tant que superglobales dans le sous-interpréteur sandbox. Ces variables seront utilisées en plus de celles définies à l'interne ou à l'aide de la configuration runkit.superglobal.
runkit.internal_override
L'option ini runkit.internal_override devrait être désactivée (mais non réactivée) à l'intérieur des sandbox.
Exemple #1 Instanciation d'un sandbox restreint
<?php
$options = array(
'safe_mode'=>true,
'open_basedir'=>'/var/www/users/jdoe/',
'allow_url_fopen'=>'false',
'disable_functions'=>'exec,shell_exec,passthru,system',
'disable_classes'=>'myAppClass');
$sandbox = new Runkit_Sandbox($options);
/* Configurations ini non protégées sont fixées normalement */
$sandbox->ini_set('html_errors',true);
?>
Toutes les variables dans la portée globale de l'environnement sandbox sont accessibles comme étant des propriétés de l'objet sandbox. La première chose à noter, c'est puisque la manière de gestion de la mémoire entre les deux threads est faite que les objets et les variables de ressources ne peuvent pas, jusqu'à présent, être échangées entre les interpréteurs. De plus, tous les tableaux sont copiés au complet et toutes références seront perdues. Cela veut aussi dire que les références entre les interpréteurs ne sont pas possibles.
Exemple #2 Utilisation des variables dans sandbox
<?php
$sandbox = new Runkit_Sandbox();
$sandbox->foo = 'bar';
$sandbox->eval('echo "$foo\n"; $bar = $foo . "baz";');
echo "{$sandbox->bar}\n";
if (isset($sandbox->foo)) unset($sandbox->foo);
$sandbox->eval('var_dump(isset($foo));');
?>
L'exemple ci-dessus va afficher :
bar barbaz bool(false)
Toute fonction définie dans le sandbox peut être appelée en tant que méthode sur l'objet sandbox. Ceci inclut aussi quelques constructions de pseudo-fonctions : pseudo-function language constructs: eval(), include, include_once, require, require_once, echo, print, die(), et exit().
Exemple #3 Appel de fonctions sandbox
<?php
$sandbox = new Runkit_Sandbox();
echo $sandbox->str_replace('a','f','abc');
?>
L'exemple ci-dessus va afficher :
fbc
Lors du passage d'arguments à une fonction sandbox, les arguments sont pris à partir de l'extérieur de l'instance de PHP. Si vous voulez passer les arguments à la portée de sandbox, soyez assuré de les accéder comme étant des propriétés de l'objet sandbox comme montré plus haut.
Exemple #4 Passage d'arguments aux fonctions sandbox
<?php
$sandbox = new Runkit_Sandbox();
$foo = 'bar';
$sandbox->foo = 'baz';
echo $sandbox->str_replace('a',$foo,'a');
echo $sandbox->str_replace('a',$sandbox->foo,'a');
?>
L'exemple ci-dessus va afficher :
bar baz
Depuis la version de runkit 0.5, certaines configurations de Sandbox
peuvent être modifiées à la volée en utilisant la syntaxe ArrayAccess.
Certaines configurations, comme active sont en
lecture seule et permettent de fournir des informations de statut. Les
autres configurations, comme output_handler peuvent
être fixées et lues comme un tableau normal. Les configurations futures
devraient être en écriture seule, cependant aucune configuration n'existe
présentement.
| Configuration | Type | But | Défaut |
|---|---|---|---|
| active | booléen (Lecture Seule) |
TRUE si le Sandbox est toujours dans un état utilisable, FALSE si
la requête est en arrêt dû à un appel à die(), exit() ou à cause d'une
condition d'erreur fatale.
|
TRUE (Initial) |
| output_handler | Callback | Lorsque fixée à une valeur de retour valide, toutes sorties générées par l'instance Sandbox seront traitées à travers la fonction nommée. Les sorties de Sandbox suivent les mêmes conventions d'appel pour les gestionnaires de sortie du système entier. | Aucun |
| parent_access | booléen | Autorise sandbox à utiliser des instances de la classe Runkit_Sandbox_Parent. Doit être activée pour que les autres configurations reliées à Runkit_Sandbox_Parent fonctionnent. | FALSE |
| parent_read | booléen | Autorise sandbox à lire des variables dans son contexte parent. | FALSE |
| parent_write | booléen | Autorise sandbox à modifier des variables dans son contexte parent. | FALSE |
| parent_eval | booléen | Autorise sandbox à évaluer du code arbitraire dans son contexte parent. (DANGEREUX) | FALSE |
| parent_include | booléen | Autorise sandbox à inclure des fichiers de code php dans son contexte parent. DANGEREUX | FALSE |
| parent_echo | booléen | Autorise sandbox à afficher des données dans son contexte parent en court-circuitant efficacement son propre output_handler. | FALSE |
| parent_call | booléen | Autorise sandbox à appeler des fonctions dans son contexte parent. | FALSE |
| parent_die | booléen | Autorise sandbox à tuer son propre parent. (Et donc soi-même) | FALSE |
| parent_scope | entier | Quelle portée la propriété de l'accès parental vérifiera ? 0 == Portée Globale, 1 == Portée Appelante, 2 == Portée précédant la portée appelante, 3 == La porté avant celle-ci, etc., etc. | 0 (Global) |
| parent_scope | chaîne de caractères | Lorsque parent_scope est fixée à une valeur d'une chaîne de caractères, elle se réfère à une variable tableau nommée dans la portée globale. Si la variable nommée n'existe pas au moment de son accès, elle sera créée comme un tableau vide. Si la variable existe mais n'est pas un tableau, un faux tableau sera créé contenant une référence à la variable globale nommée. |
(PECL runkit >= 0.7.0)
Runkit_Sandbox_Parent — Classe Anti-Sandbox Runkit
L'instanciation de la classe Runkit_Sandbox_Parent à l'intérieure d'un environnement sandbox créé à partir de la classe Runkit_Sandbox fournit certains moyens (contrôlés) pour un sandbox fils pour accéder à son parent.
Note: Support Sandbox (requis pour runkit_lint(), runkit_lint_file() et la classe Runkit_Sandbox) n'est seulement disponible qu'avec PHP 5.1 ou les versions de PHP 5.0 spécialement patché et nécessite que la protection de thread soit activée. Voyez le fichier README inclus dans le paquetage runkit pour plus d'informations.
Afin de faire fonctionner une des fonctionnalités de Runkit_Sandbox_Parent, le support doit être activé sur une base de chaque sandbox en activant le drapeau parent_access à partir du contexte parent.
Exemple #1 Travailler avec des variables dans un sandbox
<?php
$sandbox = new Runkit_Sandbox();
$sandbox['parent_access'] = true;
?>
Comme les accès des variables de sandbox, les variables de parent sandbox devraient être lues et écrites à partir des propriétés de la classe Runkit_Sandbox_Parent. L'accès en lecture aux variables parentes devraient être activé avec la configuration parent_read (en plus de la base de configuration parent_access). L'accès en écriture est activé avec la configuration parent_write.
La portée des variables est différente de l'accès aux variables enfants de sandbox; elle n'est pas limitée au variables globales seulement. En configurant la configuration parent_scope pour un entier approprié, les autres portées dans la pile active pourraient être inspectée. Une valeur de 0 (Défaut) autorisera l'accès direct aux variables dans la portée globale. 1 pointera l'accès des variables à n'importe quelles variables dont la portée était active au moment ou le bloc courant du code sandbox était exécuté. Des valeurs plus élevées font reculer à travers les fonctions qui ont appelées d'autres fonctions qui menent au code sandbox en train d'être exécuté et qui essaie d'accéder à ses propres variables parentes.
Exemple #2 Accès aux variables parentes
<?php
$php = new Runkit_Sandbox();
$php['parent_access'] = true;
$php['parent_read'] = true;
$test = "Global";
$php->eval('$PARENT = new Runkit_Sandbox_Parent;');
$php['parent_scope'] = 0;
one();
$php['parent_scope'] = 1;
one();
$php['parent_scope'] = 2;
one();
$php['parent_scope'] = 3;
one();
$php['parent_scope'] = 4;
one();
$php['parent_scope'] = 5;
one();
function un() {
$test = "un()";
two();
}
function deux() {
$test = "deux()";
three();
}
function trois() {
$test = "trois()";
$GLOBALS['php']->eval('var_dump($PARENT->test);');
}
?>
L'exemple ci-dessus va afficher :
string(6) "Global" string(7) "trois()" string(5) "deux()" string(5) "un()" string(6) "Global" string(6) "Global"
Comme l'accès avec sandbox, un sandbox peut accéder ses fonctions parentes si les configurations adéquates ont été activées. L'activation de parent_call autorisera le sandbox d'appeler toutes les fonctions disponibles à la portée parente. Les constructions de langage sont chacune contrôlées par ses propres configurations : print et echo sont activées avec parent_echo. die() et exit() sont activées avec parent_die. eval() est activées avec parent_eval tandis que include, include_once, require et require_once sont activées avec parent_include.
(PECL runkit >= 0.7.0)
runkit_class_adopt — Convertit une classe de base à une classe héritée, ajoute une méthode ancestrale lorsque approprié
$classname
, string $parentname
)
classname
Le nom de la classe à adopter
parentname
Classe parente pour laquelle la classe enfant s'étend
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec runkit_class_adopt()
<?php
class myParent {
function parentFunc() {
echo "Sortie Fonction Parente\n";
}
}
class myChild {
}
runkit_class_adopt('myChild','myParent');
myChild::parentFunc();
?>
L'exemple ci-dessus va afficher :
Sortie Fonction Parente
(PECL runkit >= 0.7.0)
runkit_class_emancipate — Convertit une classe héritée à une classe de base, supprime toute méthode pour qui la portée est ancestrale
$classname
)
classname
Nom de la classe à émanciper
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec runkit_class_emancipate()
<?php
class myParent {
function parentFunc () {
echo "Sortie Fonction Parente\n";
}
}
class myChild extends myParent {
}
myChild::parentFunc();
runkit_class_emancipate('myChild');
myChild::parentFunc();
?>
L'exemple ci-dessus va afficher :
Sortie Fonction Parente Fatal error: Call to undefined function: parentFunc() in example.php on line 12
(PECL runkit >= 0.7.0)
runkit_constant_add — Similaire à define(), mais permet aussi la définition dans définitions de classe
constname
Nom de la constante à déclarer. Soit une chaîne de caractères pour indiquer une constante globale ou un classname::constname pour indiquer une constante de classe.
value
Valeur NULL, Bool, Long, Double, String ou Resource pour enregistrer la nouvelle constante.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL runkit >= 0.7.0)
runkit_constant_redefine — Redéfinit une constante déjà définie
constname
Constante à redéfinir. Soit une chaîne de caractères pour indiquer une constante globale ou classname::constname pour indiquer une constante de classe.
newvalue
Nouvelle valeur à assigner à la constante.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL runkit >= 0.7.0)
runkit_constant_remove — Enlève/Supprime une constante déjà définie
$constname
)
constname
Nom de la constante à enlever. Soit une chaîne de caractères pour indiquer une constante globale ou classname::constname pour indiquer une constante de classe.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL runkit >= 0.7.0)
runkit_function_add — Ajoute une nouvelle fonction, similaire à create_function()
$funcname
, string $arglist
, string $code
)
funcname
Nom de la fonction à être créé
arglist
Liste d'arguments séparés par des virgules
code
Code qui compose la fonction
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec runkit_function_add()
<?php
runkit_function_add('testme','$a,$b','echo "La valeur de a est $a\n"; echo "La valeur de b est $b\n";');
testme(1,2);
?>
L'exemple ci-dessus va afficher :
La valeur de a est 1 La valeur de b est 2
(PECL runkit >= 0.7.0)
runkit_function_copy — Copie une fonction vers un nom de fonction nouveau
$funcname
, string $targetname
)
funcname
Nom de la fonction existante
targetname
Nom de la nouvelle fonction pour copier la définition vers celle-ci
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec runkit_function_copy()
<?php
function original() {
echo "Dans une fonction\n";
}
runkit_function_copy('original','duplicate');
original();
duplicate();
?>
L'exemple ci-dessus va afficher :
Dans une fonction Dans une fonction
(PECL runkit >= 0.7.0)
runkit_function_redefine — Remplace une définition de fonction avec une nouvelle implémentation
$funcname
, string $arglist
, string $code
)Note: Par défaut, seulement les fonctions définies par l'utilisateur peuvent être supprimées, renommées ou modifiées. Afin de surcharger des fonctions internes, vous devez activer la configuration runkit.internal_override dans le fichier php.ini du système entier.
funcname
Nom de la fonction à redéfinir
arglist
Nouvelle liste d'arguments à être acceptés par la fonction
code
Nouvelle implémentation du code
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec runkit_function_redefine()
<?php
function testme() {
echo "Implémentation de Testme originale\n";
}
testme();
runkit_function_redefine('testme','','echo "Nouvelle implémentation de Testme\n";');
testme();
?>
L'exemple ci-dessus va afficher :
Implémentation de Testme originale Nouvelle implémentation de Testme
(PECL runkit >= 0.7.0)
runkit_function_remove — Enlève une définition de fonction
$funcname
)Note: Par défaut, seulement les fonctions définies par l'utilisateur peuvent être supprimées, renommées ou modifiées. Afin de surcharger des fonctions internes, vous devez activer la configuration runkit.internal_override dans le fichier php.ini du système entier.
funcname
Nom de la fonction à supprimer
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL runkit >= 0.7.0)
runkit_function_rename — Change le nom d'une fonction
$funcname
, string $newname
)Note: Par défaut, seulement les fonctions définies par l'utilisateur peuvent être supprimées, renommées ou modifiées. Afin de surcharger des fonctions internes, vous devez activer la configuration runkit.internal_override dans le fichier php.ini du système entier.
funcname
Nom de la fonction courante
newname
Nouveau nom de fonction
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL runkit >= 0.7.0)
runkit_import — Traite un fichier PHP important fonctions et définitions de classes, écrasement où applicable
$filename
[, int $flags = RUNKIT_IMPORT_CLASS_METHODS
] )
Similaire à include,
par contre tout code qui réside à l'extérieur de fonction ou classe est simplement ignoré.
De plus, dépendamment de la valeur de flags,
toutes fonctions et classes qui existent déjà dans l'environnement en cours
d'exécution seront automatiquement écrasées par leurs nouvelles définitions.
filename
Nom du fichier pour importer les définitions de fonctions et de classe
flags
Comparaison de bits OU (OR) de la famille de constantes RUNKIT_IMPORT_*.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL runkit >= 0.7.0)
runkit_lint_file — Vérifie la syntaxe PHP d'un fichier spécifié
$filename
)La fonction runkit_lint_file() effectue une vérification de syntaxe (lint) sur le fichier spécifié en testant les erreurs de scripts. Cette fonction est similaire à l'utilisation de php -l à partir de la ligne de commande.
Note: Support Sandbox (requis pour runkit_lint(), runkit_lint_file() et la classe Runkit_Sandbox) n'est seulement disponible qu'avec PHP 5.1 ou les versions de PHP 5.0 spécialement patché et nécessite que la protection de thread soit activée. Voyez le fichier README inclus dans le paquetage runkit pour plus d'informations.
filename
Fichier contenant du code PHP à être vérifié
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL runkit >= 0.7.0)
runkit_lint — Vérifie la syntaxe PHP de code PHP spécifié
$code
)La fonction runkit_lint() effectue une vérification de syntaxe (lint) sur le code PHP spécifié en testant les erreurs de scripts. Cette fonction est similaire à l'utilisation de php -l à partir de la ligne de commande à l'exception que runkit_lint() accepte le code actuel plutôt qu'un fichier.
Note: Support Sandbox (requis pour runkit_lint(), runkit_lint_file() et la classe Runkit_Sandbox) n'est seulement disponible qu'avec PHP 5.1 ou les versions de PHP 5.0 spécialement patché et nécessite que la protection de thread soit activée. Voyez le fichier README inclus dans le paquetage runkit pour plus d'informations.
code
Code PHP à être vérifié
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL runkit >= 0.7.0)
runkit_method_add — Ajoute dynamiquement une nouvelle méthode à une classe donnée
$classname
, string $methodname
, string $args
, string $code
[, int $flags = RUNKIT_ACC_PUBLIC
] )Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
classname
La classe dans laquelle la méthode sera ajoutée
methodname
Le nom de la méthode à ajouter
args
Liste des arguments séparés par des virgules pour la nouvelle méthode créée
code
Le code à être évalué lors que methodname est
appelé
flags
Le type de méthode à créer, peut être
RUNKIT_ACC_PUBLIC,
RUNKIT_ACC_PROTECTED ou
RUNKIT_ACC_PRIVATE
Note:
Ce paramètre est utilisé seulement en PHP 5, parce que, avant cette version, toutes les méthodes étaient publiques.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec runkit_method_add()
<?php
class Example {
function foo() {
echo "foo!\n";
}
}
// Crée un objet Example
$e = new Example();
// Ajoute une nouvelle méthode publique
runkit_method_add(
'Example',
'add',
'$num1, $num2',
'return $num1 + $num2;',
RUNKIT_ACC_PUBLIC
);
// ajoute 12 + 4
echo $e->add(12, 4);
?>
L'exemple ci-dessus va afficher :
16
(PECL runkit >= 0.7.0)
runkit_method_copy — Copie une méthode d'une classe à une autre
$dClass
, string $dMethod
, string $sClass
[, string $sMethod
] )Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
dClass
Classe destination pour la méthode copiée
dMethod
Nom de la méthode de destination
sClass
Classe source pour la méthode à copier
sMethod
Nom de la méthode à copier à partir de la classe source. Si ce
paramètre est omis, la valeur de dMethod est
utilisée.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec runkit_method_copy()
<?php
class Foo {
function example() {
return "foo!\n";
}
}
class Bar {
// initialement, aucune méthode
}
// Copie la méthode example() de la classe Foo vers la classe Bar, comme étant baz()
runkit_method_copy('Bar', 'baz', 'Foo', 'example');
// sortie de la fonction copiée
echo Bar::baz();
?>
L'exemple ci-dessus va afficher :
foo!
(PECL runkit >= 0.7.0)
runkit_method_redefine — Change dynamiquement le code de la méthode donnée
$classname
, string $methodname
, string $args
, string $code
[, int $flags = RUNKIT_ACC_PUBLIC
] )Note: Cette fonction ne peut être utilisée pour manipuler la méthode en cours d'utilisation (ou chaînée).
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
classname
La classe dans laquelle la méthode sera redéfinie
methodname
Le nom de la méthode à redéfinir
args
Liste d'arguments séparés par des virgules pour la méthode redéfinie
code
Le nouveau code qui sera évalué lorsque
methodname sera appelée
flags
La méthode redéfinie peut etre
RUNKIT_ACC_PUBLIC,
RUNKIT_ACC_PROTECTED ou
RUNKIT_ACC_PRIVATE
Note:
Ce paramètre est utilisé seulement en PHP 5, parce que, avant cette version, toutes les méthodes étaient publiques.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec runkit_method_redefine()
<?php
class Example {
function foo() {
return "foo!\n";
}
}
// Crée un objet Example
$e = new Example();
// Sortie Example::foo() (avant la redéfinition)
echo "Avant : " . $e->foo();
// Redéfinition de la méthode 'foo'
runkit_method_redefine(
'Example',
'foo',
'',
'return "bar!\n";',
RUNKIT_ACC_PUBLIC
);
// Sortie Example::foo() (après la redéfinition)
echo "Après : " . $e->foo();
?>
L'exemple ci-dessus va afficher :
Avant : foo! Après : bar!
(PECL runkit >= 0.7.0)
runkit_method_remove — Supprime dynamiquement la méthode donnée
$classname
, string $methodname
)Note: Cette fonction ne peut être utilisée pour manipuler la méthode en cours d'utilisation (ou chaînée).
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
classname
La classe dans laquelle la méthode sera supprimée
methodname
Le nom de la méthode à supprimer
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec runkit_method_remove()
<?php
class Example {
function foo() {
return "foo!\n";
}
function bar() {
return "bar!\n";
}
}
// Suppression de la méthode 'foo'
runkit_method_remove(
'Example',
'foo'
);
echo implode(' ', get_class_methods('Example'));
?>
L'exemple ci-dessus va afficher :
bar
(PECL runkit >= 0.7.0)
runkit_method_rename — Change dynamiquement le nom de la méthode donnée
$classname
, string $methodname
, string $newname
)Note: Cette fonction ne peut être utilisée pour manipuler la méthode en cours d'utilisation (ou chaînée).
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
classname
La classe dans laquelle la méthode sera renommée
methodname
Le nom de la méthode à renommer
newname
Le nouveau nom à donner à la méthode renommée
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec runkit_method_rename()
<?php
class Example {
function foo() {
return "foo!\n";
}
}
// Renomme la méthode 'foo' par 'bar'
runkit_method_rename(
'Example',
'foo',
'bar'
);
// output renamed function
echo Example::bar();
?>
L'exemple ci-dessus va afficher :
foo!
(PECL runkit >= 0.8.0)
runkit_return_value_used — Détermine si la valeur de retour des fonctions courantes sera utilisée
Retourne TRUE si la valeur de retour d'une fonction est utilisée par la
portée appelante, FALSE autrement.
Exemple #1 Exemple avec runkit_return_value_used()
<?php
function foo() {
var_dump(runkit_return_value_used());
}
foo();
$f = foo();
?>
L'exemple ci-dessus va afficher :
bool(false) bool(true)
(PECL runkit >= 0.7.0)
runkit_sandbox_output_handler — Spécifie une fonction à capturer et/ou traiter la sortie à partir d'un runkit sandbox
Normalement, toutes les sorties (comme avec echo ou print) seront écrites comme si elles avaient été écrites à partir de la portée du parent. Cependant, l'utilisation de runkit_sandbox_output_handler(), sorties générées par le sandbox (incluant les erreurs), peuvent être capturées par une fonction extérieure à sandbox.
Note: Support Sandbox (requis pour runkit_lint(), runkit_lint_file() et la classe Runkit_Sandbox) n'est seulement disponible qu'avec PHP 5.1 ou les versions de PHP 5.0 spécialement patché et nécessite que la protection de thread soit activée. Voyez le fichier README inclus dans le paquetage runkit pour plus d'informations.
Note: Obsolète
Depuis la version de runkit 0.5, cette fonction est obsolète et devrait être supprimée de ce paquetage avant la version 1.0. Le gestionnaire de sortie pour une instance donnée de Runkit_Sandbox devrait être lue/fixée en utilisant la syntaxe tableau de décalage montrée sur la page de définition de la classe Runkit_Sandbox.
sandbox
Instance de la classe Runkit_Sandbox sur laquelle spécifier la gestion des sorties.
callback
Nom d'une fonction qui s'attend à un paramètre. La sortie générée par
sandbox sera envoyée à cette fonction de rappel.
Tout ce qui sera retourné par cette fonction sera affiché normalement.
Si ce paramètre n'est pas passé, alors la gestion des sorties ne sera
pas changée. Si une valeur incorrecte est passée, la gestion des
sorties sera désactivée et sera retournée à l'affichage direct.
Retourne le nom de la fonction de rappel précédemment définie en tant que
gestion des sorties, ou FALSE si aucun gestionnaire n'avait été
précédemment défini.
Exemple #1 Alimentation de sortie vers une variable
<?php
function capture_output($str) {
$GLOBALS['sandbox_output'] .= $str;
return '';
}
$sandbox_output = '';
$php = new Runkit_Sandbox();
runkit_sandbox_output_handler($php, 'capture_output');
$php->echo("Bonjour\n");
$php->eval('var_dump("Excusez-moi");');
$php->die("Je me suis perdu.");
unset($php);
echo "Sandbox Complété\n\n";
echo $sandbox_output;
?>
L'exemple ci-dessus va afficher :
Sandbox Complété Bonjour string(9) "Excusez-moi" Je me suis perdu.
(PECL runkit >= 0.7.0)
runkit_superglobals — Retourne un tableau indexé numériquement des variables superglobales enregistrées
Retourne un tableau indexé numériquement des variables superglobales enregistrée actuellement. C'est-à-dire _GET, _POST, _REQUEST, _COOKIE, _SESSION, _SERVER, _ENV, _FILES
L'extension scream donne la possibilité de désactiver l'opérateur de contrôle d'erreur, de manière à ce que toutes les erreurs soient rapportées. Cette fonctionnalité est désactivée par une directive PHP.
PHP version 5.2.0 ou plus récent.
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/scream
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
| Nom | Défaut | Modifiable | Historique |
|---|---|---|---|
| scream.enabled | Off | PHP_INI_ALL |
Voici un éclaircissement sur l'utilisation des directives de configuration.
scream.enabled
int
Active ou non le module scream.
Cette extension ne définit aucune ressource.
Cet exemple montre comment l'extension scream affecte le comportement du gestionnaire d'erreur PHP.
Exemple #1 Activation et désactivation de scream, à l'exécution
<?php
// Affichage des erreurs
ini_set('display_errors', true);
error_reporting(E_ALL);
// Désactivation de scream : le code est silencieux
ini_set('scream.enabled', false);
echo "Opening http://example.com/not-existing-file\n";
@fopen('http://example.com/not-existing-file', 'r');
// Activation de scream : le code est verbeux
ini_set('scream.enabled', true);
echo "Opening http://example.com/not-existing-file\n";
@fopen('http://example.com/another-not-existing-file', 'r');
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Opening http://example.com/not-existing-file Opening http://example.com/not-existing-file Warning: fopen(http://example.com/another-not-existing-file): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in example.php on line 14
Note: Généralement, on active cette extension avec une directive de configuration php.ini, au lieu de la modifier dans le code PHP.
Les références faibles fournissent une façon non-intrusive de gérer les objets éphémères. Contrairement aux références normales (fortes), les références faibles n'alertent pas le gestionnaire de la libération de l'objet. Pour cette raison, un objet peut être détruit même si une référence faible vers cet objet existe toujours. Dans de telles conditions, la référence faible devient invalide de façon transparente.
Exemple #1 Exemple d'utilisation de Weakref
<?php
class MyClass {
public function __destruct() {
echo "Destruction de l'objet !\n";
}
}
$o1 = new MyClass;
$r1 = new Weakref($o1);
if ($r1->valid()) {
echo "L'objet existe toujours !\n";
var_dump($r1->get());
} else {
echo "L'objet est mort !\n";
}
unset($o1);
if ($r1->valid()) {
echo "L'objet existe toujours !\n";
var_dump($r1->get());
} else {
echo "L'objet est mort !\n";
}
?>
L'exemple ci-dessus va afficher :
L'objet existe toujours !
object(MyClass)#1 (0) {
}
L'objet est mort !
Object is dead!
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Cette extension » PECL n'est pas intégrée à PHP.
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/weakref.
Aucune bibliothèque DLL pour cette extension PECL n'est actuellement disponible. Reportez-vous à la section Compilation sous Windows.
Cette extension ne définit aucune ressource.
(PECL weakref >= 0.1.0)
La classe WeakRef fournit une passerelle vers les objets sans prévenir le gestionnaire de collection de la libération de ces derniers. Elle fournit également une façon de passer d'une référence faible à une référence forte.
Exemple #1 Exemple d'utilisation de WeakRef
<?php
class MyClass {
public function __destruct() {
echo "Destruction de l'objet !\n";
}
}
$o1 = new MyClass;
$r1 = new WeakRef($o1);
if ($r1->valid()) {
echo "L'objet existe toujours !\n";
var_dump($r1->get());
} else {
echo "L'objet est mort !\n";
}
unset($o1);
if ($r1->valid()) {
echo "L'objet existe toujours !\n";
var_dump($r1->get());
} else {
echo "L'objet est mort !\n";
}
?>
L'exemple ci-dessus va afficher :
L'objet existe toujours !
object(MyClass)#1 (0) {
}
Destruction de l'objet !
L'objet est mort !
(PECL weakref >= 0.1.0)
Weakref::acquire — Acquière une forte référence sur un objet
Acquière une forte référence sur un objet, passant ainsi virtuellement d'une référence faible en une référence forte.
Cette fonction ne contient aucun paramètre.
Retourne TRUE si la référence est valide et peut être convertie en une
référence forte, FALSE sinon.
Exemple #1 Exemple avec Weakref::acquire()
<?php
class MyClass {
public function __destruct() {
echo "Destroying object!\n";
}
}
$o1 = new MyClass;
$r1 = new Weakref($o1);
$r1->acquire();
echo "Unsetting o1...\n";
unset($o1);
$o2 = $r1->get();
$r1->release();
echo "Unsetting o2...\n";
unset($o2);
?>
L'exemple ci-dessus va afficher :
Unsetting o1... Unsetting o2... Destroying object!
Exemple #2 Exemple d'acquisition / libération
<?php
class MyClass {
public function __destruct() {
echo "Destroying object!\n";
}
}
$o1 = new MyClass;
$r1 = new Weakref($o1);
echo "Acquiring...\n";
$r1->acquire();
echo " Unsetting...\n";
unset($o1);
echo " Acquiring...\n";
$r1->acquire();
echo " Acquiring...\n";
$r1->acquire();
echo " Releasing...\n";
$r1->release();
echo " Releasing...\n";
$r1->release();
echo "Releasing...\n";
$r1->release();
?>
L'exemple ci-dessus va afficher :
Acquiring...
Unsetting...
Acquiring...
Acquiring...
Releasing...
Releasing...
Releasing...
Destroying object!
(PECL weakref >= 0.1.0)
Weakref::__construct — Construit une nouvelle référence forte
$object
] )Construit une nouvelle référence forte.
object
L'objet à référencer.
Aucune valeur n'est retournée.
Exemple #1 Exemple avec Weakref::__construct()
<?php
class MyClass {
public function __destruct() {
echo "Destruction de l'objet !\n";
}
}
$o1 = new MyClass;
$r1 = new Weakref($o1);
if ($r1->valid()) {
echo "L'objet existe toujours !\n";
var_dump($r1->get());
} else {
echo "L'objet est mort !\n";
}
unset($o1);
if ($r1->valid()) {
echo "L'objet existe toujours !\n";
var_dump($r1->get());
} else {
echo "L'objet est mort !\n";
}
?>
L'exemple ci-dessus va afficher :
L'objet existe toujours !
object(MyClass)#1 (0) {
}
Destruction de l'objet !
L'objet est mort !
(PECL weakref >= 0.1.0)
Weakref::get — Retourne l'objet pointé par sa référence forte
Retourne l'objet pointé par sa référence forte.
Cette fonction ne contient aucun paramètre.
Retourne l'objet si la référence est toujours valide, NULL sinon.
(PECL weakref >= 0.1.0)
Weakref::release — Libère une référence précédemment acquise
Libère une référence précédemment acquise. Cela revient à modifier une référence forte en une référence faible.
Cette fonction ne contient aucun paramètre.
Retourne TRUE si la référence a été précédemment acquise et ainsi, a pu être
libérée, FALSE sinon.
Exemple #1 Exemple avec Weakref::release()
<?php
class MyClass {
public function __destruct() {
echo "Destruction de l'objet !\n";
}
}
$o1 = new MyClass;
$r1 = new Weakref($o1);
$r1->acquire();
echo "Libération de o1...\n";
unset($o1);
$o2 = $r1->get();
$r1->release();
echo "Libération de o2...\n";
unset($o2);
?>
L'exemple ci-dessus va afficher :
Libération de o1... Libération de o2... Destruction de l'objet !
(PECL weakref >= 0.1.0)
Weakref::valid — Vérifie si l'objet référencé existe toujours
Vérifie si l'objet référencé existe toujours.
Cette fonction ne contient aucun paramètre.
Retourne TRUE si l'objet existe toujours et ainsi, est toujours accessibe
via la méthode Weakref::get(), FALSE sinon.
(PECL weakref >= 0.2.0)
Exemple #1 Exemple d'utilisation de Weakmap
<?php
$wm = new WeakMap();
$o = new StdClass;
class A {
public function __destruct() {
echo "Mort !\n";
}
}
$wm[$o] = new A;
var_dump(count($wm));
echo "Effacement..\n";
unset($o);
echo "Fait\n";
var_dump(count($wm));
L'exemple ci-dessus va afficher :
int(1) Effacement.. Mort ! Fait int(0)
(PECL weakref >= 0.2.0)
WeakMap::__construct — Construit un nouveau map
Construit un nouveau map.
Cette fonction ne contient aucun paramètre.
Aucune valeur n'est retournée.
(PECL weakref >= 0.2.0)
WeakMap::count — Compte le nombre d'entrées du map
Compte le nombre d'entrées du map.
Cette fonction ne contient aucun paramètre.
Retourne le nombre d'entrées du map.
(PECL weakref >= 0.2.0)
WeakMap::current — Retourne la valeur courante de l'itération
Cette fonction ne contient aucun paramètre.
La valeur actuellement itérée.
(PECL weakref >= 0.2.0)
WeakMap::key — Retourne la clé courante de l'itérateur
Retourne l'objet servant comme clé dans le map, à la position courante de l'itérateur.
Cette fonction ne contient aucun paramètre.
L'objet clé actuellement itéré.
(PECL weakref >= 0.2.0)
WeakMap::next — Avance jusqu'au prochain élément du map
Avance jusqu'au prochain élément du map.
Cette fonction ne contient aucun paramètre.
Aucune valeur n'est retournée.
(PECL weakref >= 0.2.0)
WeakMap::offsetExists — Vérifie si un objet est dans le map
$object
)Vérifie si l'objet passé est référencé dans le map.
object
L'objet à vérifier.
Retourne TRUE si l'objet est contenu dans le map,
FALSE sinon.
(PECL weakref >= 0.2.0)
WeakMap::offsetGet — Retourne la valeur pointée par un certain objet
Retourne la valeur pointée par un certain objet.
object
L'objet clé.
Retourne la valeur associée à l'objet clé passé en argument,
ou NULL sinon.
(PECL weakref >= 0.2.0)
WeakMap::offsetSet — Met à jour le map avec une nouvelle paire clé-valeur
Met à jour le map avec une nouvelle paire clé-valeur. Si la clé existe déjà dans le map, l'ancienne valeur est remplacée avec la nouvelle.
object
L'objet servant comme clé de la paire clé-valeur.
value
DOnnées arbitraires servant comme valeur de la paire clé-valeur.
Aucune valeur n'est retournée.
(PECL weakref >= 0.2.0)
WeakMap::offsetUnset — Supprime une entrée depuis le map
$object
)Supprime une entrée depuis le map.
object
L'objet clé à supprimer depuis le map.
Aucune valeur n'est retournée.
(PECL weakref >= 0.2.0)
WeakMap::rewind — Réinitialise l'itérateur au début du map
Réinitialise l'itérateur au début du map.
Cette fonction ne contient aucun paramètre.
Aucune valeur n'est retournée.
(PECL weakref >= 0.2.0)
WeakMap::valid — Vérifie si l'itérateur est toujours sur un élément map valide
Vérifie si l'itérateur est toujours sur un élément map valide.
Cette fonction ne contient aucun paramètre.
Retourne TRUE si l'itérateur est sur un élément valide
qui peut être accédé, FALSE sinon.
L'extension Windows Cache pour PHP est un accélérateur PHP qui est utilisé pour augmenter la vitesse des applications PHP sous Windows et Windows Server. Une fois l'extension Windows Cache activée et chargée par le moteur PHP, les applications PHP peuvent tirer parti des fonctionnalités sans aucune modification de code.
L'extension Windows Cache comprend 5 types de caches. Ce qui suit décrit le but de chaque type de cache et les avantages qu'il procure.
Cache d'Opcode PHP - PHP est un moteur de traitement de script, qui lit un flux d'entrée de données qui contient du texte et / ou des instructions PHP et produit un autre flux de données, le plus souvent au format HTML. Cela signifie que sur un serveur Web le moteur PHP lit, analyse, compile et exécute un script PHP à chaque fois qu'il est demandé par un client Web. Les operations de lecture, d'analyse et de compilation ajoute une charge supplémentaire sur le processeur (CPU) et sur le système de fichiers, ce qui affecte la performance globale d'une application web PHP. Le cache de bytecode PHP (Opcode) est utilisé pour stocker le bytecode du script compilé dans la mémoire partagée pour qu'il puisse être ré-utilisé par le moteur PHP lors des exécutions suivantes du même script.
Cache de fichiers - Même avec le cache d'opcode PHP activé, le moteur PHP doit accèder aux fichiers de script sur un système de fichiers. Lorsque les scripts PHP sont stockés sur le système de fichiers d'un ordinateur distant, les opérations sur ces fichiers introduisent une surcharge importante des performances. L'extension de Cache Windows pour PHP inclut un cache de fichier qui est utilisé pour stocker le contenu des fichiers de scripts PHP dans la mémoire partagée, ce qui réduit le nombre d'opérations effectuées par le moteur PHP sur le système de fichiers.
Cache de résolution des chemins de fichier - Les scripts PHP incluent ou fonctionnent très souvent avec des fichiers en utilisant des chemins relatifs. Chaque chemin de fichier doit être normalisé en un chemin de fichier absolu par le moteur PHP. Quand une application PHP utilise de nombreux fichiers PHP et y accède par des chemins relatifs, l'opération de résolution des chemins peut impacter négativement les performances de l'application. L'extension de Cache Windows pour PHP fournit un cache de résolution des chemins de fichier, qui est utilisé pour stocker les correspondances entre les chemins de fichier relatifs et absolus, réduisant ainsi le nombre de résolutions que le moteur PHP devra effectuer.
Cache utilisateur (disponible depuis la version 1.1.0) - Les scripts PHP peuvent tirer profit du cache de mémoire partagée en utilisant l'API de cache utilisateur. Les objets PHP et les variables peuvent être stockées dans le cache utilisateur et réutilisés lors des requêtes suivantes. Ce cache peut être utilisé pour améliorer les performances des scripts PHP et pour partager les données entre plusieurs processus PHP.
Gestionnaire de session (disponible depuis la version 1.1.0) - Le gestionnaire de session WinCache peut être utilisé pour stocker les données de session PHP dans le cache de la mémoire partagée. Cela évite des opérations sur le système de fichiers pour la lecture et l'écriture des données de session, ce qui améliore les performances lorsque un montant important de données est stocké dans la session PHP.
L'extension est actuellement uniquement supportée sur les configurations suivantes :
Windows OS:
PHP:
Note: L'extension WinCache peut uniquement être utilisée lorsque IIS est configuré pour exécuter PHP via FastCGI.
Cette extension » PECL n'est pas intégrée à PHP.
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/wincache.
Il y a deux packages pour cette extension: un package est pour les versions PHP 5.2.X, et l'autre package est pour PHP 5.3.X. Choisissez le package approprié à la version PHP utilisée.
Pour installer et activer l'extension, suivez ces étapes :
Décompressez le package dans un endroit temporaire.
Copiez le fichier php_wincache.dll dans le dossier d'extensions PHP. En général, ce dossier se nomme "ext" et est situé dans le même dossier avec tout les fichiers binaires PHP. Par exemple : C:\Program Files\PHP\ext.
Avec un éditeur de texte, ouvrez le fichier php.ini, qui se trouve généralement dans le même dossier que tout les fichiers binaires PHP. Par exemple : C:\Program Files\PHP\php.ini.
Ajoutez la ligne suivante à la fin du fichier php.ini : extension = php_wincache.dll.
Enregistrez et fermez le fichier php.ini.
Redémarrez le pool d'application IIS pour que PHP récupère les changements de configuration. Pour vérifier que l'extension a été activée, créez un fichier nommé phpinfo.php contenant un appel à la fonction phpinfo.
Sauvez le fichier phpinfo.php dans le répertoire racine d'un site Web IIS qui utilise PHP, puis ouvrez un navigateur et faites une requête sur http://localhost/phpinfo.php. Cherchez une section appelée wincache dans la page retournée. Si l'extension est activée, alors la sortie de phpinfo listera les paramètres de configuration fournis par WinCache.
Note: Ne pas oublier de supprimer le fichier phpinfo.php du répertoire racine après avoir vérifié que l'extension a été activée.
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
Le tableau suivant répertorie et explique les paramètres de configuration fournis par l'extension WinCache :
| Nom | Défaut | Minimum | Maximum | Modifiable | Historique |
|---|---|---|---|---|---|
| wincache.fcenabled | "1" | "0" | "1" | PHP_INI_ALL | Disponible depuis WinCache 1.0.0 |
| wincache.fcenabledfilter | "NULL" | "NULL" | "NULL" | PHP_INI_SYSTEM | Disponible depuis WinCache 1.0.0 |
| wincache.fcachesize | "24" | "5" | "255" | PHP_INI_SYSTEM | Disponible depuis WinCache 1.0.0 |
| wincache.fcndetect | "1" | "0" | "1" | PHP_INI_SYSTEM | Disponible depuis WinCache 1.1.0 |
| wincache.maxfilesize | "256" | "10" | "2048" | PHP_INI_SYSTEM | Disponible depuis WinCache 1.0.0 |
| wincache.ocenabled | "1" | "0" | "1" | PHP_INI_ALL | Disponible depuis WinCache 1.0.0 |
| wincache.ocenabledfilter | "NULL" | "NULL" | "NULL" | PHP_INI_SYSTEM | Disponible depuis WinCache 1.0.0 |
| wincache.ocachesize | "96" | "15" | "255" | PHP_INI_SYSTEM | Disponible depuis WinCache 1.0.0 |
| wincache.filecount | "4096" | "1024" | "16384" | PHP_INI_SYSTEM | Disponible depuis WinCache 1.0.0 |
| wincache.chkinterval | "30" | "0" | "300" | PHP_INI_SYSTEM | Disponible depuis WinCache 1.0.0 |
| wincache.ttlmax | "1200" | "0" | "7200" | PHP_INI_SYSTEM | Disponible depuis WinCache 1.0.0 |
| wincache.enablecli | 0 | 0 | 1 | PHP_INI_SYSTEM | Disponible depuis WinCache 1.0.0 |
| wincache.ignorelist | NULL | NULL | NULL | PHP_INI_ALL | Disponible depuis WinCache 1.0.0 |
| wincache.namesalt | NULL | NULL | NULL | PHP_INI_SYSTEM | Disponible depuis WinCache 1.0.0 |
| wincache.ucenabled | 1 | 0 | 1 | PHP_INI_SYSTEM | Disponible depuis WinCache 1.1.0 |
| wincache.ucachesize | 8 | 5 | 85 | PHP_INI_SYSTEM | Disponible depuis WinCache 1.1.0 |
| wincache.scachesize | 8 | 5 | 85 | PHP_INI_SYSTEM | Disponible depuis WinCache 1.1.0 |
| wincache.rerouteini | NULL | NULL | NULL | PHP_INI_SYSTEM | Disponible depuis WinCache 1.2.0 |
Voici un éclaircissement sur l'utilisation des directives de configuration.
wincache.fcenabled
boolean
wincache.fcenabledfilter
string
wincache.fcachesize
integer
wincache.fcndetect
boolean
wincache.maxfilesize
integer
wincache.ocenabled
boolean
wincache.ocenabledfilter
string
wincache.ocachesize
integer
wincache.filecount
integer
wincache.chkinterval
integer
wincache.ttlmax
integer
wincache.enablecli
boolean
wincache.ignorelist
string
Définit une liste de fichiers qui ne doivent pas être mis en cache par l'extension. La liste des fichiers est spécifiée en utilisant des noms de fichiers uniquement, séparés par le symbole pipe - "|".
Exemple #1 wincache.ignorelist exemple
wincache.ignorelist = "index.php|misc.php|admin.php"
wincache.namesalt
string
wincache.ucenabled
boolean
wincache.ucachesize
integer
wincache.scachesize
integer
wincache.rerouteini
string
Le package d'installation pour WinCache inclut un script PHP, wincache.php, qui peut être utilisé pour obtenir des informations et des statistiques sur le cache.
Si l'extension WinCache a été installée via l'installeur de Microsoft Web Platform, alors ce script se trouve dans %SystemDrive%\Program Files\IIS\Windows Cache for PHP\. Sur une version 64 bits du système d'exploitation Windows Server, le script se trouve dans %SystemDrive%\Program Files (x86)\IIS\Windows Cache for PHP. Si l'extension a été installée manuellement, alors le fichier wincache.php sera situé dans le même dossier à partir duquel le contenu du package d'installation a été extrait.
Pour utiliser wincache.php, copiez-le dans le dossier racine d'un site Web ou dans n'importe quel sous-dossier. Pour protéger le script, ouvrez-le dans n'importe quel éditeur et remplacez les valeurs des constantes USERNAME et PASSWORD. Si n'importe quel autre authentification IIS est activée sur le serveur, alors suivez les instructions dans les commentaires :
Exemple #1 Configuration de l'authentification pour wincache.php
<?php
/**
* ======================== CONFIGURATION SETTINGS ==============================
* If you do not want to use authentication for this page, set USE_AUTHENTICATION to 0.
* If you use authentication then replace the default password.
*/
define('USE_AUTHENTICATION', 1);
define('USERNAME', 'wincache');
define('PASSWORD', 'wincache');
/**
* The Basic PHP authentication will work only when IIS is configured to support
* Anonymous Authentication' and nothing else. If IIS is configured to support/use
* any other kind of authentication like Basic/Negotiate/Digest etc, this will not work.
* In that case use the array below to define the names of users in your
* domain/network/workgroup which you want to grant access to.
*/
$user_allowed = array('DOMAIN\user1', 'DOMAIN\user2', 'DOMAIN\user3');
/**
* If the array contains string 'all', then all the users authenticated by IIS
* will have access to the page. Uncomment the below line and comment above line
* to grant access to all users who gets authenticated by IIS.
*/
/* $user_allowed = array('all'); */
/** ===================== END OF CONFIGURATION SETTINGS ========================== */
?>
Note: Protégez toujours le script wincache.php en utilisant soit le mécanisme d'authentification intégré ou le mécanisme d'authentification du serveur. Laissez ce script non protégé peut compromettre la sécurité de votre application web et du serveur.
Le gestionnaire de session WinCache (disponible depuis WinCache 1.1.0) peut être utilisé pour configurer PHP pour stocker les données de session dans la mémoire partagée du cache de session. L'utilisation de la mémoire partagée au lieu de la session par défaut aide à améliorer les performances des applications PHP qui stockent de grandes quantités de données dans des objets de session. Le cache de session Wincache utilise des fichiers basés sur la mémoire partagée, ce qui assure que les données de session ne seront pas perdues lors du recyclage de la file d'attente des applications IIS.
Pour configurer PHP pour utiliser le gestionnaire de session WinCache mettez le paramètre session.save_handler du fichier php.ini à wincache. Par défaut, l'endroit où sont stockés les fichiers temporaires sous Windows est utilisé pour stocker les données de session. Pour changer cet endroit, utilisez la directive session.save_path.
Exemple #1 Activer le gestionnaire de session WinCache
session.save_handler = wincache session.save_path = C:\inetpub\temp\session\
Les fonctionnalités WinCache de re routages de fonctions (disponibles depuis WinCache 1.2.0) peuvent être utilisées pour remplacer des fonctions PHP natives par leur équivalent optimisé pour des cas particuliers. L'extension Wincache inclut des implémentations de fonctions PHP optimisées pour Windows, notamment dans les cas d'accès réseau ou système de fichiers. Les fonctions suivantes sont concernées :
Pour configurer le re routage de fonctions avec Wincache, utilisez le fichier reroute.ini inclut dans le paquet. Copiez le dans le dossier où se trouve php.ini. Après, ajoutez wincache.rerouteini dans php.ini et précisez le chemin absolu ou relatif vers reroute.ini.
Exemple #1 Activation des fonctionnalités de re routage des fonctions de WinCache
wincache.rerouteini = C:\PHP\reroute.ini
Note: Si activé, il est recommandé d'augmenter la taille du cache des fichiers. Ceci peut être fait en utilisant le paramètre wincache.fcachesize.
Le fichier reroute.ini contient la correspondance entre la fonction PHP native et l'équivalent Wincache. Chaque ligne dans le fichier définit une correspondance. Voici la syntaxe:
<PHP function name>:[<number of function parameters>]=<wincache function name>
Un exemple de fichier est donné plus bas. Dans cet exemple, les appels aux fonctions PHP file_get_contents() seront remplacés par wincache_file_get_contents() seulement si le nombre de paramètres passés à la fonction est inférieur ou égal à deux. C'est utile de préciser le nombre de paramètres lorsque la fonction de remplacement n'est pas conçue pour tous les utiliser.
Exemple #2 Reroute.ini
[FunctionRerouteList] file_exists=wincache_file_exists file_get_contents:2=wincache_file_get_contents readfile:2=wincache_readfile is_readable=wincache_is_readable is_writable=wincache_is_writable is_writeable=wincache_is_writable is_file=wincache_is_file is_dir=wincache_is_dir realpath=wincache_realpath filesize=wincache_filesize
Cette extension ne définit aucune ressource.
Cette extension ne définit aucune constante.
(PECL wincache >= 1.0.0)
wincache_fcache_fileinfo — Extrait des informations sur les fichiers mis en cache dans le cache de fichiers
$summaryonly = false
] )Extrait des informations sur le contenu du cache de fichiers et son utilisation.
summaryonly
Si le tableau retourné doit contenir des informations sur chaque entrée du cache en plus du résumé sur les fichiers du cache.
Tableau de méta-données sur le cache de fichier ou FALSE si une erreur survient
Le tableau retourné par cette fonction contient les éléments suivants :
file_entries - Tableau contenant les informations sur tous les fichiers mis en cache:
Exemple #1 Un exemple de wincache_fcache_fileinfo()
<pre>
<?php
print_r(wincache_fcache_fileinfo());
?>
</pre>
L'exemple ci-dessus va afficher :
Array
( [total_cache_uptime] => 3234
[total_file_count] => 5
[total_hit_count] => 0
[total_miss_count] => 1
[file_entries] => Array
(
[1] => Array
(
[file_name] => c:\inetpub\wwwroot\checkcache.php
[add_time] => 1
[use_time] => 0
[last_check] => 1
[hit_count] => 1
[file_size] => 2435
)
[2] => Array (...iterates for each cached file)
)
)
(PECL wincache >= 1.0.0)
wincache_fcache_meminfo — Extrait des informations sur l'utilisation de la mémoire du cache de fichiers.
Extrait des informations sur l'utilisation de la mémoire du cache de fichiers.
Tableau de méta-données sur l'utilisation de la mémoire du cache de fichiers ou FALSE si une erreur survient
Le tableau retourné par cette fonction contient les éléments suivants:
Exemple #1 Un exemple de wincache_fcache_meminfo()
<pre>
<?php
print_r(wincache_fcache_meminfo());
?>
</pre>
L'exemple ci-dessus va afficher :
Array
(
[memory_total] => 134217728
[memory_free] => 131339120
[num_used_blks] => 361
[num_free_blks] => 3
[memory_overhead] => 5856
)
(PECL wincache >= 1.1.0)
wincache_lock — Acquière un verrou exclusif sur une clé donnée
$key
[, bool $isglobal = false
] )Obtient un verrou exclusif sur une clé donnée. L'exécution du script courant sera bloqué tant que le verrou ne pourra pas être obtenu. Une fois le verrou obtenu, les autres scripts tentant de requérir le verrou en utilisant la même clé seront bloqués, tant que le script courant n'aura pas libéré le verrou en utilisant la fonction wincache_unlock().
L'utilisation de la fonction wincache_lock() et de la fonction wincache_unlock() peut conduire à des verrous morts lors de l'exécution de scripts PHP sur des environnements multi-processus, comme FastCGI. N'utilisez pas ces fonctions tant que vous n'êtes pas absolument certain d'en avoir besoin. Pour la majorité des opérations sur le cache utilisateur, il n'est pas nécessaire de les utiliser.
key
Nom de la clé du cache dont nous souhaitons obtenir un verrou.
isglobal
Contrôle si le contexte du verrou est local ou au niveau système. Les verrous locaux ont un contexte au niveau applicatif dans le cas de l'utilisation sous IIS Fast CGI ou au niveau de tous les processus PHP qui ont le même identifiant parent de processus.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec wincache_lock()
<?php
$fp = fopen("/tmp/lock.txt", "r+");
if (wincache_lock(“lock_txt_lock”)) { // obtient un verrou exclusif
ftruncate($fp, 0); // tronque le fichier
fwrite($fp, "On écrit quelque chose ici\n");
wincache_unlock(“lock_txt_lock”); // libère le verrou
} else {
echo "Impossible d'obtenir le verrou !";
}
fclose($fp);
?>
(PECL wincache >= 1.0.0)
wincache_ocache_fileinfo — Extrait des informations sur les fichiers mis en cache dans le cache opcode
$summaryonly = false
] )Extrait des informations sur le contenu du cache opcode et son utilisation.
summaryonly
Contrôle si le tableau retourné doit contenir des informations sur les entrées individuelles du cache en plus du résumé sur le cache opcode.
Tableau de méta-données sur le cache opcode ou FALSE si une erreur survient
Le tableau retourné par cette fonction contient les éléments suivants:
file_entries - Tableau contenant les informations sur tous les fichiers mis en cache:
Exemple #1 Un exemple de wincache_ocache_fileinfo()
<pre>
<?php
print_r(wincache_ocache_fileinfo());
?>
</pre>
L'exemple ci-dessus va afficher :
Array
(
[total_cache_uptime] => 17357
[total_file_count] => 121
[total_hit_count] => 36562
[total_miss_count] => 201
[file_entries] => Array
(
[1] => Array
(
[file_name] => c:\inetpub\wwwroot\checkcache.php
[add_time] => 17356
[use_time] => 7
[last_check] => 10
[hit_count] => 454
[function_count] => 0
[class_count] => 1
)
[2] => Array (...iterates for each cached file)
)
)
(PECL wincache >= 1.0.0)
wincache_ocache_meminfo — Extrait des informations sur l'utilisation du cache opcode
Extrait des informations sur l'utilisation de la mémoire par le cache opcode.
Tableau de méta-données sur l'utilisation de la mémoire cache opcode ou FALSE si une erreur survient
Le tableau retourné par cette fonction contient les éléments suivants :
Exemple #1 Un exemple de wincache_ocache_meminfo()
<pre>
<?php
print_r(wincache_ocache_meminfo());
?>
</pre>
L'exemple ci-dessus va afficher :
Array
(
[memory_total] => 134217728
[memory_free] => 112106972
[num_used_blks] => 15469
[num_free_blks] => 4
[memory_overhead] => 247600
)
(PECL wincache >= 1.0.0)
wincache_refresh_if_changed — Actualise les entrées du cache pour les fichiers mis en cache
$files
] )Actualise les entrées du cache pour les fichiers dont les noms ont été passés dans les arguments d'entrée. Si aucun argument n'est précisé, alors, actualise toutes les entrées du cache.
files
Tableau de noms de fichiers pour les fichiers qui ont besoin d'être actualisés. Un chemin de fichier absolu ou relatif peut être utilisé.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
WinCache effectue des contrôles réguliers sur les fichiers mis en cache pour veiller à ce que, si un fichier ai changé, l'entrée correspondante dans la mémoire cache sois mis à jour. Par défaut, cette vérification est effectuée toutes les 30 secondes. Si par exemple un script PHP met à jour un autre script PHP où les configurations de l'application son stockés, alors il peu arriver que après les changement de configuration soient sauvés, l'application utilise toujours les anciens paramètres pour quelque temps jusqu'à ce que le cache sois actualisé. Dans ce cas, il est préférable d'actualiser le cache juste après que le fichier ai été modifié. L'exemple qui suis montre comment cela peut être effectué.
Exemple #1 Un exemple de wincache_refresh_if_changed()
<?php
$filename = 'C:\inetpub\wwwroot\config.php';
$handle = fopen($filename, 'w+');
if ($handle === FALSE) die('Failed to open file '.$filename.' for writing');
fwrite($handle, '<?php $setting=something; ?>');
fclose($handle);
wincache_refresh_if_changed(array($filename));
?>
(PECL wincache >= 1.0.0)
wincache_rplist_fileinfo — Récupère des informations du cache sur un chemin de fichier résolu
$summaryonly = false
] )Récupère des informations sur une cartographie en cache entre des chemins relatifs de fichiers et leurs correspondances en chemins absolus.
Un tableau de données méta contenant le contenu du cache d'un chemin
de fichier résolu ou FALSE si une erreur survient
Le tableau retourné par cette fonction contient les éléments suivants :
rplist_entries - un tableau contenant les informations sur les chemins de fichier présents en cache :
Exemple #1 Exemple avec wincache_rplist_fileinfo()
<pre>
<?php
print_r(wincache_rplist_fileinfo());
?>
</pre>
L'exemple ci-dessus va afficher :
Array
(
[total_file_count] => 5
[rplist_entries] => Array
(
[1] => Array
(
[resolve_path] => checkcache.php
[subkey_data] => c:\inetpub\wwwroot|c:\inetpub\wwwroot\checkcache.php
)
[2] => Array (...iterates for each cached file)
)
)
(PECL wincache >= 1.0.0)
wincache_rplist_meminfo — Récupère des informations sur l'utilisation de la mémoire par le cache de chemin de fichier résolu
Récupère des informations sur l'utilisation de la mémoire par le cache de chemin de fichier résolu.
Un tableau de données méta qui décrit l'utilisation de la mémoire
par le cache de chemin de fichier résolu. ou FALSE si une erreur survient
Le tableau retourné par cette fonction contient les éléments suivants :
Exemple #1 Exemple avec wincache_rplist_meminfo()
<pre>
<?php
print_r(wincache_rplist_meminfo());
?>
</pre>
L'exemple ci-dessus va afficher :
Array
(
[memory_total] => 9437184
[memory_free] => 9416744
[num_used_blks] => 23
[num_free_blks] => 1
[memory_overhead] => 416
)
(PECL wincache >= 1.1.0)
wincache_scache_info — Récupère des informations sur des fichiers mis en cache
$summaryonly = false
] )Récupère des informations sur le contenu du cache et son utilisation.
summaryonly
Contrôle si le tableau retourné doit contenir des informations sur des entrées individuelles du cache en plus du résumé du cache.
Un tableau de données méta sur le cache pour cette session
ou FALSE si une erreur survient
Le tableau retourné par cette fonction contient les éléments suivants :
TRUE si les méta-données du cache sont pour une instance
de cache locale, FALSE si elles sont pour un cache global
scache_entries - un tableau contenant les informations sur les éléments mis en cache :
Exemple #1 Exemple avec wincache_scache_info()
<pre>
<?php
print_r(wincache_scache_info());
?>
</pre>
L'exemple ci-dessus va afficher :
Array
(
[total_cache_uptime] => 17357
[total_file_count] => 121
[total_hit_count] => 36562
[total_miss_count] => 201
[scache_entries] => Array
(
[1] => Array
(
[file_name] => c:\inetpub\wwwroot\checkcache.php
[add_time] => 17356
[use_time] => 7
[last_check] => 10
[hit_count] => 454
[function_count] => 0
[class_count] => 1
)
[2] => Array (...iterates for each cached file)
)
)
(PECL wincache >= 1.1.0)
wincache_scache_meminfo — Récupère des informations sur l'utilisation de la mémoire du cache
Récupère des informations sur l'utilisation mémoire du cache.
Un tableau de données méta sur l'utilisation de la mémoire du cache
ou FALSE si une erreur survient
Le tableau retourné par cette fonction contient les éléments suivants :
Exemple #1 Exemple avec wincache_scache_meminfo()
<pre>
<?php
print_r(wincache_scache_meminfo());
?>
</pre>
L'exemple ci-dessus va afficher :
Array
(
[memory_total] => 5242880
[memory_free] => 5215056
[num_used_blks] => 6
[num_free_blks] => 3
[memory_overhead] => 176
)
(PECL wincache >= 1.1.0)
wincache_ucache_add — Ajoute une nouvelle variable au cache utilisateur
Ajoute une variable au cache utilisateur, uniquement si elle n'existe pas déjà dans le cache. La variable restera dans le cache tant que le délai d'expiration n'est pas atteint ou qu'elle n'est effacée par la fonction wincache_ucache_delete() ou la fonction wincache_ucache_clear().
key
Stocke la variable en utilisant le nom key. Si une variable
correspondant à la même clé est déjà présente dans le cache, la fonction
échouera et retournera FALSE. Le paramètre key est sensible à la
casse. Pour écraser cette valeur, si key est présent,
utilisez plutôt la fonction wincache_ucache_set().
key peut également être un tableau de paires nom => valeur où
les noms seront utilisés comme clés. Ce format peut être utilisé pour ajouter
de multiples valeurs dans le cache en une seule opération.
value
La valeur de la variable à stocker. Le paramètre Value supporte
tous les types de données, sauf les ressources, comme des pointeurs de fichiers.
Ce paramètre sera ignoré si le premier argument est un tableau. De façon général, il convient
de passer la valeur NULL au paramètre value lors de l'utilisation
d'un tableau pour le paramètre key. Si le paramètre value
est un objet, ou un tableau contenant des objets, alors les objets seront linéarisés. Reportez-vous
à la fonction __sleep() pour plus de détails
sur la linéarisation d'objets.
values
Tableau associatif de clés et de valeurs.
ttl
Durée de vie de la variable dans le cache, en secondes. Après la durée spécifiée par le paramètre
ttl, la variable stockée sera supprimée du cache. Ce paramètre prend, comme
valeur par défaut, zéro (0), ce qui signifie que la variable restera dans le cache
tant qu'elle n'est pas explicitement effacée en utilisant la fonction wincache_ucache_delete()
ou la fonction wincache_ucache_clear().
Si le paramètre key est une chaîne de caractères, la fonction retourne
TRUE en cas de succès, FALSE si une erreur survient.
Si le paramètre key est un tableau, la fonction retourne :
FALSE ;
Exemple #1 Exemple avec wincache_ucache_add() et le paramètre key sous forme de chaîne de caractères
<?php
$bar = 'BAR';
var_dump(wincache_ucache_add('foo', $bar));
var_dump(wincache_ucache_add('foo', $bar));
var_dump(wincache_ucache_get('foo'));
?>
L'exemple ci-dessus va afficher :
bool(true) bool(false) string(3) "BAR"
Exemple #2 Exemple avec wincache_ucache_add() et le paramètre key sous forme d'un tableau
<?php
$colors_array = array('green' => '5', 'Blue' => '6', 'yellow' => '7', 'cyan' => '8');
var_dump(wincache_ucache_add($colors_array));
var_dump(wincache_ucache_add($colors_array));
var_dump(wincache_ucache_get('Blue'));
?>
L'exemple ci-dessus va afficher :
array(0) { }
array(4) {
["green"]=> int(-1)
["Blue"]=> int(-1)
["yellow"]=> int(-1)
["cyan"]=> int(-1)
}
string(1) "6"
(PECL wincache >= 1.1.0)
wincache_ucache_cas — Compare la variable avec son ancienne valeur et lui assigne une nouvelle valeur
$key
, int $old_value
, int $new_value
)
Compare la variable associée avec la clé key avec
la valeur old_value et si elle correspond, lui assigne
la nouvelle valeur new_value.
key
La clé key utilisé pour stocker la variable
dans le cache. key est sensible à la casse.
old_value
L'ancienne valeur de la variable pointée par le paramètre
key dans le cache utilisateur.
La valeur doit être de type long, sinon, la fonction
retournera FALSE.
new_value
La nouvelle valeur qui sera assignée à la variable pointée par
la clé key si la correspondance a été trouvée.
La valeur doit être de type long, sinon, la fonction
retournera FALSE.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec wincache_ucache_cas()
<?php
wincache_ucache_set('counter', 2922);
var_dump(wincache_ucache_cas('counter', 2922, 1));
var_dump(wincache_ucache_get('counter'));
?>
L'exemple ci-dessus va afficher :
bool(true) int(1)
(PECL wincache >= 1.1.0)
wincache_ucache_clear — Supprime le contenu d'une entrée du cache utilisateur
Supprime toutes les valeurs stockées dans le cache utilisateur.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec wincache_ucache_clear()
<?php
wincache_ucache_set('green', 1);
wincache_ucache_set('red', 2);
wincache_ucache_set('orange', 4);
wincache_ucache_set('blue', 8);
wincache_ucache_set('cyan', 16);
$array1 = array('green', 'red', 'orange', 'blue', 'cyan');
var_dump(wincache_ucache_get($array1));
var_dump(wincache_ucache_clear());
var_dump(wincache_ucache_get($array1));
?>
L'exemple ci-dessus va afficher :
array(5) { ["green"]=> int(1)
["red"]=> int(2)
["orange"]=> int(4)
["blue"]=> int(8)
["cyan"]=> int(16) }
bool(true)
bool(false)
(PECL wincache >= 1.1.0)
wincache_ucache_dec — Décrémente la valeur associée à une clé
Décrémente de 1 ou dec_by de la valeur associée
avec la clé key.
key
La clé key utilisée pour stoker la variable
dans le cache. Le paramètre key est sensible
à la casse.
dec_by
La valeur utilisée pour décrémenter la variable associée à la clé
key. Si l'argument est un nombre à virgule flottante,
il sera arrondi à l'entier le plus proche. La variable associée avec la clé
key doit être de type long, sinon,
la fonction retournera FALSE.
success
Sera définie à TRUE en cas de succès, FALSE si une erreur survient.
Retourne la valeur décrémentée en cas de succès, FALSE si une erreur survient.
Exemple #1 Exemple avec wincache_ucache_dec()
<?php
wincache_ucache_set('counter', 1);
var_dump(wincache_ucache_dec('counter', 2923, $success));
var_dump($success);
?>
L'exemple ci-dessus va afficher :
int(2922) bool(true)
(PECL wincache >= 1.1.0)
wincache_ucache_delete — Supprime les variables du cache utilisateur
Supprime les éléments pointés par la clé key
du cache utilisateur.
key
La clé key utilisée pour stoker la variable dans
le cache. Le paramètre key est sensible à la casse.
key peut être un tableau de clés.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Si le paramètre key est un tableau, alors la fonction
retournera FALSE si un des éléments du tableau n'a pu être supprimé du cache
utilisateur, sinon, elle retournera un tableau contenant toutes les clés
ayant été supprimées avec succès.
Exemple #1 Exemple avec wincache_ucache_delete() et
le paramètre key sous forme de chaîne de caractères
<?php
wincache_ucache_set('foo', 'bar');
var_dump(wincache_ucache_delete('foo'));
var_dump(wincache_ucache_exists('foo'));
?>
L'exemple ci-dessus va afficher :
bool(true) bool(false)
Exemple #2 Exemple avec wincache_ucache_delete() et
le paramètre key sous forme d'un tableau
<?php
$array1 = array('green' => '5', 'blue' => '6', 'yellow' => '7', 'cyan' => '8');
wincache_ucache_set($array1);
$array2 = array('green', 'blue', 'yellow', 'cyan');
var_dump(wincache_ucache_delete($array2));
?>
L'exemple ci-dessus va afficher :
array(4) { [0]=> string(5) "green"
[1]=> string(4) "Blue"
[2]=> string(6) "yellow"
[3]=> string(4) "cyan" }
Exemple #3 Exemple avec wincache_ucache_delete() et
le paramètre key sous la forme d'un tableau où quelques
éléments n'ont pas pu être supprimés
<?php
$array1 = array('green' => '5', 'blue' => '6', 'yellow' => '7', 'cyan' => '8');
wincache_ucache_set($array1);
$array2 = array('orange', 'red', 'yellow', 'cyan');
var_dump(wincache_ucache_delete($array2));
?>
L'exemple ci-dessus va afficher :
array(2) { [0]=> string(6) "yellow"
[1]=> string(4) "cyan" }
(PECL wincache >= 1.1.0)
wincache_ucache_exists — Vérifie si une variable existe dans le cache utilisateur
$key
)
Vérifie si une variable dont la clé est key
existe ou non dans le cache utilisateur.
key
La clé key utilisée pour stoker
la variable dans le cache. Le paramètre key
est sensible à la casse.
Retourne TRUE si la variable dont la clé est key existe,
FALSE sinon.
Exemple #1 Exemple avec wincache_ucache_exists()
<?php
if (!wincache_ucache_exists('green'))
wincache_ucache_set('green', 1);
var_dump(wincache_ucache_exists('green'));
?>
L'exemple ci-dessus va afficher :
bool(true)
(PECL wincache >= 1.1.0)
wincache_ucache_get — Récupère une variable stokée dans le cache utilisateur
Récupère une variable stokée dans le cache utilisateur.
key
La clé key utilisée pour stoker la variable
dans le cache. Le paramètre key est sensible à la casse.
key peut être un tableau de clés. Dans ce cas, la valeur
retournée sera un tableau de valeurs de chaque éléments du tableau key.
Si un objet ou un tableau contenant des objets est retourné, alors les objets
seront délinéarisés. Reportez-vous à la fonction
__wakeup() pour plus
de détails sur les délinéarisations des objets.
success
Sera définie à TRUE en cas de succès, FALSE si une erreur survient.
Si le paramètre key est une chaîne de caractères, la fonction retournera
la valeur de la variable stokée avec cette clé. Le paramètre success
sera défini à TRUE en cas de succès, et à FALSE si une erreur survient.
Si le paramètre key est un tableau, le paramètre
success sera toujours défini à TRUE. Le tableau retourné
(paires de nom => valeur) contiendra uniquement les paires nom => valeur pour
lesquelles la récupération depuis le cache utilisateur a été un succès.
Si aucune des clés du tableau ne correspond à des entrées du cache utilisateur,
un tableau vide sera retourné.
Exemple #1 Exemple avec wincache_ucache_get() et
le paramètre key sous forme de chaîne de caractères
<?php
wincache_ucache_add('color', 'blue');
var_dump(wincache_ucache_get('color', $success));
var_dump($success);
?>
L'exemple ci-dessus va afficher :
string(4) "blue" bool(true)
Exemple #2 Exemple avec wincache_ucache_get() et
le paramètre key sous forme d'un tableau
<?php
$array1 = array('green' => '5', 'Blue' => '6', 'yellow' => '7', 'cyan' => '8');
wincache_ucache_set($array1);
$array2 = array('green', 'Blue', 'yellow', 'cyan');
var_dump(wincache_ucache_get($array2, $success));
var_dump($success);
?>
L'exemple ci-dessus va afficher :
array(4) { ["green"]=> string(1) "5"
["Blue"]=> string(1) "6"
["yellow"]=> string(1) "7"
["cyan"]=> string(1) "8" }
bool(true)
(PECL wincache >= 1.1.0)
wincache_ucache_inc — Incrémente la valeur associée à une clé
Incrémente, de 1 ou de la valeur du paramètre inc_by,
la valeur associée avec la clé key.
key
La clé key utilisée pour stoker la variable
dans le cache. Le paramètre key est sensible à la casse.
inc_by
La valeur utilisée pour incrémenter la variable associée à la clé
key. Si l'argument est un nombre à virgule flottante,
elle sera arrondie à l'entier le plus proche. La variable associée à la clé
key doit être de type long, sinon
la fonction échouera et retournera FALSE.
success
Sera défini à TRUE en cas de succès, FALSE si une erreur survient.
Retourne la valeur incrémentée en cas de succès, FALSE si une erreur survient.
Exemple #1 Exemple avec wincache_ucache_inc()
<?php
wincache_ucache_set('counter', 1);
var_dump(wincache_ucache_inc('counter', 2921, $success));
var_dump($success);
?>
L'exemple ci-dessus va afficher :
int(2922) bool(true)
(PECL wincache >= 1.1.0)
wincache_ucache_info — Récupère des informations sur des données stokées dans le cache utilisateur
$summaryonly = false
[, string $key
]] )Récupère des informations sur des données stokées dans le cache utilisateur.
summaryonly
Contrôle si le tableau résultant doit contenir les informations sur des entrées individuelles en plus du résumé du cache utilisateur.
key
La clé de l'entrée du cache utilisateur. Si spécifiée, alors le tableau
résultant contiendra des informations uniquement sur cette entrée
du cache. Si non spécifiée, et le paramètre summaryonly
est défini à FALSE, alors le tableau résultant contiendra des informations
sur toutes les entrées du cache.
Un tableau de données méta sur le cache utilisateur
ou FALSE si une erreur survient
Le tableau retourné par cette fonction contient les éléments suivants :
TRUE si les données méta du cache sont pour une instance
locale du cache, FALSE si elles sont pour le cache global
ucache_entries - un tableau contenant les informations sur les éléments mis en cache :
Exemple #1 Exemple avec wincache_ucache_info()
<?php
wincache_ucache_get('green');
wincache_ucache_set('green', 2922);
wincache_ucache_get('green');
wincache_ucache_get('green');
wincache_ucache_get('green');
print_r(wincache_ucache_info());
?>
L'exemple ci-dessus va afficher :
Array
( ["total_cache_uptime"] => int(0)
["is_local_cache"] => bool(false)
["total_item_count"] => int(1)
["total_hit_count"] => int(3)
["total_miss_count"] => int(1)
["ucache_entries"] => Array(1)
( [1] => Array(6)
(
["key_name"] => string(5) "green"
["value_type"] => string(4) "long"
["is_session"] => int(0)
["ttl_seconds"] => int(0)
["age_seconds"] => int(0)
["hitcount"] => int(3)
)
)
)
(PECL wincache >= 1.1.0)
wincache_ucache_meminfo — Récupère des informations sur l'utilisation mémoire du cache utilisateur
Récupère des informations sur l'utilisation mémoire du cache utilisateur.
Tableau de données méta sur l'utilisation mémoire du cache utilisateur
ou FALSE si une erreur survient
Le tableau retourné par cette fonction contient les éléments suivants :
Exemple #1 Exemple avec wincache_ucache_meminfo()
<pre>
<?php
print_r(wincache_ucache_meminfo());
?>
</pre>
L'exemple ci-dessus va afficher :
Array
(
[memory_total] => 5242880
[memory_free] => 5215056
[num_used_blks] => 6
[num_free_blks] => 3
[memory_overhead] => 176
)
(PECL wincache >= 1.1.0)
wincache_ucache_set — Ajoute une variable au cache utilisateur et écrase la variable si elle existe déjà dans le cache
Ajoute une variable au cache utilisateur. Écrase une variable si elle existe déjà dans le cache. La variable ainsi créée ou mise à jour restera dans le cache utilisateur tant que le délai d'expiration n'est pas atteint ou tant qu'elle n'est pas supprimée avec la fonction wincache_ucache_delete() ou la fonction wincache_ucache_clear().
key
Stocke la variable en utilisant la clé key.
Si une variable utilisant la même clé key est
déjà présente, la fonction écrasera la précédente valeur avec la nouvelle.
Le paramètre key est sensible à la casse.
key peut également être un tableau de paires
nom => valeur où les noms seront utilisés comme clés. Ceci peut être utile
pour ajouter plusieurs valeurs dans le cache en une seule opération.
value
Valeur de la variable à stocker. Le paramètre Value
supporte tous les types de données, sauf les ressources, comme les pointeurs
de fichiers. Ce paramètre est ignoré si le premier argument est un tableau.
Il est de convention de passer la valeur NULL comme valeur du paramètre
value lors de l'utilisation d'un tableau dans le paramètre
key. Si le paramètre value est un objet,
ou un tableau contenant des objets, alors tous les objets seront linéarisés.
Reportez-vous à la fonction __sleep()
pour plus de détails sur la linéarisation d'objets.
values
Tableau associatif de clés et de valeurs.
ttl
Durée de vie de la variable dans le cache, en secondes. Après la durée spécifiée par
le paramètre ttl, la variable stockée sera effacée du cache utilisateur.
Ce paramètre prend par défaut la valeur zéro (0), ce qui signifie
que la variable restera dans le cache tant qu'elle ne sera pas explicitement supprimée
en appelant la fonction wincache_ucache_delete() ou la fonction
wincache_ucache_clear().
Si key est une chaîne de caractères, la fonction retournera TRUE en cas de succès,
FALSE si une erreur survient.
Si key est un tableau, la fonction retournera :
FALSE.
Exemple #1 Exemple avec wincache_ucache_set() et
le paramètre key sous forme de chaîne de caractères
<?php
$bar = 'BAR';
var_dump(wincache_ucache_set('foo', $bar));
var_dump(wincache_ucache_get('foo'));
$bar1 = 'BAR1';
var_dump(wincache_ucache_set('foo', $bar1));
var_dump(wincache_ucache_get('foo'));
?>
L'exemple ci-dessus va afficher :
bool(true) string(3) "BAR" bool(true) string(3) "BAR1"
Exemple #2 Exemple avec wincache_ucache_set() et
le paramètre key sous forme de tableau
<?php
$colors_array = array('green' => '5', 'Blue' => '6', 'yellow' => '7', 'cyan' => '8');
var_dump(wincache_ucache_set($colors_array));
var_dump(wincache_ucache_set($colors_array));
var_dump(wincache_ucache_get('Blue'));
?>
L'exemple ci-dessus va afficher :
array(0) {}
array(0) {}
string(1) "6"
(PECL wincache >= 1.1.0)
wincache_unlock — Libère un verrou exclusif sur une clé donnée
$key
)Libère un verrou exclusif qui a été obtenu sur une clé donnée en utilisant la fonction wincache_lock(). Si un autre processus est en attente de ce verrou, pour cette clé, il obtiendra le verrou.
L'utilisation des fonctions wincache_lock() et wincache_unlock() peut provoquer des verrous morts lors de l'exécution de scripts PHP dans un environnement multi-processus comme FastCGI. N'utilisez pas ces fonctions tant que vous n'êtes pas sûr d'en avoir besoin. Pour la majorité des opérations sur le cache utilisateur, il n'est pas nécessaire de les utiliser.
key
Nom de la clé du cache pour laquelle le verrou doit être libéré.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec wincache_unlock()
<?php
$fp = fopen("/tmp/lock.txt", "r+");
if (wincache_lock(“lock_txt_lock”)) { // Pose d'un verrou exclusif
ftruncate($fp, 0); // on vide le fichier
fwrite($fp, "On écrit quelque chose ici\n");
wincache_unlock(“lock_txt_lock”); // On libère le verrou
} else {
echo "Impossible d'obtenir le verrou !";
}
fclose($fp);
?>
Pour compiler l'extension WinCache, il faudra:
Pour compléter les deux premières étapes, suivez le guide étape par étape » Compiler PHP sous Windows.
Pour obtenir le code source de WinCache, suivez les instructions décrites dans Télécharger des extensions PECL.
Les étapes suivantes décrivent comment compiler et construire WinCache sous Windows:
Ouvrez une invite de commande utilisée pour compiler PHP
Allez dans le dossier racine où les sources de PHP sont présentes
Lancez la commande :
cscript.exe win32\build\buildconf.js
Lancez la commande :
configure.bat --help
Lancez la commande :
configure.js [all options used to build PHP] --enable-wincache
Lancez la commande :
nmake
Les étapes suivantes décrivent comment vérifier que WinCache a été construit correctement :
Allez dans le dossier où les fichiers PHP sont construits.
Lancez la commande :
php.exe -n -d extension=php_wincache.dll -re wincache
XHProf est un profileur hiérarchique et instrumental léger. Lors de la phase de collecte des données, il conserve une trace du nombre d'appels et le métrique inclusif pour les arcs dans le graphique d'appel dynamique d'un programme. Il calcule le métrique exclusif lors de la phase de rapport/envoi, comme la durée, le temps CPU, ainsi que l'utilisation de mémoire. Un profil de fonction peut être décomposé par une fonction appelante ou l'appelée. XHProf gère les fonctions récursives en détectant les cycles dans le graphique d'appel lors de la collecte des données, et stoppe les cycles en donnant des noms uniques de profondeur lors de l'invocation de la récursivité.
XHProf inclut une interface utilisateur HTML (écrite en PHP). Le navigateur web permet ainsi de consulter le résultat du profilage de façon simple mais aussi pour partager les résultats. Une image de graphique d'appel est également fournie.
Les rapports XHProf peuvent être très utiles pour comprendre la structure du code qui vient d'être exécuté. La nature hiérarchique des rapports peut être utilisée pour déterminer, par exemple, la chaîne d'appels ayant conduit à l'appel d'une fonction particulière.
XHProf supporte la possibilité de comparer deux exécutions (i.e. rapports différentiels) ou agréger des données issues de plusieurs exécutions. Les rapports différentiels et agrégés, tout comme les rapports d'exécution unique) offre une vue plate mais aussi hiérarchique du profilage.
Vous pouvez trouver plus d'informations directement sur la page » facebook de xhprof.
Bien que non requise, xhprof inclut une interface écrite en PHP. Elle est utilisée pour sauvegarder et afficher les données de profilage de façon simple, où la lecture s'effectue directement via un navigateur web. Aussi, un serveur web PHP peut rendre l'utilisation de xhprof plus conviviale.
Il y a également un fork de l'interface GUI sur » http://github.com/preinheimer/xhprof
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/xhprof
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
| Nom | Défaut | Modifiable | Historique |
|---|---|---|---|
| xhprof.output_dir | "" | PHP_INI_ALL |
Voici un éclaircissement sur l'utilisation des directives de configuration.
xhprof.output_dir
string
Dossier utilisé par l'implémentation par défaut de l'interface iXHProfRuns (nommément, la classe XHProfRuns_Default) pour stocker les exécutions de XHProf.
Cette extension ne définit aucune ressource.
Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.
XHPROF_FLAGS_NO_BUILTINS
(integer)
XHPROF_FLAGS_CPU
(integer)
XHPROF_FLAGS_MEMORY
(integer)
Exemple #1 Exemple avec Xhprof et le GUI optionnel
Cet exemple démarre et stoppe le profilage, puis utilise l'interface GUI fourni pour sauvegarder et analyser les résultats. En d'autres termes, le code de l'extension en tant que tel s'arrête après l'appel à la fonction xhprof_disable().
<?php
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
for ($i = 0; $i <= 1000; $i++) {
$a = $i * $i;
}
$xhprof_data = xhprof_disable();
$XHPROF_ROOT = "/tools/xhprof/";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_testing");
echo "http://localhost/xhprof/xhprof_html/index.php?run={$run_id}&source=xhprof_testing\n";
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
http://localhost/xhprof/xhprof_html/index.php?run=t11_4bdf44d21121f&source=xhprof_testing
(PECL xhprof >= 0.9.0)
xhprof_disable — Stoppe le profilage xhprof
Stoppe le profilage, et retourne les données xhprof depuis son exécution.
Cette fonction ne contient aucun paramètre.
Un tableau de données xhprof issues de son exécution.
Exemple #1 Exemple avec xhprof_disable()
<?php
xhprof_enable();
$foo = strlen("foo bar");
$xhprof_data = xhprof_disable();
print_r($xhprof_data);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[main()==>strlen] => Array
(
[ct] => 1
[wt] => 279
)
[main()==>xhprof_disable] => Array
(
[ct] => 1
[wt] => 9
)
[main()] => Array
(
[ct] => 1
[wt] => 610
)
)
(PECL xhprof >= 0.9.0)
xhprof_enable — Démarre un profilage xhprof
$flags = 0
[, array $options
]] )Démarre un profilage xhprof.
flags
Drapeaux optionnels pour ajouter des informations additionnelles au
profilage. Voir les
constantes XHprof pour plus
d'informations sur ces drapeaux, i.e., XHPROF_FLAGS_MEMORY
pour activer le profilage de la mémoire.
options
Un tableau d'options optionnelles, par exemple, l'option 'ignored_functions' pour ignorer certaines fonctions durant le profilage.
NULL
| Version | Description |
|---|---|
| 0.9.2 |
Le paramètre options optionnel a été ajouté.
|
Exemple #1 Exemple avec xhprof_enable()
<?php
// 1. profilage de la durée time + memory + CPU ; on ignore les fonctions internes
xhprof_enable(XHPROF_FLAGS_NO_BUILTINS | XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);
// 2. profilage du temps écoulé ; on ignore les fonctions call_user_func* lors du profilage
xhprof_enable(
0,
array('ignored_functions' => array('call_user_func',
'call_user_func_array')));
// 3. profilage du temps écoulés ainsi que de la mémoire ; on ignore les fonctions call_user_func* lors du profilage
xhprof_enable(
XHPROF_FLAGS_MEMORY,
array('ignored_functions' => array('call_user_func',
'call_user_func_array')));
?>
(PECL xhprof >= 0.9.0)
xhprof_sample_disable — Stoppe un profilage xhprof sur échantillon
Stoppe un profilage xhprof sur échantillon.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Cette fonction ne contient aucun paramètre.
Un tableau de données de l'échantillon xhprof, depuis l'exécution.
Exemple #1 Exemple avec xhprof_sample_disable()
<?php
xhprof_sample_enable();
for ($i = 0; $i <= 10000; $i++) {
$a = strlen($i);
$b = $i * $a;
$c = rand();
}
$xhprof_data = xhprof_sample_disable();
print_r($xhprof_data);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[1272935300.800000] => main()
[1272935300.900000] => main()
)
(PECL xhprof >= 0.9.0)
xhprof_sample_enable — Description
Démarre le profilage en mode échantillonnage, ce qui correspond à une version légère de la fonction xhprof_enable(). L'intervalle d'échantillonnage est de 0.1 secondes, et les échantillons enregistrent la pile complète des fonctions appelées. La principale utilisation de cette fonction est lorsque l'on souhaite diagnostiquer et surveiller les performances sans pour autant prendre trop de ressource.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Cette fonction ne contient aucun paramètre.
NULL
Ces fonctions vous permettent de lire et de manipuler les tags ID3. Les tags ID3 sont utilisés dans les fichiers MP3 pour stocker le titre d'une chanson, tout comme des informations sur l'artiste, l'album, le genre, l'année et le numéro de la piste.
Depuis la version 0.2, il est également possible d'extraire des champs texte depuis des tags ID3 v2.2+.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/id3.
Aucune bibliothèque DLL pour cette extension PECL n'est actuellement disponible. Reportez-vous à la section Compilation sous Windows.
Cette extension ne définit aucune directive de configuration.
Cette extension ne définit aucune ressource.
La plupart des fonctions ID3 vous permettent soit de spécifier, soit de retourner un tag. Pour spécifier la version, utilisez une de ces constantes :
ID3_V1_0
(entier)
ID3_V1_0 est utilisé si vous travaillez avec des tags
ID3 V1.0. Ces tags peuvent contenir les champs title,
artist, album, genre,
year et comment.
ID3_V1_1
(entier)
ID3_V1_1 est utilisé si vous travaillez avec des tags
ID3 V1.1. Ces tags peuvent contenir tous les champs de la version 1.0 ainsi qu'un
champ représentant le numéro de la piste.
ID3_V2_1
(entier)
ID3_V2_1 est utilisé si vous travaillez avec des tags
ID3 V2.1.
ID3_V2_2
(entier)
ID3_V2_2 est utilisé si vous travaillez avec des tags
ID3 V2.2 tags.
ID3_V2_3
(entier)
ID3_V2_3 est utilisé si vous travaillez avec des tags
ID3 V2.3 tags.
ID3_V2_4
(entier)
ID3_V2_4 est utilisé si vous travaillez avec des tags
ID3 V2.4 tags.
ID3_BEST
(entier)
ID3_BEST est utilisé si vous voulez laisser les fonctions
id3 déterminer quelle version de tags doit être utilisée.
(PECL id3 >= 0.2)
id3_get_frame_long_name — Récupère le nom long d'un champs ID3v2
$frameId
)id3_get_frame_long_name() retourne le nom long d'un champs ID3v2.
frameId
Une frame ID3v2
Retourne le nom long d'un champs ou FALSE si une erreur survient.
Exemple #1 Exemple avec id3_get_frame_long_name()
<?php
$longName = id3_get_frame_long_name("TOLY");
echo $longName;
?>
L'exemple ci-dessus va afficher :
Original lyricist(s)/text writer(s)
(PECL id3 >= 0.2)
id3_get_frame_short_name — Récupère le nom court d'un champs ID3v2
$frameId
)id3_get_frame_short_name() retourne le nom court d'un champs ID3v2.
frameId
Une frame ID3v2
Retourne le nom court d'un champs ou FALSE si une erreur survient.
Les valeurs retournées par id3_get_frame_short_name() sont utilisées dans le tableau retourné par id3_get_tag().
Exemple #1 Exemple avec id3_get_frame_short_name()
<?php
$shortName = id3_get_frame_short_name("TOLY");
echo $shortName;
?>
L'exemple ci-dessus va afficher :
originalLyricist
(PECL id3 >= 0.1)
id3_get_genre_id — Récupération d'un id pour un genre
$genre
)id3_get_genre_id() retourne l'id pour un genre.
genre
Nom du genre, sous la forme d'une chaîne de caractères.
L'id du genre ou FALSE si une erreur survient.
Exemple #1 Exemple avec id3_get_genre_id()
<?php
$id = id3_get_genre_id("Alternative");
echo $id;
?>
L'exemple ci-dessus va afficher :
20
(PECL id3 >= 0.1)
id3_get_genre_list — Récupère toutes les valeurs possibles du genre
id3_get_genre_list() retourne un tableau contenant tous les genres possibles pouvant être stockés dans un tag ID3. La liste a été créée par Eric Kemp et, plus tard, complétée par WinAmp.
Cette fonction est pratique pour fournir à vos utilisateurs une liste de genres depuis laquelle ils peuvent en choisir un. Lorsque vous mettez à jour vos tags ID3, vous devez également spécifier un genre sous forme d'entier entre 0-147.
Retourne un tableau contenant tous les genres possibles qui peuvent être stockés dans une balise ID3.
Exemple #1 Exemple avec id3_get_genre_list()
<?php
$genres = id3_get_genre_list();
print_r($genres);
?>
L'exemple ci-dessus va afficher :
Array
(
[0] => Blues
[1] => Classic Rock
[2] => Country
[3] => Dance
[4] => Disco
[5] => Funk
[6] => Grunge
[7] => Hip-Hop
[8] => Jazz
[9] => Metal
[10] => New Age
[11] => Oldies
[12] => Other
[13] => Pop
[14] => R&B
[15] => Rap
[16] => Reggae
[17] => Rock
[18] => Techno
[19] => Industrial
[20] => Alternative
[21] => Ska
[22] => Death Metal
[23] => Pranks
[24] => Soundtrack
[25] => Euro-Techno
[26] => Ambient
[27] => Trip-Hop
[28] => Vocal
[29] => Jazz+Funk
[30] => Fusion
[31] => Trance
[32] => Classical
[33] => Instrumental
[34] => Acid
[35] => House
[36] => Game
[37] => Sound Clip
[38] => Gospel
[39] => Noise
[40] => Alternative Rock
[41] => Bass
[42] => Soul
[43] => Punk
[44] => Space
[45] => Meditative
[46] => Instrumental Pop
[47] => Instrumental Rock
[48] => Ethnic
[49] => Gothic
[50] => Darkwave
[51] => Techno-Industrial
[52] => Electronic
[53] => Pop-Folk
[54] => Eurodance
[55] => Dream
[56] => Southern Rock
[57] => Comedy
[58] => Cult
[59] => Gangsta
[60] => Top 40
[61] => Christian Rap
[62] => Pop/Funk
[63] => Jungle
[64] => Native US
[65] => Cabaret
[66] => New Wave
[67] => Psychadelic
[68] => Rave
[69] => Showtunes
[70] => Trailer
[71] => Lo-Fi
[72] => Tribal
[73] => Acid Punk
[74] => Acid Jazz
[75] => Polka
[76] => Retro
[77] => Musical
[78] => Rock & Roll
[79] => Hard Rock
[80] => Folk
[81] => Folk-Rock
[82] => National Folk
[83] => Swing
[84] => Fast Fusion
[85] => Bebob
[86] => Latin
[87] => Revival
[88] => Celtic
[89] => Bluegrass
[90] => Avantgarde
[91] => Gothic Rock
[92] => Progressive Rock
[93] => Psychedelic Rock
[94] => Symphonic Rock
[95] => Slow Rock
[96] => Big Band
[97] => Chorus
[98] => Easy Listening
[99] => Acoustic
[100] => Humour
[101] => Speech
[102] => Chanson
[103] => Opera
[104] => Chamber Music
[105] => Sonata
[106] => Symphony
[107] => Booty Bass
[108] => Primus
[109] => Porn Groove
[110] => Satire
[111] => Slow Jam
[112] => Club
[113] => Tango
[114] => Samba
[115] => Folklore
[116] => Ballad
[117] => Power Ballad
[118] => Rhytmic Soul
[119] => Freestyle
[120] => Duet
[121] => Punk Rock
[122] => Drum Solo
[123] => Acapella
[124] => Euro-House
[125] => Dance Hall
[126] => Goa
[127] => Drum & Bass
[128] => Club-House
[129] => Hardcore
[130] => Terror
[131] => Indie
[132] => BritPop
[133] => Negerpunk
[134] => Polsk Punk
[135] => Beat
[136] => Christian Gangsta
[137] => Heavy Metal
[138] => Black Metal
[139] => Crossover
[140] => Contemporary C
[141] => Christian Rock
[142] => Merengue
[143] => Salsa
[144] => Thrash Metal
[145] => Anime
[146] => JPop
[147] => SynthPop
)
(PECL id3 >= 0.1)
id3_get_genre_name — Récupère le nom pour un id de genre
$genre_id
)id3_get_genre_name() retourne le nom pour un id de genre spécifié.
genre_id
Un entier, compris entre 0 et 147
Retourne le nom sous la forme d'une chaîne de caractères.
Exemple #1 Exemple avec id3_get_genre_name()
<?php
$genre = id3_get_genre_name(20);
echo $genre;
?>
L'exemple ci-dessus va afficher :
Alternative
(PECL id3 >= 0.1)
id3_get_tag — Récupère toutes les informations stockées dans un tag ID3
$filename
[, int $version = ID3_BEST
] )id3_get_tag() est utilisée pour récupérer toutes les informations stockées dans un tag ID3 d'un fichier spécifique.
filename
Le chemin vers le fichier MP3
Au lieu de passer un nom de fichier, vous pouvez aussi passer un flux de ressource valide.
version
Vous permet de spécifier la version du tag, bien que les fichiers MP3 doivent contenir à la fois les versions 1.x et les versions 2.x.
Depuis la version 0.2, id3_get_tag() supporte également les tags ID3 version 2.2, 2.3 et 2.4. Pour extraire les informations de ces tags, passez une des constantes ID3_V2_2, ID3_V2_3 ou ID3_V2_4 en tant que second paramètre. Les tags ID3 v2.x peuvent contenir beaucoup plus d'informations sur le fichier MP3 que les versions ID3 v1.x.
Retourne un tableau associatif avec diverses clés, comme : title, artist, ..
La clé genre doit contenir un entier compris entre 0 et 147. Vous pouvez utiliser la fonction id3_get_genre_name() pour convertir ce nombre en une chaîne lisible humainement.
Exemple #1 Exemple avec id3_get_tag()
<?php
$tag = id3_get_tag( "path/to/example.mp3" );
print_r($tag);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[title] => DN-38416
[artist] => Re:\Legion
[album] => Reflections
[year] => 2004
[genre] => 19
)
Exemple #2 Exemple avec id3_get_tag()
<?php
$tag = id3_get_tag( "path/to/example2.mp3", ID3_V2_3 );
print_r($tag);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[copyright] => Dirty Mac
[originalArtist] => Dirty Mac
[composer] => Marcus Götze
[artist] => Dirty Mac
[title] => Little Big Man
[album] => Demo-Tape
[track] => 5/12
[genre] => (17)Rock
[year] => 2001
)
(PECL id3 >= 0.1)
id3_get_version — Récupère la version d'un tag ID3
$filename
)id3_get_version() récupère la(les) version(s) de la(des) balise(s) ID3 d'un fichier MP3.
Si un fichier contient une balise ID3 v1.1, il contiendra toujours aussi une balise 1.0, vu que 1.1 est uniquement une extension de 1.0.
filename
Le chemin vers le fichier MP3
Au lieu de passer un nom de fichier, vous pouvez aussi passer un flux de ressource valide.
Retourne la(les) version(s) du(des) tag(s) ID3 d'un fichier MP3.
Sachant qu'un tag peut contenir des tags ID3 de version v1.x
et v2.x, la valeur retournée par cette fonction doit être
comparée au niveau binaire avec les constantes prédéfinies
ID3_V1_0, ID3_V1_1 et
ID3_V2.
Exemple #1 Exemple avec id3_get_version()
<?php
$version = id3_get_version( "path/to/example.mp3" );
if ($version & ID3_V1_0) {
echo "Contains a 1.x tag\n";
}
if ($version & ID3_V1_1) {
echo "Contains a 1.1 tag\n";
}
if ($version & ID3_V2) {
echo "Contains a 2.x tag\n";
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Contains a 1.x tag Contains a 1.1 tag
(PECL id3 >= 0.1)
id3_remove_tag — Efface un tag ID3
$filename
[, int $version = ID3_V1_0
] )id3_remove_tag() est utilisé pour effacer les informations stockées dans un tag ID3.
filename
Le chemin vers le fichier MP3
Au lieu d'un nom de fichier, vous pouvez également passer une ressource valide.
version
Vous permet de spécifier la version du tag, bien que les fichiers MP3 doivent contenir à la fois les versions 1.x et les versions 2.x.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec id3_remove_tag()
<?php
$result = id3_remove_tag( "path/to/example.mp3", ID3_V1_0 );
if ($result === true) {
echo "Le tag a été effacé avec succès\n";
}
?>
Si le fichier est accessible en écriture et qu'il contient un tag 1.0, l'exemple affichera :
Le tag a été effacé avec succès
Note: Actuellement, id3_remove_tag() supporte uniquement les tags version 1.0 et 1.1. Si vous tentez d'effacer un tag 1.0 et que le fichier contient un tag 1.1, le tag sera effacé car la version 1.1 n'est qu'une extension de la version 1.0.
(PECL id3 >= 0.1)
id3_set_tag — Met à jour les informations stockées dans un tag ID3
$filename
, array $tag
[, int $version = ID3_V1_0
] )id3_set_tag() est utilisé pour changer les informations stockées dans un tag ID3. Si aucun tag n'est présent, le tag sera ajouté au fichier.
filename
Le chemin vers le fichier MP3
Au lieu d'un nom de fichier, vous pouvez également passer une ressource valide.
tag
Un tableau associatif de clés et de valeurs de tags
Les clés suivantes peuvent être utilisées dans le tableau associatif :
| Clé | Valeur possible | Disponible dans la version |
|---|---|---|
| "title" | chaîne de caractères avec un maximum de 30 caractères | v1.0, v1.1 |
| "artist" | chaîne de caractères avec un maximum de 30 caractères | v1.0, v1.1 |
| "album" | chaîne de caractères avec un maximum de 30 caractères | v1.0, v1.1 |
| "year" | 4 digits | v1.0, v1.1 |
| "genre" | valeur entière comprise entre 0 et 147 | v1.0, v1.1 |
| "comment" | chaîne de caractères avec un maximum de 30 caractères (28 en v1.1) | v1.0, v1.1 |
| "track" | entier compris entre 0 et 255 | v1.1 |
version
Vous permet de spécifier la version du tag, bien que les fichiers MP3 doivent contenir à la fois les versions 1.x et les versions 2.x.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec id3_set_tag()
<?php
$data = array(
"title" => "Re:Start",
"artist" => "Re:\Legion",
"comment" => "A nice track"
);
$result = id3_set_tag( "path/to/example.mp3", $data, ID3_V1_0 );
if ($result === true) {
echo "Le tag a été mis à jour avec succès\n";
}
?>
Si le fichier est accessible en écriture, l'exemple affichera :
Le tag a été mis à jour avec succès
Note: Actuellement, id3_set_tag() supporte uniquement les versions 1.0 et 1.1.
KTaglib est une approche orientée objet de la bibliothèque taglib du projet KDE utilisée dans des projets comme Amarok, permettant de lire et d'écrire les tags ID3 et Ogg. La bibliothèque permet également d'accéder aux informations audio. Cette approche suit l'API C++ de base, mais a été modifiée légèrement afin d'être plus orientée PHP.
Note:
Pour le moment, ktaglib est capable de lire et d'écrire les tags ID3v1 et ID3v2.
Si vous voulez compiler ktaglib, vous devez avoir installé la bibliothèque taglib version 1.5. Pour obtenir cette bibliothèque, reportez-vous à la » page du projet taglib. Les bibliothèque DLL Windows sont compilés statiquement sur taglib, aussi, vous n'avez pas besoin d'installer la bibliothèque taglib.
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/ktaglib.
Aucune bibliothèque DLL pour cette extension PECL n'est actuellement disponible. Reportez-vous à la section Compilation sous Windows.
Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.
KTaglib utilise des constantes. La plupart de ces constantes est identique à celle de la bibliothèque Taglib.
KTaglib_MPEG_Header::Version1
(integer)
KTaglib_MPEG_Header::Version2
(integer)
KTaglib_MPEG_Header::Version2_5
(integer)
KTaglib_ID3v2_AttachedPictureFrame::Other
(integer)
KTaglib_ID3v2_AttachedPictureFrame::FileIcon
(integer)
KTaglib_ID3v2_AttachedPictureFrame::OtherFileIcon
(integer)
KTaglib_ID3v2_AttachedPictureFrame::FrontCover
(integer)
KTaglib_ID3v2_AttachedPictureFrame::BackCover
(integer)
KTaglib_ID3v2_AttachedPictureFrame::LeafletPage
(integer)
KTaglib_ID3v2_AttachedPictureFrame::Media
(integer)
KTaglib_ID3v2_AttachedPictureFrame::LeadArtist
(integer)
KTaglib_ID3v2_AttachedPictureFrame::Artist
(integer)
KTaglib_ID3v2_AttachedPictureFrame::Conductor
(integer)
KTaglib_ID3v2_AttachedPictureFrame::Band
(integer)
KTaglib_ID3v2_AttachedPictureFrame::Composer
(integer)
KTaglib_ID3v2_AttachedPictureFrame::Lyricist
(integer)
KTaglib_ID3v2_AttachedPictureFrame::RecordingLocation
(integer)
KTaglib_ID3v2_AttachedPictureFrame::DuringRecording
(integer)
KTaglib_ID3v2_AttachedPictureFrame::DuringPerformance
(integer)
KTaglib_ID3v2_AttachedPictureFrame::MovieScreenCapture
(integer)
KTaglib_ID3v2_AttachedPictureFrame::ColouredFish
(integer)
KTaglib_ID3v2_AttachedPictureFrame::Illustration
(integer)
KTaglib_ID3v2_AttachedPictureFrame::BandLogo
(integer)
(No version information available, might only be in SVN)
Représente un fichier MPEG. Les fichiers MPEG peuvent avoir des tags ID3v1, ID3v2 et des propriétés audio.
(0.0.1)
KTaglib_MPEG_File::__construct — Ouvre un nouveau fichier
$filename
)Ouvre un nouveau fichier MPEG.
filename
Le fichier à lire.
Exemple #1 Ouvre un nouveau fichier MP3 et lit le titre
<?php
$mpeg = new KTaglib_MPEG_File('example.mp3');
echo $mpeg->getID3v1Tag()->getTitle();
?>
(0.0.1)
KTaglib_MPEG_File::getAudioProperties — Retourne un objet qui permet l'accès aux propriétés audio
Retourne un objet qui permet l'accès aux propriétés audio d'un fichier MPEG.
Retourne un objet KTaglib_MPEG_AudioProperties ou FALSE si une erreur survient.
(0.0.1)
KTaglib_MPEG_File::getID3v1Tag — Retourne un objet représentant un tag ID3v1
$create = false
] )Retourne un objet représentant un tag ID3v1, qui pourra être utilisé pour récupérer les informations s'y trouvant.
Retourne un objet KTaglib_MPEG_ID3v1Tag ou FALSE s'il n'y a pas de tag ID3v1.
(0.0.1)
KTaglib_MPEG_File::getID3v2Tag — Retourne un objet ID3v2
Retourne un objet ID3v2 pour le fichier MPEG. S'il n'y a aucun tag ID3v2, une exception KTaglib_TagNotFoundException sera lancée.
Retourne un objet KTaglib_ID3v2_Tag pour un fichier MPEG s'il possède un tag ID3v2,
ou FALSE s'il n'en possède pas.
(No version information available, might only be in SVN)
Représente les propriétés audio d'un fichier MPEG, comme la longueur, le débit ou encore la fréquence.
(0.0.1)
KTaglib_MPEG_AudioProperties::getBitrate — Retourne le débit binaire d'un fichier MPEG
Retourne le débit binaire d'un fichier MPEG.
Retourne le débit binaire, sous la forme d'un entier.
(0.0.1)
KTaglib_MPEG_AudioProperties::getChannels — Retourne le nombre de canaux d'un fichier MPEG
Retourne le nombre de canaux d'un fichier MPEG.
Retourne le nombre de canaux, sous la forme d'un entier.
(0.0.1)
KTaglib_MPEG_AudioProperties::getLayer — Retourne la couche d'un fichier MPEG
Retourne la couche d'un fichier MPEG (habituellement 2 pour un MP3).
Retourne la couche, sous la forme d'un entier.
(0.0.1)
KTaglib_MPEG_AudioProperties::getLength — Retourne la taille d'un fichier MPEG
Retourne la taille d'un fichier MPEG.
Retourne la taille, sous la forme d'un entier.
(0.0.1)
KTaglib_MPEG_AudioProperties::getSampleBitrate — Retourne l'échantillonnage d'un fichier MPEG
Retourne l'échantillonnage d'un fichier MPEG.
Retourne l'échantillonnage, sous la forme d'un entier.
(0.0.1)
KTaglib_MPEG_AudioProperties::getVersion — Retourne la version d'un fichier MPEG
Retourne la version de l'en-tête d'un fichier MPEG. Les versions possibles sont définies dans Tag_MPEG_Header (Version1, Version2, Version2.5).
Retourne la version.
(0.0.1)
KTaglib_MPEG_AudioProperties::isCopyrighted — Retourne le statut du copyright d'un fichier MPEG
Retourne true si le fichier MPEG est sous copyright.
Retourne true si le fichier MPEG est sous copyright.
(0.0.1)
KTaglib_MPEG_AudioProperties::isOriginal — Vérifie si le fichier MPEG est marqué comme un fichier original
Retourne true si le fichier MPEG est marqué comme original.
Retourne true si le fichier MPEG est marqué comme original.
(0.0.1)
KTaglib_MPEG_AudioProperties::isProtectionEnabled — Vérifie si un mécanisme de protection d'un fichier MPEG est actif
Retourne true si un mécanisme de protection tel que le DRM est actif pour ce fichier.
Retourne true si un mécanisme de protection tel que le DRM est actif pour ce fichier.
(No version information available, might only be in SVN)
Classe de base pour les tags ID3v1 ou ID3v2.
(0.0.1)
KTaglib_Tag::getAlbum — Retourne le nom de l'album d'un tag ID3
Retourne le nom de l'album d'un tag ID3. Cette méthode est implémentée pour les tags ID3v1 et ID3v2.
Retourne le nom de l'album.
(0.0.1)
KTaglib_Tag::getArtist — Retourne le nom de l'artiste d'un tag ID3
Retourne le nom de l'artiste d'un tag ID3. Cette méthode est implémentée pour les tags ID3v1 et ID3v2.
Retourne le nom de l'artiste.
(0.0.1)
KTaglib_Tag::getComment — Retourne le commentaire d'un tag ID3
Retourne le commentaire d'un tag ID3. Cette méthode est implémentée pour les tags ID3v1 et ID3v2.
Retourne le commentaire.
(0.0.1)
KTaglib_Tag::getGenre — Retourne le genre d'un tag ID3
Retourne le genre d'un tag ID3. Cette méthode est implémentée pour les tags ID3v1 et ID3v2.
Retourne le genre.
(0.0.1)
KTaglib_Tag::getTitle — Retourne le titre d'un tag ID3
Retourne le titre d'un tag ID3. Cette méthode est implémentée pour les tags ID3v1 et ID3v2.
Retourne le titre.
(0.0.1)
KTaglib_Tag::getTrack — Retourne le numéro de la piste d'un tag ID3
Retourne le numéro de la piste d'un tag ID3. Cette méthode est implémentée pour les tags ID3v1 et ID3v2.
Retourne le numéro de la piste, sous la forme d'un entier.
(0.0.1)
KTaglib_Tag::getYear — Retourne l'année d'un tag ID3
Retourne l'année d'un tag ID3. Cette méthode est implémentée pour les tags ID3v1 et ID3v2.
Retourne l'année, sous la forme d'un entier.
(0.0.1)
KTaglib_Tag::isEmpty — Retourne TRUE si le tag est vide
Retourne TRUE si le tag existe mais qu'il est vide. Cette méthode
est implémentée pour les tags ID3v1 et ID3v2.
Retourne TRUE si le tag est vide, FALSE sinon.
(No version information available, might only be in SVN)
Représente un tag ID3v2. Elle fournit une liste des frames ID3v2 et peut être utilisée pour ajouter ou effacer des frames.
(0.0.1)
KTaglib_ID3v2_Tag::addFrame — Ajoute une frame à un tag ID3v2
Ajoute une frame à un tag ID3v2. La frame doit être un objet KTaglib_ID3v2_Frame valide. Pour sauvegarder la frame, la fonction de sauvegarde doit être appelée.
Retourne TRUE en cas de succès, FALSE sinon.
(0.0.1)
KTaglib_ID3v2_Tag::getFrameList — Retourne un tableau de frames ID3v2, associées avec un tag ID3v2
Retourne un tableau de frames ID3v2, associées au tag ID3v2.
Retourne un tableau d'objets KTaglib_ID3v2_Frame.
(No version information available, might only be in SVN)
La classe de base pour les frames ID3v2. Les tags ID3v2 sont séparés en plusieurs frames spécialisés. Quelques frames peuvent être présents plusieurs fois.
(0.0.1)
KTaglib_ID3v2_Frame::getSize — Retourne la taille de la frame, en octets
Retourne la taille de la frame, en octets. Reportez-vous au site id3.org pour savoir comment sont les frames et comment elles sont définies.
Retourne la taille de la frame, en octets.
(0.0.1)
KTaglib_ID3v2_Frame::__toString — Retourne une chaîne représentant la frame
Retourne une chaîne représentant la frame. Ce peut être uniquement l'identifiant de la frame, mais cette chaîne peut également contenir d'autres informations. Reportez-vous à la documentation de ktaglib pour plus d'informations.
Retourne une chaîne représentant la frame.
(No version information available, might only be in SVN)
Représente une frame ID3v2 qui peut contenir une image.
(0.0.1)
KTaglib_ID3v2_AttachedPictureFrame::getDescription — Retourne une description de l'image contenu dans la frame spécialisée
Retourne la description attachée à une frame contenant une image, dans une frame ID3v2.x.
Retourne une description de l'image.
(0.2.0)
KTaglib_ID3v2_AttachedPictureFrame::getMimeType — Retourne le type MIME de l'image
Retourne le type MIME de l'image présente dans la frame spécialisée.
Notez que cette méthode peut retourner différents types. Alors que les tags ID3v2.2 contiennent un type MIME qui ne commencent pas par "image/", les tags ID3v2.3 et v2.4 commencent eux par "image/". Aussi, cette méthode peut retourner "image/png" pour les tags IDv2.3 et uniquement "PNG" pour les tags ID3v2.2.
Notez également que, malgré le fait qu'une image soit attachée, le type MIME peut ne pas avoir été défini, et ainsi, une chaîne vide peut être retournée.
Retourne le type MIME de l'image.
(0.2.0)
KTaglib_ID3v2_AttachedPictureFrame::getType — Retourne le type d'une image
Retourne le type d'une image.
La spécification ID3v2 autorise un AttachedPictureFrame à définir une image. Cela peut être, i.e. FrontCover ou FileIcon. Reportez-vous à la description de la classe KTaglib_ID3v2_AttachedPictureFrame pour une liste des types disponibles.
Retourne un entier représentant le type de l'image.
(0.0.1)
KTaglib_ID3v2_AttachedPictureFrame::savePicture — Sauvegarde une image dans un fichier
$filename
)Sauvegarde l'image attachée dans un fichier donné.
Retourne TRUE en cas de succès, FALSE sinon.
(0.2.0)
KTaglib_ID3v2_AttachedPictureFrame::setMimeType — Définit le type MIME d'une image
Définit le type MIME d'une image. C'est, en général, "image/png" ou "image/jpeg".
(0.0.1)
KTaglib_ID3v2_AttachedPictureFrame::setPicture — Définit le tag image en une image donnée
$filename
)Définit le tag image en une image donnée. L'image est chargée depuis le fichier fourni. Notez que l'image n'est sauvegardée que lors de l'appel à la méthode de sauvegarde de l'objet fichier correspondant.
Retourne TRUE en cas de succès, FALSE si une erreur survient.
(0.2.0)
KTaglib_ID3v2_AttachedPictureFrame::setType — Définit le type de l'image
$type
)Définit le type de l'image. Ce peut être FrontCover ou FileIcon. Reportez-vous à la description de la classe KTaglib_ID3v2_AttachedPictureFrame pour une liste de types disponibles ainsi que leurs constantes correspondantes.
Le format de fichier OGG/Vorbis, comme définit par » http://www.vorbis.com/, est un schéma pour la compression de flux audio par de multiples facteurs avec un minimum de perte de qualité. Cette extension ajoute le support Ogg Vorbis aux gestionnaires d'URL de PHP. Lorsqu'utilisé en mode lecture, les données compressées OGG/Vorbis sont déployées en audio PCM brute en un des six formats d'encodage PCM listés ci-dessous.
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/oggvorbis
Cette extension ne définit aucune directive de configuration.
Cette extension ne définit aucune ressource.
Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.
| Constante | Définition |
|---|---|
OGGVORBIS_PCM_U8 |
PCM 8-bit non-signé. |
OGGVORBIS_PCM_S8 |
PCM 8-bit signé. |
OGGVORBIS_PCM_U16_LE |
PCM 16-bit non-signé. Arrangements normaux Little Endian. |
OGGVORBIS_PCM_U16_BE |
PCM 16-bit non-signé. Arrangements normaux Big Endian. |
OGGVORBIS_PCM_S16_LE |
PCM 16-bit signé. Arrangements normaux Little Endian. |
OGGVORBIS_PCM_S16_BE |
PCM 16-bit signé. Arrangements normaux Big Endian. |
| Option | Définition | Pertinence | Défaut |
|---|---|---|---|
| pcm_mode | Encodage PCM utilisé. Voir les constantes ci-dessous. | Lecture / Écriture | OGGVORBIS_PCM_S16_LE |
| rate | Taux d'échantillonnage PCM. Mesuré en Hz. | Écriture uniquement | 44100 |
| bitrate | Débit d'encodage moyen Vorbis / Débit d'encodage variable. Mesuré en bps (ABR) ou en niveau de qualité (VBR : 0.0 à 1.0). 128000 ABR équivaut à 0.4 VBR. | Écriture uniquement | 128000 |
| channels | Nombre de canaux PCM. 1 == Mono, 2 == Stéréo. | Écriture uniquement | 2 |
| serialno | Numéro de série du flux dans un fichier. Doit être unique dans un fichier. Parce qu'il est potentiellement possible de sélectionner plusieurs numéros de série dans un fichier chaîné, faites l'effort d'assigner manuellement des numéros uniques lors de l'encodage. | Écriture uniquement | Random |
| comments | Tableau associatif de commentaires de fichier. Peut être traduit par strtoupper($name) . "=$value". Note : cette option de contexte n'est pas disponible en oggvorbis 0.1 | Écriture uniquement | array('ENCODER' => 'PHP/OggVorbis, http://pear.php.net/oggvorbis') |
Exemple #1 Lecture d'un fichier OGG/Vorbis
<?php
dl("oggvorbis.so");
/* Par défaut, ogg:// décodera en 16-bit signé, en mode Little Endian */
$fp = fopen('ogg://monaudio.ogg', 'r');
/* Collecte quelques informations sur le fichier. */
$metadata = stream_get_meta_data($fp);
/* Inspection de la première chanson (habituellement la seule chanson
mais les fichiers OGG/Vorbis peuvent être chaînés) */
$songdata = $metadata['wrapper_data'][0];
echo "Fichier OGG/Vorbis encodé par : {$songdata['vendor']}\n.";
echo " {$songdata['channels']} canaux de {$songdata['rate']}Hz encodé à {$songdata['bitrate_nominal']}bps.\n";
foreach($songdata['comments'] as $comment) {
echo " $comment\n";
}
while ($audio_data = fread($fp, 8192)) {
/* Faire quelque chose avec l'audio PCM extrait depuis le OGG.
Copier vers /dev/dsp est une bonne chose sur les systèmes linux,
souvenez-vous juste de définir le périphérique pour votre mode d'échantillonage d'abord. */
}
fclose($fp);
?>
Exemple #2 Encoder un fichier audio en OGG/Vorbis
<?php
dl('oggvorbis.so');
$context = stream_context_create(array('ogg'=>array(
'pcm_mode' => OGGVORBIS_PCM_S8, /* audio 8bit signé */
'rate' => 44100, /* Qualité CD 44kHz */
'bitrate' => 0.5, /* Qualité moyenne VBR */
'channels' => 1, /* Mono */
'serialno' => 12345))); /* Unique dans notre flux */
/* Ouverture d'un fichier pour un ajout. Ceci permet de "chaîner" un deuxième flux OGG à la fin du premier. */
$ogg = fopen('ogg://machanson.ogg', 'a', false, $context);
$pcm = fopen('mysample.pcm', 'r');
/* Compression de l'audio brute PCM depuis mysample.pcm vers machanson.ogg */
stream_copy_to_stream($pcm, $ogg);
fclose($pcm);
fclose($ogg);
?>
Plate-forme indépendante pour la gestion de l'audio. Requiert la bibliothèque » OpenAL.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Cette extension » PECL n'est pas intégrée à PHP.
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/openal.
Aucune bibliothèque DLL pour cette extension PECL n'est actuellement disponible. Reportez-vous à la section Compilation sous Windows.
Cette extension ne définit aucune directive de configuration.
Cette extension définie quatre types de ressource : Open AL(Device) - Retournée par openal_device_open(), Open AL(Context) - Retournée par openal_context_create(), Open AL(Buffer) - Retournée par openal_buffer_create(), et Open AL(Source) - Retournée par openal_source_create().
Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.
ALC_FREQUENCY
(entier)
ALC_REFRESH
(entier)
ALC_SYNC
(entier)
AL_FREQUENCY
(entier)
AL_BITS
(entier)
AL_CHANNELS
(entier)
AL_SIZE
(entier)
AL_BUFFER
(entier)
AL_SOURCE_RELATIVE
(entier)
AL_SOURCE_STATE
(entier)
AL_PITCH
(entier)
AL_GAIN
(entier)
AL_MIN_GAIN
(entier)
AL_MAX_GAIN
(entier)
AL_MAX_DISTANCE
(entier)
AL_ROLLOFF_FACTOR
(entier)
AL_CONE_OUTER_GAIN
(entier)
AL_CONE_INNER_ANGLE
(entier)
AL_CONE_OUTER_ANGLE
(entier)
AL_REFERENCE_DISTANCE
(entier)
AL_POSITION
(entier)
AL_VELOCITY
(entier)
AL_DIRECTION
(entier)
AL_ORIENTATION
(entier)
AL_FORMAT_MONO8
(entier)
AL_FORMAT_MONO16
(entier)
AL_FORMAT_STEREO8
(entier)
AL_FORMAT_STEREO16
(entier)
AL_INITIAL
(entier)
AL_PLAYING
(entier)
AL_PAUSED
(entier)
AL_STOPPED
(entier)
AL_LOOPING
(entier)
AL_TRUE
(entier)
AL_FALSE
(entier)
(PECL openal >= 0.1.0)
openal_buffer_create — Génère un buffer OpenAL
openal_buffer_create() retourne une ressource
Open AL(Buffer) ou FALSE en cas d'erreur.
(PECL openal >= 0.1.0)
openal_buffer_data — Charge un buffer avec des données
$buffer
, int $format
, string $data
, int $freq
)buffer
Une ressource Open AL(Buffer) (précédemment créée par openal_buffer_create()).
format
Format du paramètre data, un parmi ceux-là :
AL_FORMAT_MONO8,
AL_FORMAT_MONO16,
AL_FORMAT_STEREO8 et
AL_FORMAT_STEREO16.
data
Bloc de données binaires audio dans le format spécifié
format et
freq.
freq
Fréquence des données data, en Hz.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL openal >= 0.1.0)
openal_buffer_destroy — Détruit un buffer OpenAL
$buffer
)buffer
Une ressource Open AL(Buffer) (précédemment créée par openal_buffer_create()).
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL openal >= 0.1.0)
openal_buffer_get — Récupère les propriétés du buffer OpenAL
$buffer
, int $property
)buffer
Une ressource Open AL(Buffer) (précédemment créée par openal_buffer_create()).
property
Une propriété spécifique, une parmi celles-ci :
AL_FREQUENCY,
AL_BITS,
AL_CHANNELS et
AL_SIZE.
Retourne une valeur entière appropriée à la demande
property ou FALSE si une erreur survient.
(PECL openal >= 0.1.0)
openal_buffer_loadwav — Charge un fichier .wav dans le buffer
$buffer
, string $wavfile
)buffer
Une ressource Open AL(Buffer) (précédemment créée par openal_buffer_create()).
wavfile
Chemin vers le fichier .wav sur le système de fichiers local.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL openal >= 0.1.0)
openal_context_create — Crée un contexte de traitement audio
$device
)device
Une ressource Open AL(Device) (précédemment créée par openal_device_open()).
Retourne une ressource Open AL(Context)
ou FALSE en cas d'erreur.
(PECL openal >= 0.1.0)
openal_context_current — Rend courant le contexte spécifié
$context
)context
Une ressource Open AL(Context) (précédemment créée par openal_context_create()).
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL openal >= 0.1.0)
openal_context_destroy — Détruit un contexte
$context
)context
Une ressource Open AL(Context) (précédemment créée par openal_context_create()).
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL openal >= 0.1.0)
openal_context_process — Traite le contexte spécifié
$context
)context
Une ressource Open AL(Context) (précédemment créée par openal_context_create()).
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL openal >= 0.1.0)
openal_context_suspend — Suspend le contexte spécifié
$context
)context
Une ressource Open AL(Context) (précédemment créée par openal_context_create()).
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL openal >= 0.1.0)
openal_device_close — Ferme un périphérique OpenAL
$device
)device
Une ressource Open AL(Device) (précédemment créée par openal_device_open()) à fermer.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL openal >= 0.1.0)
openal_device_open — Initialise une interface audio OpenAL
$device_desc
] )device_desc
openal_device_open() ouvre un périphérique audio
optionnellement spécifié par le paramètre device_desc.
Si le paramètre device_desc n'est pas spécifié, le
premier périphérique audio disponible sera utilisé.
Retourne une ressource Open AL(Device)
ou FALSE en cas d'erreur.
(PECL openal >= 0.1.0)
openal_listener_get — Récupère une propriété d'auditeur
Retourne un nombre décimal ou un tableau de nombres à virgule flottante ou FALSE si une erreur survient.
(PECL openal >= 0.1.0)
openal_listener_set — Définie une propriété d'auditeur
property
La propriété à définir, une parmi celles-ci :
AL_GAIN (float),
AL_POSITION (array(float,float,float)),
AL_VELOCITY (array(float,float,float)) et
AL_ORIENTATION (array(float,float,float)).
setting
La valeur à définir, soit un nombre décimal, soit un tableau de nombres à virgule flottante appropriés.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL openal >= 0.1.0)
openal_source_create — Génère une ressource de source
Retourne une ressource Open AL(Source)
ou FALSE en cas d'erreur.
(PECL openal >= 0.1.0)
openal_source_destroy — Détruit une ressource de source
$source
)source
Une ressource Open AL(Source) (précédemment créée par openal_source_create()).
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL openal >= 0.1.0)
openal_source_get — Récupère une propriété de source OpenAL
source
Une ressource Open AL(Source) (précédemment créée par openal_source_create()).
property
Propriété à récupérer, une parmi celles-ci :
AL_SOURCE_RELATIVE (entier),
AL_SOURCE_STATE (entier),
AL_PITCH (float),
AL_GAIN (float),
AL_MIN_GAIN (float),
AL_MAX_GAIN (float),
AL_MAX_DISTANCE (float),
AL_ROLLOFF_FACTOR (float),
AL_CONE_OUTER_GAIN (float),
AL_CONE_INNER_ANGLE (float),
AL_CONE_OUTER_ANGLE (float),
AL_REFERENCE_DISTANCE (float),
AL_POSITION (array(float,float,float)),
AL_VELOCITY (array(float,float,float)),
AL_DIRECTION (array(float,float,float)).
Retourne le type associé avec la propriété récupérée ou FALSE si une erreur survient.
(PECL openal >= 0.1.0)
openal_source_pause — Marque une pause dans la source
$source
)source
Une ressource Open AL(Source) (précédemment créée avec openal_source_create()).
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL openal >= 0.1.0)
openal_source_play — Démarre la lecture de la source
$source
)source
Une ressource Open AL(Source) (précédemment créée par openal_source_create()).
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL openal >= 0.1.0)
openal_source_rewind — Revient en arrière dans la source
$source
)source
Une ressource Open AL(Source) (précédemment créée par openal_source_create()).
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL openal >= 0.1.0)
openal_source_set — Définie une propriété de la source
source
Une ressource Open AL(Source) (précédemment créée par openal_source_create()).
property
La propriété à définir, une parmi celles-ci :
AL_BUFFER (OpenAL(Source)),
AL_LOOPING (boolean),
AL_SOURCE_RELATIVE (int),
AL_SOURCE_STATE (int),
AL_PITCH (float),
AL_GAIN (float),
AL_MIN_GAIN (float),
AL_MAX_GAIN (float),
AL_MAX_DISTANCE (float),
AL_ROLLOFF_FACTOR (float),
AL_CONE_OUTER_GAIN (float),
AL_CONE_INNER_ANGLE (float),
AL_CONE_OUTER_ANGLE (float),
AL_REFERENCE_DISTANCE (float),
AL_POSITION (array(float,float,float)),
AL_VELOCITY (array(float,float,float)),
AL_DIRECTION (array(float,float,float)).
setting
La valeur à assigner à la propriété spécifiée par le paramètre
property.
Référez-vous à la description de la propriété
property pour une
description des valeurs attendues.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL openal >= 0.1.0)
openal_source_stop — Arrête la lecture de la source
$source
)source
Une ressource Open AL(Source) (précédemment créée par openal_source_create()).
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL openal >= 0.1.0)
openal_stream — Démarre le streaming d'une source
$source
, int $format
, int $rate
)source
Une ressource Open AL(Source) (précédemment créée par openal_source_create()).
format
Le format du paramètre data, un parmi ceux-là :
AL_FORMAT_MONO8,
AL_FORMAT_MONO16,
AL_FORMAT_STEREO8 et
AL_FORMAT_STEREO16.
rate
La fréquence des données à streamer, en Hz.
Retourne une ressource de streaming ou FALSE si une erreur survient.
Ce paquet vous permet d'accéder à l'administration des serveurs Kerberos V. Vous pourrez créer, modifier et effacer les directives et les éléments principaux Kerberos V.
Plus d'informations à propos de Kerberos peuvent être trouvées sur » http://web.mit.edu/kerberos/www/.
La documentation sur Kerberos et KADM5 peut être trouvée sur » http://web.mit.edu/kerberos/www/krb5-1.2/krb5-1.2.8/doc/admin_toc.html.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/kadm5.
Note:
Si vous utilisez cette option sans spécifier le chemin vers KADM5, PHP utilisera les bibliothèques clientes internes de KADM5. Les utilisateurs qui exécutent d'autres applications qui utilisent également KADM5 (par exemple, l'exécution de PHP 4 et PHP 5 comme modules apache concurrent, ou auth-kadm5), doivent également spécifier le chemin vers KADM5 : --with-kadm5=/path/to/kadm5. Ceci forcera PHP à utiliser les bibliothèques clientes installées par KADM5, évitant ainsi les conflits.
Aucune bibliothèque DLL pour cette extension PECL n'est actuellement disponible. Reportez-vous à la section Compilation sous Windows.
Cette extension ne définit aucune directive de configuration.
Cette extension définit un gestionnaire KADM5 retourné par la fonction kadm5_init_with_password().
Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.
Les fonctions kadm5_create_principal(), kadm5_modify_principal() et kadm5_modify_principal() vous permettent de spécifier des attributs spéciaux utilisant un champ de bits. Les symboles sont définis ci-dessous :
| constante |
|---|
| KRB5_KDB_DISALLOW_POSTDATED |
| KRB5_KDB_DISALLOW_FORWARDABLE |
| KRB5_KDB_DISALLOW_TGT_BASED |
| KRB5_KDB_DISALLOW_RENEWABLE |
| KRB5_KDB_DISALLOW_PROXIABLE |
| KRB5_KDB_DISALLOW_DUP_SKEY |
| KRB5_KDB_DISALLOW_ALL_TIX |
| KRB5_KDB_REQUIRES_PRE_AUTH |
| KRB5_KDB_REQUIRES_HW_AUTH |
| KRB5_KDB_REQUIRES_PWCHANGE |
| KRB5_KDB_DISALLOW_SVR |
| KRB5_KDB_PWCHANGE_SERVER |
| KRB5_KDB_SUPPORT_DESMD5 |
| KRB5_KDB_NEW_PRINC |
Les fonctions kadm5_create_principal(), kadm5_modify_principal() et kadm5_get_principal() permettent de spécifier ou retourner les options des éléments principaux en tant que tableaux associatifs. Les clés pour le tableau associatif sont définies en tant que constantes ci-dessous :
| constante | type | description |
|---|---|---|
| KADM5_PRINCIPAL | long | Le délai d'expiration des éléments principaux en tant que timestamp Kerberos. |
| KADM5_PRINC_EXPIRE_TIME | long | Le délai d'expiration des éléments principaux en tant que timestamp Kerberos. |
| KADM5_LAST_PW_CHANGE | long | Le délai pendant lequel le mot de passe du principal a été changé pour la dernière fois. |
| KADM5_PW_EXPIRATION | long | Le délai d'expiration du mot de passe du principal courant, en tant que timestamp Kerberos. |
| KADM5_MAX_LIFE | long | La durée de vie maximale de tous les tickets Kerberos issus de ce principal. |
| KADM5_MAX_RLIFE | long | La durée maximale renouvelable de tous les tickets Kerberos issus de ce principal. |
| KADM5_MOD_NAME | string | Le nom du principal Kerberos qui a modifié ce principal le plus récemment. |
| KADM5_MOD_TIME | long | L'heure à laquelle ce principal a été modifié pour la dernière fois, en tant que timestamp Kerberos. |
| KADM5_KVNO | long | La version de la clé courante du principal. |
| KADM5_POLICY | string | Le nom de la directive contrôlant ce principal. |
| KADM5_CLEARPOLICY | long | La procédure standard servant à assigner la directive par défaut pour créer des éléments principaux. KADM5_CLEARPOLICY supprime ce comportement. |
| KADM5_LAST_SUCCESS | long | L'heure KDC de la dernière AS_REQ qui a réussi. |
| KADM5_LAST_FAILED | long | L'heure KDC de la dernière AS_REQ qui a échoué. |
| KADM5_FAIL_AUTH_COUNT | long | Le nombre d'échec récursif AS_REQs. |
| KADM5_RANDKEY | long |
Génère un mot de passe aléatoire pour le principal. Le paramètre
password sera ignoré.
|
| KADM5_ATTRIBUTES | long | Un champ de bits d'attributs à utiliser par KDC. |
Cet exemple simple montre comment se connecter, interroger, imprimer les éléments principaux et se déconnecter depuis une base de données KADM5.
Exemple #1 Exemple général de l'extension KADM5
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
print "<h1>get_principals</h1>\n";
$principals = kadm5_get_principals($handle);
for( $i=0; $i<count($principals); $i++)
print "$principals[$i]<br>\n";
print "<h1>get_policies</h1>\n";
$policies = kadm5_get_policies($handle);
for( $i=0; $i<count($policies); $i++)
print "$policies[$i]<br>\n";
print "<h1>get_principal burbach@GONICUS.LOCAL</h1>\n";
$options = kadm5_get_principal($handle, "burbach@GONICUS.LOCAL" );
$keys = array_keys($options);
for( $i=0; $i<count($keys); $i++) {
$value = $options[$keys[$i]];
print "$keys[$i]: $value<br>\n";
}
$options = array(KADM5_PRINC_EXPIRE_TIME => 0);
kadm5_modify_principal($handle, "burbach@GONICUS.LOCAL", $options);
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_chpass_principal — Modifie le mot de passe du principal
$handle
, string $principal
, string $password
)
kadm5_chpass_principal() définit un nouveau mot de passe
password pour le principal.
handle
Un gestionnaire KADM5.
principal
Le principal.
password
Le nouveau mot de passe.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple de modification du mot de passe du principal
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
kadm5_chpass_principal($handle, "burbach@GONICUS.LOCAL", "newpassword");
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_create_principal — Crée un principal kerberos avec les paramètres donnés
$handle
, string $principal
[, string $password
[, array $options
]] )
kadm5_create_principal() crée un
principal avec le mot de passe
password donné.
handle
Un gestionnaire KADM5.
principal
Le principal.
password
Si password n'est pas spécifié ou s'il
vaut NULL, une clé aléatoire sera générée.
options
Il est possible de spécifier plusieurs paramètres optionnels avec le tableau
options. Les options suivantes sont autorisées :
KADM5_PRINC_EXPIRE_TIME,
KADM5_PW_EXPIRATION,
KADM5_ATTRIBUTES,
KADM5_MAX_LIFE,
KADM5_KVNO,
KADM5_POLICY,
KADM5_CLEARPOLICY,
KADM5_MAX_RLIFE.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple de création d'un principal
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
$attributes = KRB5_KDB_REQUIRES_PRE_AUTH | KRB5_KDB_DISALLOW_PROXIABLE;
$options = array(KADM5_PRINC_EXPIRE_TIME => 0,
KADM5_POLICY => "default",
KADM5_ATTRIBUTES => $attributes);
kadm5_create_principal($handle, "burbach@GONICUS.LOCAL", "password", $options);
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_delete_principal — Efface un principal kerberos
$handle
, string $principal
)
Efface un principal depuis la base de données Kerberos.
handle
Un gestionnaire KADM5.
principal
Le principal à effacer.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec kadm5_delete_principal()
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
kadm5_delete_principal($handle, "burbach@GONICUS.LOCAL");
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_destroy — Ferme la connexion avec le serveur d'administration et libère toutes les ressources associées
$handle
)Ferme la connexion avec le serveur d'administration et libère toutes les ressources associées.
handle
Un gestionnaire KADM5.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL kadm5 >= 0.2.3)
kadm5_flush — Valide toutes les modifications de la base de données Kerberos
$handle
)Valide toutes les modifications de la base de données Kerberos, et quitte la connexion ouverte du serveur d'administration Kerberos
handle
Un gestionnaire KADM5.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL kadm5 >= 0.2.3)
kadm5_get_policies — Récupère toutes les directives depuis la base de données Kerberos
$handle
)Récupère un tableau contenant tous les noms des directives.
handle
Un gestionnaire KADM5.
Retourne un tableau de directives en cas de succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec kadm5_get_policies()
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
print "<h1>get_policies</h1>\n";
foreach (kadm5_get_policies($handle) as $policy) {
echo "$policy<br />\n";
}
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_get_principal — Récupère les entrées des éléments principaux depuis la base de données Kerberos
$handle
, string $principal
)Récupère les entrées des éléments principaux depuis la base de données Kerberos.
handle
Un gestionnaire KADM5.
principal
Le principal.
kadm5_get_principal() retourne un tableau associatif contenant
les clés suivantes : KADM5_PRINCIPAL, KADM5_PRINC_EXPIRE_TIME,
KADM5_PW_EXPIRATION, KADM5_ATTRIBUTES, KADM5_MAX_LIFE, KADM5_MOD_NAME,
KADM5_MOD_TIME, KADM5_KVNO, KADM5_POLICY, KADM5_MAX_RLIFE,
KADM5_LAST_SUCCESS, KADM5_LAST_FAILED, KADM5_FAIL_AUTH_COUNT.
en cas de succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec kadm5_get_principal()
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
print "<h1>get_principal burbach@GONICUS.LOCAL</h1>\n";
$options = kadm5_get_principal($handle, "burbach@GONICUS.LOCAL" );
foreach ($options as $key => $value) {
echo "$key: $value<br />\n";
}
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_get_principals — Récupère tous les éléments principaux depuis la base de données Kerberos
$handle
)kadm5_get_principals() retourne un tableau contenant tous les noms des éléments principaux.
handle
A KADM5 handle.
Retourne un tableau d'éléments principaux en cas de succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec kadm5_get_principals()
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
print "<h1>get_principals</h1>\n";
foreach (kadm5_get_principals($handle) as $principal) {
echo "$principal<br />\n";
}
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_init_with_password — Ouvre une connexion à la bibliothèque KADM5
$admin_server
, string $realm
, string $principal
, string $password
)
Ouvre une connexion avec la bibliothèque KADM5 en utilisant
le principal et le mot de passe
password pour obtenir les créances initiales depuis le
serveur d'administration admin_server.
admin_server
Le serveur.
realm
Définit le domaine d'identification pour la connexion.
principal
Le principal.
password
Si password est omis ou s'il vaut NULL,
une clé aléatoire sera générée.
Retourne un gestionnaire KADM5 en cas de succès ou FALSE si une erreur survient.
Exemple #1 Exemple d'initialisation KADM5
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
$attributes = KRB5_KDB_REQUIRES_PRE_AUTH | KRB5_KDB_DISALLOW_PROXIABLE;
$options = array(KADM5_PRINC_EXPIRE_TIME => 0,
KADM5_POLICY => "default",
KADM5_ATTRIBUTES => $attributes);
kadm5_create_principal($handle, "burbach@GONICUS.LOCAL", "password", $options);
kadm5_destroy($handle);
?>
Note:
La connexion doit être close après l'avoir utilisée avec la fonction kadm5_destroy().
(PECL kadm5 >= 0.2.3)
kadm5_modify_principal — Modifie un principal Kerberos avec les paramètres donnés
$handle
, string $principal
, array $options
)Modifie un principal Kerberos avec les paramètres donnés
handle
Un gestionnaire KADM5.
principal
Le principal.
options
Il est possible de spécifier plusieurs paramètres optionnels avec
un tableau d'options. Les options suivantes
sont autorisées :
KADM5_PRINC_EXPIRE_TIME,
KADM5_PW_EXPIRATION,
KADM5_ATTRIBUTES,
KADM5_MAX_LIFE,
KADM5_KVNO,
KADM5_POLICY,
KADM5_CLEARPOLICY,
KADM5_MAX_RLIFE.
KADM5_FAIL_AUTH_COUNT.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple de modification d'un principal
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
$attributes = KRB5_KDB_REQUIRES_PRE_AUTH;
$options = array(KADM5_PRINC_EXPIRE_TIME => 3451234,
KADM5_POLICY => "gonicus",
KADM5_ATTRIBUTES => $attributes);
kadm5_modify_principal($handle, "burbach@GONICUS.LOCAL", $options);
kadm5_destroy($handle);
?>
Ce paquet est basé sur la bibliothèque libradius (Remote Authentication Dial In User Service) de FreeBSD. Il permet aux clients d'effectuer des identification et représentations par le biais de requêtes réseau sur des serveurs distants.
Cette extension PECL supporte tout le protocole Radius Authentication complet pour les identifications (» RFC 2865) et Radius Accounting (» RFC 2866). Ce paquet est disponible pour Unix (testé sous FreeBSD et Linux) mais aussi pour Windows.
Note:
Une description de libradius peut être trouvée » ici. Une description détaillée du fichier de configuration peut être trouvée » ici.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Cette extension » PECL n'est pas intégrée à PHP.
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/radius.
Aucune bibliothèque DLL pour cette extension PECL n'est actuellement disponible. Reportez-vous à la section Compilation sous Windows.
Cette extension ne définit aucune directive de configuration.
Cette extension ne définit aucune ressource.
Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.
RADIUS_ACCESS_REQUEST
()
RADIUS_ACCESS_ACCEPT
()
RADIUS_ACCESS_REJECT
()
RADIUS_ACCOUNTING_REQUEST
()
RADIUS_ACCOUNTING_RESPONSE
()
RADIUS_ACCESS_CHALLENGE
()
RADIUS_USER_NAME
(chaîne de caractères)
RADIUS_USER_PASSWORD
(chaîne de caractères)
RADIUS_CHAP_PASSWORD
(chaîne de caractères)
RADIUS_NAS_IP_ADDRESS
(chaîne de caractères)
RADIUS_NAS_PORT
(entier)
RADIUS_SERVICE_TYPE
(entier)
Type de service :
RADIUS_LOGINRADIUS_FRAMEDRADIUS_CALLBACK_LOGINRADIUS_CALLBACK_FRAMEDRADIUS_OUTBOUNDRADIUS_ADMINISTRATIVERADIUS_NAS_PROMPTRADIUS_AUTHENTICATE_ONLYRADIUS_CALLBACK_NAS_PROMPTRADIUS_FRAMED_PROTOCOL
(entier)
Protocole encadré :
RADIUS_PPPRADIUS_SLIPRADIUS_ARAPRADIUS_GANDALFRADIUS_XYLOGICSRADIUS_FRAMED_IP_ADDRESS
(int)
RADIUS_FRAMED_IP_NETMASK
(chaîne de caractères)
RADIUS_FRAMED_ROUTING
(entier)
RADIUS_FILTER_ID
(chaîne de caractères)
RADIUS_FRAMED_MTU
(entier)
RADIUS_FRAMED_COMPRESSION
(entier)
Compression :
RADIUS_COMP_NONERADIUS_COMP_VJRADIUS_COMP_IPXHDRRADIUS_LOGIN_IP_HOST
(chaîne de caractères)
RADIUS_LOGIN_SERVICE
(entier)
RADIUS_LOGIN_TCP_PORT
(entier)
RADIUS_REPLY_MESSAGE
(chaîne de caractères)
RADIUS_CALLBACK_NUMBER
(chaîne de caractères)
RADIUS_CALLBACK_ID
(chaîne de caractères)
RADIUS_FRAMED_ROUTE
(chaîne de caractères)
RADIUS_FRAMED_IPX_NETWORK
(chaîne de caractères)
RADIUS_STATE
(chaîne de caractères)
RADIUS_CLASS
(entier)
RADIUS_VENDOR_SPECIFIC
(entier)
RADIUS_SESSION_TIMEOUT
(entier)
RADIUS_IDLE_TIMEOUT
(entier)
RADIUS_TERMINATION_ACTION
(entier)
RADIUS_CALLED_STATION_ID
(entier)
RADIUS_CALLING_STATION_ID
(chaîne de caractères)
RADIUS_NAS_IDENTIFIER
(entier)
RADIUS_PROXY_STATE
(entier)
RADIUS_LOGIN_LAT_SERVICE
(entier)
RADIUS_LOGIN_LAT_NODE
(entier)
RADIUS_LOGIN_LAT_GROUP
(entier)
RADIUS_FRAMED_APPLETALK_LINK
(entier)
RADIUS_FRAMED_APPLETALK_NETWORK
(entier)
RADIUS_FRAMED_APPLETALK_ZONE
(entier)
RADIUS_CHAP_CHALLENGE
(chaîne de caractères)
RADIUS_NAS_PORT_TYPE
(entier)
Type du port NAS :
RADIUS_ASYNCRADIUS_SYNCRADIUS_ISDN_SYNCRADIUS_ISDN_ASYNC_V120RADIUS_ISDN_ASYNC_V110RADIUS_VIRTUALRADIUS_PIAFSRADIUS_HDLC_CLEAR_CHANNELRADIUS_X_25RADIUS_X_75RADIUS_G_3_FAXRADIUS_SDSLRADIUS_ADSL_CAPRADIUS_ADSL_DMTRADIUS_IDSLRADIUS_ETHERNETRADIUS_XDSLRADIUS_CABLERADIUS_WIRELESS_OTHERRADIUS_WIRELESS_IEEE_802_11RADIUS_PORT_LIMIT
(entier)
RADIUS_LOGIN_LAT_PORT
(entier)
RADIUS_CONNECT_INFO
(chaîne de caractères)
RADIUS_ACCT_STATUS_TYPE
(entier)
Type de statut du compte :
RADIUS_STARTRADIUS_STOPRADIUS_ACCOUNTING_ONRADIUS_ACCOUNTING_OFFRADIUS_ACCT_DELAY_TIME
(entier)
RADIUS_ACCT_INPUT_OCTETS
(entier)
RADIUS_ACCT_OUTPUT_OCTETS
(entier)
RADIUS_ACCT_SESSION_ID
(entier)
RADIUS_ACCT_AUTHENTIC
(entier)
Accounting authentic, un parmi :
RADIUS_AUTH_RADIUSRADIUS_AUTH_LOCALRADIUS_AUTH_REMOTERADIUS_ACCT_SESSION_TIME
(entier)
RADIUS_ACCT_INPUT_PACKETS
(entier)
RADIUS_ACCT_OUTPUT_PACKETS
(entier)
RADIUS_ACCT_TERMINATE_CAUSE
(entier)
Accounting terminate cause, un parmi :
RADIUS_TERM_USER_REQUESTRADIUS_TERM_LOST_CARRIERRADIUS_TERM_LOST_SERVICERADIUS_TERM_IDLE_TIMEOUTRADIUS_TERM_SESSION_TIMEOUTRADIUS_TERM_ADMIN_RESETRADIUS_TERM_ADMIN_REBOOTRADIUS_TERM_PORT_ERRORRADIUS_TERM_NAS_ERRORRADIUS_TERM_NAS_REQUESTRADIUS_TERM_NAS_REBOOTRADIUS_TERM_PORT_UNNEEDEDRADIUS_TERM_PORT_PREEMPTEDRADIUS_TERM_PORT_SUSPENDEDRADIUS_TERM_SERVICE_UNAVAILABLERADIUS_TERM_CALLBACKRADIUS_TERM_USER_ERRORRADIUS_TERM_HOST_REQUESTRADIUS_ACCT_MULTI_SESSION_ID
(chaîne de caractères)
RADIUS_ACCT_LINK_COUNT
(entier)
RADIUS_VENDOR_MICROSOFT
(entier)
Attributs spécifiques à Microsoft (» RFC 2548) :
RADIUS_MICROSOFT_MS_CHAP_RESPONSERADIUS_MICROSOFT_MS_CHAP_ERRORRADIUS_MICROSOFT_MS_CHAP_PW_1RADIUS_MICROSOFT_MS_CHAP_PW_2RADIUS_MICROSOFT_MS_CHAP_LM_ENC_PWRADIUS_MICROSOFT_MS_CHAP_NT_ENC_PWRADIUS_MICROSOFT_MS_MPPE_ENCRYPTION_POLICYRADIUS_MICROSOFT_MS_MPPE_ENCRYPTION_TYPESRADIUS_MICROSOFT_MS_RAS_VENDORRADIUS_MICROSOFT_MS_CHAP_DOMAINRADIUS_MICROSOFT_MS_CHAP_CHALLENGERADIUS_MICROSOFT_MS_CHAP_MPPE_KEYSRADIUS_MICROSOFT_MS_BAP_USAGERADIUS_MICROSOFT_MS_LINK_UTILIZATION_THRESHOLDRADIUS_MICROSOFT_MS_LINK_DROP_TIME_LIMITRADIUS_MICROSOFT_MS_MPPE_SEND_KEYRADIUS_MICROSOFT_MS_MPPE_RECV_KEYRADIUS_MICROSOFT_MS_RAS_VERSIONRADIUS_MICROSOFT_MS_OLD_ARAP_PASSWORDRADIUS_MICROSOFT_MS_NEW_ARAP_PASSWORDRADIUS_MICROSOFT_MS_ARAP_PASSWORD_CHANGE_REASONRADIUS_MICROSOFT_MS_FILTERRADIUS_MICROSOFT_MS_ACCT_AUTH_TYPERADIUS_MICROSOFT_MS_ACCT_EAP_TYPERADIUS_MICROSOFT_MS_CHAP2_RESPONSERADIUS_MICROSOFT_MS_CHAP2_SUCCESSRADIUS_MICROSOFT_MS_CHAP2_PWRADIUS_MICROSOFT_MS_PRIMARY_DNS_SERVERRADIUS_MICROSOFT_MS_SECONDARY_DNS_SERVERRADIUS_MICROSOFT_MS_PRIMARY_NBNS_SERVERRADIUS_MICROSOFT_MS_SECONDARY_NBNS_SERVERRADIUS_MICROSOFT_MS_ARAP_CHALLENGEComment commencer ?
Le paquet contient un exemple de script PHP. Ce script montre une identification avec radius, en utilisant PAP ou CHAP (md5). Si vous effectuer une identification via Microsoft Radius servers, alors il est possible d'utiliser CHAP (md5). Si vous voulez vous identifier avec Microsoft Servers, vous devez utiliser MS-CHAPv1 ou MS-CHAPv2, mais c'est plus compliqué, car vous devez avoir md4, sha1 et des pour générer les bonnes données. L'exemple fourni montre toutes les méthodes d'identification, incluant MS-CHAPv1 et MS-CHAPv2. Pour faire en sorte que MS-CHAP fonctionne, vous devez activer les extensions mcrypt et mhash, à partir de la version 1.2 de ce paquet, l'extension mcrypt n'est plus nécessaire.
Si vous avez des commentaires, des corrections de bogues, des améliorations ou si vous voulez aider dans le développement, vous pouvez envoyer un email à » mbretter@php.net.
(PECL radius >= 1.1.0)
radius_acct_open — Crée une ressource Radius pour les comptes
Retourne une ressource en cas de succès ou FALSE si une erreur survient.
Cette fonction n'échoue que s'il y a un manque de mémoire.
Exemple #1 Exemple avec radius_acct_open()
<?php
$res = radius_acct_open ()
or die ("Impossible de créer la ressource");
print("La ressource a été créée avec succès");
?>
(PECL radius >= 1.1.0)
radius_add_server — Ajoute un serveur
$radius_handle
, string $hostname
, int $port
, string $secret
, int $timeout
, int $max_tries
)
radius_add_server() peut être utilisé plusieurs fois, et il
peut être utilisé avec la fonction radius_config().
Tout au plus, 10 serveurs peuvent être spécifiés. Lorsque plusieurs serveurs sont fournis,
ils sont essayés à la façon round-robin tant qu'une réponse valide
n'est pas reçue, ou tant que la limite max_tries
de chaque serveur n'est pas atteinte.
radius_handle
hostname
Le paramètre hostname spécifie l'hôte serveur,
soit en tant que nom de domaine qualifié, soit en tant qu'adresse IP.
port
Le port spécifie le port UDP à
contacter sur le serveur. Si le port donné vaut 0, la bibliothèque
recherchera le service radius/udp ou
radacct/udp
dans la base de données des services du réseau et utilisera le port
s'y trouvant. Si aucune entrée n'est trouvée, la bibliothèque utilisera les ports
Radius standards, 1812 pour l'identification et 1813 pour les comptes.
secret
Le secret partagé pour l'hôte serveur est passé au paramètre
secret. Le protocole Radius ignore
tout mais garde les 128 premiers octets du secret partagé.
timeout
Le délai limite pour recevoir les réponses du serveur est passé au
paramètre timeout, sous la forme de seconde.
max_tries
Le nombre maximal de requêtes répétées à faire avant d'échouer.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec radius_add_server()
<?php
if (!radius_add_server($res, 'radius.example.com', 1812, 'testing123', 3, 3)) {
echo 'Erreur Radius :' . radius_strerror($res). "\n<br>";
exit;
}
?>
(PECL radius >= 1.1.0)
radius_auth_open — Crée une ressource Radius pour l'identification
Retourne une ressource en cas de succès ou FALSE si une erreur survient.
Cette fonction n'échoue que s'il y a un manque de mémoire.
Exemple #1 Exemple avec radius_auth_open()
<?php
$radh = radius_auth_open()
or die ("Impossible de créer la ressource");
echo "La ressource a été créée avec succès";
?>
(PECL radius >= 1.1.0)
radius_close — Libère toutes les ressources Radius
$radius_handle
)Il n'est pas nécessaire d'appeler cette fonction car PHP libère toutes les ressources à la fin de chaque demande.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL radius >= 1.1.0)
radius_config — Demande à la bibliothèque de lire un fichier de configuration donné
$radius_handle
, string $file
)Avant toute demande Radius, la bibliothèque doit connaître le serveur à contacter. La manière simple de configurer la bibliothèque est d'appeler la fonction radius_config(). radius_config() demande à la bibliothèque de lire un fichier de configuration dont le format est décrit sur la page » radius.conf.
radius_handle
file
Le chemin vers le fichier de configuration est passé en tant qu'argument à la fonction radius_config(). La bibliothèque peut également être configurée en appelant la fonction radius_add_server().
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL radius >= 1.1.0)
radius_create_request — Crée une demande de compte ou d'identification
$radius_handle
, int $type
)Une demande Radius consiste en du code spécifiant une demande spécifique, ainsi que zéro ou plusieurs attributs qui fournissent des informations supplémentaires. Pour commencer à construire une nouvelle demande, appelez la fonction radius_create_request().
Note: Attention : Vous devez appeler cette fonction avant de passer n'importe quel argument !
radius_handle
type
Le type est RADIUS_ACCESS_REQUEST ou
RADIUS_ACCOUNTING_REQUEST.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec radius_create_request()
<?php
if (!radius_create_request($res, RADIUS_ACCESS_REQUEST)) {
echo 'Erreur Radius :' . radius_strerror($res). "\n<br />";
exit;
}
?>
(PECL radius >= 1.1.0)
radius_cvt_addr — Convertit des données brutes en adresse IP
$data
)
Exemple #1 Exemple avec radius_cvt_addr()
<?php
while ($resa = radius_get_attr($res)) {
if (!is_array($resa)) {
printf ("Erreur lors de la récupération des attributs : %s\n", radius_strerror($res));
exit;
}
$attr = $resa['attr'];
$data = $resa['data'];
switch ($attr) {
case RADIUS_FRAMED_IP_ADDRESS:
$ip = radius_cvt_addr($data);
echo "IP : $ip<br>\n";
break;
case RADIUS_FRAMED_IP_NETMASK:
$mask = radius_cvt_addr($data);
echo "MASQUE : $mask<br>\n";
break;
}
}
?>
(PECL radius >= 1.1.0)
radius_cvt_int — Convertit des données brutes en entier
$data
)
Exemple #1 Exemple avec radius_cvt_int()
<?php
while ($resa = radius_get_attr($res)) {
if (!is_array($resa)) {
printf ("Erreur lors de la récupération des attributs : %s\n", radius_strerror($res));
exit;
}
$attr = $resa['attr'];
$data = $resa['data'];
switch ($attr) {
case RADIUS_FRAMED_MTU:
$mtu = radius_cvt_int($data);
echo "MTU : $mtu<br>\n";
break;
}
}
?>
(PECL radius >= 1.1.0)
radius_cvt_string — Convertit des données brutes en chaîne de caractères
$data
)
Exemple #1 Exemple avec radius_cvt_string()
<?php
while ($resa = radius_get_attr($res)) {
if (!is_array($resa)) {
printf ("Erreur lors de la récupération des attributs : %s\n", radius_strerror($res));
exit;
}
$attr = $resa['attr'];
$data = $resa['data'];
switch ($attr) {
case RADIUS_FILTER_ID:
$id = radius_cvt_string($data);
echo "Filtre ID : $id<br>\n";
break;
}
}
?>
(PECL radius >= 1.2.0)
radius_demangle_mppe_key — Dérive les clés mppe depuis des données
$radius_handle
, string $mangled
)Lors de l'utilisation de MPPE avec MS-CHAPv2, les clés reçues et envoyées sont "séchées" (voir la » RFC 2548), cependant, cette fonction est utile, car je ne sais pas s'il y a ou pas une implémentation de PPTP-MPPE dans PHP.
Retourne la chaîne ou FALSE si une erreur survient.
(PECL radius >= 1.2.0)
radius_demangle — Assèche des données
$radius_handle
, string $mangled
)Quelques données (mots de passe, clés MS-CHAPv1 MPPE) sont "séchées" pour des raisons de sécurité et doivent être "asséchées" avant de pouvoir les utiliser.
Retourne la chaîne "asséchées" ou FALSE si une erreur survient.
(PECL radius >= 1.1.0)
radius_get_attr — Extrait un attribut
Comme les demandes Radius, chaque réponse doit contenir zéro ou plusieurs attributs. Après la réception d'une réponse avec succès par la fonction radius_send_request(), ces attributs peuvent être extraits un par un en utilisant la fonction radius_get_attr(). À chaque appel de radius_get_attr(), le prochain attribut est récupéré depuis la réponse courante.
Retourne un tableau associatif contenant le type de l'attribut ainsi que les données ou un numéro d'erreur <= 0.
Exemple #1 Exemple avec radius_get_attr()
<?php
while ($resa = radius_get_attr($res)) {
if (!is_array($resa)) {
printf("Erreur lors de la récupération de l'attribut : %s\n", radius_strerror($res));
exit;
}
$attr = $resa['attr'];
$data = $resa['data'];
printf("Attribut récupéré :%d %d octets %s\n", $attr, strlen($data), bin2hex($data));
}
?>
(PECL radius >= 1.1.0)
radius_get_vendor_attr — Extrait un attribut spécifique au vendeur
$data
)
Si radius_get_attr() retourne
RADIUS_VENDOR_SPECIFIC,
radius_get_vendor_attr() peut être appelé pour
déterminer le vendeur.
Retourne un tableau associatif contenant le type de l'attribut, le vendeur ainsi
que les données, ou FALSE si une erreur survient.
Exemple #1 Exemple avec radius_get_vendor_attr()
<?php
while ($resa = radius_get_attr($res)) {
if (!is_array($resa)) {
printf ("Erreur lors de la récupération de l'attribut : %s\n", radius_strerror($res));
exit;
}
$attr = $resa['attr'];
$data = $resa['data'];
printf("Attribut récupéré :%d %d octets %s\n", $attr, strlen($data), bin2hex($data));
if ($attr == RADIUS_VENDOR_SPECIFIC) {
$resv = radius_get_vendor_attr($data);
if (is_array($resv)) {
$vendor = $resv['vendor'];
$attrv = $resv['attr'];
$datav = $resv['data'];
printf("Récupération du vendeur de l'attribut :%d %d octets %s\n", $attrv, strlen($datav), bin2hex($datav));
}
}
}
?>
(PECL radius >= 1.1.0)
radius_put_addr — Attache une adresse IP en tant qu'attribut
$radius_handle
, int $type
, string $addr
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL radius >= 1.1.0)
radius_put_attr — Attache un attribut binaire
$radius_handle
, int $type
, string $value
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec radius_put_attr()
<?php
mt_srand(time());
$chall = mt_rand();
$chapval = md5(pack('Ca*',1 , 'sepp' . $chall));
$pass = pack('CH*', 1, $chapval);
if (!radius_put_attr($res, RADIUS_CHAP_PASSWORD, $pass)) {
echo 'Erreur Radius :' . radius_strerror($res). "\n<br />";
exit;
}
?>
(PECL radius >= 1.1.0)
radius_put_int — Attache un attribut entier
$radius_handle
, int $type
, int $value
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec radius_put_int()
<?php
if (!radius_put_int($res, RAD_FRAMED_PROTOCOL, RAD_PPP)) {
echo 'Erreur Radius :' . radius_strerror($res). "\n<br />";
exit;
}
?>
(PECL radius >= 1.1.0)
radius_put_string — Attache un attribut chaîne de caractères
$radius_handle
, int $type
, string $value
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec radius_put_string()
<?php
if (!radius_put_string($res, RADIUS_USER_NAME, 'billy')) {
echo 'Erreur Radius :' . radius_strerror($res). "\n<br />";
exit;
}
?>
(PECL radius >= 1.1.0)
radius_put_vendor_addr — Attache un attribut IP-Address spécifique à un vendeur
$radius_handle
, int $vendor
, int $type
, string $addr
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL radius >= 1.1.0)
radius_put_vendor_attr — Attache un attribut binaire à un vendeur spécifique
$radius_handle
, int $vendor
, int $type
, string $value
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec radius_put_vendor_attr()
<?php
if (!radius_put_vendor_attr($res, RADIUS_VENDOR_MICROSOFT, RAD_MICROSOFT_MS_CHAP_CHALLENGE, $challenge)) {
echo 'Erreur Radius :' . radius_strerror($res). "\n<br />";
exit;
}
?>
(PECL radius >= 1.1.0)
radius_put_vendor_int — Attache un attribut entier à un vendeur spécifique
$radius_handle
, int $vendor
, int $type
, int $value
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL radius >= 1.1.0)
radius_put_vendor_string — Attache un attribut sous la forme d'une chaîne à un vendeur spécifique
$radius_handle
, int $vendor
, int $type
, string $value
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PECL radius >= 1.1.0)
radius_request_authenticator — Retourne l'identifiant demandé
$radius_handle
)L'identifiant demandé est nécessaire pour le rétablissement des données comme les mots de passe et les clés de chiffrement.
Retourne l'identificateur demandé en tant que chaîne de caractères ou
FALSE si une erreur survient.
(PECL radius >= 1.1.0)
radius_send_request — Envoie la demande et attente une réponse
$radius_handle
)Après qu'une demande Radius ait été construite, elle est envoyé grâce à la fonction radius_send_request().
La fonction radius_send_request() envoie la requête et attend une réponse valide, essayant à nouveau, suivant la méthode round-robin autant que nécessaire.
Si une réponse valide est reçue, radius_send_request()
retourne le code Radius qui spécifie le type de réponse. C'est, typiquement,
RADIUS_ACCESS_ACCEPT,
RADIUS_ACCESS_REJECT ou
RADIUS_ACCESS_CHALLENGE. Si aucune
réponse valide n'est reçue, radius_send_request() retournera FALSE.
(PECL radius >= 1.1.0)
radius_server_secret — Retourne le secret partagé
$radius_handle
)Le secret partagé est nécessaire pour le rétablissement des données comme les mots de passe et les clés de chiffrement.
Retourne le secret partagé du serveur en tant que chaîne de caractères
ou FALSE si une erreur survient.
(PECL radius >= 1.1.0)
radius_strerror — Retourne un message d'erreur
$radius_handle
)Si une fonction Radius échoue, alors, elle enregistre un message d'erreur. Ce message d'erreur peut être récupéré avec cette fonction.
Retourne un message d'erreur en tant que chaîne de caractères.
L'extension Calendar contient une série de fonctions afin de convertir simplement les différents formats de calendrier. Elles sont basées sur un comptage de jour Julien. Le comptage Julien est un comptage commençant le 1er Janvier 4713 A.J. Pour convertir les différents calendriers, vous devez tout d'abord convertir en nombre de jours Julien, puis, dans le type de calendrier de votre choix. Le comptage de jours Julien est très différent du calendrier Julien ! Pour plus d'informations sur le comptage en jours Julien, visitez cette page : » http://www.hermetic.ch/cal_stud/jdn.htm. Pour plus d'informations sur les différents calendriers, visitez cette page : » http://www.fourmilab.ch/documents/calendar/.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Pour faire fonctionner ces fonctions avec PHP, vous devez le compiler avec l'option --enable-calendar .
La version Windows de PHP dispose du support automatique de cette extension. Vous n'avez pas à ajouter de bibliothèque supplémentaire pour disposer de ces fonctions.
Cette extension ne définit aucune directive de configuration.
Cette extension ne définit aucune ressource.
Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.
CAL_GREGORIAN
(entier)
CAL_JULIAN
(entier)
CAL_JEWISH
(entier)
CAL_FRENCH
(entier)
CAL_NUM_CALS
(integer)
CAL_DOW_DAYNO
(entier)
CAL_DOW_SHORT
(integer)
CAL_DOW_LONG
(integer)
CAL_MONTH_GREGORIAN_SHORT
(entier)
CAL_MONTH_GREGORIAN_LONG
(integer)
CAL_MONTH_JULIAN_SHORT
(integer)
CAL_MONTH_JULIAN_LONG
(integer)
CAL_MONTH_JEWISH
(entier)
CAL_MONTH_FRENCH
(entier)
Les constantes suivantes sont disponibles depuis PHP 4.3.0 :
CAL_EASTER_DEFAULT
(integer)
CAL_EASTER_ROMAN
(integer)
CAL_EASTER_ALWAYS_GREGORIAN
(integer)
CAL_EASTER_ALWAYS_JULIAN
(entier)
Les constantes suivantes sont disponibles depuis PHP 5.0.0 :
(PHP 4 >= 4.1.0, PHP 5)
cal_days_in_month — Retourne le nombre de jours dans un mois, pour une année et un calendrier donné
$calendar
, int $month
, int $year
)
Retourne le nombre de jours dans le mois month
de l'année year, pour le calendrier
calendar.
calendar
Calendrier à utiliser pour le calcul
month
Mois dans le calendrier sélectionné
year
Année dans le calendrier sélectionné
Le nombre de jours dans le mois sélectionné, dans le calendrier fourni.
Exemple #1 Exemple avec cal_days_in_month()
<?php
$num = cal_days_in_month(CAL_GREGORIAN, 8, 2003); // 31
echo "Il y a $num jours en Août 2003";
?>
(PHP 4 >= 4.1.0, PHP 5)
cal_from_jd — Convertit le nombre de jours Julien en un calendrier spécifique
$jd
, int $calendar
)
cal_from_jd() convertit le nombre de jours Julien
jd en une date du calendrier
calendar. Les valeurs possibles pour
calendar sont
CAL_GREGORIAN,
CAL_JULIAN,
CAL_JEWISH et
CAL_FRENCH.
Retourne un tableau contenant des informations sur le calendrier, comme le mois, le jour, l'année, le jour de la semaine, les noms abrégés et complets des jours de la semaine et du mois, et la date, sous la forme d'une chaîne de caractères "mois/jour/année".
Exemple #1 Exemple avec cal_from_jd()
<?php
$today = unixtojd(mktime(0, 0, 0, 8, 16, 2003));
print_r(cal_from_jd($today, CAL_GREGORIAN));
?>
L'exemple ci-dessus va afficher :
Array ( [date] => 8/16/2003 [month] => 8 [day] => 16 [year] => 2003 [dow] => 6 [abbrevdayname] => Sat [dayname] => Saturday [abbrevmonth] => Aug [monthname] => August )
(PHP 4 >= 4.1.0, PHP 5)
cal_info — Retourne des détails sur un calendrier
$calendar = -1
] )
cal_info() retourne des informations sur le
calendrier calendar spécifié.
Les informations de calendriers sont retournées dans un tableau
qui contient les éléments calname, calsymbol,
month, abbrevmonth et
maxdaysinmonth. Les noms des différents calendriers
qui peuvent être utilisés dans le paramètre calendar
sont les suivants :
CAL_GREGORIAN - Calendrier Grégorien
CAL_JULIAN - Calendrier Julien
CAL_JEWISH - Calendrier juif
CAL_FRENCH - Calendrier révolutionnaire français
Si le paramètre calendar n'est pas spécifié,
un tableau représentant tous les calendriers est retourné.
calendar
Calendrier dont on souhaite des informations. Si aucun calendrier n'est spécifié, des informations sur tous les calendriers seront retournées.
| Version | Description |
|---|---|
| 5.0 |
Le paramètre calendar devient optionnel et vaut
par défaut "tous calendriers" s'il n'est pas spécifié.
|
Exemple #1 Exemple avec cal_info()
<?php
$info = cal_info(0);
print_r($info);
?>
L'exemple ci-dessus va afficher :
Array
(
[months] => Array
(
[1] => January
[2] => February
[3] => March
[4] => April
[5] => May
[6] => June
[7] => July
[8] => August
[9] => September
[10] => October
[11] => November
[12] => December
)
[abbrevmonths] => Array
(
[1] => Jan
[2] => Feb
[3] => Mar
[4] => Apr
[5] => May
[6] => Jun
[7] => Jul
[8] => Aug
[9] => Sep
[10] => Oct
[11] => Nov
[12] => Dec
)
[maxdaysinmonth] => 31
[calname] => Gregorian
[calsymbol] => CAL_GREGORIAN
)
(PHP 4 >= 4.1.0, PHP 5)
cal_to_jd — Convertit un calendrier en nombre de jours Julien
$calendar
, int $month
, int $day
, int $year
)
cal_to_jd() calcule le nombre de jours Julien
pour une date, dans le calendrier calendar.
Les valeurs possibles pour calendar sont
CAL_GREGORIAN,
CAL_JULIAN,
CAL_JEWISH et
CAL_FRENCH.
calendar
Calendrier à convertir. Un parmi
CAL_GREGORIAN,
CAL_JULIAN,
CAL_JEWISH ou
CAL_FRENCH.
month
Le mois, sous la forme d'un nombre. L'intervalle valide
dépend du calendrier calendar
day
Le jour, sous la forme d'un nombre. L'intervalle valide
dépend du calendrier calendar
year
L'année, sous la forme d'un nombre. L'intervalle valide
dépend du calendrier calendar
Le nombre de jour Julien.
(PHP 4, PHP 5)
easter_date — Retourne un timestamp UNIX pour Pâques, à minuit pour une année donnée
$year
] )Retourne un timestamp UNIX pour Pâques, à minuit, pour une année donnée.
Cette fonction génère une alerte si la date tombe hors de la zone de validité des timestamp UNIX (i.e. avant 1970 ou après 2037).
La date de Pâques a été fixée par le concile de Nicée, en 325 de notre ère, comme étant le dimanche après la première pleine lune qui suit l'équinoxe de printemps. L'équinoxe de printemps est considéré comme étant toujours le 21 mars, ce qui réduit le problème au calcul de la date de la lune pleine qui suit, et le dimanche suivant. L'algorithme fut introduit vers 532, par Dionysius Exiguus. Avec le calendrier Julien, (pour les années avant 1753), un cycle de 19 ans suffit pour connaître les dates des phases de la lune. Avec le calendrier grégorien, (à partir des années 1753, conçu par Clavius et Lilius, puis introduit par le pape Grégoire XIII en octobre 1582, et en Grande Bretagne et ses colonies en septembre 1752), deux facteurs de corrections ont été ajoutés pour rendre le cycle plus précis.
year
L'année, sous la forme d'un nombre compris entre 1970 et 2037
La date pour Pâques, sous la forme d'un timestamp unix.
| Version | Description |
|---|---|
| Depuis la version 4.3.0 |
Le paramètre year est optionnel et vaut par
défaut l'année courante vis à vis de l'heure locale.
|
Exemple #1 Exemple avec easter_date()
<?php
echo date("M-d-Y", easter_date(1999)); // Apr-04-1999
echo date("M-d-Y", easter_date(2000)); // Apr-23-2000
echo date("M-d-Y", easter_date(2001)); // Apr-15-2001
?>
(PHP 4, PHP 5)
easter_days — Retourne le nombre de jours entre le 21 Mars et Pâques, pour une année donnée
$year
[, int $method = CAL_EASTER_DEFAULT
]] )Retourne le nombre de jours entre le 21 Mars et Pâques, pour une année donnée. Si l'année n'est pas précisée, l'année courante sera utilisée.
Cette fonction peut être utilisée à la place de easter_date() pour calculer la date de Pâques, pour les années qui tombent hors de l'intervalle de validité des timestamps UNIX (i.e. avant 1970 ou après 2037).
La date de Pâques a été fixée par le concile de Nicée, en 325 de notre ère, comme étant le dimanche après la première pleine lune qui suit l'équinoxe de printemps. L'équinoxe de printemps est considéré comme étant toujours le 21 mars, ce qui réduit le problème au calcul de la date de la lune pleine qui suit, et le dimanche suivant. L'algorithme fut introduit vers 532, par Dionysius Exiguus. Avec le calendrier Julien, (pour les années avant 1753), un cycle de 19 ans suffit pour connaître les date des phases de la lune. Avec le calendrier grégorien, (à partir des années 1753, conçu par Clavius et Lilius, puis introduit par le pape Grégoire XIII en octobre 1582, et en Grande Bretagne et ses colonies en septembre 1752), deux facteurs de corrections ont été ajoutés pour rendre le cycle plus précis.
year
L'année, sous la forme d'un nombre positif
method
Permet le calcul des dates de Pâques en se basant sur
le calendrier Grégorien pour les années entre 1582 et
1752 lorsque définit à CAL_EASTER_ROMAN.
Voir les constantes
des calendriers pour plus de constantes valides.
Le nombre de jours entre le 21 Mars et Pâques, pour l'année
year fournie.
| Version | Description |
|---|---|
| Depuis la version 4.3.0 |
Le paramètre year est optionnel et vaut par défaut,
l'année courante du temps local.
|
| Depuis la version 4.3.0 |
Le paramètre method a été introduit.
|
Exemple #1 Exemple avec easter_days()
<?php
echo easter_days(1999); // 14, i.e. April 4
echo easter_days(1492); // 32, i.e. April 22
echo easter_days(1913); // 2, i.e. March 23
?>
(PHP 4, PHP 5)
FrenchToJD — Convertit une date du calendrier français républicain en nombre de jours du calendrier Julien
$month
, int $day
, int $year
)frenchtojd() convertit une date du calendrier français républicain en nombre de jours du calendrier Julien.
Ces fonctions convertissent les dates comprises entre l'an 1 et l'an 14 (22 Septembre 1792 à 22 Septembre 1806 en calendrier grégorien). Cela couvre plus que la durée d'existence de ce calendrier.
month
Le mois, sous la forme d'un nombre entre 1 (pour Vendémiaire) à 13 (pour la période de 5-6 jours en à la fin de chaque année)
day
Le jour, sous la forme d'un nombre compris entre 1 et 30
year
L'année, sous la forme d'un nombre compris entre 1 et 14
Le jour Julien pour la date fournie du calendrier français républicain, sous la forme d'un entier.
(PHP 4, PHP 5)
GregorianToJD — Convertit une date grégorienne en nombre de jours du calendrier Julien
$month
, int $day
, int $year
)Intervalle de validité pour le calendrier grégorien : 4714 avant JC à 9999 après JC.A.D.
Bien qu'il soit possible de manipuler des dates jusqu'en 4714 avant JC, une telle utilisation n'est pas significative. En effet, ce calendrier fut créé le 18 octobre 1582 après J.C. (ou 5 octobre 1582 en calendrier grec). Certains pays ne l'acceptèrent que bien plus tard. Par exemple, les britanniques n'y passèrent qu'en 1752, les Russes en 1918 et les Grecs en 1923. La plupart des pays européens utilisaient le calendrier Julien avant le Grégorien.
month
Le mois, sous la forme d'un nombre compris entre 1 (pour Janvier) et 12 (pour Décembre)
day
Le jour, sous la forme d'un nombre compris entre 1 et 31
year
L'année, sous la forme d'un nombre compris entre -4714 et 9999
Le jour Julien pour la date fournie du calendrier Grégorien, sous la forme d'un entier.
Exemple #1 Fonctions calendrier
<?php
$jd = GregorianToJD(10, 11, 1970);
echo "$jd\n";
$gregorian = JDToGregorian($jd);
echo "$gregorian\n";
?>
(PHP 4, PHP 5)
JDDayOfWeek — Retourne le numéro du jour de la semaine
Retourne le numéro du jour de la semaine. Peut retourner une chaîne ou un entier, en fonction du mode.
julianday
Le numéro du jour Julien, sous la forme d'un entier
mode
| Mode | Signification |
|---|---|
| 0 (défaut) | Retourne le numéro du jour comme un entier (0=dimanche, 1=lundi, etc.) |
| 1 | Retourne une chaîne contenant le nom du jour (anglais grégorien) |
| 2 | Retourne une chaîne contenant le nom abrégé du jour de la semaine (anglais grégorien) |
Le jour de la semaine Grégorien, sous la forme d'un entier ou d'une chaîne de caractères.
(PHP 4, PHP 5)
JDMonthName — Retourne le nom du mois
$julianday
, int $mode
)
Retourne une chaîne contenant le nom du mois.
mode indique de quel calendrier
dépend ce mois, et quel type de nom doit être retourné.
| Mode | Signification | Valeurs |
|---|---|---|
| 0 | Grégorien - abrégé | Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec |
| 1 | Grégorien | January, February, March, April, May, June, July, August, September, October, November, December |
| 2 | Julien - abrégé | Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec |
| 3 | Julien | January, February, March, April, May, June, July, August, September, October, November, December |
| 4 | Juif | Tishri, Heshvan, Kislev, Tevet, Shevat, AdarI, AdarII, Nisan, Iyyar, Sivan, Tammuz, Av, Elul |
| 5 | Républicain français | Vendemiaire, Brumaire, Frimaire, Nivose, Pluviose, Ventose, Germinal, Floreal, Prairial, Messidor, Thermidor, Fructidor, Extra |
jday
Le jour Julien à analyser
calendar
Le calendrier dans lequel on récupère le nom du mois
Le nom du mois pour le jour Julien donné, pour le calendrier
calendar.
(PHP 4, PHP 5)
JDToFrench — Convertit le nombre de jours du calendrier Julien en date du calendrier français républicain
$juliandaycount
)Convertit le nombre de jours du calendrier julien en date du calendrier français républicain.
La date française républicaine, sous la forme d'une chaîne de caractères "mois/jour/année".
(PHP 4, PHP 5)
JDToGregorian — Convertit le nombre de jours du calendrier Julien en date grégorienne
$julianday
)Convertit le nombre de jours du calendrier Julien en une chaîne contenant une date du calendrier grégorien, au format "mois/jour/année".
La date grégorienne, sous la forme d'une chaîne de caractères "mois/jour/année".
(PHP 4, PHP 5)
jdtojewish — Convertit le nombre de jours du calendrier Julien en date du calendrier juif
$juliandaycount
[, bool $hebrew = false
[, int $fl = 0
]] )Convertit le nombre de jours du calendrier Julien en date du calendrier juif.
Les paramètres optionnels hebrew et
fl sont disponibles depuis PHP 5.0.0.
Si le paramètre hebrew vaut TRUE, le paramètre
fl sera utilisé pour générer une chaîne au
format hébreux. Les formats disponibles sont :
CAL_JEWISH_ADD_ALAFIM_GERESH,
CAL_JEWISH_ADD_ALAFIM et
CAL_JEWISH_ADD_GERESHAYIM.
La date Juive, sous la forme d'une chaîne de caractères "mois/jour/année".
| Version | Description |
|---|---|
| 5.0.0 |
Les paramètres hebrew et fl
ont été ajoutés.
Le paramètre fl a été ajouté.
|
| 4.3.0 |
Le paramètre hebrew a été ajouté.
|
Exemple #1 Exemple avec jdtojewish()
<?php
echo jdtojewish(gregoriantojd(10, 8, 2002), true,
CAL_JEWISH_ADD_GERESHAYIM + CAL_JEWISH_ADD_ALAFIM + CAL_JEWISH_ADD_ALAFIM_GERESH);
?>
(PHP 4, PHP 5)
JDToJulian — Convertit le nombre de jours du calendrier Julien en date du calendrier Julien
$julianday
)Convertit le nombre de jours du calendrier Julien en une chaîne contenant la date du calendrier Julien, au format "mois/jour/année".
La date Julien, sous la forme d'une chaîne de caractères "mois/jour/année".
(PHP 4, PHP 5)
jdtounix — Convertit un jour Julien en timestamp UNIX
$jday
)
Retourne un timestamp UNIX correspondant au jour Julien
jday ou FALSE si jday
n'est pas dans l'intervalle de validité de l'époque UNIX. (années
grégoriennes entre 1970 et 2037 ou 2440588 <=
jday <= 2465342 .)
Le temps retourné est un temps local (et non GMT).
jday
Le nombre de jours Julien, compris entre 2440588 et 2465342.
Le timestamp unix pour le début du jour Julien donné.
(PHP 4, PHP 5)
JewishToJD — Convertit une date du calendrier Juif en nombre de jours du calendrier Julien
$month
, int $day
, int $year
)Bien qu'il soit possible de manipuler des dates à partir de l'an 1 (3761 avant J.C.), une telle utilisation a peu de sens. Le calendrier juif a été utilisé depuis plusieurs dizaines de siècles, mais dans les premiers temps, il n'y avait pas de formule pour déterminer le début du mois. Un nouveau mois commençait quand une nouvelle lune était observée.
month
Le mois, sous la forme d'un nombre entre 1 et 13
day
Le jour, sous la forme d'un nombre entre 1 et 30
year
L'année, sous la forme d'un nombre entre 1 et 9999
Le jour Julien pour la date Juive donnée, sous la forme d'un entier.
(PHP 4, PHP 5)
JulianToJD — Convertit un jours du calendrier Julien en un nombre de jours du calendrier Julien
$month
, int $day
, int $year
)Intervalle de validité du calendrier Julien : 4713 avant JC à 9999 après J.C.
Bien qu'il soit possible de manipuler des dates jusqu'en 4713 avant JC, une telle utilisation n'est pas significative. En effet, ce calendrier fut créé en 46 avant J.C., et ses détails ne furent finalisés qu'au plus tôt en 8 après JC, et probablement pas avant le quatrième siècle après JC. De plus, le début de l'année variait suivant les peuples, certains n'acceptant pas janvier comme premier mois de l'année.
Souvenez-vous, le calendrier courant du système utilisé sur le Web est un calendrier Grégorien. gregoriantojd() peut être utilisé pour convertir ce genre de dates en un nombre de jours du calendrier Julien.
month
Le mois, sous la forme d'un nombre entre 1 (pour Janvier) et 12 (pour Décembre)
day
Le jour, sous la forme d'un nombre entre 1 et 31
year
L'année, sous la forme d'un nombre entre -4713 et 9999
Le jour Julien pour la date Julienne donnée, sous la forme d'un entier.
(PHP 4, PHP 5)
unixtojd — Convertit un timestamp UNIX en un jour Julien
$timestamp = time()
] )
Retourne le jour Julien du timestamp UNIX timestamp
(nombre de secondes depuis le 1/1/1970), ou pour le jour courant si
timestamp est omis.
timestamp
Un timestamp unix à convertir.
Un nombre de jours Julien, sous la forme d'un entier.
Ces fonctions vous permettent de récupérer la date et l'heure depuis le serveur où le script PHP s'exécute. Vous pouvez utiliser ces fonctions pour formater la date et l'heure de différentes façons.
Les informations quant à la date et l'heure sont stockées en interne comme nombre sur 64 bits, aussi, toutes les dates imaginables (y compris les dates négatives) sont supportées. L'intervalle va de 292 billions d'années dans le passé, et la même valeur dans le futur.
Note: Gardez à l'esprit que ces fonctions sont indépendantes de la configuration locale de votre système. Assurez-vous donc de prendre en considération l'heure d'été (en utilisant e.g. $date = strtotime('+7 days', $date) et non $date += 7*24*60*60) ainsi que les années bissextiles lorsque vous utilisez ces fonctions.
Note: Les fuseaux horaires référencés dans cette section peuvent être trouvés dans la section Liste des Fuseaux Horaires Supportés.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Il n'y pas d'installation nécessaire pour utiliser ces fonctions, elles font parties du coeur de PHP.
Note: Récupération de la dernière base de données des fuseaux horaires
La dernière version de la base de données des fuseaux horaires peut être installée via le paquet PECL » timezonedb.
Note: Support DateTime expérimental en PHP 5.1.x
Bien que la classe DateTime (et les fonctions connexes) soit activée par défaut depuis PHP 5.2.0, il est possible d'ajouter un support expérimental dans PHP 5.1.x en utilisant le drapeau suivant lors de la compilation : CFLAGS=-DEXPERIMENTAL_DATE_SUPPORT=1
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
| Nom | Défaut | Modifiable | Historique |
|---|---|---|---|
| date.default_latitude | "31.7667" | PHP_INI_ALL | Disponible depuis PHP 5.0.0. |
| date.default_longitude | "35.2333" | PHP_INI_ALL | Disponible depuis PHP 5.0.0. |
| date.sunrise_zenith | "90.583333" | PHP_INI_ALL | Disponible depuis PHP 5.0.0. |
| date.sunset_zenith | "90.583333" | PHP_INI_ALL | Disponible depuis PHP 5.0.0. |
| date.timezone | "" | PHP_INI_ALL | Disponible depuis PHP 5.1.0. |
Voici un éclaircissement sur l'utilisation des directives de configuration.
date.default_latitude
float
La latitude par défaut.
date.default_longitude
float
La longitude par défaut.
date.sunrise_zenith
float
L'heure de lever du soleil par défaut.
date.sunset_zenith
float
L'heure du coucher du soleil par défaut.
date.timezone
string
Le décalage horaire par défaut utilisé par toutes les fonctions date/heure. Avant PHP 5.3.0, ceci ne fonctionnait que si la variable d'environnement TZ n'est pas définie. L'ordre des décalages horaires utilisés si aucun n'est spécifié est explicitement décrit dans la page de documentation sur la fonction date_default_timezone_get(). Voir Liste des Fuseaux Horaires Supportés pour une liste complète des décalages horaires supportés.
Note: Les quatre premières options de configuration sont actuellement utilisées uniquement par les fonctions date_sunrise() et date_sunset().
Cette extension ne définit aucune ressource.
Les constantes DATE_ sont définies depuis PHP 5.1.1 et offrent une représentation standard des dates, qui peut être utilisée avec toutes les fonctions de formatage de date (comme date()).
Les constantes suivantes existent depuis PHP 5.1.2 et spécifient un format retourné par les fonctions date_sunrise() et date_sunset().
(PHP 5 >= 5.2.0)
Représentation d'une date et heure.
$format
, string $time
[, DateTimeZone $timezone
] )DateTime::ATOM
DATE_ATOM
DateTime::ISO8601
DATE_ISO8601
DateTime::RFC822
DATE_RFC822
DateTime::RFC850
DATE_RFC850
DateTime::RFC1036
DATE_RFC1036
DateTime::RFC1123
DATE_RFC1123
DateTime::RFC2822
DATE_RFC2822
DateTime::RFC3339
DATE_RFC3339
DATE_ATOM (Depuis PHP 5.1.3)
DateTime::RSS
DATE_RSS
DateTime::W3C
DATE_W3C
| Version | Description |
|---|---|
| 5.2.2 | La comparaison d'objet DateTime avec les opérateurs de comparaison fonctionne maintenant normalement. Dans les versions antérieures, tous les objets DateTime étaient considérés comme égaux (en utilisant ==). |
(PHP 5 >= 5.3.0)
DateTime::add -- date_add — Ajoute une durée à un objet DateTime
Style orienté objet
Style procédural
Ajoute la durée de l'objet DateInterval à l'objet DateTime.
object
Style procédural uniquement : Un objet DateTime retourné par la fonction date_create(). Cette fonction modifie cet objet.
interval
Un objet DateInterval
Retourne l'objet DateTime pour chainer les méthodes ou FALSE si une erreur survient.
Exemple #1 Exemple avec DateTime::add()
Style orienté objet
<?php
$date = new DateTime('2000-01-01');
$date->add(new DateInterval('P10D'));
echo $date->format('Y-m-d') . "\n";
?>
Style procédural
<?php
$date = date_create('2000-01-01');
date_add($date, date_interval_create_from_date_string('10 days'));
echo date_format($date, 'Y-m-d');
?>
L'exemple ci-dessus va afficher :
2000-01-11
Exemple #2 Autres exemples avec DateTime::add()
<?php
$date = new DateTime('2000-01-01');
$date->add(new DateInterval('PT10H30S'));
echo $date->format('Y-m-d H:i:s') . "\n";
$date = new DateTime('2000-01-01');
$date->add(new DateInterval('P7Y5M4DT4H3M2S'));
echo $date->format('Y-m-d H:i:s') . "\n";
?>
L'exemple ci-dessus va afficher :
2000-01-01 10:00:30 2007-06-05 04:03:02
Exemple #3 Attention à l'ajout de mois
<?php
$date = new DateTime('2000-12-31');
$interval = new DateInterval('P1M');
$date->add($interval);
echo $date->format('Y-m-d') . "\n";
$date->add($interval);
echo $date->format('Y-m-d') . "\n";
?>
L'exemple ci-dessus va afficher :
2001-01-31 2001-03-03
DateTime::modify() est une alternative pouvant être utilisée avec PHP 5.2.
(PHP 5 >= 5.2.0)
DateTime::__construct -- date_create — Retourne un nouvel objet DateTime
time
Une chaîne date/heure. Les formats valides sont expliqués dans la documentation sur les formats Date et Heure.
Passez NULL ici pour obtenir le temps courant en utilisant
le paramètre $timezone.
timezone
Un objet DateTimeZone object representant le fuseau horaire.
Si$timezone est omis, le fuseau horaire
actuel sera utilisé.
Note:
Le paramètre
$timezoneet le fuseau horaire actuels sont ignorés lorsque paramètre$timeest un timestamp UNIX (e.g. @946684800) ou précise un fuseau (e.g. 2010-01-28T15:00:00+02:00).
Retourne une nouvelle instance DateTime.
Style procédural retourne FALSE en cas d'erreur.
Émet un Exception en cas d'erreur.
| Version | Description |
|---|---|
| 5.3.0 | Si une date invalide est précisée, une exception est maintenant levée. Auparavant, une erreur était émise. |
Exemple #1 Exemple avec DateTime::__construct()
Style orienté objet
<?php
try {
$date = new DateTime('2000-01-01');
} catch (Exception $e) {
echo $e->getMessage();
exit(1);
}
echo $date->format('Y-m-d');
?>
Style procédural
<?php
$date = date_create('2000-01-01');
if (!$date) {
$e = date_get_last_errors();
foreach ($e['errors'] as $error) {
echo "$error\n";
}
exit(1);
}
echo date_format($date, 'Y-m-d');
?>
Les exemples ci-dessus vont afficher :
2000-01-01
Exemple #2 Autres exemples avec DateTime::__construct()
<?php
// date/time spécifiés dans le fuseau de votre machine
$date = new DateTime('2000-01-01');
echo $date->format('Y-m-d H:i:sP') . "\n";
// date/time dans un fuseau précis.
$date = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru'));
echo $date->format('Y-m-d H:i:sP') . "\n";
// date/time courants dans le fuseau de votre machine
$date = new DateTime();
echo $date->format('Y-m-d H:i:sP') . "\n";
// date/time courants dans un fuseau précis.
$date = new DateTime(null, new DateTimeZone('Pacific/Nauru'));
echo $date->format('Y-m-d H:i:sP') . "\n";
// Utilisation d'un timestamp Unix. Notez que le résultat est dans le fuseau UTC.
$date = new DateTime('@946684800');
echo $date->format('Y-m-d H:i:sP') . "\n";
// Valeur non existante
$date = new DateTime('2000-02-30');
echo $date->format('Y-m-d H:i:sP') . "\n";
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
2000-01-01 00:00:00-05:00 2000-01-01 00:00:00+12:00 2010-04-24 10:24:16-04:00 2010-04-25 02:24:16+12:00 2000-01-01 00:00:00+00:00 2000-03-01 00:00:00-05:00
(PHP 5 >= 5.3.0)
DateTime::createFromFormat -- date_create_from_format — Retourne un nouvel objet DateTime formaté
Style orienté objet
$format
, string $time
[, DateTimeZone $timezone
] )Style procédural
Retourne un nouvel objet DateTime formaté.
format
Le format à utiliser. Voir les options de formattage ci-dessous. Dans le plus part des cas, les mêmes lettres que pour la fonction date() peuvent être utilisées.
format character |
Description | Exemple de valeurs analysées |
|---|---|---|
| Jour | --- | --- |
| d et j | Jour du mois, sur 2 chiffres, avec ou sans le zéro initial | 01 à 31 ou 1 à 31 |
| D and l | Une représentation textuelle du jour | De Mon jusqu'à Sun ou de Sunday jusqu'à Saturday |
| S | Préfixe anglais du jour du mois, sur 2 caractères. Il sera ignoré lors de l'analyse. | st, nd, rd ou th. |
| z | Le jour de l'année (en commençant à 0) | 0 through 365 |
| Mois | --- | --- |
| F et M | Une représentation textuelle du mois, comme January ou Sept | De January à December ou de Jan à Dec |
| m et n | Une représentation numérique du mois, avec ou sans zéro initial | De 01 à 12 ou de 1 à 12 |
| Année | --- | --- |
| Y | Une représentation complète de l'année, sur 4 chiffres | Exemples : 1999 ou 2003 |
| y | Une reprensation partielle de l'année, sur 2 chiffres | Exemples : 99 ou 03 |
| Heure | --- | --- |
| a et A | Ante meridiem et Post meridiem | am ou pm |
| g et h | L'heure au format 12-heures, avec ou sans zéro initial | De 1 à 12 ou de 01 à 12 |
| G et H | L'heure au format 24-heures, avec ou sans zéro initial | De 0 à 23 ou de 00 à 23 |
| i | Les minutes, avec un zéro initial | De 00 à 59 |
| s | Les secondes, avec un zéro initial | De 00 à 59 |
| u | Les microsecondes (jusqu'à 6 chiffres) | Exemple : 45, 654321 |
| Fuseau horaire | --- | --- |
| e, O, P et T | L'identifiant du fuseau horaire, ou la différence en heures avec UTC, ou la différence avec UTC avec deux points (:) entre les heures et les minutes, ou l'abbréviation du fuseau horaire | Exemples : UTC, GMT, Atlantic/Azores ou +0200 ou +02:00 ou EST, MDT |
| Date/heure complète | --- | --- |
| U | Le nombre de secondes depuis l'époque Unix (January 1 1970 00:00:00 GMT) | Exemple : 1292177455 |
| Espace et séparateurs | --- | --- |
| (espace) | Un espace ou une tabulation | Exemple : |
| # | Un des symboles de séparation suivants : ;, :, /, ., ,, -, ( ou ) | Exemple : / |
| ;, :, /, ., ,, -, ( ou ) | Le caractère spécifié. | Exemple : - |
| ? | Un octet aléatoire | Exemple : ^ (Be aware that for UTF-8 characracters you might need more than one ?. In this case, using * is probably what you want instead) |
| * | Octets aléatoires jusqu'au prochain séparateur ou chiffre | Exemple : * dans Y-*-d avec la chaîne 2009-aWord-08 trouvera la chaîne aWord |
| ! | Réinitialise tous les champs (année, mois, jour, heure, minute, seconde ainsi que les informations quant au fuseau horaire) à l'heure de l'époque Unix | Sans le caractère !, tous les champs seront définis à la date et heure courante. |
| | | Réinitialise tous les champs (année, mois, jour, heure, minute, seconde ainsi que les informations quant au fuseau horaire) à l'heure de l'époque Unix s'ils n'ont pas encore été analysés | Y-m-d| définira l'année, le mois et le jour avec les informations trouvées dans la chaîne analysée, mais aussi l'heure, les minutes et les secondes à 0. |
| + | Si le spécifieur de format est présent, les données restantes de la chaîne ne causeront pas une erreur, mais une alerte | Utilisez la méthode DateTime::getLastErrors() pour identifier la présence de données restantes. |
Les caractères non reconnus dans le format feront échoués l'analyse et un message d'erreur sera ajouté à la structure retournée. Vous pouvez utiliser la méthode DateTime::getLastErrors() pour récupérer les messages d'erreur.
Si format n'est pas composé du caractère
! alors les valeurs de temps générées qui sont absentes de
format prendront comme valeur le temps système.
Si format contient le caractère
!, alors les valeurs de temps générées qui sont absentes de
format ainsi que les valeurs situées à gauche de
! prendront des valeurs mesurées depuis Unix epoch.
Le début de l'époque Unix est le 01/01/1970 à 00:00:00 UTC.
time
Chaîne représentant l'heure.
timezone
Un objet DateTimeZone représentant le fuseau horaire désiré.
Si timezone est omis et
time ne contient pas de fuseau,
le fuseau courant sera utilisé.
Note:
Le paramètre
timezoneet le fuseau courant sont ignorés lorsque le paramètretimecontient un timestamp (par ex 946684800) ou précise un fuseau (par ex 2010-01-28T15:00:00+02:00).
Retourne un nouvel objet DateTime ou FALSE si une erreur survient.
Exemple #1 Exemple avec DateTime::createFromFormat()
Style orienté objet
<?php
$date = DateTime::createFromFormat('j-M-Y', '15-Feb-2009');
echo $date->format('Y-m-d');
?>
Style procédural
<?php
$date = date_create_from_format('j-M-Y', '15-Feb-2009');
echo date_format($date, 'Y-m-d');
?>
Les exemples ci-dessus vont afficher :
2009-02-15
Exemple #2 Autres exemples avec DateTime::createFromFormat()
<?php
echo 'Date courante: ' . date('Y-m-d H:i:s') . "\n";
$format = 'Y-m-d';
$date = DateTime::createFromFormat($format, '2009-02-15');
echo "Format: $format; " . $date->format('Y-m-d H:i:s') . "\n";
$format = 'Y-m-d H:i:s';
$date = DateTime::createFromFormat($format, '2009-02-15 15:16:17');
echo "Format: $format; " . $date->format('Y-m-d H:i:s') . "\n";
$format = 'Y-m-!d H:i:s';
$date = DateTime::createFromFormat($format, '2009-02-15 15:16:17');
echo "Format: $format; " . $date->format('Y-m-d H:i:s') . "\n";
$format = '!d';
$date = DateTime::createFromFormat($format, '15');
echo "Format: $format; " . $date->format('Y-m-d H:i:s') . "\n";
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Date courante: 2010-04-23 10:29:35 Format: Y-m-d; 2009-02-15 10:29:35 Format: Y-m-d H:i:s; 2009-02-15 15:16:17 Format: Y-m-!d H:i:s; 1970-01-15 15:16:17 Format: !d; 1970-01-15 00:00:00
(PHP 5 >= 5.3.0)
DateTime::diff -- date_diff — Retourne la différence entre deux objets DateTime
datetime
La date à comparer.
absolute
Retourner la différence absolue ou non.
L'objet DateInterval représentant
la différence entre les 2 dates ou FALSE si une erreur survient.
Exemple #1 Exemple avec DateTime::diff()
Style orienté objet
<?php
$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-13');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days');
?>
Style procédural
<?php
$datetime1 = date_create('2009-10-11');
$datetime2 = date_create('2009-10-13');
$interval = date_diff($datetime1, $datetime2);
echo $interval->format('%R%a days');
?>
L'exemple ci-dessus va afficher :
+2 days
Exemple #2 Comparaison de dates DateTime
Note:
Depuis PHP 5.2.2, les objets DateTime peuvent être comparés grâce aux opérateurs de comparaison.
<?php
$date1 = new DateTime("now");
$date2 = new DateTime("tomorrow");
var_dump($date1 == $date2);
var_dump($date1 < $date2);
var_dump($date1 > $date2);
?>
L'exemple ci-dessus va afficher :
bool(false) bool(true) bool(false)
(PHP 5 >= 5.2.0)
DateTime::format -- date_format — Retourne la date au format demandé
Style orienté objet
$format
)Style procédural
Retourne une date formattée selon un format donné.
object
Seulement en style procédural : un objet DateTime retourné par date_create()
format
Format accepté par date().
Retourne la date formatée, en cas de succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec DateTime::format()
Style orienté objet
<?php
$date = new DateTime('2000-01-01');
echo $date->format('Y-m-d H:i:s');
?>
Style procédural
<?php
$date = date_create('2000-01-01');
echo date_format($date, 'Y-m-d H:i:s');
?>
?>
L'exemple ci-dessus va afficher :
2000-01-01 00:00:00
Cette méthode n'utilise pas les locales. Toute sortie est en anglais.
(PHP 5 >= 5.3.0)
DateTime::getLastErrors -- date_get_last_errors — Retourne les dernières erreurs et alertes
Style orienté objet
Style procédural
Retourne un tableau contenant les dernières erreurs et alertes obtenues lors de l'analyse de la chaîne de date.
Cette fonction ne contient aucun paramètre.
Retourne un tableau contenant les erreurs et alertes.
Exemple #1 Exemple avec DateTime::getLastErrors()
Style orienté objet
<?php
try {
$date = new DateTime('asdfasdf');
} catch (Exception $e) {
// Juste pour l'exemple...
print_r(DateTime::getLastErrors());
// Manière orientée objets de gérer les erreurs (exceptions)
// echo $e->getMessage();
}
?>
Style procédural
<?php
$date = date_create('asdfasdf');
print_r(date_get_last_errors());
?>
Les exemples ci-dessus vont afficher :
Array
(
[warning_count] => 1
[warnings] => Array
(
[6] => Double timezone specification
)
[error_count] => 1
[errors] => Array
(
[0] => The timezone could not be found in the database
)
)
(PHP 5 >= 5.2.0)
DateTime::getOffset -- date_offset_get — Retourne le décalage horaire
Style orienté objet
Style procédural
Retourne le décalage horaire.
object
Seulement en style procédural : un objet DateTime retourné par date_create()
Retourne le décalage horaire en secondes depuis UTC
en cas de succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec DateTime::getOffset()
Style orienté objet
<?php
$winter = new DateTime('2010-12-21', new DateTimeZone('America/New_York'));
$summer = new DateTime('2008-06-21', new DateTimeZone('America/New_York'));
echo $winter->getOffset() . "\n";
echo $summer->getOffset() . "\n";
?>
Style procédural
<?php
$winter = date_create('2010-12-21', timezone_open('America/New_York'));
$summer = date_create('2008-06-21', timezone_open('America/New_York'));
echo date_offset_get($winter) . "\n";
echo date_offset_get($summer) . "\n";
?>
Les exemples ci-dessus vont afficher :
-18000 -14400
Note: -18000 = -5 heures, -14400 = -4 heures.
(PHP 5 >= 5.3.0)
DateTime::getTimestamp -- date_timestamp_get — Lit le timestamp Unix
Style orienté objet
Style procédural
Lit le timestamp Unix.
Cette fonction ne contient aucun paramètre.
Retourne le timestamp Unix représentant la date.
Exemple #1 Exemple avec DateTime::getTimestamp()
Style orienté objet
<?php
$date = new DateTime();
echo $date->getTimestamp();
?>
Style procédural
<?php
$date = date_create();
echo date_timestamp_get($date);
?>
Les exemples ci-dessus vont afficher quelque chose de similaire à :
1272509157
Utiliser U comme paramètre de DateTime::format() est une alternative proposée pour PHP 5.2.
(PHP 5 >= 5.2.0)
DateTime::getTimezone -- date_timezone_get — Lit le fuseau horaire d'un objet DateTime
Style orienté objet
Style procédural
Retourne le fuseau relatif à un DateTime donné.
object
Seulement en style procédural : un objet DateTime retourné par date_create()
Retourne l'objet DateTimeZone en
cas de succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec DateTime::getTimezone()
Style orienté objet
<?php
$date = new DateTime(null, new DateTimeZone('Europe/London'));
$tz = $date->getTimezone();
echo $tz->getName();
?>
Style procédural
<?php
$date = date_create(null, timezone_open('Europe/London'));
$tz = date_timezone_get($date);
echo timezone_name_get($tz);
?>
L'exemple ci-dessus va afficher :
Europe/London
(PHP 5 >= 5.2.0)
DateTime::modify -- date_modify — Modifie le timestamp
Style orienté objet
Style procédural
Modifie le timestamp d'un objet DateTime en l'incrémentant ou le décrémentant dans un format acceptable par strtotime().
object
Style procédural uniquement : Un objet DateTime retourné par la fonction date_create(). Cette fonction modifie cet objet.
modify
Une chaîne date/heure. Les formats valides sont expliqués dans la documentation sur les formats Date et Heure.
Retourne l'objet DateTime pour chainer les méthodes ou FALSE si une erreur survient.
| Version | Description |
|---|---|
| 5.3.6 | Les requêtes date/heure absolues prennent maintenant effets. Auparavant, seules les parties relatives étaient utilisées. |
| 5.3.0 | Changement de
valeur de retour de NULL à DateTime en cas de succès. |
Exemple #1 Exemple avec DateTime::modify()
Style orienté objet
<?php
$date = new DateTime('2006-12-12');
$date->modify('+1 day');
echo $date->format('Y-m-d');
?>
Style procédural
<?php
$date = date_create('2006-12-12');
date_modify($date, '+1 day');
echo date_format($date, 'Y-m-d');
?>
Les exemples ci-dessus vont afficher :
2006-12-13
Exemple #2 Méfiez-vous lors de l'ajout ou la soustraction de mois
<?php
$date = new DateTime('2000-12-31');
$date->modify('+1 month');
echo $date->format('Y-m-d') . "\n";
$date->modify('+1 month');
echo $date->format('Y-m-d') . "\n";
?>
L'exemple ci-dessus va afficher :
2001-01-31 2001-03-03
(PHP 5 >= 5.2.0)
DateTime::__set_state — Le gestionnaire __set_state
Le gestionnaire __set_state().
array
Le tableau d'initialisation.
Retourne une nouvelle instance de l'objet DateTime.
(PHP 5 >= 5.2.0)
DateTime::setDate -- date_date_set — Assigne la date
Style orienté objet
Style procédural
Assigne la date courante de l'objet DateTime à une nouvelle date.
object
Style procédural uniquement : Un objet DateTime retourné par la fonction date_create(). Cette fonction modifie cet objet.
year
Année de la date.
month
Mois de la date.
day
Jour de la date.
Retourne l'objet DateTime pour chainer les méthodes ou FALSE si une erreur survient.
| Version | Description |
|---|---|
| 5.3.0 | Changement de
valeur de retour de NULL à DateTime en cas de succès. |
Exemple #1 Exemple avec DateTime::setDate()
Style orienté objet
<?php
$date = new DateTime();
$date->setDate(2001, 2, 3);
echo $date->format('Y-m-d');
?>
Style procédural
<?php
$date = date_create();
date_date_set($date, 2001, 2, 3);
echo date_format($date, 'Y-m-d');
?>
Les exemples ci-dessus vont afficher :
2001-02-03
Exemple #2 Les valeurs qui dépassent leurs bornes sont ajoutées à leur parent
<?php
$date = new DateTime();
$date->setDate(2001, 2, 28);
echo $date->format('Y-m-d') . "\n";
$date->setDate(2001, 2, 29);
echo $date->format('Y-m-d') . "\n";
$date->setDate(2001, 14, 3);
echo $date->format('Y-m-d') . "\n";
?>
L'exemple ci-dessus va afficher :
2001-02-28 2001-03-01 2002-02-03
(PHP 5 >= 5.2.0)
DateTime::setISODate -- date_isodate_set — Configure une date ISO
Style orienté objet
Style procédural
Configure une date au format ISO 8601 : en utilisant des décalages de semaines et de jours, au lieu de dates spécifiques.
object
Style procédural uniquement : Un objet DateTime retourné par la fonction date_create(). Cette fonction modifie cet objet.
year
L'année de la date.
week
Le numéro de la semaine.
day
Décalage par rapport au premier jour de la semaine.
Retourne l'objet DateTime pour chainer les méthodes ou FALSE si une erreur survient.
| Version | Description |
|---|---|
| 5.3.0 | Changement de
valeur de retour de NULL à DateTime en cas de succès. |
Exemple #1 Exemple avec DateTime::setISODate()
Style orienté objet
<?php
$date = new DateTime();
$date->setISODate(2008, 2);
echo $date->format('Y-m-d') . "\n";
$date->setISODate(2008, 2, 7);
echo $date->format('Y-m-d') . "\n";
?>
Style procédural
<?php
$date = date_create();
date_isodate_set($date, 2008, 2);
echo date_format($date, 'Y-m-d') . "\n";
date_isodate_set($date, 2008, 2, 7);
echo date_format($date, 'Y-m-d') . "\n";
?>
Les exemples ci-dessus vont afficher :
2008-01-07 2008-01-13
Exemple #2 Les valeurs qui excèdent leur bornes s'ajoutent à leur parent
<?php
$date = new DateTime();
$date->setISODate(2008, 2, 7);
echo $date->format('Y-m-d') . "\n";
$date->setISODate(2008, 2, 8);
echo $date->format('Y-m-d') . "\n";
$date->setISODate(2008, 53, 7);
echo $date->format('Y-m-d') . "\n";
?>
L'exemple ci-dessus va afficher :
2008-01-13 2008-01-14 2009-01-04
Exemple #3 Calcul du mois dans lequel est une semaine
<?php
$date = new DateTime();
$date->setISODate(2008, 14);
echo $date->format('n');
?>
Les exemples ci-dessus vont afficher :
3
(PHP 5 >= 5.2.0)
DateTime::setTime -- date_time_set — Assigne l'heure
object
Style procédural uniquement : Un objet DateTime retourné par la fonction date_create(). Cette fonction modifie cet objet.
hour
Heure du moment.
minute
Minute du moment.
second
Seconde du moment.
Retourne l'objet DateTime pour chainer les méthodes ou FALSE si une erreur survient.
| Version | Description |
|---|---|
| 5.3.0 | Changement de
valeur de retour de NULL à DateTime en cas de succès. |
Exemple #1 Exemple avec DateTime::setTime()
Style orienté objet
<?php
$date = new DateTime('2000-01-01');
$date->setTime(14, 55);
echo $date->format('Y-m-d H:i:s') . "\n";
$date->setTime(14, 55, 24);
echo $date->format('Y-m-d H:i:s') . "\n";
?>
Style procédural
<?php
$date = date_create('2001-01-01');
date_time_set($date, 14, 55);
echo date_format($date, 'Y-m-d H:i:s') . "\n";
date_time_set($date, 14, 55, 24);
echo date_format($date, 'Y-m-d H:i:s') . "\n";
?>
Les exemples ci-dessus vont afficher quelque chose de similaire à :
2000-01-01 14:55:00 2000-01-01 14:55:24
Exemple #2 Les valeurs qui dépassent leur borne sont ajoutées à leur parent
<?php
$date = new DateTime('2001-01-01');
$date->setTime(14, 55, 24);
echo $date->format('Y-m-d H:i:s') . "\n";
$date->setTime(14, 55, 65);
echo $date->format('Y-m-d H:i:s') . "\n";
$date->setTime(14, 65, 24);
echo $date->format('Y-m-d H:i:s') . "\n";
$date->setTime(25, 55, 24);
echo $date->format('Y-m-d H:i:s') . "\n";
?>
L'exemple ci-dessus va afficher :
2001-01-01 14:55:24 2001-01-01 14:56:05 2001-01-01 15:05:24 2001-01-02 01:55:24
(PHP 5 >= 5.3.0)
DateTime::setTimestamp -- date_timestamp_set — Assigne la date et l'heure à l'aide d'un timestamp Unix
Style orienté objet
Style procédural
Assigne la date et l'heure à l'aide d'un timestamp Unix.
object
Style procédural uniquement : Un objet DateTime retourné par la fonction date_create(). Cette fonction modifie cet objet.
unixtimestamp
Timestamp Unix représentant la date et l'heure.
Retourne l'objet DateTime pour chainer les méthodes ou FALSE si une erreur survient.
Exemple #1 Exemple avec DateTime::setTimestamp()
Style orienté objet
<?php
$date = new DateTime();
echo $date->format('U = Y-m-d H:i:s') . "\n";
$date->setTimestamp(1171502725);
echo $date->format('U = Y-m-d H:i:s') . "\n";
?>
Style procédural
<?php
$date = date_create();
echo date_format($date, 'U = Y-m-d H:i:s') . "\n";
date_timestamp_set($date, 1171502725);
echo date_format($date, 'U = Y-m-d H:i:s') . "\n";
?>
Les exemples ci-dessus vont afficher quelque chose de similaire à :
1272508903 = 2010-04-28 22:41:43 1171502725 = 2007-02-14 20:25:25
Pour PHP 5.2, une alternative est de passer un timestamp Unix à DateTime::__construct() comme montré dans l'exemple suivant.
Exemple #2 DateTime::setTimestamp() alternative pour PHP 5.2
<?php
$ts = 1171502725;
$date = new DateTime("@$ts");
echo $date->format('U = Y-m-d H:i:s') . "\n";
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
1171502725 = 2007-02-14 20:25:25
(PHP 5 >= 5.2.0)
DateTime::setTimezone -- date_timezone_set — Configure le fuseau horaire de l'objet DateTime
Style orienté objet
Style procédural
object
Style procédural uniquement : Un objet DateTime retourné par la fonction date_create(). Cette fonction modifie cet objet.
timezone
Un objet DateTimeZone représentant le fuseau horaire désiré.
Retourne l'objet DateTime pour chainer les méthodes ou FALSE si une erreur survient.
| Version | Description |
|---|---|
| 5.3.0 | Changement de
valeur de retour de NULL à DateTime en cas de succès. |
Exemple #1 Exemple avec DateTime::setTimeZone()
Style orienté objet
<?php
$date = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru'));
echo $date->format('Y-m-d H:i:sP') . "\n";
$date->setTimezone(new DateTimeZone('Pacific/Chatham'));
echo $date->format('Y-m-d H:i:sP') . "\n";
?>
Style procédural
<?php
$date = date_create('2000-01-01', timezone_open('Pacific/Nauru'));
echo date_format($date, 'Y-m-d H:i:sP') . "\n";
date_timezone_set($date, timezone_open('Pacific/Chatham'));
echo date_format($date, 'Y-m-d H:i:sP') . "\n";
?>
L'exemple ci-dessus va afficher :
2000-01-01 00:00:00+12:00 2000-01-01 01:45:00+13:45
(PHP 5 >= 5.3.0)
DateTime::sub -- date_sub — Soustrait une durée à un objet DateTime
Style orienté objet
Style procédural
Soustrait la durée spécifiée par l'objet DateInterval de l'objet DateTime.
object
Style procédural uniquement : Un objet DateTime retourné par la fonction date_create(). Cette fonction modifie cet objet.
interval
Un objet DateInterval
Retourne l'objet DateTime pour chainer les méthodes ou FALSE si une erreur survient.
Exemple #1 Exemple avec DateTime::sub()
Style orienté objet
<?php
$date = new DateTime('2000-01-20');
$date->sub(new DateInterval('P10D'));
echo $date->format('Y-m-d') . "\n";
?>
Style procédural
<?php
$date = date_create('2000-01-20');
date_sub($date, date_interval_create_from_date_string('10 days'));
echo date_format($date, 'Y-m-d');
?>
Les exemples ci-dessus vont afficher :
2000-01-10
Exemple #2 Autres exemples avec DateTime::sub()
<?php
$date = new DateTime('2000-01-20');
$date->sub(new DateInterval('PT10H30S'));
echo $date->format('Y-m-d H:i:s') . "\n";
$date = new DateTime('2000-01-20');
$date->sub(new DateInterval('P7Y5M4DT4H3M2S'));
echo $date->format('Y-m-d H:i:s') . "\n";
?>
L'exemple ci-dessus va afficher :
2000-01-19 13:59:30 1992-08-15 19:56:58
Exemple #3 Attention à la soustraction de mois
<?php
$date = new DateTime('2001-04-30');
$interval = new DateInterval('P1M');
$date->sub($interval);
echo $date->format('Y-m-d') . "\n";
$date->sub($interval);
echo $date->format('Y-m-d') . "\n";
?>
L'exemple ci-dessus va afficher :
2001-03-30 2001-03-02
DateTime::modify() est une alternative à utiliser avec PHP 5.2.
(PHP 5 >= 5.2.0)
DateTime::__wakeup — Le gestionnaire de __wakeup
Cette fonction ne contient aucun paramètre.
Initialise un objet DateTime.
(PHP 5 >= 5.2.0)
Représentation d'un fuseau horaire.
DateTimeZone::AFRICA
Fuseau africain.
DateTimeZone::AMERICA
Fuseau américain.
DateTimeZone::ANTARCTICA
Fuseau antarctique.
DateTimeZone::ARCTIC
Fuseau arctique.
DateTimeZone::ASIA
Fuseau asiatique.
DateTimeZone::ATLANTIC
Fuseau atlantique.
DateTimeZone::AUSTRALIA
Fuseau australien.
DateTimeZone::EUROPE
Fuseau européen.
DateTimeZone::INDIAN
Fuseau indien.
DateTimeZone::PACIFIC
Fuseau pacifique.
DateTimeZone::UTC
Fuseau UTC.
DateTimeZone::ALL
Tous les fuseaux.
DateTimeZone::ALL_WITH_BC
Tous les fuseaux, y compris les anciens.
DateTimeZone::PER_COUNTRY
Fuseaux horaires par pays.
(PHP 5 >= 5.2.0)
DateTimeZone::__construct -- timezone_open — Crée un nouvel objet DateTimeZone
Style orienté objet
$timezone
)Style procédural
Crée un nouvel objet DateTimeZone.
Retourne un objet DateTimeZone, en cas de succès.
Style procédural retourne FALSE en cas d'erreur..
Cette méthode émet une exception Exception, si le fuseau horaire fourni n'est pas reconnu.
Exemple #1 Interception des erreurs avec DateTimeZone
<?php
// Gestion des erreurs par interception des exceptions
$timezones = array('Europe/London', 'Mars/Phobos', 'Jupiter/Europa');
foreach ($timezones as $tz) {
try {
$mars = new DateTimeZone($tz);
} catch(Exception $e) {
echo $e->getMessage() . '<br />';
}
}
?>
L'exemple ci-dessus va afficher :
DateTimeZone::__construct() [datetimezone.--construct]: Unknown or bad timezone (Mars/Phobos) DateTimeZone::__construct() [datetimezone.--construct]: Unknown or bad timezone (Jupiter/Europa)
(PHP 5 >= 5.3.0)
DateTimeZone::getLocation -- timezone_location_get — Retourne les informations géographiques d'un fuseau horaire
Style orienté objet
Style procédural
Retourne les informations géographiques d'un fuseau horaire, comprenant le code du pays, la latitude et la longitude, et commentaires.
objectSeulement en style procédural : un DateTimeZone objet retourné par timezone_open()
Tableau contenant les informations de localisation du fuseau horaire.
Exemple #1 Exemple avec DateTimeZone::getLocation()
<?php
$tz = new DateTimeZone("Europe/Prague");
print_r($tz->getLocation());
print_r(timezone_location_get($tz));
?>
L'exemple ci-dessus va afficher :
Array
(
[country_code] => CZ
[latitude] => 50.08333
[longitude] => 14.43333
[comments] =>
)
Array
(
[country_code] => CZ
[latitude] => 50.08333
[longitude] => 14.43333
[comments] =>
)
(PHP 5 >= 5.2.0)
DateTimeZone::getName -- timezone_name_get — Retourne le nom du fuseau horaire
Style orienté objet
Style procédural
Retourne le nom du fuseau horaire.
object
L'objet DateTimeZone utilisé pour retourner le nom du fuseau.
Un des fuseaux horaires de la liste des fuseaux horaires.
(PHP 5 >= 5.2.0)
DateTimeZone::getOffset -- timezone_offset_get — Retourne le décalage GMT d'un fuseau horaire
Style orienté objet
Style procédural
timezone_offset_get() retourne le décalage horaire par
rapport au GMT pour le paramètre datetime. Le
décalage GMT est calculé à partir des informations de fuseau horaire
contenu dans l'objet DateTime.
objectSeulement en style procédural : un DateTimeZone objet retourné par timezone_open()
datetime
Objet DateTime qui contient la date dont il faut calculer le décalage.
Retourne le décalage horaire, exprimé en secondes, en cas de succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec DateTimeZone::getOffset()
<?php
// Crée deux objets fuseau horaire, un pour Taipei (Taiwan) et un pour
// Tokyo (Japon)
$dateTimeZoneTaipei = new DateTimeZone("Asia/Taipei");
$dateTimeZoneJapan = new DateTimeZone("Asia/Tokyo");
// Crée deux objets DateTime qui contiennent le même timestampe Unix,
// mais sont situés dans deux fuseaux horaires différents.
$dateTimeTaipei = new DateTime("now", $dateTimeZoneTaipei);
$dateTimeJapan = new DateTime("now", $dateTimeZoneJapan);
// Calcule le décalage horaire GMT pour l'objet $dateTimeTaipei
// mais en utilisant le fuseau horaire de Tokyo
// ($dateTimeZoneJapan).
$timeOffset = $dateTimeZoneJapan->getOffset($dateTimeTaipei);
// Devrait afficher int(32400) (pour les dates après le Sat Sep 8 01:00:00 1951 JST).
var_dump($timeOffset);
?>
(PHP 5 >= 5.2.0)
DateTimeZone::getTransitions -- timezone_transitions_get — Retourne toutes les transitions d'un fuseau horaire
Style orienté objet
$timestamp_begin
[, int $timestamp_end
]] )Style procédural
$object
[, int $timestamp_begin
[, int $timestamp_end
]] )
objectSeulement en style procédural : un DateTimeZone objet retourné par timezone_open()
timestamp_begin
Début du timestamp.
timestamp_end
Fin du timestamp.
Retourne un tableau numérique, contenant des tableaux associatifs
avec toutes les transitions, en cas de succès ou FALSE si une erreur survient.
| Version | Description |
|---|---|
| 5.3.0 |
Les paramètres optionnels timestamp_begin
et timestamp_end ont été ajouté.
|
Exemple #1 Exemple avec timezone_transitions_get()
<?php
$timezone = new DateTimeZone("Europe/London");
$transitions = $timezone->getTransitions();
print_r(array_slice($transitions, 0, 3));
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[0] => Array
(
[ts] => -9223372036854775808
[time] => -292277022657-01-27T08:29:52+0000
[offset] => 3600
[isdst] => 1
[abbr] => BST
)
[1] => Array
(
[ts] => -1691964000
[time] => 1916-05-21T02:00:00+0000
[offset] => 3600
[isdst] => 1
[abbr] => BST
)
[2] => Array
(
[ts] => -1680472800
[time] => 1916-10-01T02:00:00+0000
[offset] => 0
[isdst] =>
[abbr] => GMT
)
)
(PHP 5 >= 5.2.0)
DateTimeZone::listAbbreviations -- timezone_abbreviations_list — Retourne un tableau associatif, décrivant un fuseau horaire
Style orienté objet
Style procédural
Retourne un tableau en cas de succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec timezone_abbreviations_list()
<?php
$timezone_abbreviations = DateTimeZone::listAbbreviations();
print_r($timezone_abbreviations["acst"]);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[0] => Array
(
[dst] => 1
[offset] => -14400
[timezone_id] => America/Porto_Acre
)
[1] => Array
(
[dst] => 1
[offset] => -14400
[timezone_id] => America/Eirunepe
)
[2] => Array
(
[dst] => 1
[offset] => -14400
[timezone_id] => America/Rio_Branco
)
[3] => Array
(
[dst] => 1
[offset] => -14400
[timezone_id] => Brazil/Acre
)
)
(PHP 5 >= 5.2.0)
DateTimeZone::listIdentifiers -- timezone_identifiers_list — Retourne un tableau numérique de tous les fuseaux horaires
Style orienté objet
$what = DateTimeZone::ALL
[, string $country = NULL
]] )Style procédural
what
Une des constantes de classe DateTimeZone.
country
Un code de pays en deux lettres, compatible ISO 3166-1.
Note: Cette option n'est dispoinble que lorsque le paramètre
whatprend la valeur deDateTimeZone::PER_COUNTRY.
Retourne un tableau en cas de succès ou FALSE si une erreur survient.
| Version | Description |
|---|---|
| 5.3.0 |
Ajout des paramètres optionnels what et
country.
|
Exemple #1 Exemple avec timezone_identifiers_list()
<?php
$timezone_identifiers = DateTimeZone::listIdentifiers();
for ($i=0; $i < 5; $i++) {
echo "$timezone_identifiers[$i]\n";
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Africa/Abidjan Africa/Accra Africa/Addis_Ababa Africa/Algiers Africa/Asmara
(PHP 5 >= 5.3.0)
Représentation d'un intervalle de dates. Un intervalle stocke un nombre fixe de durées (en années, mois, jours, heures, etc.) ou une chaîne relative à une durée dans un format compréhensible par le constructeur de la classe DateTime.
Année.
Numéro du mois.
Numéro du jour.
L'heure.
Les minutes.
Les secondes.
Vaut 1 si l'intervalle est inversée et 0 sinon. Voir la méthode DateInterval::format().
Nombre total de jours entre la date de début et la
date de fin lors d'un calcul DateTime::diff().
days vaudra NULL dans les autres cas.
(PHP 5 >= 5.3.0)
DateInterval::__construct — Crée un nouvel objet DateInterval
$interval_spec
)Crée un nouvel objet DateInterval.
interval_spec
Spécification d'intervalle.
Le format commence avec la lettre P, pour "period". Chaque durée de la période est représentée par une valeur entière suivie par une désignation de période. Si la durée contient des éléments de temps, cette portion de la spécification est précédée par la lettre T.
| Désignation de période | Description |
|---|---|
| Y | Années |
| M | Mois |
| D | Jours |
| W | Semaine. Sera converti en jours, aussi, vous ne pouvez pas le combiner avec D. |
| H | Heures |
| M | Minutes |
| S | Secondes |
Voici quelques exemples simples. 2 jours sera P2D. 2 secondes sera PT2S. 6 années et 5 minutes sera P6YT5M.
Note:
Les types d'unité doivent être entrés des plus grands aux plus petits. Ainsi, les années doivent être présentes avant les mois, les mois avant les jours, les jours avant les minutes, etc. Aussi, une année et 4 jours doit être représenté comme P1Y4D, et non P4D1Y.
Cette spécification peut également être représentée sous la forme d'une durée. Aussi, une année et 4 jours peut être P0001-00-04T00:00:00. Mais les valeurs de ce format ne peuvent pas exécéder une période donnée (i.e. 25 heures est invalide).
Ces formats sont basés sur la » spécification de durée ISO 8601.
Exemple #1 Exemple avec DateInterval
<?php
$interval = new DateInterval('P2Y4DT6H8M');
var_dump($interval);
?>
L'exemple ci-dessus va afficher :
object(DateInterval)#1 (8) {
["y"]=>
int(2)
["m"]=>
int(0)
["d"]=>
int(4)
["h"]=>
int(6)
["i"]=>
int(8)
["s"]=>
int(0)
["invert"]=>
int(0)
["days"]=>
bool(false)
}
(PHP 5 >= 5.3.0)
DateInterval::createFromDateString — Configure un objet DateInterval à partir des parties d'une chaîne
Utilise les analyseurs de dates natifs et configure un objet DateInterval à partir d'une chaîne de caractères.
time
Une date, avec des portions relatives.
Retourne un nouvel objet DateInterval, en cas de succès.
(PHP 5 >= 5.3.0)
DateInterval::format — Formate l'intervalle
$format
)Formate l'intervalle.
format
Caractère de format |
Description | Valeur d'exemple |
|---|---|---|
| % | Caractère % littéral | % |
| Y | Années, numérique, au moins 2 chiffres avec zéros initiaux | 01, 03 |
| y | Années, numérique | 1, 3 |
| M | Mois, numérique, au moins 2 chiffres avec zéros initiaux | 01, 03, 12 |
| m | Mois, numérique | 1, 3, 12 |
| D | Jours, numérique, au moins 2 chiffres avec zéros initiaux | 01, 03, 31 |
| d | Jours, numérique | 1, 3, 31 |
| a | Nombre total de jours | 4, 18, 8123 |
| H | Heures, numérique, au moins 2 chiffres avec zéros initiaux | 01, 03, 23 |
| h | Heures, numérique | 1, 3, 23 |
| I | Minutes, numérique, au moins 2 chiffres avec zéros initiaux | 01, 03, 59 |
| i | Minutes, numérique | 1, 3, 59 |
| S | Secondes, numérique, au moins 2 chiffres avec zéros initiaux | 01, 03, 57 |
| s | Secondes, numérique | 1, 3, 57 |
| R | Signe "-" lorsque négatif, "+" si positif | -, + |
| r | Signe "-" lorsque négatif, vide si positif | -, |
Retourne l'intervalle formaté.
Note:
La méthode DateInterval::format() ne recalcule pas la retenue dans les chaines de temps ni dans les segments de date. Ce comportement est attendu car il n'est pas possible de dépasser des valeurs comme "32 days" qui pourrait être interprété comme "1 mois et 4 jours" ou "1 mois et 1 jour".
Exemple #1 Exemple avec DateInterval
<?php
$interval = new DateInterval('P2Y4DT6H8M');
echo $interval->format('%d jours');
?>
L'exemple ci-dessus va afficher :
4 jours
Exemple #2 DateInterval et retenue
<?php
$interval = new DateInterval('P32D');
echo $interval->format('%d jours');
?>
L'exemple ci-dessus va afficher :
32 jours
Exemple #3 DateInterval et DateTime::diff() avec les modificateurs %a et %d
<?php
$january = new DateTime('2010-01-01');
$february = new DateTime('2010-02-01');
$interval = $february->diff($january);
// %a affichera le nombre total de jours...
echo $interval->format('%a jours au total')."\n";
// ...alors que %d n'affichera que le nombre de jours non encore couverts
// dans le mois.
echo $interval->format('%m mois, %d jour');
?>
L'exemple ci-dessus va afficher :
31 jours au total 1 mois, 0 jour
(PHP 5 >= 5.3.0)
Représentation d'une période de dates.
$start
, DateInterval $interval
, int $recurrences
[, int $options
] )DatePeriod::EXCLUDE_START_DATE
Exclut la date de début, utilisé par DatePeriod::__construct().
$start
, DateInterval $interval
, int $recurrences
[, int $options
] )$start
, DateInterval $interval
, DateTime $end
[, int $options
] )$isostr
[, int $options
] )Crée un nouvel objet DatePeriod.
start
Date de début.
interval
Intervalle.
recurrences
Nombre de récurrences.
end
Date de fin.
isostr
Chaîne contenant l'intervalle ISO.
options
Peut être configuré à DatePeriod::EXCLUDE_START_DATE.
(PHP 4, PHP 5)
checkdate — Valide une date grégorienne
$month
, int $day
, int $year
)Vérifie la validité d'une date formée par les arguments. Une date est considérée comme valide si chaque paramètre est défini correctement.
month
Le mois doit être compris entre 1 et 12.
day
Le jour doit être un jour autorisé par le mois donné. Les années bissextiles sont prises en comptes.
year
L'année est comprise entre 1 et 32767 inclus.
Retourne TRUE si la date fournie est valide, sinon FALSE.
Exemple #1 Exemple avec checkdate()
<?php
var_dump(checkdate(12, 31, 2000));
var_dump(checkdate(2, 29, 2001));
?>
L'exemple ci-dessus va afficher :
bool(true) bool(false)
Cette fonction est un alias de : DateTime::add()
(PHP 5 >= 5.3.0)
date_create_from_format — Alias de DateTime::createFromFormat()
Cette fonction est un alias de : DateTime::createFromFormat()
Cette fonction est un alias de : DateTime::__construct()
Cette fonction est un alias de : DateTime::setDate()
(PHP 5 >= 5.1.0)
date_default_timezone_get — Récupère le décalage horaire par défaut utilisé par toutes les fonctions date/heure dans un script
Cette fonction retourne le décalage horaire en suivant l'ordre de préférences suivant :
Lecture du décalage horaire définie en utilisant la fonction date_default_timezone_set() (si elle existe)
Avant PHP 5.4.0 uniquement : Lecture de la variable d'environnement TZ (si elle n'est pas vide)
Lecture de la valeur de l'option de configuration date.timezone (si elle est définie)
Avant PHP 5.4.0 uniquement : Interrogation du système d'exploitation (si le système le supporte et l'autorise). Cette interrogation utilise un algorithme qui tente de deviner le décalage horaire. Aussi, le résultat peut ne pas être attendu dans certaine situation. Une alerte est affichée lorsque cette étape est atteinte. Inutile de la rapporter afin qu'elle soit corrigée, mais définissez plutôt date.timezone de façon plus correcte.
Si tout ce qui précède échoue, date_default_timezone_get() retournera le décalage horaire par défaut de UTC.
Retourne une chaîne de caractères.
| Version | Description |
|---|---|
| 5.4.0 | La variable d'environnement TZ n'est plus utilisée pour deviner le décalage horaire. |
| 5.4.0 | Le décalage horaire n'est plus deviné depuis les informations disponibles via le système d'exploitation. |
Exemple #1 Récupération du décalage horaire par défaut
<?php
date_default_timezone_set('Europe/London');
if (date_default_timezone_get()) {
echo 'date_default_timezone_set : ' . date_default_timezone_get() . '<br />';
}
if (ini_get('date.timezone')) {
echo 'date.timezone : ' . ini_get('date.timezone');
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
date_default_timezone_set : Europe/London date.timezone : Europe/London
Exemple #2 Récupération de l'abréviation d'un décalage horaire
<?php
date_default_timezone_set('America/Los_Angeles');
echo date_default_timezone_get() . ' => ' . date('e') . ' => ' . date('T');
?>
L'exemple ci-dessus va afficher :
America/Los_Angeles => America/Los_Angeles => PST
(PHP 5 >= 5.1.0)
date_default_timezone_set — Définit le décalage horaire par défaut de toutes les fonctions date/heure
$timezone_identifier
)date_default_timezone_set() définit le décalage horaire par défaut utilisé par toutes les fonctions date/heure.
Note:
Depuis PHP 5.1.0 (lorsque les fonctions date/heure ont été écrites), chaque appel à une fonction date/heure génère une
E_NOTICEsi le décalage horaire n'est pas valide et/ou un messageE_WARNINGsi vous utilisez des configurations système ou la variable d'environnement TZ.
Au lieu d'utiliser cette fonction pour définir le décalage horaire par défaut dans votre script, vous pouvez également utiliser la configuration INI date.timezone.
timezone_identifier
L'identifiant de décalage horaire, comme UTC ou Europe/Lisbon. La liste des identifiants valides est disponible dans le Liste des Fuseaux Horaires Supportés.
Cette fonction retourne FALSE si
timezone_identifier n'est pas valide, TRUE sinon.
Exemple #1 Récupération du décalage horaire par défaut
<?php
date_default_timezone_set('America/Los_Angeles');
$script_tz = date_default_timezone_get();
if (strcmp($script_tz, ini_get('date.timezone'))){
echo 'Le décalage horaire du script diffère du décalage horaire défini dans le fichier ini.';
} else {
echo 'Le décalage horaire du script est équivalent à celui défini dans le fichier ini.';
}
?>
| Version | Description |
|---|---|
| 5.3.0 |
Émet maintenant une alerte de type E_WARNING
plutôt qu'une alerte de type E_STRICT.
|
| 5.1.2 |
La fonction commence à valider le paramètre
timezone_identifier.
|
Cette fonction est un alias de : DateTime::diff()
Cette fonction est un alias de : DateTime::format()
Cette fonction est un alias de : DateTime::getLastErrors()
(PHP 5 >= 5.3.0)
date_interval_create_from_date_string — Alias de DateInterval::createFromDateString()
Cette fonction est un alias de : DateInterval::createFromDateString()
Cette fonction est un alias de : DateInterval::format()
Cette fonction est un alias de : DateTime::setISODate()
Cette fonction est un alias de : DateTime::modify()
Cette fonction est un alias de : DateTime::getOffset()
(PHP 5 >= 5.3.0)
date_parse_from_format — Récupère les informations d'une date donnée suivant un format spécifique
$format
, string $date
)Retourne un tableau associatif contenant des informations détaillées sur une date donnée.
format
Format accepté par la fonction DateTime::createFromFormat().
date
Chaîne représentant la date.
Retourne un tableau associatif avec des informations détaillées sur la date donnée.
Exemple #1 Exemple avec date_parse_from_format()
<?php
$date = "6.1.2009 13:00+01:00";
print_r(date_parse_from_format("j.n.Y H:iP", $date));
?>
L'exemple ci-dessus va afficher :
Array
(
[year] => 2009
[month] => 1
[day] => 6
[hour] => 13
[minute] => 0
[second] => 0
[fraction] =>
[warning_count] => 0
[warnings] => Array
(
)
[error_count] => 0
[errors] => Array
(
)
[is_localtime] => 1
[zone_type] => 1
[zone] => -60
[is_dst] =>
)
(PHP 5 >= 5.2.0)
date_parse — Retourne un tableau associatif avec des informations détaillées sur une date donnée
$date
)
Retourne un tableau contenant des informations sur la date analysée en
cas de succès ou FALSE si une erreur survient.
Dans le cas où la fonction retourne une erreur, l'élément "errors" contiendra les messages d'erreur.
Exemple #1 Exemple avec date_parse()
<?php
print_r(date_parse("2006-12-12 10:00:00.5"));
?>
L'exemple ci-dessus va afficher :
Array
(
[year] => 2006
[month] => 12
[day] => 12
[hour] => 10
[minute] => 0
[second] => 0
[fraction] => 0.5
[warning_count] => 0
[warnings] => Array()
[error_count] => 0
[errors] => Array()
[is_localtime] =>
)
Cette fonction est un alias de : DateTime::sub()
(PHP 5 >= 5.1.2)
date_sun_info — Retourne un tableau avec les informations sur lever/coucher du soleil ainsi que le début et la fin de l'aube
$time
, float $latitude
, float $longitude
)
time
Timestamp.
latitude
Latitude en degrés.
longitude
Longitude en degrés.
Retourne un tableau en cas de succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec date_sun_info()
<?php
$sun_info = date_sun_info(strtotime("2006-12-12"), 31.7667, 35.2333);
foreach ($sun_info as $key => $val) {
echo "$key: " . date("H:i:s", $val) . "\n";
}
?>
L'exemple ci-dessus va afficher :
sunrise: 05:52:11 sunset: 15:41:21 transit: 10:46:46 civil_twilight_begin: 05:24:08 civil_twilight_end: 16:09:24 nautical_twilight_begin: 04:52:25 nautical_twilight_end: 16:41:06 astronomical_twilight_begin: 04:21:32 astronomical_twilight_end: 17:12:00
(PHP 5)
date_sunrise — Retourne l'heure de levé du soleil pour un jour et un endroit donnés
$timestamp
[, int $format = SUNFUNCS_RET_STRING
[, float $latitude = ini_get("date.default_latitude")
[, float $longitude = ini_get("date.default_longitude")
[, float $zenith = ini_get("date.sunrise_zenith")
[, float $gmt_offset = 0
]]]]] )
date_sunrise() retourne l'heure de levé du soleil pour un jour
(spécifié par le paramètre timestamp) et un endroit donnés.
timestamp
Le timestamp Unix du jour pour lequel l'heure de levé du soleil est donné.
format
| Constante | Description | Exemple |
|---|---|---|
| SUNFUNCS_RET_STRING | Retourne le résultat en tant que chaîne de caractères | 16:46 |
| SUNFUNCS_RET_DOUBLE | Retourne le résultat en tant que nombre décimal | 16.78243132 |
| SUNFUNCS_RET_TIMESTAMP | Retourne le résultat en tant qu'entier (timestamp) | 1095034606 |
latitude
Par défaut, c'est le Nord. Passez une valeur négative pour le Sud. Voir aussi date.default_latitude.
longitude
Par défaut, c'est l'Est. Passez une valeur négative pour l'Ouest. Voir aussi date.default_longitude.
zenith
Par défaut : date.sunrise_zenith
gmtoffset
Spécifié en heures.
Retourne l'heure de levé du soleil dans un format spécifié
en cas de succès ou FALSE si une erreur survient.
Chaque appel à une fonction date/heure générera un message de type
E_NOTICE si le fuseau horaire n'est pas valide,
et/ou un message de type E_STRICT
ou E_WARNING si vous
utilisez la configuration du système ou la variable d'environnement
TZ. Voir aussi date_default_timezone_set()
| Version | Description |
|---|---|
| 5.1.0 |
Émet un message de type |
Exemple #1 Exemple avec date_sunrise()
<?php
/* Calcul l'heure du levé du soleil pour Lisbonne, Portugal
Latitude: 38.4 North
Longitude: 9 West
Zenith ~= 90
offset: +1 GMT
*/
echo date("D M d Y"). ', sunrise time : ' .date_sunrise(time(), SUNFUNCS_RET_STRING, 38.4, -9, 90, 1);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Mon Dec 20 2004, sunrise time : 08:54
(PHP 5)
date_sunset — Retourne l'heure de coucher du soleil pour un jour et un endroit donnés
$timestamp
[, int $format = SUNFUNCS_RET_STRING
[, float $latitude = ini_get("date.default_latitude")
[, float $longitude = ini_get("date.default_longitude")
[, float $zenith = ini_get("date.sunset_zenith")
[, float $gmt_offset = 0
]]]]] )
date_sunset() retourne l'heure de couché du soleil pour
un jour (spécifié en tant que timestamp Unix) et un endroit donnés.
timestamp
Le timestamp Unix du jour pour lequel l'heure du
couché du soleil est donnée.
format
| Constante | Description | Exemple |
|---|---|---|
| SUNFUNCS_RET_STRING | Retourne le résultat sous la forme d'une chaîne de caractères | 16:46 |
| SUNFUNCS_RET_DOUBLE | Retourne le résultat sous la forme d'un nombre décimal | 16.78243132 |
| SUNFUNCS_RET_TIMESTAMP | Retourne le résultat sous la forme d'un entier (timestamp) | 1095034606 |
latitude
Par défaut, c'est le Nord. Passez une valeur négative pour le Sud. Voir aussi date.default_latitude.
longitude
Par défaut, c'est l'Est. Passez une valeur négative pour l'Ouest. Voir aussi date.default_longitude.
zenith
Par défaut : date.sunrise_zenith
gmtoffset
Spécifié en heures.
Chaque appel à une fonction date/heure générera un message de type
E_NOTICE si le fuseau horaire n'est pas valide,
et/ou un message de type E_STRICT
ou E_WARNING si vous
utilisez la configuration du système ou la variable d'environnement
TZ. Voir aussi date_default_timezone_set()
| Version | Description |
|---|---|
| 5.1.0 |
Émet un message de type |
Retourne l'heure de couché du soleil dans un format
spécifié ou FALSE si une erreur survient.
Exemple #1 Exemple avec date_sunset()
<?php
/* Calcul l'heure du couché du soleil pour Lisbonne, Portugal
Latitude: 38.4 North
Longitude: 9 West
Zenith ~= 90
offset: +1 GMT
*/
echo date("D M d Y"). ', sunset time : ' .date_sunset(time(), SUNFUNCS_RET_STRING, 38.4, -9, 90, 1);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Mon Dec 20 2004, sunset time : 18:13
Cette fonction est un alias de : DateTime::setTime()
Cette fonction est un alias de : DateTime::getTimestamp()
Cette fonction est un alias de : DateTime::setTimestamp()
Cette fonction est un alias de : DateTime::getTimezone()
Cette fonction est un alias de : DateTime::setTimezone()
(PHP 4, PHP 5)
date — Formate une date/heure locale
$format
[, int $timestamp = time()
] )
Retourne une date sous forme d'une chaîne, au format
donné par le paramètre format,
fournie par le paramètre timestamp
ou la date et l'heure courantes si aucun timestamp n'est fourni.
En d'autres termes, le paramètre timestamp
est optionnel et vaut par défaut la valeur de la fonction time().
format
Le format de la date désirée. Voir les options de formatage ci-dessous.
Il existe aussi de nombreuses
constantes de dates
qui peuvent être utilisées, ce qui fait que DATE_RSS
va remplacer le format "D, d M Y H:i:s".
Caractères pour le paramètre format |
Description | Exemple de valeurs retournées |
|---|---|---|
| Jour | --- | --- |
| d | Jour du mois, sur deux chiffres (avec un zéro initial) | 01 à 31 |
| D | Jour de la semaine, en trois lettres (et en anglais) | Mon à Sun |
| j | Jour du mois sans les zéros initiaux | 1 à 31 |
| l ('L' minuscule) | Jour de la semaine, textuel, version longue, en anglais | Sunday à Saturday |
| N | Représentation numérique ISO-8601 du jour de la semaine (ajouté en PHP 5.1.0) | 1 (pour Lundi) à 7 (pour Dimanche) |
| S | Suffixe ordinal d'un nombre pour le jour du mois, en anglais, sur deux lettres | st, nd, rd ou th. Fonctionne bien avec j |
| w | Jour de la semaine au format numérique | 0 (pour dimanche) à 6 (pour samedi) |
| z | Jour de l'année | 0 à 365 |
| Semaine | --- | --- |
| W | Numéro de semaine dans l'année ISO-8601, les semaines commencent le lundi (ajouté en PHP 4.1.0) | Exemple : 42 (la 42ème semaine de l'année) |
| Mois | --- | --- |
| F | Mois, textuel, version longue; en anglais, comme January ou December | January à December |
| m | Mois au format numérique, avec zéros initiaux | 01 à 12 |
| M | Mois, en trois lettres, en anglais | Jan à Dec |
| n | Mois sans les zéros initiaux | 1 à 12 |
| t | Nombre de jours dans le mois | 28 à 31 |
| Année | --- | --- |
| L | Est ce que l'année est bissextile | 1 si bissextile, 0 sinon. |
| o | L'année ISO-8601. C'est la même valeur que Y, excepté que si le numéro de la semaine ISO (W) appartient à l'année précédente ou suivante, cette année sera utilisé à la place. (ajouté en PHP 5.1.0) | Exemples : 1999 ou 2003 |
| Y | Année sur 4 chiffres | Exemples : 1999 ou 2003 |
| y | Année sur 2 chiffres | Exemples : 99 ou 03 |
| Heure | --- | --- |
| a | Ante meridiem et Post meridiem en minuscules | am ou pm |
| A | Ante meridiem et Post meridiem en majuscules | AM ou PM |
| B | Heure Internet Swatch | 000 à 999 |
| g | Heure, au format 12h, sans les zéros initiaux | 1 à 12 |
| G | Heure, au format 24h, sans les zéros initiaux | 0 à 23 |
| h | Heure, au format 12h, avec les zéros initiaux | 01 à 12 |
| H | Heure, au format 24h, avec les zéros initiaux | 00 à 23 |
| i | Minutes avec les zéros initiaux | 00 à 59 |
| s | Secondes, avec zéros initiaux | 00 à 59 |
| u | Microsecondes (ajouté en PHP 5.2.2) | Exemple : 654321 |
| Fuseau horaire | --- | --- |
| e | L'identifiant du fuseau horaire (ajouté en PHP 5.1.0) | Exemples : UTC, GMT, Atlantic/Azores |
| I (i majuscule) | L'heure d'été est activée ou pas | 1 si oui, 0 sinon. |
| O | Différence d'heures avec l'heure de Greenwich (GMT), exprimée en heures | Exemple : +0200 |
| P | Différence avec l'heure Greenwich (GMT) avec un deux-points entre les heures et les minutes (ajouté dans PHP 5.1.3) | Exemple : +02:00 |
| T | Abréviation du fuseau horaire | Exemples : EST, MDT ... |
| Z | Décalage horaire en secondes. Le décalage des zones à l'ouest de la zone UTC est négative, et à l'est, il est positif. | -43200 à 50400 |
| Date et Heure complète | --- | --- |
| c | Date au format ISO 8601 (ajouté en PHP 5) | 2004-02-12T15:19:21+00:00 |
| r | Format de date » RFC 2822 | Exemple : Thu, 21 Dec 2000 16:01:07 +0200 |
| U | Secondes depuis l'époque Unix (1er Janvier 1970, 0h00 00s GMT) | Voir aussi time() |
Les caractères non reconnus seront imprimés tels quel. "Z" retournera toujours 0 lorsqu'il est utilisé avec gmdate().
Note:
Sachant que cette fonction n'accepte que des entiers sous la forme de timestamp, le caractère u n'est utile que lors de l'utilisation de la fonction date_format() avec un timestamp utilisateur créé avec la fonction date_create().
timestamp
Le paramètre optionnel timestamp est un timestamp
Unix de type entier qui vaut par défaut l'heure courante locale si
le paramètre timestamp n'est pas fourni. En d'autres
termes, il vaut par défaut la valeur de la fonction time().
Retourne une date formatée. Si une valeur non-numérique est utilisée
dans le paramètre timestamp, FALSE sera
retourné et une erreur de niveau E_WARNING est émise.
Chaque appel à une fonction date/heure générera un message de type
E_NOTICE si le fuseau horaire n'est pas valide,
et/ou un message de type E_STRICT
ou E_WARNING si vous
utilisez la configuration du système ou la variable d'environnement
TZ. Voir aussi date_default_timezone_set()
| Version | Description |
|---|---|
| 5.1.0 | L'intervalle de validité d'un timestamp va généralement du Vendredi 13 Décembre 1901 20:45:54 GMT au Mardi 19 Janvier 2038 03:14:07 GMT. (Ces dates correspondent aux valeurs minimales et maximales des entiers 32 bits non-signés). Cependant, avant PHP 5.1.0, cette intervalle va du 01-01-1970 au 19-01-2038 sur quelques systèmes (e.g. Windows). |
| 5.1.0 |
Émet un message de type |
| 5.1.1 |
Il y a plusieurs constantes utiles
de formats date/heure standards qui peuvent être utilisées pour spécifier le paramètre
format.
|
Exemple #1 Exemple avec date()
<?php
// Définit le fuseau horaire par défaut à utiliser. Disponible depuis PHP 5.1
date_default_timezone_set('UTC');
// Affichage de quelque chose comme : Monday
echo date("l");
// Affichage de quelque chose comme : Monday 8th of August 2005 03:12:46 PM
echo date('l jS \of F Y h:i:s A');
// Affiche : July 1, 2000 is on a Saturday
echo "July 1, 2000 is on a " . date("l", mktime(0, 0, 0, 7, 1, 2000));
/* utilise les constantes dans le paramètre format */
// Affichage de quelque chose comme : Mon, 15 Aug 2005 15:12:46 UTC
echo date(DATE_RFC822);
// Affichage de quelque chose comme : 2000-07-01T00:00:00+00:00
echo date(DATE_ATOM, mktime(0, 0, 0, 7, 1, 2000));
?>
Vous pouvez faire afficher un caractère spécial dans la chaîne de format en le protégeant par un antislash. Si le caractère est lui-même une séquence incluant un antislash, vous devrez protéger aussi l'antislash.
Exemple #2 Protection des caractères dans la fonction date()
<?php
// Affichage de quelque chose comme : Wednesday the 15th
echo date('l \t\h\e jS');
?>
Il est possible d'utiliser date() et mktime() ensemble pour générer des dates dans le futur ou dans le passé.
Exemple #3 Exemple avec date() et mktime()
<?php
$tomorrow = mktime(0, 0, 0, date("m") , date("d")+1, date("Y"));
$lastmonth = mktime(0, 0, 0, date("m")-1, date("d"), date("Y"));
$nextyear = mktime(0, 0, 0, date("m"), date("d"), date("Y")+1);
?>
Note:
Cette méthode est plus sûre que simplement ajouter ou retrancher le nombre de secondes dans une journée ou un mois à un timestamp, à cause des heures d'hiver et d'été.
Voici maintenant quelques exemples de formatage avec date(). Notez que vous devriez échapper tous les autres caractères, car s'ils ont une signification spéciale, ils risquent de produire des effets secondaires indésirables. Notez aussi que les versions futures de PHP peuvent attribuer une signification à des lettres qui sont actuellement inertes. Lorsque vous échappez les caractères, pensez à utiliser des guillemets simples, pour que les séquences \n ne deviennent pas des nouvelles lignes.
Exemple #4 Exemple avec date()
<?php
// Aujourd'hui, le 12 Mars 2001, 5:16:18 pm, Fuseau horaire
// Mountain Standard Time (MST)
$today = date("F j, Y, g:i a"); // March 10, 2001, 5:16 pm
$today = date("m.d.y"); // 03.10.01
$today = date("j, n, Y"); // 10, 3, 2001
$today = date("Ymd"); // 20010310
$today = date('h-i-s, j-m-y, it is w Day'); // 05-16-18, 10-03-01, 1631 1618 6 Satpm01
$today = date('\i\t \i\s \t\h\e jS \d\a\y.'); // It is the 10th day (10ème jour du mois).
$today = date("D M j G:i:s T Y"); // Sat Mar 10 17:16:18 MST 2001
$today = date('H:m:s \m \e\s\t\ \l\e\ \m\o\i\s'); // 17:03:18 m est le mois
$today = date("H:i:s"); // 17:16:18
?>
Pour formater des dates dans d'autres langues, utilisez les fonctions setlocale() et strftime() au lieu de la fonction date().
Note:
Pour générer un timestamp à partir d'une représentation de date, vous pouvez utiliser la fonction strtotime(). De plus, certaines bases de données disposent de fonctions pour convertir leurs propres formats de date en timestamp (par exemple, MySQL et sa fonction » UNIX_TIMESTAMP()).
Un timestamp représentant le début de la requête est disponible dans la variable $_SERVER['REQUEST_TIME'] depuis PHP 5.1.
(PHP 4, PHP 5)
getdate — Retourne la date/heure
$timestamp = time()
] )
Retourne un tableau associatif contenant les informations
de date et d'heure du timestamp timestamp
lorsqu'il est fourni, sinon, le timestamp de la date/heure courante locale.
timestamp
Le paramètre optionnel timestamp est un timestamp
Unix de type entier qui vaut par défaut l'heure courante locale si
le paramètre timestamp n'est pas fourni. En d'autres
termes, il vaut par défaut la valeur de la fonction time().
Retourne un tableau associatif contenant les informations
de date et d'heure du timestamp timestamp.
Les éléments du tableau associatif retourné sont les suivants :
| Clé | Description | Exemple de valeur retournée |
|---|---|---|
| "seconds" | Représentation numérique des secondes | 0 à 59 |
| "minutes" | Représentation numérique des minutes | 0 à 59 |
| "hours" | Représentation numérique des heures | 0 à 23 |
| "mday" | Représentation numérique du jour du mois courant | 1 à 31 |
| "wday" | Représentation numérique du jour de la semaine courante | 0 (pour Dimanche) à 6 (pour Samedi) |
| "mon" | Représentation numérique du mois | 1 à 12 |
| "year" | Année, sur 4 chiffres | Exemples : 1999 ou 2003 |
| "yday" | Représentation numérique du jour de l'année | 0 à 365 |
| "weekday" | Version texte du jour de la semaine | Sunday à Saturday |
| "month" | Version texte du mois, comme January ou March | January à December |
| 0 | Nombre de secondes depuis l'époque Unix, similaire à la valeur retournée par la fonction time() et utilisée par date(). | Dépend du système, typiquement de -2147483648 à 2147483647. |
Exemple #1 Exemple avec getdate()
<?php
$today = getdate();
print_r($today);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[seconds] => 40
[minutes] => 58
[hours] => 21
[mday] => 17
[wday] => 2
[mon] => 6
[year] => 2003
[yday] => 167
[weekday] => Tuesday
[month] => June
[0] => 1055901520
)
(PHP 4, PHP 5)
gettimeofday — Retourne l'heure actuelle
C'est une interface avec gettimeofday(2). Elle retourne un tableau associatif qui contient les informations retournées par le système.
return_float
Lorsque défini à TRUE, un nombre décimal est retourné à la place d'un tableau.
Par défaut, un tableau est retourné. Si le paramètre return_float
est défini, alors un nombre décimal sera retourné.
Clés du tableau :
| Version | Description |
|---|---|
| 5.1.0 |
Le paramètre return_float a été ajouté.
|
Exemple #1 Exemple avec gettimeofday()
<?php
print_r(gettimeofday());
echo gettimeofday(true);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array ( [sec] => 1073504408 [usec] => 238215 [minuteswest] => 0 [dsttime] => 1 ) 1073504408.23910
(PHP 4, PHP 5)
gmdate — Formate une date/heure GMT/CUT
$format
[, int $timestamp = time()
] )gmdate() est identique à la fonction date(), hormis le fait que le temps retourné est GMT (Greenwich Mean Time).
format
Le format de la date en sortie. Voir les options de formatage pour la fonction date().
timestamp
Le paramètre optionnel timestamp est un timestamp
Unix de type entier qui vaut par défaut l'heure courante locale si
le paramètre timestamp n'est pas fourni. En d'autres
termes, il vaut par défaut la valeur de la fonction time().
Retourne une date formatée. Si une valeur non numérique est utilisée pour le
paramètre timestamp, FALSE est retourné et une erreur
de niveau E_WARNING sera émise.
| Version | Description |
|---|---|
| 5.1.0 | L'intervalle de validité d'un timestamp est typiquement depuis le Vendredi 13 Décembre 1901 20:45:54 GMT au 19 Janvier 2038 03:14:07 GMT. (ce qui correspond aux valeurs minimales et maximales d'un entier 32 bits signé). Cependant, avant PHP 5.1.0, cet intervalle était limité de 01-01-1970 à 19-01-2038 sous quelques systèmes (e.g. Windows). |
| 5.1.1 |
Il y a quelques constants utiles
pour les formats standards date/heure qui peuvent être utilisées dans le paramètre
format.
|
Exemple #1 Exemple avec gmdate()
Lorsque cette fonction est exécutée en Finlande (GMT +0200), la première ligne ci-dessous affichera "Jan 01 1998 00:00:00", tandis que la seconde affichera "Dec 31 1997 22:00:00".
<?php
echo date("M d Y H:i:s", mktime(0, 0, 0, 1, 1, 1998));
echo gmdate("M d Y H:i:s", mktime(0, 0, 0, 1, 1, 1998));
?>
(PHP 4, PHP 5)
gmmktime — Retourne le timestamp UNIX d'une date GMT
$hour = gmdate("H")
[, int $minute = gmdate("i")
[, int $second = gmdate("s")
[, int $month = gmdate("n")
[, int $day = gmdate("j")
[, int $year = gmdate("Y")
[, int $is_dst = -1
]]]]]]] )Identique à la fonction mktime() excepté le fait que les paramètres passés sont GMT. gmmktime() utilise en interne la fonction mktime(), donc, seuls les temps valides dans la zone locale dérivée peuvent être utilisés.
Comme mktime(), les arguments restants peuvent être ignorés. Ils prendront alors leurs valeurs GMT actuelles.
hour
Le nombre d'heures depuis le début de la journée fixée par les paramètres
month, day et year.
Les valeurs négatives font références aux heures avant minuit du jour en question.
Les valeurs supérieures à 23 font références aux heures associées pour le(s)
jour(s) suivant(s).
minute
Le nombre de minutes depuis le début de l'heure hour.
Les valeurs négatives font références aux minutes de l'heure précédente.
Les valeurs supérieures à 59 font références aux minutes associées
pour l'(les) heure(s) suivante(s).
second
Le nombre de secondes depuis le début de la minute minute.
Les valeurs négatives font références aux secondes de la minute précédente.
Les valeurs supérieures à 59 font références aux secondes associées à
la(les) minute(s) suivante(s).
month
Le nombre de mois depuis la fin de l'année précédente. Les valeurs comprises entre 1 et 12 font références aux mois du calendrier normal de l'année en question. Les valeurs inférieures à 1 (y compris les valeurs négatives) font références aux mois de l'année précédente dans l'ordre inverse, aussi, 0 correspond à décembre, -1 à novembre, etc. Les valeurs supérieures à 12 font références au mois correspondant dans l'(les) année(s) suivante(s).
day
Le nombre de jours depuis la fin du mois précédent. Les valeurs comprises entre 1 et 28, 29, 30, 31 (suivant le mois) font références aux jours normaux dans le mois courant. Les valeurs inférieures à 1 (y compris les valeurs négatives) font références aux jours du mois précédent, aussi, 0 correspond au dernier jour du mois précédent, -1, le jour d'avant, etc. Les valeurs supérieures au nombre de jours du mois courant font références aux jours correspondants du(des) mois suivant(s).
year
L'année
is_dst
Les paramètres représentent toujours une date GMT donc, le paramètre
is_dst n'influence pas le résultat.
Retourne un timestamp Unix de type entier.
| Version | Description |
|---|---|
| 5.1.0 |
Depuis PHP 5.1.0, le paramètre is_dst est devenu
obsolète. Comme résultat, le nouveau gestionnaire de fuseau horaire doit être utilisé
à la place.
|
Exemple #1 Exemple avec gmmktime()
<?php
// Affiche : July 1, 2000 is on a Friday
echo "July 1, 2000 is on a " . date("l", gmmktime(0, 0, 0, 7, 1, 2000));
?>
(PHP 4, PHP 5)
gmstrftime — Formate une date/heure GMT/CUT en fonction de la configuration locale
$format
[, int $timestamp = time()
] )gmstrftime() se comporte exactement comme strftime() hormis le fait que l'heure utilisée est celle de Greenwich (Greenwich Mean Time, GMT). Par exemple, dans la zone Eastern Standard Time (est des USA) est GMT -0500, la première ligne de l'exemple ci-dessous affiche "Dec 31 1998 20:00:00", tandis que la seconde affiche "Jan 01 1999 01:00:00".
format
Voir la description de la fonction strftime().
timestamp
Le paramètre optionnel timestamp est un timestamp
Unix de type entier qui vaut par défaut l'heure courante locale si
le paramètre timestamp n'est pas fourni. En d'autres
termes, il vaut par défaut la valeur de la fonction time().
Retourne une chaîne de caractères formatée suivant le format donné par le
paramètre timestamp ou la date courante
si aucun paramètre timestamp n'est fourni.
Les noms des mois, des jours de la semaine et des autres chaînes
dépendant d'une localisation donnée, respectent la localisation
courante définie par la fonction setlocale().
Exemple #1 Exemple avec gmstrftime()
<?php
setlocale(LC_TIME, 'en_US');
echo strftime("%b %d %Y %H:%M:%S", mktime(20, 0, 0, 12, 31, 98)) . "\n";
echo gmstrftime("%b %d %Y %H:%M:%S", mktime(20, 0, 0, 12, 31, 98)) . "\n";
?>
(PHP 5)
idate — Formate une date/heure locale en tant qu'entier
$format
[, int $timestamp = time()
] )
idate() retourne une nombre formaté avec le
format format et représentant le timestamp
timestamp ou l'heure courant si
timestamp est omis.
En d'autres termes, le paramètre timestamp est optionnel
et la valeur par défaut est la valeur retournée par la fonction time().
À l'inverse de la fonction date(), idate()
accepte juste un caractère comme paramètre format.
format
Caractères de format |
Description |
|---|---|
| B | Temps Internet Swatch Beat |
| d | Le jour du mois |
| h | Heure (format 12 heures) |
| H | Heure (format 24 heures) |
| i | Minutes |
| I(i, en majuscule) | Retourne 1 si l'heure d'été est activée, 0 sinon |
| L(l, en majuscule) | Retourne 1 pour une année bissextile, 0 sinon |
| m | Numéro du mois |
| s | Secondes |
| t | Jour du mois courant |
| U | Secondes depuis l'époque Unix - 1 Janvier 1970 00:00:00 UTC - c'est la même chose que la fonction time() |
| w | Jour de la semaine (0 pour Dimanche) |
| W | Le numéro de semaine de l'année ; selon l'ISO-8601, les semaines débutent le Lundi |
| y | Année sur 1 ou 2 chiffres, voir la note plus bas |
| Y | Année sur 4 chiffres |
| z | Jour de l'année |
| Z | Décalage horaire, en secondes |
timestamp
Le paramètre optionnel timestamp est un timestamp
Unix de type entier qui vaut par défaut l'heure courante locale si
le paramètre timestamp n'est pas fourni. En d'autres
termes, il vaut par défaut la valeur de la fonction time().
Retourne un entier.
Sachant que idate() retourne toujours un entier et qu'il ne peut commencer par 0, idate() peut retourner moins de chiffres que ce dont on pourrait espérer. Voir l'exemple ci-dessous.
Chaque appel à une fonction date/heure générera un message de type
E_NOTICE si le fuseau horaire n'est pas valide,
et/ou un message de type E_STRICT
ou E_WARNING si vous
utilisez la configuration du système ou la variable d'environnement
TZ. Voir aussi date_default_timezone_set()
| Version | Description |
|---|---|
| 5.1.0 |
Émet un message de type |
Exemple #1 Exemple avec idate()
<?php
$timestamp = strtotime('1st January 2004'); //1072915200
// ceci affiche l'année sur deux chiffres
// néanmoins, vu que ce chiffre va commencer par "0",
// seul "4" sera affiché
echo idate('y', $timestamp);
?>
(PHP 4, PHP 5)
localtime — Récupère l'heure locale
$timestamp = time()
[, bool $is_associative = false
]] )localtime() retourne un tableau identique à la structure retournée par la fonction C localtime.
timestamp
Le paramètre optionnel timestamp est un timestamp
Unix de type entier qui vaut par défaut l'heure courante locale si
le paramètre timestamp n'est pas fourni. En d'autres
termes, il vaut par défaut la valeur de la fonction time().
is_associative
si défini à FALSE ou ignoré, force localtime()
à retourner un tableau à index numérique. S'il est mis à TRUE,
localtime() retourne un tableau associatif,
avec tous les éléments de la structure C, accessible avec les clés.
Les noms des différentes clés du tableau associatif sont les suivants :
Chaque appel à une fonction date/heure générera un message de type
E_NOTICE si le fuseau horaire n'est pas valide,
et/ou un message de type E_STRICT
ou E_WARNING si vous
utilisez la configuration du système ou la variable d'environnement
TZ. Voir aussi date_default_timezone_set()
| Version | Description |
|---|---|
| 5.1.0 |
Émet un message de type |
Exemple #1 Exemple avec localtime()
<?php
$localtime = localtime();
$localtime_assoc = localtime(time(), true);
print_r($localtime);
print_r($localtime_assoc);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[0] => 24
[1] => 3
[2] => 19
[3] => 3
[4] => 3
[5] => 105
[6] => 0
[7] => 92
[8] => 1
)
Array
(
[tm_sec] => 24
[tm_min] => 3
[tm_hour] => 19
[tm_mday] => 3
[tm_mon] => 3
[tm_year] => 105
[tm_wday] => 0
[tm_yday] => 92
[tm_isdst] => 1
)
(PHP 4, PHP 5)
microtime — Retourne le timestamp UNIX actuel avec les microsecondes
microtime() retourne le timestamp Unix, avec les microsecondes. Cette fonction est uniquement disponible sur les systèmes qui supportent la fonction gettimeofday().
get_as_float
Si utilisé et défini à TRUE, microtime() retournera
un nombre à virgule flottante au lieu d'une chaîne de caractères, tel que décrit
dans la section des valeurs retournées ci-dessous.
Par défaut, microtime() retourne une chaîne de caractères au format "msec sec", où sec est le temps courant mesuré en nombre de secondes depuis l'époque Unix (1 Janvier 1970, 00:00:00 GMT), et msec est le nombre de microsecondes qui se sont écoulées depuis sec exprimé en secondes.
Si get_as_float est défini à TRUE, alors
microtime() retourne un nombre à virgule flottante,
qui représente le temps courant, en secondes, depuis l'époque Unix, précis
à la microseconde près.
| Version | Description |
|---|---|
| 5.0.0 |
Le paramètre get_as_float a été ajouté.
|
Exemple #1 Durée d'exécution d'un script avec la fonction microtime()
<?php
/**
* Fonction simple identique à celle en PHP 5 qui va suivre
*/
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$time_start = microtime_float();
// Attend pendant un moment
usleep(100);
$time_end = microtime_float();
$time = $time_end - $time_start;
echo "Ne rien faire pendant $time secondes\n";
?>
Exemple #2 Durée d'exécution d'un script en PHP 5
<?php
$time_start = microtime(true);
// Sleep for a while
usleep(100);
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "Did nothing in $time seconds\n";
?>
(PHP 4, PHP 5)
mktime — Retourne le timestamp UNIX d'une date
$hour = date("H")
[, int $minute = date("i")
[, int $second = date("s")
[, int $month = date("n")
[, int $day = date("j")
[, int $year = date("Y")
[, int $is_dst = -1
]]]]]]] )mktime() retourne un timestamp UNIX correspondant aux arguments fournis. Ce timestamp est un entier long, contenant le nombre de secondes entre le début de l'époque UNIX (1er Janvier 1970 00:00:00 GMT) et le temps spécifié.
Les arguments peuvent être omis, de droite à gauche, et tous les arguments manquants sont utilisés avec la valeur courante de l'heure et du jour.
Note:
Depuis PHP 5.1, lorsqu'appelée sans argument, la fonction mktime() émet une alerte de type
E_STRICT: utilisez la fonction time() à la place.
hour
Le nombre d'heures depuis le début de la journée fixée par les paramètres
month, day et year.
Les valeurs négatives font références aux heures avant minuit du jour en question.
Les valeurs supérieures à 23 font références aux heures associées pour le(s)
jour(s) suivant(s).
minute
Le nombre de minutes depuis le début de l'heure hour.
Les valeurs négatives font références aux minutes de l'heure précédente.
Les valeurs supérieures à 59 font références aux minutes associées
pour l'(les) heure(s) suivante(s).
second
Le nombre de secondes depuis le début de la minute minute.
Les valeurs négatives font références aux secondes de la minute précédente.
Les valeurs supérieures à 59 font références aux secondes associées à
la(les) minute(s) suivante(s).
month
Le nombre de mois depuis la fin de l'année précédente. Les valeurs comprises entre 1 et 12 font références aux mois du calendrier normal de l'année en question. Les valeurs inférieures à 1 (y compris les valeurs négatives) font références aux mois de l'année précédente dans l'ordre inverse, aussi, 0 correspond à décembre, -1 à novembre, etc. Les valeurs supérieures à 12 font références au mois correspondant dans l'(les) année(s) suivante(s).
day
Le nombre de jours depuis la fin du mois précédent. Les valeurs comprises entre 1 et 28, 29, 30, 31 (suivant le mois) font références aux jours normaux dans le mois courant. Les valeurs inférieures à 1 (y compris les valeurs négatives) font références aux jours du mois précédent, aussi, 0 correspond au dernier jour du mois précédent, -1, le jour d'avant, etc. Les valeurs supérieures au nombre de jours du mois courant font références aux jours correspondants du(des) mois suivant(s).
year
L'année, peut être sur deux ou quatre chiffres, avec des valeurs
allant de 0 à 69, correspondant au valeur 2000 à 2069 et 70 à 100,
correspondant au valeur 1970 à 2000. Sur les systèmes où time_t
un entier signé sur 32bits, ce qui est le plus courant de nos jours,
la période valide pour year est
quelque part près de 1901 et 2038. Cependant, avant PHP 5.1.0,
cette intervalle était limitée de 1970 à 2038 sur quelques systèmes
(i.e. Windows).
is_dst
Ce paramètre peut être mis à 1 si l'heure d'hiver est appliquée (DST),
0 si elle ne l'est pas, et -1 (par défaut) si on ne sait pas.
Si l'on ne sait pas, PHP tente de le traiter lui-même.
Ceci peut occasionner des résultats inattendus (mais néanmoins correct).
Quelques temps sont invalides si DST est activé sur les systèmes où
PHP fonctionne ou is_dist est défini à 1.
Si DST est activé e.g. 2:00, tous les temps entre 2:00 et 3:00 sont invalides
et la fonction mktime() retourne une valeur indéfinie
(généralement une valeur négative). Quelques systèmes (e.g. Solaris 8)
activent DST à minuit, donc, le temps 0:30 du jour lorsque DST est activé
est évalué à 23:30 du jour précédent.
Note:
Depuis PHP 5.1.0, ce paramètre est obsolète. Comme résultat, le nouveau gestionnaire de fuseau horaire doit être utilisé à la place.
mktime() retourne un timestamp Unix des arguments donnés.
Si les arguments ne sont pas valides, la fonction retournera FALSE (avant
PHP 5.1, elle retournait -1).
Chaque appel à une fonction date/heure générera un message de type
E_NOTICE si le fuseau horaire n'est pas valide,
et/ou un message de type E_STRICT
ou E_WARNING si vous
utilisez la configuration du système ou la variable d'environnement
TZ. Voir aussi date_default_timezone_set()
| Version | Description |
|---|---|
| 5.3.0 |
mktime() lance maintenant une alerte de type
E_DEPRECATED si le paramètre
is_dst est utilisé.
|
| 5.1.0 |
Le paramètre is_dst est obsolète. Fait que la fonction
retourne FALSE en cas d'erreur, au lieu de -1.
La fonction a été modifiée pour accepter la valeur zéro comme
année, mois ou bien jour.
|
| 5.1.0 |
Lorsqu'appelée sans argument, la fonction mktime() émet
une alerte de type E_STRICT. Utilisez la fonction
time() à la place.
|
| 5.1.0 |
Émet un message de type |
Exemple #1 Exemple simple avec mktime()
<?php
// Configuration du fuseau horaire. Disponible depuis PHP 5.1
date_default_timezone_set('UTC');
// Affiche : July 1, 2000 est un Saturday
echo "July 1, 2000 est un " . date("l", mktime(0, 0, 0, 7, 1, 2000));
// Affiche quelque chose comme : 2006-04-05T01:02:03+00:00
echo date('c', mktime(1, 2, 3, 4, 5, 2006));
?>
Exemple #2 Exemple avec mktime()
mktime() est pratique pour faire des calculs de dates et des validations, car elle va automatiquement corriger les valeurs invalides. Par exemple, toutes les lignes suivantes vont retourner la même date : "Jan-01-1998".
<?php
echo date("M-d-Y", mktime(0, 0, 0, 12, 32, 1997));
echo date("M-d-Y", mktime(0, 0, 0, 13, 1, 1997));
echo date("M-d-Y", mktime(0, 0, 0, 1, 1, 1998));
echo date("M-d-Y", mktime(0, 0, 0, 1, 1, 98));
?>
Exemple #3 Dernier jour d'un mois
Le dernier jour d'un mois peut être décrit comme le jour "0" du mois suivant, et non pas le jour -1. Les deux exemples suivants vont donner : "Le dernier jour de Février 2000 est: 29".
<?php
$lastday = mktime(0, 0, 0, 3, 0, 2000);
echo strftime("Le dernier jour de Fevrier 2000 est : %d", $lastday);
$lastday = mktime(0, 0, 0, 4, -31, 2000);
echo strftime("Le dernier jour de Fevrier 2000 est : %d", $lastday);
?>
Avant PHP 5.1.0, les valeurs négatives des timestamp ne sont pas supportées sous toutes les versions actuelles de Microsoft Windows. De ce fait, l'intervalle valide pour les années est de 1970 à 2038, inclus.
(PHP 4, PHP 5)
strftime — Formate une date/heure locale avec la configuration locale
$format
[, int $timestamp = time()
] )Formate une date et/ou une heure suivant la localisation locale. Les noms des mois, des jours de la semaine mais aussi d'autres chaînes dépendant de la location, respecteront la localisation courante définie par la fonction setlocale().
Tous les caractères modificateurs ne sont pas toujours supportés par toutes les bibliothèques C. Dans ce cas, ils ne seront pas supportés par PHP non plus. De plus, toutes les plates-formes ne supportent pas les timestamps négatifs, et vos dates pourraient être limitées par le début de l'époque Unix. Cela signifie que %e, %T, %R et %D (et peut être d'autres) et les dates antérieures au 1er Janvier 1970 ne fonctionneront pas sous Windows, sur certaines distributions de Linux, et sur certains systèmes d'exploitation. Pour Windows, une liste complète des options de conversion est disponible sur le » site de MSDN.
format
format |
Description | Exemple de valeurs retournées |
|---|---|---|
| Jour | --- | --- |
| %a | Nom abrégé du jour de la semaine | De Sun à Sat |
| %A | Nom complet du jour de la semaine | De Sunday à Saturday |
| %d | Jour du mois en numérique, sur 2 chiffres (avec le zéro initial) | De 01 à 31 |
| %e | Jour du mois, avec un espace précédant le premier chiffre. L'implémentation Windows est différente, voyez après pour plus d'informations. | De 1 à 31 |
| %j | Jour de l'année, sur 3 chiffres avec un zéro initial | 001 à 366 |
| %u | Représentation ISO-8601 du jour de la semaine | De 1 (pour Lundi) à 7 (pour Dimanche) |
| %w | Représentation numérique du jour de la semaine | De 0 (pour Dimanche) à 6 (pour Samedi) |
| Semaine | --- | --- |
| %U | Numéro de la semaine de l'année donnée, en commençant par le premier Lundi comme première semaine | 13 (pour la 13ème semaine pleine de l'année) |
| %V | Numéro de la semaine de l'année, suivant la norme ISO-8601:1988, en commençant comme première semaine, la semaine de l'année contenant au moins 4 jours, et où Lundi est le début de la semaine | De 01 à 53 (où 53 compte comme semaine de chevauchement) |
| %W | Une représentation numérique de la semaine de l'année, en commençant par le premier Lundi de la première semaine | 46 (pour la 46ème semaine de la semaine commençant par un Lundi) |
| Mois | --- | --- |
| %b | Nom du mois, abrégé, suivant la locale | De Jan à Dec |
| %B | Nom complet du mois, suivant la locale | De January à December |
| %h | Nom du mois abrégé, suivant la locale (alias de %b) | De Jan à Dec |
| %m | Mois, sur 2 chiffres | De 01 (pour Janvier) à 12 (pour Décembre) |
| Année | --- | --- |
| %C | Représentation, sur 2 chiffres, du siècle (année divisée par 100, réduit à un entier) | 19 pour le 20ème siècle |
| %g | Représentation, sur 2 chiffres, de l'année, compatible avec les standards ISO-8601:1988 (voyez %V) | Exemple : 09 pour la semaine du 6 janvier 2009 |
| %G | La version complète à quatre chiffres de %g | Exemple : 2008 pour la semaine du 3 janvier 2009 |
| %y | L'année, sur 2 chiffres | Exemple : 09 pour 2009, 79 pour 1979 |
| %Y | L'année, sur 4 chiffres | Exemple : 2038 |
| Heure | --- | --- |
| %H | L'heure, sur 2 chiffres, au format 24 heures | De 00 à 23 |
| %I | Heure, sur 2 chiffres, au format 12 heures | De 01 à 12 |
| %l ('L' minuscule) | Heure, au format 12 heures, avec un espace précédant de complétion pour les heures sur un chiffre | De 1 à 12 |
| %M | Minute, sur 2 chiffres | De 00 à 59 |
| %p | 'AM' ou 'PM', en majuscule, basé sur l'heure fournie | Exemple : AM pour 00:31, PM pour 22:23 |
| %P | 'am' ou 'pm', en minuscule, basé sur l'heure fournie | Exemple : am pour 00:31, pm pour 22:23 |
| %r | Identique à "%I:%M:%S %p" | Exemple : 09:34:17 PM pour 21:34:17 |
| %R | Identique à "%H:%M" | Exemple : 00:35 pour 12:35 AM, 16:44 pour 4:44 PM |
| %S | Seconde, sur 2 chiffres | De 00 à 59 |
| %T | Identique à "%H:%M:%S" | Exemple : 21:34:17 pour 09:34:17 PM |
| %X | Représentation de l'heure, basée sur la locale, sans la date | Exemple : 03:59:16 ou 15:59:16 |
| %z | Soit le décalage horaire depuis UTC, ou son abréviation (suivant le système d'exploitation) | Exemple : -0500 ou EST pour l'heure de l'Est |
| %Z | Le décalage horaire ou son abréviation NON fournie par %z (suivant le système d'exploitation) | Exemple : -0500 ou EST pour l'heure de l'Est |
| L'heure et la date | --- | --- |
| %c | Date et heure préférées, basées sur la locale | Exemple : Tue Feb 5 00:45:10 2009 pour le 5 Février 2009 à 12:45:10 AM |
| %D | Identique à "%m/%d/%y" | Exemple : 02/05/09 pour le 5 Février 2009 |
| %F | Identique à "%Y-%m-%d" (utilisé habituellement par les bases de données) | Exemple : 2009-02-05 pour le 5 février 2009 |
| %s | Timestamp de l'époque Unix (identique à la fonction time()) | Exemple : 305815200 pour le 10 Septembre 1979 08:40:00 AM |
| %x | Représentation préférée de la date, basée sur la locale, sans l'heure | Exemple : 02/05/09 pour le 5 Février 2009 |
| Divers | --- | --- |
| %n | Une nouvelle ligne ("\n") | --- |
| %t | Une tabulation ("\t") | --- |
| %% | Le caractère de pourcentage ("%") | --- |
La longueur maximale de ce paramètre est de 1023 caractères.
Contrairement à la norme ISO-9899:1999, Sun Solaris commence avec le Dimanche à 1. Aussi, le format %u ne fonctionnera pas tel que décrit dans ce manuel.
Windows seulement: Le modificateur %e n'est pas supporté sous Windows. Pour calculer la valeur, le modificateur %#d peut être utilisé à la place. L'exemple d'après illustre la manière d'écrire un code cross-plateforme.
Mac OS X uniquement : Le modificateur %P n'est pas supporté sous l'implémentation de Mac OS X de cette fonction.
timestamp
Le paramètre optionnel timestamp est un timestamp
Unix de type entier qui vaut par défaut l'heure courante locale si
le paramètre timestamp n'est pas fourni. En d'autres
termes, il vaut par défaut la valeur de la fonction time().
Retourne une chaîne de caractères formatée suivant le paramètre format
donné, en utilisant le paramètre timestamp ou la date locale
courante si aucun timestamp n'est fourni. Les noms des mois, des jours de la
semaine mais aussi d'autres chaînes dépendant de la location, respecteront
la localisation courante définie par la fonction setlocale().
Chaque appel à une fonction date/heure générera un message de type
E_NOTICE si le fuseau horaire n'est pas valide,
et/ou un message de type E_STRICT
ou E_WARNING si vous
utilisez la configuration du système ou la variable d'environnement
TZ. Voir aussi date_default_timezone_set()
Vu que la sortie dépend de la bibliothèque C sous-jacente, quelques
spécificateurs de conversion ne sont pas supportés. Sous Windows,
le fait de fournir un spécificateur de conversion inconnu retournera
5 messages de niveau E_WARNING et retournera FALSE
au final. Sous d'autres systèmes d'exploitation, vous ne recevrez aucun
message de niveau E_WARNING et la sortie contiendra les
spécificateurs non convertis.
| Version | Description |
|---|---|
| 5.1.0 |
Émet un message de type |
Cet exemple ne fonctionnera que si vous avez les locales respectives installées sur votre système.
Exemple #1 Exemple avec strftime()
<?php
setlocale(LC_TIME, "C");
echo strftime("%A");
setlocale(LC_TIME, "fi_FI");
echo strftime(" in Finnish is %A,");
setlocale(LC_TIME, "fr_FR");
echo strftime(" in French %A and");
setlocale(LC_TIME, "de_DE");
echo strftime(" in German %A.\n");
?>
Exemple #2 Exemple au format de date ISO 8601:1988
<?php
/* December 2002 / January 2003
ISOWk M Tu W Thu F Sa Su
----- ----------------------------
51 16 17 18 19 20 21 22
52 23 24 25 26 27 28 29
1 30 31 1 2 3 4 5
2 6 7 8 9 10 11 12
3 13 14 15 16 17 18 19 */
// Affiche : 12/28/2002 - %V,%G,%Y = 52,2002,2002
echo "12/28/2002 - %V,%G,%Y = " . strftime("%V,%G,%Y", strtotime("12/28/2002")) . "\n";
// Affiche : 12/30/2002 - %V,%G,%Y = 1,2003,2002
echo "12/30/2002 - %V,%G,%Y = " . strftime("%V,%G,%Y", strtotime("12/30/2002")) . "\n";
// Affiche : 1/3/2003 - %V,%G,%Y = 1,2003,2003
echo "1/3/2003 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/3/2003")) . "\n";
// Affiche : 1/10/2003 - %V,%G,%Y = 2,2003,2003
echo "1/10/2003 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/10/2003")) . "\n";
/* December 2004 / January 2005
ISOWk M Tu W Thu F Sa Su
----- ----------------------------
51 13 14 15 16 17 18 19
52 20 21 22 23 24 25 26
53 27 28 29 30 31 1 2
1 3 4 5 6 7 8 9
2 10 11 12 13 14 15 16 */
// Affiche : 12/23/2004 - %V,%G,%Y = 52,2004,2004
echo "12/23/2004 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("12/23/2004")) . "\n";
// Affiche : 12/31/2004 - %V,%G,%Y = 53,2004,2004
echo "12/31/2004 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("12/31/2004")) . "\n";
// Affiche : 1/2/2005 - %V,%G,%Y = 53,2004,2005
echo "1/2/2005 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/2/2005")) . "\n";
// Affiche : 1/3/2005 - %V,%G,%Y = 1,2005,2005
echo "1/3/2005 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/3/2005")) . "\n";
?>
Exemple #3 %e fonctionnant sous toute plateforme
<?php
// Jan 1 : résultats dans : '%e%1%' (%%, e, %%, %e, %%)
$format = '%%e%%%e%%';
// Vérifie sous Windows, pour trouver et remplacer le modificateur %e
// correctement
if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
$format = preg_replace('#(?<!%)((?:%%)*)%e#', '\1%#d', $format);
}
echo strftime($format);
?>
Exemple #4 Affiche tous les formats connus ou non.
<?php
// Décrit les formats.
$strftimeFormats = array(
'A' => 'Une représentation textuelle complète du jour',
'B' => 'Nom du mois complet, basé sur la locale',
'C' => 'Représentation sur 2 chiffres de l\'année (année, divisée par 100, tronquée en entier)',
'D' => 'Identique à "%m/%d/%y"',
'E' => '',
'F' => 'Identique à "%Y-%m-%d"',
'G' => 'La version complète, sur 4 chiffres de %g',
'H' => 'Une représentation sur 2 chiffres de l\'heure au format 24-heures',
'I' => 'Une représentation sur 2 chiffres de l\'heure au format 12-heures',
'J' => '',
'K' => '',
'L' => '',
'M' => 'Une représentation sur 2 chiffres des minutes',
'N' => '',
'O' => '',
'P' => '"am" ou "pm" (en minuscule) basé sur l\'heure courante',
'Q' => '',
'R' => 'Identique à "%H:%M"',
'S' => 'Une représentation sur 2 chiffres des secondes',
'T' => 'Identique à "%H:%M:%S"',
'U' => 'Numéro de la semaine pour l\'année courante, en commençant par le premier Dimanche comme première semaine',
'V' => 'ISO-8601:1988 numéro de la semaine de l\'année courante, commençant par la première semaine de l\'année avec au moins 4 jours de semaine, avec le Lundi comme début de semaine',
'W' => 'Une représentation numérique de la semaine de l\'année, en commençant par le premier Lundi comme première semaine',
'X' => 'Représentation préférée pour l\'heure, basée sur la locale, sans la date',
'Y' => 'Une représentation sur 4 chiffres de l\'année',
'Z' => 'L\'abréviation du décalage horaire, non fournie par %z (dépend sur système d\'exploitation)',
'a' => 'L\'abréviation de la représentation textuelle du jour',
'b' => 'L\'abréviation du nom du mois, basée sur la locale',
'c' => 'Timestamp préféré basé sur la locale',
'd' => 'Jour du mois sur 2 chiffres (avec le zéro initial)',
'e' => 'Jour du mois, avec un espace précédent un seul chiffre',
'f' => '',
'g' => 'Une représentation sur 2 chiffres de l\'année au format ISO-8601:1988 (voir %V)',
'h' => 'Abréviation du nom du mois, basée sur la locale (alias de %b)',
'i' => '',
'j' => 'Jour de l\'année, sur 3 chiffres avec zéro initial',
'k' => '',
'l' => 'Heure, au format 12-heures, avec un espace précédent un seul chiffre',
'm' => 'Une représentation du mois sur 2 chiffres',
'n' => 'Un caractère de nouvelle ligne ("\n")',
'o' => '',
'p' => '"AM" ou "PM" (en majuscule) basé sur l\'heure courante',
'q' => '',
'r' => 'Identique à "%I:%M:%S %p"',
's' => 'Timestamp par rapport à l\'époque Unix',
't' => 'Un caractère de tabulation ("\t")',
'u' => 'Représentation numérique du jour de la semaine au format ISO-8601',
'v' => '',
'w' => 'Représentation numérique du jour de la semaine',
'x' => 'Représentation préférée de la date, basée sur la locale, sans l\'heure',
'y' => 'Représentation de l\'année sur 2 chiffres',
'z' => 'Soit le décalage horaire depuis UTC ou son abréviation (suivant le système d\'exploitation)',
'%' => 'Un caractère pourcentage ("%")',
);
// Résultats.
$strftimeValues = array();
// 2value les formats tout en supprimant les erreurs.
foreach($strftimeFormats as $format => $description){
if (False !== ($value = @strftime("%{$format}"))){
$strftimeValues[$format] = $value;
}
}
// Trouve la valeur la plus longue.
$maxValueLength = 2 + max(array_map('strlen', $strftimeValues));
// Affiche tous les formats connus.
foreach($strftimeValues as $format => $value){
echo "Format connu : '{$format}' = ", str_pad("'{$value}'", $maxValueLength), " ( {$strftimeFormats[$format]} )\n";
}
// Affiche tous les formats non connus.
foreach(array_diff_key($strftimeFormats, $strftimeValues) as $format => $description){
echo "Format inconnu : '{$format}' ", str_pad(' ', $maxValueLength), ($description ? " ( {$description} )" : ''), "\n";
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Format connu : 'A' = 'Friday' ( Une représentation textuelle complète du jour )
Format connu : 'B' = 'December' ( Nom du mois complet, basé sur la locale )
Format connu : 'H' = '11' ( Une représentation sur 2 chiffres de l'heure au format 24-heures )
Format connu : 'I' = '11' ( Une représentation sur 2 chiffres de l'heure au format 12-heures )
Format connu : 'M' = '24' ( Une représentation sur 2 chiffres des minutes )
Format connu : 'S' = '44' ( Une représentation sur 2 chiffres des secondes )
Format connu : 'U' = '48' ( Numéro de la semaine pour l'année courante, en commençant par le premier Dimanche comme première semaine )
Format connu : 'W' = '48' ( Une représentation numérique de la semaine de l'année, en commençant par le premier Lundi comme première semaine )
Format connu : 'X' = '11:24:44' ( Représentation préférée pour l'heure, basée sur la locale, sans la date )
Format connu : 'Y' = '2010' ( Une représentation sur 4 chiffres de l'année )
Format connu : 'Z' = 'GMT Standard Time' ( L'abréviation du décalage horaire, non fournie par %z (dépend sur système d'exploitation )
Format connu : 'a' = 'Fri' ( L'abréviation de la représentation textuelle du jour )
Format connu : 'b' = 'Dec' ( L'abréviation du nom du mois, basée sur la locale )
Format connu : 'c' = '12/03/10 11:24:44' ( Timestamp préféré basé sur la locale )
Format connu : 'd' = '03' ( Jour du mois sur 2 chiffres (avec le zéro initial) )
Format connu : 'j' = '337' ( Jour de l'année, sur 3 chiffres avec zéro initial )
Format connu : 'm' = '12' ( Une représentation du mois sur 2 chiffres )
Format connu : 'p' = 'AM' ( "AM" ou "PM" (en majuscule) basé sur l'heure courante )
Format connu : 'w' = '5' ( Représentation numérique du jour de la semaine )
Format connu : 'x' = '12/03/10' ( Représentation préférée de la date, basée sur la locale, sans l'heure )
Format connu : 'y' = '10' ( Représentation de l'année sur 2 chiffres )
Format connu : 'z' = 'GMT Standard Time' ( Soit le décalage horaire depuis UTC ou son abréviation (suivant le système d'exploitation) )
Format connu : '%' = '%' ( Un caractère pourcentage ("%") )
Format inconnu : 'C' ( Représentation sur 2 chiffres de l'année (année, divisée par 100, tronquée en entier) )
Format inconnu : 'D' ( Identique à "%m/%d/%y" )
Format inconnu : 'E'
Format inconnu : 'F' ( Identique à "%Y-%m-%d" )
Format inconnu : 'G' ( La version complète, sur 4 chiffres de %g )
Format inconnu : 'J'
Format inconnu : 'K'
Format inconnu : 'L'
Format inconnu : 'N'
Format inconnu : 'O'
Format inconnu : 'P' ( "am" ou "pm" (en minuscule) basé sur l'heure courante )
Format inconnu : 'Q'
Format inconnu : 'R' ( Identique à "%H:%M" )
Format inconnu : 'T' ( Identique à "%H:%M:%S" )
Format inconnu : 'V' ( ISO-8601:1988 numéro de la semaine de l'année courante, commençant par la première semaine de l'année avec au moins 4 jours de semaine, avec le Lundi comme début de semaine )
Format inconnu : 'e' ( Jour du mois, avec un espace précédent un seul chiffre )
Format inconnu : 'f'
Format inconnu : 'g' ( Une représentation sur 2 chiffres de l'année au format ISO-8601:1988 (voir %V) )
Format inconnu : 'h' ( Abréviation du nom du mois, basée sur la locale (alias de %b) )
Format inconnu : 'i'
Format inconnu : 'k'
Format inconnu : 'l' ( Heure, au format 12-heures, avec un espace précédent un seul chiffre )
Format inconnu : 'n' ( Un caractère de nouvelle ligne ("\n") )
Format inconnu : 'o'
Format inconnu : 'q'
Format inconnu : 'r' ( Identique à "%I:%M:%S %p" )
Format inconnu : 's' ( Timestamp par rapport à l'époque Unix )
Format inconnu : 't' ( Un caractère de tabulation ("\t") )
Format inconnu : 'u' ( Représentation numérique du jour de la semaine au format ISO-8601 )
Format inconnu : 'v'
Note: %G et %V, qui sont basées sur la semaine ISO 8601:1988, peut conduire à des résultats inattendus (bien que corrects) si le système de numérotation n'est pas connu. Voir l'exemple %V de cette page.
$date
, string $format
)
strptime() retourne un tableau après avoir
analysé date, ou FALSE en cas d'erreur.
Les noms des mois et jour de la semaine dépendent de la configuration
locale, choisie avec setlocale()
(LC_TIME).
date (string)
La chaîne à analyser (e.g. retournée par strftime())
format (string)
Le format utilisé par date (e.g. le
même que celui qui a été utilisé par strftime()).
Pour plus d'informations sur les spécificateurs de formats, voyez la fonction strftime().
Retourne un tableau ou FALSE si une erreur survient.
| Paramètres | Description |
|---|---|
| "tm_sec" | Secondes après la minute (0-61) |
| "tm_min" | Minutes après l'heure (0-59) |
| "tm_hour" | Heure depuis minuit (0-23) |
| "tm_mday" | Jour du mois (1-31) |
| "tm_mon" | Mois depuis janvier (0-11) |
| "tm_year" | Années depuis 1900 |
| "tm_wday" | Jours depuis dimanche (0-6) |
| "tm_yday" | Jours depuis le 1er janvier (0-365) |
| "unparsed" |
La partie de date qui n'a pas été
reconnue par l'analyseur avec le format
spécifié.
|
Exemple #1 Exemple avec strptime()
<?php
$format = '%d/%m/%Y %H:%M:%S';
$strf = strftime($format);
echo "$strf\n";
print_r(strptime($strf, $format));
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
03/10/2004 15:54:19
Array
(
[tm_sec] => 19
[tm_min] => 54
[tm_hour] => 15
[tm_mday] => 3
[tm_mon] => 9
[tm_year] => 104
[tm_wday] => 0
[tm_yday] => 276
[unparsed] =>
)
Note: Cette fonction n'est pas implémentée sous Windows.
Note:
En interne, cette fonction appèle la fonction strptime() fournie par la bibliothèque système C. Cette fonction a des comportements bien différents suivants les systèmes d'exploitation. L'utilisation de la fonction date_parse_from_format(), qui elle, ne souffre pas de ces défauts, est recommandée depuis PHP 5.3.0 et suivants.
Note:
"tm_sec" inclut toutes les secondes intercalaires (acutellement 2 par an). Pour plus d'informations sur les secondes intercalaires, reportez-vous à l'» article sur Wikipedia les concernant.
Note:
Avant PHP 5.2.0, cette fonction pouvait avoir un comportement imprévisible, notamment concernant "tm_sec", "tm_min" et "tm_hour" qui pouvaient retourner des valeurs non définies.
(PHP 4, PHP 5)
strtotime — Transforme un texte anglais en timestamp
$time
[, int $now = time()
] )
strtotime() essaye de lire une date au format
anglais dans la chaîne time,
et de la transformer en timestamp Unix (le nombre de secondes depuis
le 1er Janvier 1970 à 00:00:00 UTC), relativement au timestamp
now, ou à la date courante si ce dernier
est omis.
Chaque paramètre de la fonction utilise le décalage horaire par défaut à moins qu'un décalage horaire y soit explicitement paramétré. Soyez vigilant à ne pas utiliser un décalage horaire différent pour chaque paramètre à moins que ce soit ce dont vous avez besoin. Reportez-vous à la fonction date_default_timezone_get() afin de savoir comment définir un décalage horaire par défaut.
time
Une chaîne date/heure. Les formats valides sont expliqués dans la documentation sur les formats Date et Heure.
now
Le timestamp, représentant la date courante, utilisé pour le calcul relative des dates.
Retourne un timestamp en cas de succès, FALSE sinon. Avant PHP 5.1.0,
cette fonction retournait -1 en cas d'échec.
Chaque appel à une fonction date/heure générera un message de type
E_NOTICE si le fuseau horaire n'est pas valide,
et/ou un message de type E_STRICT
ou E_WARNING si vous
utilisez la configuration du système ou la variable d'environnement
TZ. Voir aussi date_default_timezone_set()
| Version | Description |
|---|---|
| 5.3.0 |
Avant PHP 5.3.0, 24:00 n'était pas un format valide
et strtotime() retournait FALSE.
|
| 5.2.7 | En PHP 5 avant 5.2.7, demander le jour de la semaine correspondant au premier jour du mois ajoute de manière incorrecte une semaine au timestamp retourné. Ceci a été corrigé dans PHP 5.2.7 et supérieur. |
| 5.1.0 |
La fonction retourne maintenant FALSE en cas d'échec, au lieu de
-1.
|
| 5.1.0 |
Émet un message de type |
| 5.0.2 | En PHP 5 jusqu'à 5.0.2, "now" et les autres temps relatifs sont mal calculés depuis minuit d'aujourd'hui. Dans les autres versions, le calcul est correct. |
| 5.0.0 | Les microsecondes sont acceptées mais ignorées. |
| 4.4.0 | En PHP avant 4.4.0, "next" est mal calculé et considère +2. Une solution typique à ce problème est d'utiliser "+1". |
Exemple #1 Exemple avec strtotime()
<?php
echo strtotime("now"), "\n";
echo strtotime("10 September 2000"), "\n";
echo strtotime("+1 day"), "\n";
echo strtotime("+1 week"), "\n";
echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
echo strtotime("next Thursday"), "\n";
echo strtotime("last Monday"), "\n";
?>
Exemple #2 Vérification d'erreur
<?php
$str = 'Pas bon';
// Avant PHP 5.1.0, vous devez comparer avec -1, au lieu de false
if (($timestamp = strtotime($str)) === false) {
echo "La chaîne ($str) est boguée";
} else {
echo "$str == " . date('l dS \o\f F Y h:i:s A', $timestamp);
}
?>
Note:
Si le chiffre des années est précisé sur deux chiffres, les valeurs entre 00-69 correspondent à 2000-2069 et 70-99 à 1970-1999. Voyez les notes après concernant les différences possibles entres systèmes 32bits (des dates peuvent échoué après le 19/01/2038 à 03:14:07).
Note:
L'intervalle de validité d'un timestamp va du Vendredi 13 Décembre 1901 20:45:54 UTC au Mardi 19 Janvier 2038 03:14:07 UTC. (Cela correspond aux dates maximales et minimales pour un entier de 32 bits signé.) Toutes les plates-formes ne supportent pas les timestamp négatifs et dans ce cas, l'intervalle de date sera limitée à environs l'époque Unix. Cela signifie que les dates antérieures au 1 Janvier 1970 ne fonctionneront pas sous Windows, quelques distributions Linux et quelques autres systèmes. PHP 5.1.0 ainsi que les versions plus récentes outrepassent cette limitation.
Pour les versions 64-bit de PHP, l'intervalle valide d'un timestamp est réellement infini, sachant que 64 bits peut représenter approximativement 293 milliards d'années dans n'importe quelle direction.
Note:
Les dates aux formats m/d/y ou d-m-y formats sont analysées en regardant le séparateur entre les différentes parties: si le séparateur est un slash (/), alors le format américain m/d/y est supposé; si le séparateur est un tiret (-) ou un point (.), alors le format Européen d-m-y sera supposé.
Pour éviter des ambiguïtés éventuelles, le mieux est d'utiliser le format ISO 8601 (YYYY-MM-DD) ou encore DateTime::createFromFormat() lorsque possible.
Note:
L'utilisation de cette fonction sur des opérations mathématiques n'est pas conseillée. Il vaut mieux utiliser dans ce cas DateTime::add() et DateTime::sub() en PHP 5.3 et suivants, ou DateTime::modify() en PHP 5.2.
(PHP 4, PHP 5)
time — Retourne le timestamp UNIX actuel
time() retourne l'heure courante, mesurée en secondes depuis le début de l'époque UNIX, (1er janvier 1970 00:00:00 GMT).
Exemple #1 Exemple avec time()
<?php
$nextWeek = time() + (7 * 24 * 60 * 60);
// 7 jours; 24 heures; 60 minutes; 60secondes
echo 'Aujourd\'hui : '. date('Y-m-d') ."\n";
echo 'Semaine prochaine : '. date('Y-m-d', $nextWeek) ."\n";
// ou en utilisant strtotime():
echo 'Semaine prochaine : '. date('Y-m-d', strtotime('+1 week')) ."\n";
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Aujourd'hui : 2005-03-30 Semaine prochaine : 2005-04-06 Semaine prochaine : 2005-04-06
Un timestamp représentant le début de la demande est disponible dans la variable $_SERVER['REQUEST_TIME'] depuis PHP 5.1.
(PHP 5 >= 5.2.0)
timezone_abbreviations_list — Alias de DateTimeZone::listAbbreviations()
Cette fonction est un alias de : DateTimeZone::listAbbreviations()
(PHP 5 >= 5.2.0)
timezone_identifiers_list — Alias de DateTimeZone::listIdentifiers()
Cette fonction est un alias de : DateTimeZone::listIdentifiers()
Cette fonction est un alias de : DateTimeZone::getLocation()
(PHP 5 >= 5.1.3)
timezone_name_from_abbr — Retourne le nom du fuseau horaire à partir de son abréviation
$abbr
[, int $gmtOffset = -1
[, int $isdst = -1
]] )
abbr
Abréviation du fuseau horaire.
gmtOffset
Décalage à partir du GMT en seconde. La valeur par défaut est -1 ce qui
signifie que le premier fuseau horaire trouvé correspondant à
abbr est retourné.
Autrement, le décalage exact est recherché et seulement s'il n'est pas
trouvé alors le premier fuseau horaire avec n'importe quel décalage est
retourné.
isdst
Indicateur d'heure d'été/heure d'hiver. Par défaut -1 qui signifie que
le décalage heure d'été/heure d'hiver n'est pas pris en compte dans la
recherche même si le fuseau le gère. Si mis à 1, alors le
gmtOffset est supposé comprendre le décalage heure d'été
/heure d'hiver; si 0 alors gmtOffset
est supposé représenter un décalage ne prennant pas en compte l'heure d'été/hiver.
Si abbr n'existe pas alors le fuseau horaire est cherché
uniquement au moyen de gmtOffset et isdst.
Retourne un nom de fuseau horaire en cas de succès ou FALSE si une erreur survient.
Exemple #1 Exemple avec timezone_name_from_abbr()
<?php
echo timezone_name_from_abbr("CET") . "\n";
echo timezone_name_from_abbr("", 3600, 0) . "\n";
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Europe/Berlin Europe/Paris
Cette fonction est un alias de : DateTimeZone::getName()
Cette fonction est un alias de : DateTimeZone::getOffset()
Cette fonction est un alias de : DateTimeZone::__construct()
(PHP 5 >= 5.2.0)
timezone_transitions_get — Alias de DateTimeZone::getTransitions()
Cette fonction est un alias de : DateTimeZone::getTransitions()
(PHP 5 >= 5.3.0)
timezone_version_get — Lit la version de la timezonedb
timezone_version_get() lit la version de la timezonedb.
Retourne une chaîne de caractères.
Exemple #1 Lecture de la version de la timezonedb
<?php
echo timezone_version_get();
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
2009.7
Cette section explique tous les formats accéptés par strtotime(), DateTime et date_create(). Les formats sont groupés par sections. Dans la plupart des cas les formats de sections différentes peuvent être utilisés dans la même chaine date/time. Pour chaque format supporté, un ou plusieurs exemples sont données ainsi qu'une description du format en question. Les caractères entre guillemets simples pour les formats sont insensibles à la casse ('t' pourrait s'écrire t ou T), les caractères écrits entre guillemets doubles, eux, sont sensibles à la casse ("T" et seulement T).
| Description | Formats | Exemples |
|---|---|---|
| frac | . [0-9]+ | ".21342", ".85" |
| hh | "0"?[1-9] | "1"[0-2] | "04", "7", "12" |
| HH | [01][0-9] | "2"[0-4] | "04", "7", "19" |
| méridien | [AaPp] .? [Mm] .? [\0\t ] | "A.m.", "pM", "am." |
| MM | [0-5][0-9] | "00", "12", "59" |
| II | [0-5][0-9] | "00", "12", "59" |
| espace | [ \t] | |
| tz | "("? [A-Za-z]{1,6} ")"? | [A-Z][a-z]+([_/][A-Z][a-z]+)+ | "CEST", "Europe/Amsterdam", "America/Indiana/Knox" |
| tzcorrection | "GMT"? [+-] hh ":"? MM? | "+0400", "GMT-07:00", "-07:00" |
| Description | Format | Examples |
|---|---|---|
| Heures seules, avec méridien | hh espace? méridien | "4 am", "5PM" |
| Heures et minutes, avec méridien | hh [.:] MM space? méridien | "4:08 am", "7:19P.M." |
| Heures, minutes et secondes avec méridien | hh [.:] MM [.:] II espace? méridien | "4:08:37 am", "7:19:19P.M." |
| MS SQL (Heures, minutes, secondes et fraction avec méridien), PHP 5.3 et plus uniquement | hh ":" MM ":" II [.:] [0-9]+ meridian | "4:08:39:12313am" |
| Description | Format | Exemples |
|---|---|---|
| Heures et minutes | 't'? HH [.:] MM | "04:08", "19.19", "T23:43" |
| Heures et minutes, sans double-points | 't'? HH MM | "0408", "t1919", "T2343" |
| Heures, minutes et secondes | 't'? HH [.:] MM [.:] II | "04.08.37", "t19:19:19" |
| Heures, minutes et secondes, sans double-points | 't'? HH MM II | "040837", "T191919" |
| Heures, minutes, secondes et fuseau | 't'? HH [.:] MM [.:] II space? ( tzcorrection | tz ) | "040837CEST", "T191919-0700" |
| Heures, minutes, secondes et fraction | 't'? HH [.:] MM [.:] II frac | "04.08.37.81412", "19:19:19.532453" |
| Information de fuseau horaire | tz | tzcorrection | "CEST", "Europe/Amsterdam", "+0430", "GMT-06:00" |
| Description | Format | Exemples |
|---|---|---|
| suffixe des jours | "st" | "nd" | "rd" | "th" | |
| dd | ([0-2]?[0-9] | "3"[01]) daysuf? | "7th", "22nd", "31" |
| DD | "0" [0-9] | [1-2][0-9] | "3" [01] | "07", "31" |
| m | 'january' | 'february' | 'march' | 'april' | 'may' | 'june' | 'july' | 'august' | 'september' | 'october' | 'november' | 'december' | 'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec' | "I" | "II" | "III" | "IV" | "V" | "VI" | "VII" | "VIII" | "IX" | "X" | "XI" | "XII" | |
| M | 'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec' | |
| mm | "0"? [0-9] | "1"[0-2] | "0", "04", "7", "12" |
| MM | "0" [0-9] | "1"[0-2] | "00", "04", "07", "12" |
| y | [0-9]{1,4} | "00", "78", "08", "8", "2008" |
| yy | [0-9]{2} | "00", "08", "78" |
| YY | [0-9]{4} | "2000", "2008", "1978" |
| Description | Format | Exemples |
|---|---|---|
| Mois américain et jour | mm "/" dd | "5/12", "10/27" |
| Mois américain, jour et année | mm "/" dd "/" y | "12/22/78", "1/17/2006", "1/17/6" |
| Année sur quatre chiffres, mois et jour avec slashs | YY "/" mm "/" dd | "2008/6/30", "1978/12/22" |
| Année sur quatre chiffres et mois (GNU) | YY "-" mm | "2008-6", "2008-06", "1978-12" |
| Année, mois et jour avec tirets | y "-" mm "-" dd | "2008-6-30", "78-12-22", "8-6-21" |
| Jour, mois et année sur quatre chiffres, avec des points, des tabulations ou des tirets | dd [.\t-] mm [.-] YY | "30-6-2008", "22.12\t1978" |
| Jour, mois et année sur deux chiffres, avec des points ou des tabulations | dd [.\t] mm "." yy | "30.6.08", "22\t12\t78" |
| Jour, mois textuel et année | dd ([ \t.-])* m ([ \t.-])* y | "30-June 2008", "22DEC78", "14 III 1879" |
| Mois textuel et année sur quatre chiffres (le jour sera le 1) | m ([ \t.-])* YY | "June 2008", "DEC1978", "March 1879" |
| Année sur quatre chiffres et mois textuel (le jour sera le 1) | YY ([ \t.-])* m | "2008 June", "1978-XII", "1879.MArCH" |
| Mois textuel, jour et année | m ([ .\t-])* dd [,.stndrh\t ]+ y | "July 1st, 2008", "April 17, 1790", "May.9,78" |
| Mois textuel et jour | m ([ .\t-])* dd [,.stndrh\t ]* | "July 1st,", "Apr 17", "May.9" |
| Jour et mois textuel | d ([ .\t-])* m | "1 July", "17 Apr", "9.May" |
| Mois abrégé, jour et année | M "-" DD "-" y | "May-09-78", "Apr-17-1790" |
| Année, mois abrégé et jour | y "-" M "-" DD | "78-Dec-22", "1814-MAY-17" |
| Année (et juste l'année) | YY | "1978", "2008" |
| Mois textuel (et juste le mois) | m | "March", "jun", "DEC" |
| Description | Format | Exemples |
|---|---|---|
| Année sur huit chiffres, mois et jour | YY MM DD | "15810726", "19780417", "18140517" |
| Année sur quatre chiffres, mois et jour avec des slashes | YY "/" MM "/" DD | "2008/06/30", "1978/12/22" |
| Année sur deux chiffres, mois et jour avec des tirets | yy "-" MM "-" DD | "08-06-30", "78-12-22" |
| Année sur quatre chiffres avec un signe optionnel, mois et jour | [+-]? YY "-" MM "-" DD | "-0002-07-26", "+1978-04-17", "1814-05-17" |
Note:
Pour les formats y et yy , les années avant 100 sont considérées d'une manière spéciale lorsque les symboles y ou yy sont utilisés. Si l'année est comprise entre 0 (inclusif) et 69 (inclusif), 2000 sont ajoutés. Si l'année est comprise entre 70 (inclusif) et 99 (inclusif) alors 1900 sont ajoutés. Cela signifie que "00-01-01" est interprété comme "2000-01-01".
Note:
Le format "Jour, mois et année sur deux chiffres avec tabulations ou points" (dd [.\t] mm "." yy) ne fonctionne que pour des valeurs d'années de 61 (inclusif) à 99 (inclusif) - en dehors de ces bornes le format du temps "HH [.:] MM [.:] SS" a une precédence plus forte et primera.
Note:
Le format "Année (et juste l'année)" ne fonctionne que si la chaine qui représente le temps a déja été trouvée, sinon le format est reconnu comme HH MM.
Note:
Il est possible d'ajouter ou soustraire une retenue pour les formats dd et DD. Le jour 0 signifie le dernier jour du mois précédent les retenues positives compteront le mois suivant. Ainsi, "2008-08-00" est équivalent à "2008-07-31" et "2008-06-31" est équivalent à "2008-07-01" (Juin ne possède que 30 jours).
Il est aussi possible de jouer avec les retenues des formats mm et MM grâce à la valeur 0. Une valeur de mois de 0 signifie Décembre de l'année précédente. Par exemple "2008-00-22" est équivalent à "2007-12-22".
Si vous combinez les deux notions précédentes et utilisez une retenue négative sur le jour et le mois, alors il se passe ceci: "2008-00-00" est converti d'abord vers "2007-12-00" puis vers "2007-11-30". Ceci arrive aussi avec la chaine "0000-00-00" qui est alors tranformée vers "-0001-11-30" (l'année -1 dans le calendrier ISO 8601, qui est 2 BC dans le calendrier Gregorien).
| Description | Formats | Exemples |
|---|---|---|
| DD | "0" [0-9] | [1-2][0-9] | "3" [01] | "02", "12", "31" |
| doy | "00"[1-9] | "0"[1-9][0-9] | [1-2][0-9][0-9] | "3"[0-5][0-9] | "36"[0-6] | "36"[0-6] "000", "012", "366" |
| frac | . [0-9]+ | ".21342", ".85" |
| hh | "0"?[1-9] | "1"[0-2] | "04", "7", "12" |
| HH | [01][0-9] | "2"[0-4] | "04", "7", "19" |
| méridien | [AaPp] .? [Mm] .? [\0\t ] | "A.m.", "pM", "am." |
| ii | [0-5][0-9] | "04", "8", "59" |
| II | [0-5][0-9] | "04", "08", "59" |
| M | 'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec' | |
| MM | [0-5][0-9] | "00", "12", "59" |
| espace | [ \t] | |
| ss | [0-5][0-9] | "04", "8", "59" |
| SS | [0-5][0-9] | "04", "08", "59" |
| W | "0"[1-9] | [1-4][0-9] | "5"[0-3] | "05", "17", "53" |
| tzcorrection | "GMT"? [+-] hh ":"? MM? | "+0400", "GMT-07:00", "-07:00" |
| YY | [0-9]{4} | "2000", "2008", "1978" |
| Description | Format | Exemples |
|---|---|---|
| Format de log commun | dd "/" M "/" YY : HH ":" II ":" SS space tzcorrection | "10/Oct/2000:13:55:36 -0700" |
| EXIF | YY ":" MM ":" DD " " HH ":" II ":" SS | "2008:08:07 18:11:31" |
| Année ISO avec semaine ISO | YY "-"? "W" W | "2008W27", "2008-W28" |
| Année ISO avec semaine ISO et jour | YY "-"? "W" W "-"? [0-7] | "2008W273", "2008-W28-3" |
| MySQL | YY "-" MM "-" DD " " HH ":" II ":" SS | "2008-08-07 18:11:31" |
| PostgreSQL: Année avec jour de l'année | YY "."? doy | "2008.197", "2008197" |
| SOAP | YY "-" MM "-" DD "T" HH ":" II ":" SS frac tzcorrection? | "2008-07-01T22:35:17.02", "2008-07-01T22:35:17.03+08:00" |
| Unix Timestamp | "@" "-"? [0-9]+ | "@1215282385" |
| XMLRPC | YY MM DD "T" hh ":" II ":" SS | "20080701T22:38:07", "20080701T9:38:07" |
| XMLRPC (Compact) | YY MM DD 't' hh II SS | "20080701t223807", "20080701T093807" |
| WDDX | YY "-" mm "-" dd "T" hh ":" ii ":" ss | "2008-7-1T9:3:37" |
Note:
Le "W" dans les formats "Année ISO avec semaine ISO" et "Année ISO avec semaine ISO et jour" est sensible à la casse, vous ne pouvez utiliser que la majuscule "W".
Le "T" dans les formats SOAP, XMRPC et WDDX est sensible à la casse, utilisez toujours la majuscule "T".
Le format timestamp Unix définit le fuseau horaire à UTC.
| Description | Format |
|---|---|
| nom du jour | 'sunday' | 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat' | 'sun' |
| textes relatifs aux jours | 'weekday' | 'weekdays' |
| nombre | [+-]?[0-9]+ |
| ordinal | 'first' | 'second' | 'third' | 'fourth' | 'fifth' | 'sixth' | 'seventh' | 'eighth' | 'ninth' | 'tenth' | 'eleventh' | 'twelfth' | 'next' | 'last' | 'previous' | 'this' |
| textes relatifs | 'next' | 'last' | 'previous' | 'this' |
| espace | [ \t]+ |
| unité | (('sec' | 'second' | 'min' | 'minute' | 'hour' | 'day' | 'fortnight' | 'forthnight' | 'month' | 'year') 's'?) | 'weeks' | daytext |
| Format | Description | Exemples |
|---|---|---|
| 'yesterday' | Minuit d'hier | "yesterday 14:00" |
| 'midnight' | Le temps est affecté à 00:00:00 | |
| 'today' | Le temps est affecté à 00:00:00 | |
| 'now' | Maintenant | |
| 'noon' | Le temps est affecté à 12:00:00 | "yesterday noon" |
| 'tomorrow' | Minuit de demain | |
| 'back of' hour | 15 minutes avant l'heure précisée | "back of 7pm", "back of 15" |
| 'front of' hour | 15 minutes après l'heure spécifiée | "front of 5am", "front of 23" |
| 'first day' ' of'? | Affecte le jour du premier jour du mois courant. Il est plus intéréssant d'utiliser cette phrase suivie d'un nom de mois. | "first day of January 2008" |
| 'last day' ' of'? | Affecte le jour du dernier jour du mois courant. Il est plus intéréssant d'utiliser cette phrase suivie d'un nom de mois. | "last day of next month" |
| ordinal espace nom de jour espace 'of' | Calcule le x-ième jour de semaine du mois en cours. | "first sat of July 2008" |
| 'last' espace nom de jour espace 'of' | Calcule le dernier jour de semaine du mois en cours. | "last sat of July 2008" |
| nombre espace? (unité | 'week') | Gère des temps relatifs dont la valeur est dénombrée. | "+5 weeks", "12 day", "-7 weekdays" |
| nombre espace unité | Gère des temps relatifs dont la valeur est dénombrée. | "fifth day", "second month" |
| 'ago' | Utilise dans le passé toute description de temps relatif ('il y a'). | "2 days ago", "8 days ago 14:00", "2 months 5 days ago", "2 months ago 5 days", "2 days ago ago" |
| nom de jour | Se déplace vers le prochain jour indiqué. | "Monday" |
| reltext espace 'week' | Gère le format spécial "weekday + last/this/next week". | "Monday next week" |
Note:
Les expressions relatives sont toujours traitées après les expressions non relatives. Ceci fait en sorte que "+1 week july 2008" et "july 2008 +1 week" sont équivalents.
"yesterday", "midnight", "today", "noon" et "tomorrow" sont des exceptions à cette règle. Notez que "tomorrow 11:00" et "11:00 tomorrow" sont différents. Soit la date d'aujourd'hui à "July 23rd, 2008" , la première expression donne "2008-07-24 11:00" alors que la seconde donnera "2008-07-24 00:00". La raison est que ces cinq expressions influencent directement la date courante.
Note:
Notez les remarques qui suivent lorsque le jour de semaine courant est le même que le jour de semaine utilisé dans la chaine de date/time. Le jour de semaine courant aurait pu être recalculé par rapport aux parties non relatives de la chaine date/time.
- "nom de jour" n'avance pas vers un autre jour. (Exemple: "Wed July 23rd, 2008" signifie "2008-07-23").
- "nombre nom de jour" n'avance pas vers un autre jour. (Exemple: "1 wednesday july 23rd, 2008" signifie "2008-07-23").
- "nombre week nom de jour" ajoutera d'abord le nombre de semaines, mais n'avancera pas vers un autre jour. Dans ce cas "nombre week" et "nom de jour" sont deux blocs distincts. (Exemple: "+1 week wednesday july 23rd, 2008" signifie "2008-07-30").
- "ordinal nom de jour" avance vers un autre jour. (Exemple "first wednesday july 23rd, 2008" signifie "2008-07-30").
- "nombre week ordinal nom de jour" ajoutera d'abord le nombre de semaines et ensuite avancera vers un autre jour. Dans ce cas, "nombre week" et "ordinal nom de jour" sont deux blocs distincts. (Exemple: "+1 week first wednesday july 23rd, 2008" signifie "2008-08-06").
- "ordinal nom de jour 'of' " n'avance pas vers uyn autre jour. (Exemple: "first wednesday of july 23rd, 2008" signifie "2008-07-02" car la phrase avec 'of' remet à zéro le jour du mois vers '1' et le '23' est ignoré ici).
Notez aussi que le "of" dans "ordinal espace nom de jour espace 'of' " et "'last' espace nom de jour espace 'of' " fait quelque chose de spécial.
- Il affecte le jour du mois à 1.
- "ordinal nom de jour 'of' " n'avance pas vers un autre jour. (Exemple: "first tuesday of july 2008" signifie "2008-07-01").
- "ordinal nom de jour " avance vers un autre jour. (Exemple: "first tuesday july 2008" signifie "2008-07-08", voyez aussi le point numéro 4 de la liste ci dessus).
- "'last' nom de jour 'of' " prend le dernier jour nommé du mois courant. (Exemple: "last wed of july 2008" signifie "2008-07-30")
- "'last' nom de jour" prend le dernier jour nommé à partir du jour actuel. (Exemple: "last wed july 2008" signifie "2008-06-25"; "july 2008" affecte d'abord la date courante à "2008-07-01" et ensuite "last wed" remonte au dernier mercredi qui est le "2008-06-25").
Note:
Les valeurs relatives des mois calculés sont basées sur le nombre de jours des mois que l'on utilise. Par exemple "+2 month 2011-11-30", donnera comme résultat la date "2012-01-30". Ceci est du au fait que le mois de novembre comporte 30 jours, et que le mois de décembre en comporte 31, soit un ajout total de 61 jours.
Ici, vous trouverez une liste complète des fuseaux horaires supportés par PHP, qui peuvent être utilisés avec, e.g. date_default_timezone_set().
Note: La dernière version de la base de données des fuseaux horaires peut être installée via la commande PECL » timezonedb.
Note: Cette liste est basée sur la version de la base de données des fuseaux horaires 2012.3.
| Africa/Abidjan | Africa/Accra | Africa/Addis_Ababa | Africa/Algiers | Africa/Asmara |
| Africa/Asmera | Africa/Bamako | Africa/Bangui | Africa/Banjul | Africa/Bissau |
| Africa/Blantyre | Africa/Brazzaville | Africa/Bujumbura | Africa/Cairo | Africa/Casablanca |
| Africa/Ceuta | Africa/Conakry | Africa/Dakar | Africa/Dar_es_Salaam | Africa/Djibouti |
| Africa/Douala | Africa/El_Aaiun | Africa/Freetown | Africa/Gaborone | Africa/Harare |
| Africa/Johannesburg | Africa/Juba | Africa/Kampala | Africa/Khartoum | Africa/Kigali |
| Africa/Kinshasa | Africa/Lagos | Africa/Libreville | Africa/Lome | Africa/Luanda |
| Africa/Lubumbashi | Africa/Lusaka | Africa/Malabo | Africa/Maputo | Africa/Maseru |
| Africa/Mbabane | Africa/Mogadishu | Africa/Monrovia | Africa/Nairobi | Africa/Ndjamena |
| Africa/Niamey | Africa/Nouakchott | Africa/Ouagadougou | Africa/Porto-Novo | Africa/Sao_Tome |
| Africa/Timbuktu | Africa/Tripoli | Africa/Tunis | Africa/Windhoek |
| America/Adak | America/Anchorage | America/Anguilla | America/Antigua | America/Araguaina |
| America/Argentina/Buenos_Aires | America/Argentina/Catamarca | America/Argentina/ComodRivadavia | America/Argentina/Cordoba | America/Argentina/Jujuy |
| America/Argentina/La_Rioja | America/Argentina/Mendoza | America/Argentina/Rio_Gallegos | America/Argentina/Salta | America/Argentina/San_Juan |
| America/Argentina/San_Luis | America/Argentina/Tucuman | America/Argentina/Ushuaia | America/Aruba | America/Asuncion |
| America/Atikokan | America/Atka | America/Bahia | America/Bahia_Banderas | America/Barbados |
| America/Belem | America/Belize | America/Blanc-Sablon | America/Boa_Vista | America/Bogota |
| America/Boise | America/Buenos_Aires | America/Cambridge_Bay | America/Campo_Grande | America/Cancun |
| America/Caracas | America/Catamarca | America/Cayenne | America/Cayman | America/Chicago |
| America/Chihuahua | America/Coral_Harbour | America/Cordoba | America/Costa_Rica | America/Creston |
| America/Cuiaba | America/Curacao | America/Danmarkshavn | America/Dawson | America/Dawson_Creek |
| America/Denver | America/Detroit | America/Dominica | America/Edmonton | America/Eirunepe |
| America/El_Salvador | America/Ensenada | America/Fort_Wayne | America/Fortaleza | America/Glace_Bay |
| America/Godthab | America/Goose_Bay | America/Grand_Turk | America/Grenada | America/Guadeloupe |
| America/Guatemala | America/Guayaquil | America/Guyana | America/Halifax | America/Havana |
| America/Hermosillo | America/Indiana/Indianapolis | America/Indiana/Knox | America/Indiana/Marengo | America/Indiana/Petersburg |
| America/Indiana/Tell_City | America/Indiana/Vevay | America/Indiana/Vincennes | America/Indiana/Winamac | America/Indianapolis |
| America/Inuvik | America/Iqaluit | America/Jamaica | America/Jujuy | America/Juneau |
| America/Kentucky/Louisville | America/Kentucky/Monticello | America/Knox_IN | America/Kralendijk | America/La_Paz |
| America/Lima | America/Los_Angeles | America/Louisville | America/Lower_Princes | America/Maceio |
| America/Managua | America/Manaus | America/Marigot | America/Martinique | America/Matamoros |
| America/Mazatlan | America/Mendoza | America/Menominee | America/Merida | America/Metlakatla |
| America/Mexico_City | America/Miquelon | America/Moncton | America/Monterrey | America/Montevideo |
| America/Montreal | America/Montserrat | America/Nassau | America/New_York | America/Nipigon |
| America/Nome | America/Noronha | America/North_Dakota/Beulah | America/North_Dakota/Center | America/North_Dakota/New_Salem |
| America/Ojinaga | America/Panama | America/Pangnirtung | America/Paramaribo | America/Phoenix |
| America/Port-au-Prince | America/Port_of_Spain | America/Porto_Acre | America/Porto_Velho | America/Puerto_Rico |
| America/Rainy_River | America/Rankin_Inlet | America/Recife | America/Regina | America/Resolute |
| America/Rio_Branco | America/Rosario | America/Santa_Isabel | America/Santarem | America/Santiago |
| America/Santo_Domingo | America/Sao_Paulo | America/Scoresbysund | America/Shiprock | America/Sitka |
| America/St_Barthelemy | America/St_Johns | America/St_Kitts | America/St_Lucia | America/St_Thomas |
| America/St_Vincent | America/Swift_Current | America/Tegucigalpa | America/Thule | America/Thunder_Bay |
| America/Tijuana | America/Toronto | America/Tortola | America/Vancouver | America/Virgin |
| America/Whitehorse | America/Winnipeg | America/Yakutat | America/Yellowknife |
| Antarctica/Casey | Antarctica/Davis | Antarctica/DumontDUrville | Antarctica/Macquarie | Antarctica/Mawson |
| Antarctica/McMurdo | Antarctica/Palmer | Antarctica/Rothera | Antarctica/South_Pole | Antarctica/Syowa |
| Antarctica/Vostok |
| Arctic/Longyearbyen |
| Asia/Aden | Asia/Almaty | Asia/Amman | Asia/Anadyr | Asia/Aqtau |
| Asia/Aqtobe | Asia/Ashgabat | Asia/Ashkhabad | Asia/Baghdad | Asia/Bahrain |
| Asia/Baku | Asia/Bangkok | Asia/Beirut | Asia/Bishkek | Asia/Brunei |
| Asia/Calcutta | Asia/Choibalsan | Asia/Chongqing | Asia/Chungking | Asia/Colombo |
| Asia/Dacca | Asia/Damascus | Asia/Dhaka | Asia/Dili | Asia/Dubai |
| Asia/Dushanbe | Asia/Gaza | Asia/Harbin | Asia/Hebron | Asia/Ho_Chi_Minh |
| Asia/Hong_Kong | Asia/Hovd | Asia/Irkutsk | Asia/Istanbul | Asia/Jakarta |
| Asia/Jayapura | Asia/Jerusalem | Asia/Kabul | Asia/Kamchatka | Asia/Karachi |
| Asia/Kashgar | Asia/Kathmandu | Asia/Katmandu | Asia/Kolkata | Asia/Krasnoyarsk |
| Asia/Kuala_Lumpur | Asia/Kuching | Asia/Kuwait | Asia/Macao | Asia/Macau |
| Asia/Magadan | Asia/Makassar | Asia/Manila | Asia/Muscat | Asia/Nicosia |
| Asia/Novokuznetsk | Asia/Novosibirsk | Asia/Omsk | Asia/Oral | Asia/Phnom_Penh |
| Asia/Pontianak | Asia/Pyongyang | Asia/Qatar | Asia/Qyzylorda | Asia/Rangoon |
| Asia/Riyadh | Asia/Saigon | Asia/Sakhalin | Asia/Samarkand | Asia/Seoul |
| Asia/Shanghai | Asia/Singapore | Asia/Taipei | Asia/Tashkent | Asia/Tbilisi |
| Asia/Tehran | Asia/Tel_Aviv | Asia/Thimbu | Asia/Thimphu | Asia/Tokyo |
| Asia/Ujung_Pandang | Asia/Ulaanbaatar | Asia/Ulan_Bator | Asia/Urumqi | Asia/Vientiane |
| Asia/Vladivostok | Asia/Yakutsk | Asia/Yekaterinburg | Asia/Yerevan |
| Atlantic/Azores | Atlantic/Bermuda | Atlantic/Canary | Atlantic/Cape_Verde | Atlantic/Faeroe |
| Atlantic/Faroe | Atlantic/Jan_Mayen | Atlantic/Madeira | Atlantic/Reykjavik | Atlantic/South_Georgia |
| Atlantic/St_Helena | Atlantic/Stanley |
| Australia/ACT | Australia/Adelaide | Australia/Brisbane | Australia/Broken_Hill | Australia/Canberra |
| Australia/Currie | Australia/Darwin | Australia/Eucla | Australia/Hobart | Australia/LHI |
| Australia/Lindeman | Australia/Lord_Howe | Australia/Melbourne | Australia/North | Australia/NSW |
| Australia/Perth | Australia/Queensland | Australia/South | Australia/Sydney | Australia/Tasmania |
| Australia/Victoria | Australia/West | Australia/Yancowinna |
| Europe/Amsterdam | Europe/Andorra | Europe/Athens | Europe/Belfast | Europe/Belgrade |
| Europe/Berlin | Europe/Bratislava | Europe/Brussels | Europe/Bucharest | Europe/Budapest |
| Europe/Chisinau | Europe/Copenhagen | Europe/Dublin | Europe/Gibraltar | Europe/Guernsey |
| Europe/Helsinki | Europe/Isle_of_Man | Europe/Istanbul | Europe/Jersey | Europe/Kaliningrad |
| Europe/Kiev | Europe/Lisbon | Europe/Ljubljana | Europe/London | Europe/Luxembourg |
| Europe/Madrid | Europe/Malta | Europe/Mariehamn | Europe/Minsk | Europe/Monaco |
| Europe/Moscow | Europe/Nicosia | Europe/Oslo | Europe/Paris | Europe/Podgorica |
| Europe/Prague | Europe/Riga | Europe/Rome | Europe/Samara | Europe/San_Marino |
| Europe/Sarajevo | Europe/Simferopol | Europe/Skopje | Europe/Sofia | Europe/Stockholm |
| Europe/Tallinn | Europe/Tirane | Europe/Tiraspol | Europe/Uzhgorod | Europe/Vaduz |
| Europe/Vatican | Europe/Vienna | Europe/Vilnius | Europe/Volgograd | Europe/Warsaw |
| Europe/Zagreb | Europe/Zaporozhye | Europe/Zurich |
| Indian/Antananarivo | Indian/Chagos | Indian/Christmas | Indian/Cocos | Indian/Comoro |
| Indian/Kerguelen | Indian/Mahe | Indian/Maldives | Indian/Mauritius | Indian/Mayotte |
| Indian/Reunion |
| Pacific/Apia | Pacific/Auckland | Pacific/Chatham | Pacific/Chuuk | Pacific/Easter |
| Pacific/Efate | Pacific/Enderbury | Pacific/Fakaofo | Pacific/Fiji | Pacific/Funafuti |
| Pacific/Galapagos | Pacific/Gambier | Pacific/Guadalcanal | Pacific/Guam | Pacific/Honolulu |
| Pacific/Johnston | Pacific/Kiritimati | Pacific/Kosrae | Pacific/Kwajalein | Pacific/Majuro |
| Pacific/Marquesas | Pacific/Midway | Pacific/Nauru | Pacific/Niue | Pacific/Norfolk |
| Pacific/Noumea | Pacific/Pago_Pago | Pacific/Palau | Pacific/Pitcairn | Pacific/Pohnpei |
| Pacific/Ponape | Pacific/Port_Moresby | Pacific/Rarotonga | Pacific/Saipan | Pacific/Samoa |
| Pacific/Tahiti | Pacific/Tarawa | Pacific/Tongatapu | Pacific/Truk | Pacific/Wake |
| Pacific/Wallis | Pacific/Yap |
| Brazil/Acre | Brazil/DeNoronha | Brazil/East | Brazil/West | Canada/Atlantic |
| Canada/Central | Canada/East-Saskatchewan | Canada/Eastern | Canada/Mountain | Canada/Newfoundland |
| Canada/Pacific | Canada/Saskatchewan | Canada/Yukon | CET | Chile/Continental |
| Chile/EasterIsland | CST6CDT | Cuba | EET | Egypt |
| Eire | EST | EST5EDT | Etc/GMT | Etc/GMT+0 |
| Etc/GMT+1 | Etc/GMT+10 | Etc/GMT+11 | Etc/GMT+12 | Etc/GMT+2 |
| Etc/GMT+3 | Etc/GMT+4 | Etc/GMT+5 | Etc/GMT+6 | Etc/GMT+7 |
| Etc/GMT+8 | Etc/GMT+9 | Etc/GMT-0 | Etc/GMT-1 | Etc/GMT-10 |
| Etc/GMT-11 | Etc/GMT-12 | Etc/GMT-13 | Etc/GMT-14 | Etc/GMT-2 |
| Etc/GMT-3 | Etc/GMT-4 | Etc/GMT-5 | Etc/GMT-6 | Etc/GMT-7 |
| Etc/GMT-8 | Etc/GMT-9 | Etc/GMT0 | Etc/Greenwich | Etc/UCT |
| Etc/Universal | Etc/UTC | Etc/Zulu | Factory | GB |
| GB-Eire | GMT | GMT+0 | GMT-0 | GMT0 |
| Greenwich | Hongkong | HST | Iceland | Iran |
| Israel | Jamaica | Japan | Kwajalein | Libya |
| MET | Mexico/BajaNorte | Mexico/BajaSur | Mexico/General | MST |
| MST7MDT | Navajo | NZ | NZ-CHAT | Poland |
| Portugal | PRC | PST8PDT | ROC | ROK |
| Singapore | Turkey | UCT | Universal | US/Alaska |
| US/Aleutian | US/Arizona | US/Central | US/East-Indiana | US/Eastern |
| US/Hawaii | US/Indiana-Starke | US/Michigan | US/Mountain | US/Pacific |
| US/Pacific-New | US/Samoa | UTC | W-SU | WET |
| Zulu |
N'utilisez aucun des fuseaux horaires listés ici (à côté de UTC), ils n'existent que pour des raisons de compatibilité ascendante.
ncurses (new curses, les nouveaux curseurs) sont une émulation libre des curseurs du System V Rel 4.0 (et plus récente). Ils utilisent le format terminfo, supportent les pavés numériques, les couleurs, les colorations multiples, les caractères de formulaire et les touches de fonctions. De par la nature interactive de cette bibliothèque, il est hors de question de l'utiliser pour écrire des applications pour le Web mais, par contre, elle peut être très intéressante pour écrire des scripts en ligne de commande.
Les fonctionnalités disponibles, telles que les couleurs, dépendent du terminal que vous utilisez. Utilisez les fonctions telles que ncurses_has_colors(), ncurses_can_change_color() et ncurses_has_ic() pour vérifier les capacités du votre.
Note:
Cette extension a été déplacée dans le module » PECL et ne sera plus intégrée dans PHP à partir de PHP 5.3.0.
Ncurses est disponible sur les plates-formes suivantes :
Vous devez disposer des bibliothèques ncurses et des fichiers d'en-têtes. Téléchargez la dernière version sur le site de » ftp://ftp.gnu.org/pub/gnu/ncurses/ ou sur un miroir GNU.
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/ncurses.
Le support des caractères CRT (ncursesw) a été ajouté en version 1.0.1 de cette extension PECL.
Cette extension ne définit aucune directive de configuration.
Cette extension définit les ressources window, panel et pad.
Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.
En cas d'erreur, les fonctions ncurses retournent -1. Certaines fonctions retourne 0 en cas de succès. Voyez les documentations associées pour plus de détails.
| Constante | Signification |
|---|---|
NCURSES_COLOR_BLACK |
Pas de couleur |
NCURSES_COLOR_WHITE |
blanc |
NCURSES_COLOR_RED |
rouge : supporté lorsque le terminal est en mode couleurs |
NCURSES_COLOR_GREEN |
vert : supporté lorsque le terminal est en mode couleurs |
NCURSES_COLOR_YELLOW |
jaune : supporté lorsque le terminal est en mode couleurs |
NCURSES_COLOR_BLUE |
bleu : supporté lorsque le terminal est en mode couleurs |
NCURSES_COLOR_CYAN |
cyan : supporté lorsque le terminal est en mode couleurs |
NCURSES_COLOR_MAGENTA |
magenta : supporté lorsque le terminal est en mode couleurs |
| Constante | Signification |
|---|---|
NCURSES_KEY_F0 - NCURSES_KEY_F64 |
Touches de fonctions F1 : F64 |
NCURSES_KEY_DOWN |
flèche vers le bas |
NCURSES_KEY_UP |
flèche vers le haut |
NCURSES_KEY_LEFT |
flèche vers la gauche |
NCURSES_KEY_RIGHT |
flèche vers la droite |
NCURSES_KEY_HOME |
touche home (vers le haut + flèche vers la gauche) |
NCURSES_KEY_BACKSPACE |
retour en arrière |
NCURSES_KEY_DL |
efface une ligne |
NCURSES_KEY_IL |
insère une ligne |
NCURSES_KEY_DC |
efface un caractère |
NCURSES_KEY_IC |
insère un caractère, ou bien passe en mode insertion |
NCURSES_KEY_EIC |
termine le mode insertion |
NCURSES_KEY_CLEAR |
efface l'écran |
NCURSES_KEY_EOS |
efface l'écran jusqu'en bas |
NCURSES_KEY_EOL |
efface l'écran jusqu'à la fin de la ligne |
NCURSES_KEY_SF |
scrolle une ligne vers le bas |
NCURSES_KEY_SR |
scrolle une ligne vers le haut |
NCURSES_KEY_NPAGE |
page suivante |
NCURSES_KEY_PPAGE |
page précédente |
NCURSES_KEY_STAB |
place une tabulation |
NCURSES_KEY_CTAB |
supprime une tabulation |
NCURSES_KEY_CATAB |
supprime toutes les tabulations |
NCURSES_KEY_SRESET |
remise à zéro partielle |
NCURSES_KEY_RESET |
remise à zéro totale |
NCURSES_KEY_PRINT |
imprime |
NCURSES_KEY_LL |
inférieur gauche (sur le pavé numérique) |
NCURSES_KEY_A1 |
supérieur gauche (sur le pavé numérique) |
NCURSES_KEY_A3 |
supérieur droit (sur le pavé numérique) |
NCURSES_KEY_B2 |
centre (sur le pavé numérique) |
NCURSES_KEY_C1 |
inférieur gauche (sur le pavé numérique) |
NCURSES_KEY_C3 |
inférieur droit (sur le pavé numérique) |
NCURSES_KEY_BTAB |
tabulation arrière |
NCURSES_KEY_BEG |
début |
NCURSES_KEY_CANCEL |
annule |
NCURSES_KEY_CLOSE |
ferme |
NCURSES_KEY_COMMAND |
commande |
NCURSES_KEY_COPY |
copie |
NCURSES_KEY_CREATE |
crée |
NCURSES_KEY_END |
fin |
NCURSES_KEY_EXIT |
quitte |
NCURSES_KEY_FIND |
trouve |
NCURSES_KEY_HELP |
aide |
NCURSES_KEY_MARK |
marque |
NCURSES_KEY_MESSAGE |
message |
NCURSES_KEY_MOVE |
déplace |
NCURSES_KEY_NEXT |
suivant |
NCURSES_KEY_OPEN |
ouvre |
NCURSES_KEY_OPTIONS |
options |
NCURSES_KEY_PREVIOUS |
précédent |
NCURSES_KEY_REDO |
refaire |
NCURSES_KEY_REFERENCE |
référence |
NCURSES_KEY_REFRESH |
rafraîchis |
NCURSES_KEY_REPLACE |
replace |
NCURSES_KEY_RESTART |
redémarre |
NCURSES_KEY_RESUME |
recommence |
NCURSES_KEY_SAVE |
sauve |
NCURSES_KEY_SBEG |
shift et début |
NCURSES_KEY_SCANCEL |
shift et annule |
NCURSES_KEY_SCOMMAND |
shift et commande |
NCURSES_KEY_SCOPY |
shift et copie |
NCURSES_KEY_SCREATE |
shift et crée |
NCURSES_KEY_SDC |
shift et efface un caractère |
NCURSES_KEY_SDL |
shift et efface une ligne |
NCURSES_KEY_SELECT |
sélectionne |
NCURSES_KEY_SEND |
shift et fin |
NCURSES_KEY_SEOL |
shift et fin de ligne |
NCURSES_KEY_SEXIT |
shift et quitte |
NCURSES_KEY_SFIND |
shift et trouve |
NCURSES_KEY_SHELP |
shift et aide |
NCURSES_KEY_SHOME |
shift et home |
NCURSES_KEY_SIC |
shift et entrée |
NCURSES_KEY_SLEFT |
shift et flèche vers la gauche |
NCURSES_KEY_SMESSAGE |
shift et message |
NCURSES_KEY_SMOVE |
shift et déplace |
NCURSES_KEY_SNEXT |
shift et suivant |
NCURSES_KEY_SOPTIONS |
shift et options |
NCURSES_KEY_SPREVIOUS |
shift et précédent |
NCURSES_KEY_SPRINT |
shift et imprime |
NCURSES_KEY_SREDO |
shift et refait |
NCURSES_KEY_SREPLACE |
shift et remplace |
NCURSES_KEY_SRIGHT |
shift et flèche vers la droite |
NCURSES_KEY_SRSUME |
shift et recommence |
NCURSES_KEY_SSAVE |
shift et sauve |
NCURSES_KEY_SSUSPEND |
shift et suspend |
NCURSES_KEY_UNDO |
défait |
NCURSES_KEY_MOUSE |
un événement souris est survenu |
NCURSES_KEY_MAX |
valeur maximale de clé |
| Constante | Signification |
|---|---|
NCURSES_BUTTON1_RELEASED - NCURSES_BUTTON4_RELEASED |
bouton (1-4) relâché |
NCURSES_BUTTON1_PRESSED - NCURSES_BUTTON4_PRESSED |
bouton (1-4) pressé |
NCURSES_BUTTON1_CLICKED - NCURSES_BUTTON4_CLICKED |
bouton (1-4) cliqué |
NCURSES_BUTTON1_DOUBLE_CLICKED -
NCURSES_BUTTON4_DOUBLE_CLICKED |
bouton (1-4) double cliqué |
NCURSES_BUTTON1_TRIPLE_CLICKED -
NCURSES_BUTTON4_TRIPLE_CLICKED |
bouton (1-4) triple cliqué |
NCURSES_BUTTON_CTRL |
Contrôle pressé durant le clic |
NCURSES_BUTTON_SHIFT |
shift pressé durant le clic |
NCURSES_BUTTON_ALT |
Alt pressé durant le clic |
NCURSES_ALL_MOUSE_EVENTS |
indique tous les événements souris |
NCURSES_REPORT_MOUSE_POSITION |
indique la position de la souris |
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_addch — Ajoute un caractère à la position courante et avance le curseur
$ch
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
ch
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_addchnstr — Ajoute une chaîne de taille donnée à la position courante
$s
, int $n
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
s
n
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_addchstr — Ajoute une chaîne à la position courante
$s
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
s
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_addnstr — Ajoute une chaîne à la position courante
$s
, int $n
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
s
n
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_addstr — Affiche du texte à la position courante
$text
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
text
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_assume_default_colors — Définit la couleur 0
$fg
, int $bg
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
fg
bg
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_attroff — Désactive les attributs donnés
$attributes
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
attributes
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_attron — Active les attributs fournis
$attributes
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
attributes
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_attrset — Modifie les attributs donnés
$attributes
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
attributes
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_baudrate — Retourne le baudrate du terminal
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_beep — Fait beeper le terminal
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
ncurses_beep() envoie une alerte audible (bell) et si ce n'est pas possible, fait flasher l'écran.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_bkgd — Définit les propriétés de fond d'écran pour le terminal
$attrchar
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
attrchar
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_bkgdset — Définit le fond d'écran
$attrchar
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
attrchar
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_border — Dessine un bord autour de l'écran avec les caractères données
$left
, int $right
, int $top
, int $bottom
, int $tl_corner
, int $tr_corner
, int $bl_corner
, int $br_corner
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Dessine les lignes spécifiées et les coins autour de la fenêtre principale.
Utilisez ncurses_wborder() pour les bordures autour de la fenêtre.
Chaque paramètre attend 0 pour dessiner la ligne et 1 pour ne pas le faire.
left
right
top
bottom
tl_corner
Coin en haut à gauche
tr_corner
Coin en haut à droite
bl_corner
Coin en bas à gauche
br_corner
Coin en bas à droite
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_bottom_panel — Place un conteneur visible en bas de la pile
$panel
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
panel
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_can_change_color — Vérifie si le terminal peut changer de couleur
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Vérifie si le terminal supporte les couleurs et si on peut peut changer ces couleurs à l'aide de la fonction ncurses_init_color(). ncurses doit être initialisé avec ncurses_init() avant d'appeler cette fonction.
Cette fonction ne contient aucun paramètre.
Retourne TRUE si on peut changer les couleurs du terminal,
et FALSE sinon.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_cbreak — Change la bufferisation d'entrée
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Désactive la bufferisation de ligne, et le traitement des caractères (les interruptions et le flux de caractères de contrôle sont inchangés), rendant les caractères tapés par l'utilisateur directement accessibles au programme.
Retourne TRUE en cas de succès, et
NCURSES_ERR en cas d'erreur.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_clear — Efface l'écran
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Efface totalement l'écran sans configurer les blancs.
Note : ncurses_clear() efface totalement l'écran sans configurer les blancs, qui représentent la couleur de fond d'écran. Pour effacer le fond d'écran avec les blancs, utilisez plutôt ncurses_erase().
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_clrtobot — Efface l'écran depuis la position courante jusqu'au bas de l'écran
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Efface toutes les lignes de l'écran depuis le curseur jusqu'à la fin de l'écran. Les blancs qui sont créés avec la fonction ncurses_clrtobot() ont le rendu courant du fond d'écran.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_clrtoeol — Efface l'écran depuis la position courante jusqu'à la fin de la ligne
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Efface la ligne courante depuis la position courante du curseur jusqu'à la fin. Les blancs qui sont créés avec la fonction ncurses_clrtoeol() ont le rendu courant du fond d'écran.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_color_content — Lit la valeur RGB d'une couleur
$color
, int &$r
, int &$g
, int &$b
)Lit les composants rouge, vert et bleu d'une couleur. Les capacités de gestion des couleurs du terminal doivent avoir été initialisées avec ncurses_start_color() avant d'appeler cette fonction.
color
Le numéero de la couleur dont il faut lire les composants. Cela peut être une des constantes de couleurs prédéfinies.
r
Une variable passée par référence, pour recevoir le composant rouge de la couleur demandée. La valeur retournée sera entre 0 et 1000.
g
Une variable passée par référence, pour recevoir le composant vert de la couleur demandée. La valeur retournée sera entre 0 et 1000.
b
Une variable passée par référence, pour recevoir le composant bleu de la couleur demandée. La valeur retournée sera entre 0 et 1000.
Retourne -1 si la fonction a réussi, et 0 si ncurses ou la gestion des couleurs du terminal n'ont pas été initialisées.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_color_set — Modifie la couleur de fond et de devant
$pair
)Configure les couleurs actives de fond et d'affichage. Tous les caractères qui seront écrits après l'utilisation de cette fonction utiliseront ces couleurs. Cette fonction a besoin du support des couleurs dans le terminal et de leur initialisation avec ncurses_start_color().
ncurses utilise des paires de couleurs pour spécifier simultanément les deux couleurs. Utilisez ncurses_init_pair() pour définir une paire.
pair
La paire de couleur qui sera utilisée pour définir les couleurs de fond d'écran et d'affichage.
Retourne -1 en cas de succès, et 0 en cas d'échec.
Exemple #1 Affichage d'une chaîne avec une couleur donnée à l'écran
<?php
ncurses_init();
// Si le terminal supporte les couleurs, initialisation et activation
if (ncurses_has_colors()) {
ncurses_start_color();
ncurses_init_pair(1, NCURSES_COLOR_YELLOW, NCURSES_COLOR_BLUE);
ncurses_color_set(1);
}
// Écriture d'une chaîne à l'écran
ncurses_mvaddstr(10, 10, "Hello world! Yellow on blue text!");
// Envoi à l'écran
ncurses_refresh();
ncurses_end();
?>
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_curs_set — Modifie l'état du curseur
$visibility
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
visibility
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_def_prog_mode — Sauve le mode du terminal
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Sauve le mode du terminal pour réutilisation (dans les curses) avec la fonction ncurses_reset_prog_mode().
Retourne FALSE en cas de succès, et TRUE sinon.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_def_shell_mode — Sauve le mode de terminal (shell)
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Sauve le mode de terminal courant pour qu'il soit réutilisé par le shell (et non pas par curses) avec la fonction ncurses_reset_shell_mode().
Retourne FALSE en cas de succès, et TRUE sinon.
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_define_key — Définit un code de clé (keycode)
$definition
, int $keycode
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
definition
keycode
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_del_panel — Retire un conteneur de la pile et l'efface (mais pas la fenêtre associée)
$panel
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
panel
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_delay_output — Retarde l'affichage sur les terminaux utilisant des caractères de remplissage
$milliseconds
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
milliseconds
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_delch — Efface le caractère courant et décale le reste de la ligne vers la gauche
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Efface la caractère sous le curseur. Tous les caractères sont alors décalés vers la gauche sur la même ligne, et le dernier caractère est remplacé par un vide. La position du curseur ne change pas.
Retourne FALSE en cas de succès, et TRUE sinon.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_deleteln — Efface la ligne courante, et monte l'écran d'une ligne
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Efface la ligne courante, qui est placée sous le curseur. Toutes les lignes sous-jacentes sont alors remontées d'un cran. La ligne du bas est effacée. La position du curseur ne change pas.
Retourne FALSE en cas de succès, et sinon TRUE.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_delwin — Efface une fenêtre ncurses
$window
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
window
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_doupdate — Affiche tout ce qui est prêt, et rafraîchit l'écran
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Compare l'écran mémoire avec l'écran physique, et met à jour l'écran physique. Cette méthode est plus efficace que d'utiliser des rafraîchissements multiples.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_echo — Active l'écho d'entrée clavier
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Active le mode écho. Tous les caractères saisis par l'utilisateur sont affichés à l'écran par ncurses_getch().
Retourne FALSE en cas de succès, et TRUE si une erreur survient.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_echochar — Affiche un caractère et rafraîchit l'écran
$character
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
character
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_end — Cesse l'utilisation de ncurses et efface l'écran
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_erase — Efface l'écran du terminal
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Remplit le terminal avec des blancs.
Les blancs créés ont la couleur du fond d'écran, configurée avec la fonction ncurses_bkgd().
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_erasechar — Lit le caractère qui se fait effacer
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Retourne le caractère qui se fait effacer.
Le caractère effacé, sous la forme d'une chaîne de caractères.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_filter — Définit LINES pour iniscr() et newterm() à 1
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_flash — Fait flasher le terminal (visual bell)
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Fait flasher le terminal et si ce n'est pas possible, envoie une alerte sonore (bell).
Retourne FALSE en cas de succès, et TRUE sinon.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_flushinp — Vide le buffer d'entrée du clavier
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Vide le buffer d'entrée du clavier que votre programme n'a pas encore lu.
Retourne FALSE en cas de succès, et TRUE sinon.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_getch — Lit un caractère sur le clavier
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_getmaxyx — Retourne la taille d'une fenêtre
$window
, int &$y
, int &$x
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Place la taille verticale et la taille horizontale de la fenêtre
window dans les variables fournies.
Les variables doivent être passées par référence, donc, elles seront modifiées lorsque l'utilisateur change la taille du terminal.
window
La fenêtre mesurée
y
Sera défini pour la hauteur de la fenêtre
x
Sera défini pour la largeur de la fenêtre
Aucune valeur n'est retournée.
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_getmouse — Lit les événements souris
&$mevent
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
ncurses_getmouse() lit les événements souris placés dans la queue.
mevent
Les options d'événements seront placées dans ce paramètre, qui doit être un tableau, passé par référence (voir l'exemple ci-dessous).
En cas de succès, un tableau associatif, contenant les clés suivantes, sera délivré :
"id" : Identifiant permettant de distinguer plusieurs périphériques
"x" : Position à l'écran, en abscisse relative, et comptée en caractères
"y" : Position à l'écran, en ordonnée relative, et comptée en caractères
"z" : Actuellement non supporté
"mmask" : Action de souris
Retourne FALSE si un événement de souris est actuellement visible
dans la fenêtre fournie, TRUE sinon.
Exemple #1 Exemple avec ncurses_getmouse()
<?php
switch (ncurses_getch()){
case NCURSES_KEY_MOUSE:
if (!ncurses_getmouse($mevent)){
if ($mevent["mmask"] & NCURSES_MOUSE_BUTTON1_PRESSED){
$mouse_x = $mevent["x"]; // Sauve la position de la souris
$mouse_y = $mevent["y"];
}
}
break;
default:
/* .... */
}
?>
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_getyx — Retourne la position courante du curseur pour une fenêtre
$window
, int &$y
, int &$x
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
window
y
x
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_halfdelay — Met le terminal en mode semi-retardé
$tenth
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
tenth
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_has_colors — Vérifie que le terminal supporte les couleurs
Vérifie que le terminal supporte les couleurs. Cette fonction peut être utilisée pour écrire des programmes indépendants des capacités du terminal. ncurses doit être initialisé avec ncurses_init() avant d'appeler cette fonction.
Cette fonction ne contient aucun paramètre.
Retourne TRUE si le terminal supporte les couleurs, FALSE sinon.
Exemple #1 Writing a string with a specified color to the screen
<?php
ncurses_init();
// Si le terminal supporte les couleurs, initialise et active les couleurs
if (ncurses_has_colors()) {
ncurses_start_color();
ncurses_init_pair(1, NCURSES_COLOR_YELLOW, NCURSES_COLOR_BLUE);
ncurses_color_set(1);
}
// Écrit une chaîne à l'écran
ncurses_mvaddstr(10, 10, "Hello world! Yellow on blue text!");
// Envoi à l'écran
ncurses_refresh();
ncurses_end();
?>
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_has_ic — Vérifie les capacités d'insertion et d'effacement
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Vérifie les capacités d'insertion et d'effacement du terminal.
Retourne TRUE lorsque le terminal a ces capacités, FALSE sinon.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_has_il — Vérifie les capacités d'insertion et d'effacement
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Vérifie les capacités d'insertion et d'effacement du terminal.
Retourne TRUE si le terminal a ces capacités, FALSE sinon.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_has_key — Vérifie la présence des touches de fonctions sur le clavier
$keycode
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
keycode
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_hide_panel — Retire un conteneur de la pile, pour le rendre invisible
$panel
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
panel
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_hline — Dessine une ligne horizontale à la position courante, en utilisant un caractère et une taille maximale
$charattr
, int $n
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
charattr
n
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_inch — Lit le caractère et ses attributs à la position courante
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Retourne le caractère de la position courante.
Retourne le caractère.
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_init_color — Configure une nouvelle valeur RGB pour une couleur
$color
, int $r
, int $g
, int $b
)Définit ou redéfinit une couleur. Lorsque cette fonction est appelée, toutes les occurrences d'une couleur donnée à l'écran, s'il y en a, changent immédiatement de définition.
Le terminal doit supporter les couleurs, et avoir été initialisé avec la fonction ncurses_start_color() avant d'appeler cette fonction. De plus, le terminal doit avoir être capable de changer les couleurs, ce qui peut être vérifié avec la fonction ncurses_can_change_color().
color
Le numéro d'identification de la couleur à redéfinir. Cela peut être une des constantes de couleurs.
r
Une valeur de couleur pour le rouge, entre 0 et 1000.
g
Une valeur de couleur pour le vert, entre 0 et 1000.
b
Une valeur de couleur pour le bleu, entre 0 et 1000.
Retourne -1 si la fonction a réussi, et 0 si ncurses ou les couleurs du terminal n'ont pas été initialisées, ou que le terminal ne supporte pas le changement de couleurs.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_init_pair — Alloue une paire de couleur
$pair
, int $fg
, int $bg
)Définit ou redéfinit une paire de couleur pour l'affichage à l'écran : fond d'écran et affichage. Si la paire de couleur a déjà été initialisée, l'écran est rafraîchit et toutes les occurrences sont modifiées pour refléter la nouvelle définition.
Le support des couleurs doit avoir été initialisé avec ncurses_start_color() avant d'appeler cette fonction. La première paire de couleur (numéro 0) est supposée être blanc sur noir pardéfaut, mais peut être modifiée avec ncurses_assume_default_colors().
pair
Le numéro de la paire à définir.
fg
La couleur d'affichage pour la paire de couleurs. Doit être une des couleurs prédéfinies ou une couleur définie par ncurses_init_color(), si le terminal est capable de changer les couleurs.
bg
La couleur de fond pour la paire de couleurs. Doit être une des couleurs prédéfinies ou une couleur définie par ncurses_init_color(), si le terminal est capable de changer les couleurs.
Retourne -1 si la fonction réussit, et 0 si ncurses ou le support des couleurs n'a pas été initialisé.
Notez que le support du changement de couleurs n'est pas nécessaire pour définir une paire de couleurs pré-existante, mais uniquement pour changer la définition des composants (rouge, vert et bleu) des couleurs elles-mêmes, via ncurses_init_color().
Exemple #1 Écriture d'une chaîne dans une couleur donnée
<?php
ncurses_init();
// Si le terminal supporte les couleurs, initialisation et activation
if (ncurses_has_colors()) {
ncurses_start_color();
ncurses_init_pair(1, NCURSES_COLOR_YELLOW, NCURSES_COLOR_BLUE);
ncurses_color_set(1);
}
// Écriture d'une chaîne à la position donnée
ncurses_mvaddstr(10, 10, "Hello world! Yellow on blue text!");
// Envoi à l'écran
ncurses_refresh();
ncurses_end();
?>
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_init — Initialise ncurses
Initialise l'interface ncurses et doit être utilisé avant n'importe quelle autre fonction ncurses.
Notez que ncurses_end() doit être appelé avant la fin du programme, ou alors le terminal ne sera pas remis dans sont mode non-visuel correct.
Cette fonction ne contient aucun paramètre.
Aucune valeur n'est retournée.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_insch — Insère un caractère et décale le reste de la ligne vers la droite, y compris le caractère courant
$character
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
character
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_insdelln — Insère des lignes devant la ligne courante en scrollant vers le bas (des nombres négatifs donneront un scroll vers le haut)
$count
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
count
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_insertln — Insère une ligne et décale le reste de l'écran vers le bas
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Insère une nouvelle ligne au-dessus de la ligne courante. La ligne du bas de l'écran sera perdue.
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_insstr — Insère une chaîne à la position courante, et décale le reste de la chaîne à droite
$text
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
text
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_instr — Lit une chaîne depuis le terminal
&$buffer
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Lit une chaîne depuis le terminal et retourne le nombre de caractères lus depuis la position courante jusqu'à la fin de la ligne.
buffer
Les caractères. Les attributs seront supprimés.
Retourne le nombre de caractères.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_isendwin — Vérifie si ncurses est en mode endwin
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Vérifie si ncurses est en mode endwin.
Retourne TRUE, si ncurses_end() a été appelée
sans aucun appel subséquent à ncurses_wrefresh(),
FALSE sinon.
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_keyok — Active ou désactive un code de clé (keycode)
$keycode
, bool $enable
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
keycode
enable
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_keypad — Active ou désactive le keypad
$window
, bool $bf
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
window
bf
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_killchar — Retourne la ligne du caractère actuellement supprimé
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Retourne la ligne du caractère actuellement supprimé.
Retourne le caractère supprimé.
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_longname — Retourne la description du terminal
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Retourne une description complète du terminal.
Retourne une description complète du terminal. La description est
tronquée à 128 caractères. En cas d'erreur, FALSE sera retourné.
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_meta — Active/désactive les informations de méta clé 8-bits
$window
, bool $8bit
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
window
8bit
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mouse_trafo — Transforme les coordonnées
&$y
, int &$x
, bool $toscreen
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
y
x
toscreen
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mouseinterval — Configure les délais entre les clics de souris
$milliseconds
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
milliseconds
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mousemask — Configure les événements de souris à surveiller
$newmask
, int &$oldmask
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Configure les événements de souris à surveiller. Par défaut, aucun événement souris n'est rapporté.
Les événements souris sont représentés par NCURSES_KEY_MOUSE
dans la fonction ncurses_wgetch(). Pour lire les
données d'événements dans la queue, utilisez la fonction
ncurses_getmouse().
newmask
Les options de masque de souris sont les constantes suivantes :
NCURSES_BUTTON1_PRESSED
NCURSES_BUTTON1_RELEASED
NCURSES_BUTTON1_CLICKED
NCURSES_BUTTON1_DOUBLE_CLICKED
NCURSES_BUTTON1_TRIPLE_CLICKED
NCURSES_BUTTON2_PRESSED
NCURSES_BUTTON2_RELEASED
NCURSES_BUTTON2_CLICKED
NCURSES_BUTTON2_DOUBLE_CLICKED
NCURSES_BUTTON2_TRIPLE_CLICKED
NCURSES_BUTTON3_PRESSED
NCURSES_BUTTON3_RELEASED
NCURSES_BUTTON3_CLICKED
NCURSES_BUTTON3_DOUBLE_CLICKED
NCURSES_BUTTON3_TRIPLE_CLICKED
NCURSES_BUTTON4_PRESSED
NCURSES_BUTTON4_RELEASED
NCURSES_BUTTON4_CLICKED
NCURSES_BUTTON4_DOUBLE_CLICKED
NCURSES_BUTTON4_TRIPLE_CLICKED
NCURSES_BUTTON_SHIFT>
NCURSES_BUTTON_CTRL
NCURSES_BUTTON_ALT
NCURSES_ALL_MOUSE_EVENTS
NCURSES_REPORT_MOUSE_POSITION
Comme effet secondaire, utiliser la valeur de 0 avec le paramètre
newmask désactive la souris. Lui donner une valeur
positive non nulle réactive la souris.
oldmask
Ce paramètre sera défini avec la valeur du masque précédent.
Retourne un masque pour indiquer quels paramètres de
newmask peut être rapporté.
En cas d'échec complet, elle retourne 0.
Exemple #1 Exemple avec ncurses_mousemask()
<?php
$newmask = NCURSES_BUTTON1_CLICKED + NCURSES_BUTTON1_RELEASED;
$mask = ncurses_mousemask($newmask, $oldmask);
if ($mask & $newmask){
printf("Toutes les options de souris spécifiées sont supportées\n");
}
?>
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_move_panel — Déplace un conteneur pour que son coin supérieur gauche soit aux coordonnées [startx, starty]
$panel
, int $startx
, int $starty
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
panel
startx
starty
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_move — Déplace la position d'affichage
$y
, int $x
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
y
x
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mvaddch — Déplace la position courante et ajoute un caractère
$y
, int $x
, int $c
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
y
x
c
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mvaddchnstr — Déplace la position et ajoute la chaîne attribuée avec la taille donnée
$y
, int $x
, string $s
, int $n
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
y
x
s
n
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mvaddchstr — Déplace la position et ajoute une chaîne attribuée
$y
, int $x
, string $s
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
y
x
s
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mvaddnstr — Déplace la position et ajoute une chaîne de taille donnée
$y
, int $x
, string $s
, int $n
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
y
x
s
n
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mvaddstr — Déplace la position et ajoute une chaîne
$y
, int $x
, string $s
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
y
x
s
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mvcur — Déplace immédiatement le curseur
$old_y
, int $old_x
, int $new_y
, int $new_x
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
old_y
old_x
new_y
new_x
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mvdelch — Déplace la position et efface le caractère, puis décale le reste de la ligne à gauche
$y
, int $x
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
y
x
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mvgetch — Déplace la position et lit le caractère à la nouvelle position
$y
, int $x
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
y
x
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mvhline — Choisi une nouvelle position et dessine une ligne horizontale avec le caractère donné, et de taille maximale donnée
$y
, int $x
, int $attrchar
, int $n
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
y
x
attrchar
n
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mvinch — Déplace la position et lit le caractère à la nouvelle position
$y
, int $x
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
y
x
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mvvline — Modifie la position et dessine une ligne verticale avec le caractère donné, de taille maximale donnée
$y
, int $x
, int $attrchar
, int $n
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
y
x
attrchar
n
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_mvwaddstr — Ajoute une chaîne à une nouvelle position dans la fenêtre
$window
, int $y
, int $x
, string $text
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
window
y
x
text
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_napms — Fait une pause
$milliseconds
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
milliseconds
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_new_panel — Crée un nouveau conteneur et l'associe à une fenêtre
$window
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
window
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_newpad — Crée un nouveau pad (fenêtre)
$rows
, int $cols
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
rows
cols
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_newwin — Crée une nouvelle fenêtre
$rows
, int $cols
, int $y
, int $x
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Crée une nouvelle fenêtre pour y dessiner des éléments.
Lors de la création de la nouvelle fenêtre, pensez à utiliser ncurses_getmaxyx() pour repérer les espaces disponibles, sachant qu'un terminal est individuel et peut varier.
rows
Nombre de lignes
cols
Nombre de colonnes
y
Y : coordonnée de l'origine
x
X : coordonnée de l'origine
Retourne un identifiant de ressource pour la nouvelle fenêtre.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_nl — Convertit les nouvelles lignes et retours chariot en sauts de ligne
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_nocbreak — Passe le terminal en mode cooked
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Retourne le terminal en mode normal (cooked). Initialement, le terminal peut ou peut ne pas être en mode cbreak, comme mode hérité. Par conséquent, un program doit appeler ncurses_cbreak() et ncurses_nocbreak() explicitement.
Retourne FALSE en cas de succès, et TRUE sinon.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_noecho — Désactive l'écho clavier
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Annule l'effet d'écho des caractères tapés à l'écran.
Retourne FALSE en cas de succès, et TRUE sinon.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_nonl — Ne convertit par les nouvelles lignes et retours chariot en sauts de ligne
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_noqiflush — Ne vide pas les buffers sur réception des caractères de signaux
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_noraw — Déconfigure le mode brut du terminal
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Déconfigure le mode brut du terminal. Le mode brut est similaire au mode cbreak, car les caractères tapés sont immédiatement passés au programme. La différence est qu'en mode brut, les caractères d'interruption, de fin de programme, de suspension et de suivi du flux de caractères sont passés sans être interprétés.
Retourne FALSE en cas de succès, et TRUE sinon.
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_pair_content — Retourne les couleurs de fond et d'affichage d'une paire
$pair
, int &$f
, int &$b
)ncurses_pair_content() lit les couleurs de fond et de forme qui constitue une paire. Le support des couleurs du terminal doivent avoir été initialisées avec la fonction ncurses_start_color() avant d'appeler cette fonction.
pair
Le numéro de la paire de couleur qu'il faut lire.
f
Une référence dans laquelle les informations de la couleur d'affichage sera placée. Les informations retournées seront un numéro de couleur parmi les couleurs prédéfinies ou une couleur définie précédemment par ncurses_init_color(), si le terminal supporte le changement de couleur.
b
Une référence dans laquelle les informations de la couleur de fond sera placée. Les informations retournées seront un numéro de couleur parmi les couleurs prédéfinies ou une couleur définie précédemment par ncurses_init_color(), si le terminal supporte le changement de couleur.
Retourne -1 si la fonction a réussi, et 0 si ncurses ou le support des couleurs du terminal n'ont pas été initialisées.
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_panel_above — Retourne le conteneur au-dessus du conteneur
$panel
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
panel
Si le conteneur est null, retourne le dernier conteneur de la pile.
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_panel_below — Retourne le conteneur sous le conteneur
$panel
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
panel
Si le conteneur est null, le premier conteneur de la pile est retourné.
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_panel_window — Retourne la fenêtre associée avec un conteneur
$panel
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
panel
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_pnoutrefresh — Copie une région depuis un pad dans un écran virtuel
$pad
, int $pminrow
, int $pmincol
, int $sminrow
, int $smincol
, int $smaxrow
, int $smaxcol
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
pad
pminrow
pmincol
sminrow
smincol
smaxrow
smaxcol
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_prefresh — Copie une région depuis un pad dans l'écran virtuel
$pad
, int $pminrow
, int $pmincol
, int $sminrow
, int $smincol
, int $smaxrow
, int $smaxcol
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
pad
pminrow
pmincol
sminrow
smincol
smaxrow
smaxcol
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_putp — Applique l'information d'espacement à la chaîne et l'affiche
$text
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
text
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_qiflush — Vide les buffers après détection d'un caractère de signal
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_raw — Passe le terminal en mode brut (raw)
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Place le terminal en mode brut. Le mode brut est similaire au mode cbreak, car les caractères tapés sont immédiatement passés au programme. La différence est qu'en mode brut, les caractères d'interruption, de fin de programme, de suspension et de suivi du flux de caractères sont passés sans être interprétés.
Retourne FALSE en cas de succès, et TRUE sinon.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_refresh — Rafraîchit l'écran
$ch
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
ch
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_replace_panel — Remplace la fenêtre associée à un conteneur
$panel
, resource $window
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
panel
window
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_reset_prog_mode — Restaure le mode prog sauvé par def_prog_mode
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_reset_shell_mode — Restaure le mode shell, mode sauvé par def_shell_mode
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_resetty — Rétablit le terminal sauvé
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Rétablit le terminal sauvé par la fonction ncurses_savetty().
Retourne toujours FALSE.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_savetty — Sauve l'état du terminal
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Sauve l'état courant du terminal. L'état courant du terminal peut être rétabli avec la fonction ncurses_resetty().
Retourne toujours FALSE.
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_scr_dump — Sauve un écran dans un fichier
$filename
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
filename
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_scr_init — Initialise un écran depuis un fichier de sauvegarde
$filename
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
filename
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_scr_restore — Rétablit un écran depuis un fichier de sauvegarde
$filename
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
filename
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_scr_set — Configure un écran depuis un fichier de sauvegarde
$filename
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
filename
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_scrl — Scrolle le contenu de la fenêtre vers le haut ou le bas, sans changer la position courante
$count
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
count
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_show_panel — Place un conteneur invisible en haut de la pile, pour le rendre visible
$panel
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
panel
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_slk_attr — Retourne l'attribut de la clé soft label courante
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Retourne l'attribut de la clé soft label.
L'attribut, sous la forme d'un entier.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_slk_attroff — Désactive l'attribut donné pour les étiquettes des function-key (fonctions clés)
$intarg
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
intarg
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_slk_attron — Active l'attribut donné pour les étiquettes des function-key (fonctions clés)
$intarg
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
intarg
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_slk_attrset — Définit les attributs donnés à une étiquette function-key
$intarg
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
intarg
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_slk_clear — Efface les soft labels de l'écran
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
ncurses_slk_clear() efface les clés label keys de l'écran.
Retourne FALSE en cas de succès, et TRUE sinon.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_slk_color — Configure la couleur des clés soft label
$intarg
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
intarg
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_slk_init — Initialise les fonctions de clés soft label
$format
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Initialise les fonctions de clés soft label.
ncurses_slk_init() doit être appelée avant que ncurses_init() et ncurses_newwin() soient utilisées.
format
Si ncurses_init() utilise une ligne de
stdscr pour émuler les soft labels, alors le paramètre
format détermine comment les labels seront
arrangés sur l'écran.
La valeur 0 indique que vous utiliserez un arrangement de type 3-2-3; la valeur 1 indiquera un arrangement 4-4; la valeur 2 indiquera un mode 4-4-4, mais une ligne d'index sera créée en plus.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_slk_noutrefresh — Copie toutes les clés soft label à l'écran virtuel
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_slk_refresh — Copie les clés soft label à l'écran
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Copie les clés soft label de l'écran virtuel vers l'écran physique.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_slk_restore — Rétablit les clés soft label
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Rétablit les clés soft label après l'utilisation de ncurses_slk_clear().
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_slk_set — Modifie les étiquettes de clé de fonction (function key labels)
$labelnr
, string $label
, int $format
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
labelnr
label
format
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_slk_touch — Force l'affichage lorsque ncurses_slk_noutrefresh est utilisé
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Force l'affichage de tous les soft labels dès la prochaine utilisation de ncurses_slk_noutrefresh().
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_standend — Cesse l'utilisation de l'attribut 'standout'
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_standout — Commence l'utilisation de l'attribut 'standout'
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_start_color — Active les couleurs
ncurses_start_color() intialise le support des couleurs dans ncurses. Cette fonction doit être appelée avant toute manipulation des couelurs, et après ncurses_init(). C'est une bonne pratique que d'appeler cette fonction juste après ncurses_init().
Cette fonction ne contient aucun paramètre.
Retourne 0 en cas de succès, et -1 si la table de couleurs n'a pas pu être allouée ou ncurses n'a pas été initialisée.
Exemple #1 Affichage d'une chaîne en couleur à l'écran
<?php
ncurses_init();
// Si le terminal supporte les couleurs, initialisation et activation
if (ncurses_has_colors()) {
ncurses_start_color();
ncurses_init_pair(1, NCURSES_COLOR_YELLOW, NCURSES_COLOR_BLUE);
ncurses_color_set(1);
}
// Ecriture de la chaîne à l'écran
ncurses_mvaddstr(10, 10, "Hello world! Yellow on blue text!");
// Envoi à l'écran
ncurses_refresh();
ncurses_end();
?>
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_termattrs — Retourne toutes les options supportées par le terminal, combinées ensemble par l'opérateur OR
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_termname — Retourne le nom court du terminal
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Retourne le nom court du terminal.
Retourne le nom court du terminal. Le nom court est tronqué à 14
caractères. En cas d'erreur, ncurses_termname()
retourne NULL.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_timeout — Configure le temps d'expiration des séquences clavier spéciales
$millisec
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
millisec
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_top_panel — Place un conteneur visible sur le haut de la pile
$panel
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
panel
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_typeahead — Spécifie un autre descripteur de fichier pour la vérification à la volée des données saisies
$fd
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
fd
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_ungetch — Replace un caractère dans la queue d'entrée
$keycode
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
keycode
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_ungetmouse — Ajoute un événement souris dans la queue
$mevent
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Ajoute un événement souris dans la queue d'entrée, et associe
cet événement avec l'état du terminal et les coordonnées relatives
(en caractères) de la souris, spécifiés dans mevent.
mevent
Un tableau associatif spécifiant les options de l'événement :
"id" : identifiant permettant de distinguer plusieurs périphériques
"x" : position à l'écran, en abscisse relative, et comptée en caractères
"y" : position à l'écran, en ordonnée relative, et comptée en caractères
"z" : actuellement non supporté
"mmask" : action de souris
Retourne FALSE en cas de succès, et TRUE sinon.
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_update_panels — Rafraîchit l'écran virtuel pour prendre en compte les relations entre les conteneurs de la pile
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_use_default_colors — Assigne la couleur de terminal pour l'index -1
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_use_env — Contrôle l'utilisation des informations d'environnement concernant la taille du terminal
$flag
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
flag
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_use_extended_names — Contrôle l'utilisation des noms étendus dans les descriptions terminfo
$flag
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
flag
(PHP 4 >= 4.0.7, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_vidattr — Affiche la chaîne sur un terminal dans le mode d'attribut vidéo
$intarg
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
intarg
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_vline — Dessine une ligne verticale à la position courante en utilisant un caractère donné, pour une taille donnée
$charattr
, int $n
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
charattr
n
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_waddch — Ajoute un caractère à la position courante, dans une fenêtre, et avance le curseur
$window
, int $ch
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
window
ch
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_waddstr — Affiche le texte à la position courante dans la fenêtre
$window
, string $str
[, int $n
] )Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
window
str
n
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wattroff — Désactive les attributs d'une fenêtre
$window
, int $attrs
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
window
attrs
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wattron — Efface les attributs de la fenêtre
$window
, int $attrs
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
window
attrs
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wattrset — Modifie les attributs d'une fenêtre
$window
, int $attrs
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
window
attrs
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wborder — Dessine le bord d'une fenêtre avec un caractère qualifié
$window
, int $left
, int $right
, int $top
, int $bottom
, int $tl_corner
, int $tr_corner
, int $bl_corner
, int $br_corner
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Dessine les lignes spécifiées et les coins autour de la fenêtre
passée par window.
Utilisez ncurses_border() pour les bordures de la fenêtre principale.
Chaque paramètre attend 0 pour dessiner et 1 pour ne pas le faire.
window
La fenêtre à traiter
left
right
top
bottom
tl_corner
Coin en haut, à gauche
tr_corner
Coin en haut, à droite
bl_corner
Coin en bas, à gauche
br_corner
Coin en bas, à droite
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wclear — Efface la fenêtre
$window
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
window
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wcolor_set — Modifie les paires de couleurs de la fenêtre
$window
, int $color_pair
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
window
color_pair
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_werase — Efface le contenu de la fenêtre
$window
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
window
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wgetch — Lit un caractère depuis le clavier (fenêtre)
$window
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
window
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_whline — Dessine une ligne horizontale à partir de la position courante, avec un caractère qualifié, et d'une taille maximale
$window
, int $charattr
, int $n
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
window
charattr
n
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wmouse_trafo — Transforme les coordonnées d'une fenêtre
$window
, int &$y
, int &$x
, bool $toscreen
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
window
x
y
toscreen
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wmove — Déplace la position d'affichage de la fenêtre
$window
, int $y
, int $x
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
window
y
x
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wnoutrefresh — Copie la fenêtre dans l'écran virtuel
$window
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
window
(PHP 4 >= 4.2.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wrefresh — Rafraîchit la fenêtre sur l'écran du terminal
$window
)Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
window
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wstandend — Termine le mode standout de la fenêtre
$window
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
window
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wstandout — Passe une fenêtre en mode standout
$window
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
window
(PHP 4 >= 4.3.0, PHP 5 < 5.3.0, PECL ncurses >= 1.0.0)
ncurses_wvline — Dessine une ligne verticale dans une fenêtre, à la position courante, en utilisant un caractère qualifié, avec une taille maximale
$window
, int $charattr
, int $n
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
window
charattr
n
Il s'agit d'une extension du langage PHP pour la bibliothèque RedHat Newt, une fenêtre basé sur un terminal et sur une bibliothèque de widget pour écrire des applications avec des interfaces conviviaux. Une fois que cette extension est activé dans PHP, vous aurez la possibilité d'utiliser des widgets, comme des fenêtres, des boutons, des boîtes à cocher, des boîtes radio, des labels, des boîtes texte, des barres de défilement, de grandes boîtes texte, des règles, etc. L'utilisation de cette extension est vraiment similaire à l'API original Newt du langage de programmation C.
Ce module utilise les fonctions de la bibliothèque RedHat Newt. Vous aurez besoin de la version libnewt >= 0.51.0.
Cette extension » PECL n'est pas intégrée à PHP. Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/newt.
En PHP 4, les sources de cette extension PECL peuvent être trouvées dans le dossier ext/ avec les sources de PHP ou sur le lien PECL ci-dessous. Afin d'utiliser ces fonctions, vous devez compiler le support newt en CGI ou en CLI PHP en utilisant l'option de configure --with-newt[=DIR] .
Note:
Cette extension n'est pas disponible pour la plate-forme Windows.
Vous aurez aussi besoin des bibliothèques curses et slang afin de compiler cette extension. Pour spécifier des emplacements de ces bibliothèques, utilisez les options de configuration suivante : --with-curses-dir=/path/to/libcurses --with-slang-dir=/path/to/libslang
Cette extension ne définit aucune directive de configuration.
Cette extension utilise deux types de ressources : "composant newt" et "grille newt".
Le type de ressource "composant newt" est retourné par les fonctions, qui créent les widgets communs newt (par exemple : newt_button()).
Le type de ressource "grille newt" est un lien spécial pour les identifiants des composants, retourné par la classe d'objet de grille de newt (par exemple : newt_create_grid())
Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.
| Constante | Signification |
|---|---|
NEWT_EXIT_HOTKEY |
touche rapide définie par newt_form_add_hot_key() a été appuyée |
NEWT_EXIT_COMPONENT |
certains composants ont demandé la sortie de la forme |
NEWT_EXIT_FDREADY |
le pointeur de fichier spécifié dans newt_form_watch_fd() est prêt à être lu ou écrit |
NEWT_EXIT_TIMER |
le temps spécifié dans newt_form_set_timer() s'est écoulé |
| Constante | Signification |
|---|---|
NEWT_COLORSET_ROOT |
|
NEWT_COLORSET_BORDER |
|
NEWT_COLORSET_WINDOW |
|
NEWT_COLORSET_SHADOW |
|
NEWT_COLORSET_TITLE |
|
NEWT_COLORSET_BUTTON |
|
NEWT_COLORSET_ACTBUTTON |
|
NEWT_COLORSET_CHECKBOX |
|
NEWT_COLORSET_ACTCHECKBOX |
|
NEWT_COLORSET_ENTRY |
|
NEWT_COLORSET_LABEL |
|
NEWT_COLORSET_LISTBOX |
|
NEWT_COLORSET_ACTLISTBOX |
|
NEWT_COLORSET_TEXTBOX |
|
NEWT_COLORSET_ACTTEXTBOX |
|
NEWT_COLORSET_HELPLINE |
|
NEWT_COLORSET_ROOTTEXT |
|
NEWT_COLORSET_EMPTYSCALE |
|
NEWT_COLORSET_FULLSCALE |
|
NEWT_COLORSET_DISENTRY |
|
NEWT_COLORSET_COMPACTBUTTON |
|
NEWT_COLORSET_ACTSELLISTBOX |
|
NEWT_COLORSET_SELLISTBOX |
| Constante | Signification |
|---|---|
NEWT_ARG_LAST |
|
NEWT_ARG_APPEND |
| Constante | Signification |
|---|---|
NEWT_FLAGS_SET |
|
NEWT_FLAGS_RESET |
|
NEWT_FLAGS_TOGGLE |
| Constante | Signification |
|---|---|
NEWT_FLAG_RETURNEXIT |
Sort de la forme, lorsque le composant est activé |
NEWT_FLAG_SCROLL |
Le composant est flottant |
NEWT_FLAG_DISABLED |
Le composant est désactivé |
NEWT_FLAG_BORDER |
|
NEWT_FLAG_WRAP |
Enveloppe le texte |
NEWT_FLAG_NOF12 |
Ne sort pas de la forme en appuyant sur F12 |
NEWT_FLAG_MULTIPLE |
|
NEWT_FLAG_SELECTED |
Le composant est sélectionné |
NEWT_FLAG_CHECKBOX |
Le composant est une case à cocher |
NEWT_FLAG_PASSWORD |
Le composant est une boîte de mot de passe |
NEWT_FLAG_SHOWCURSOR |
Montre le curseur |
| Constante | Signification |
|---|---|
NEWT_FD_READ |
|
NEWT_FD_WRITE |
|
NEWT_FD_EXCEPT |
| Constante | Signification |
|---|---|
NEWT_CHECKBOXTREE_UNSELECTABLE |
|
NEWT_CHECKBOXTREE_HIDE_BOX |
|
NEWT_CHECKBOXTREE_COLLAPSED |
|
NEWT_CHECKBOXTREE_EXPANDED |
|
NEWT_CHECKBOXTREE_UNSELECTED |
|
NEWT_CHECKBOXTREE_SELECTED |
| Constante | Signification |
|---|---|
NEWT_ENTRY_SCROLL |
|
NEWT_ENTRY_RETURNEXIT |
|
NEWT_ENTRY_DISABLED |
| Constante | Signification |
|---|---|
NEWT_LISTBOX_RETURNEXIT |
| Constante | Signification |
|---|---|
NEWT_TEXTBOX_WRAP |
Enveloppe le texte dans la boîte texte |
NEWT_TEXTBOX_SCROLL |
Défile le texte dans la boîte texte |
| Constante | Signification |
|---|---|
NEWT_FORM_NOF12 |
Ne sort pas de la forme en appuyant sur F12 |
| Constante | Signification |
|---|---|
NEWT_KEY_TAB |
|
NEWT_KEY_ENTER |
|
NEWT_KEY_SUSPEND |
|
NEWT_KEY_ESCAPE |
|
NEWT_KEY_RETURN |
|
NEWT_KEY_EXTRA_BASE |
|
NEWT_KEY_UP |
|
NEWT_KEY_DOWN |
|
NEWT_KEY_LEFT |
|
NEWT_KEY_RIGHT |
|
NEWT_KEY_BKSPC |
|
NEWT_KEY_DELETE |
|
NEWT_KEY_HOME |
|
NEWT_KEY_END |
|
NEWT_KEY_UNTAB |
|
NEWT_KEY_PGUP |
|
NEWT_KEY_PGDN |
|
NEWT_KEY_INSERT |
|
NEWT_KEY_F1 |
|
NEWT_KEY_F2 |
|
NEWT_KEY_F3 |
|
NEWT_KEY_F4 |
|
NEWT_KEY_F5 |
|
NEWT_KEY_F6 |
|
NEWT_KEY_F7 |
|
NEWT_KEY_F8 |
|
NEWT_KEY_F9 |
|
NEWT_KEY_F10 |
|
NEWT_KEY_F11 |
|
NEWT_KEY_F12 |
|
NEWT_KEY_RESIZE |
| Constante | Signification |
|---|---|
NEWT_ANCHOR_LEFT |
|
NEWT_ANCHOR_RIGHT |
|
NEWT_ANCHOR_TOP |
|
NEWT_ANCHOR_BOTTOM |
| Constante | Signification |
|---|---|
NEWT_GRID_FLAG_GROWX |
|
NEWT_GRID_FLAG_GROWY |
|
NEWT_GRID_EMPTY |
|
NEWT_GRID_COMPONENT |
|
NEWT_GRID_SUBGRID |
Cet exemple est une utilisation du dialogue 'setup' de RedHat écrit en PHP, exécuté en mode texte.
Exemple #1 Exemple d'Utilisation Newt
<?php
newt_init ();
newt_cls ();
newt_draw_root_text (0, 0, "Test Mode Setup Utility 1.12");
newt_push_help_line (null);
newt_draw_root_text (-30, 0, "(c) 1999-2002 RedHat, Inc");
newt_get_screen_size ($rows, $cols);
newt_open_window ($rows/2-17, $cols/2-10, 34, 17, "Choose a Tool");
$form = newt_form ();
$list = newt_listbox (3, 2, 10);
foreach (array (
"Authentication configuration",
"Firewall configuration",
"Mouse configuration",
"Network configuration",
"Printer configuration",
"System services") as $l_item)
{
newt_listbox_add_entry ($list, $l_item, $l_item);
}
$b1 = newt_button (5, 12, "Run Tool");
$b2 = newt_button (21, 12, "Quit");
newt_form_add_component ($form, $list);
newt_form_add_components ($form, array($b1, $b2));
newt_refresh ();
newt_run_form ($form);
newt_pop_window ();
newt_pop_help_line ();
newt_finished ();
newt_form_destroy ($form);
?>
(PECL newt >= 0.1)
newt_bell — Envoie un beep au terminal
Cette fonction envoie un beep au terminal.
Note:
Dépendemment des configurations du terminal, le beep peut être ou ne peut être audible.
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_centered_window — Ouvre une fenêtre centrée de la taille spécifiée
$width
, int $height
[, string $title
] )Ouvre une fenêtre centrée de la taille spécifiée.
width
Largeur de la fenêtre
height
Hauteur de la fenêtre
title
Titre de la fenêtre
Valeur non définie.
(PECL newt >= 0.1)
newt_checkbox_get_value — Récupère la valeur de la ressource de boîte à cocher
$checkbox
)Cette fonction retourne le caractère dans la séquence qui indique la valeur courante de la boîte à cocher.
checkbox
Retourne le caractère indiquant la valeur de la boîte à cocher.
(PECL newt >= 0.1)
newt_checkbox_set_flags — Configure une ressource de boîte à cocher
$checkbox
, int $flags
, int $sense
)Cette fonction permet de définir divers drapeaux d'une ressource de boîte à cocher.
checkbox
flags
sense
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_checkbox_set_value — Définit la valeur de la boîte à cocher
$checkbox
, string $value
)Cette fonction permet de définir la valeur courante de la ressource de boîte à cocher.
checkbox
value
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_checkbox_tree_add_item — Ajout un nouvel élément à l'arbre des boîtes à cocher
$checkboxtree
, string $text
, mixed $data
, int $flags
, int $index
[, int $...
] )Cette fonction permet d'ajout un nouvel élément l'arbre des boîtes à cocher.
checkboxtree
text
data
flags
index
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_checkbox_tree_find_item — Cherche un élément dans l'arbre des boîtes à cocher
Cherche un élément dans l'arbre des boîtes à cocher.
checkboxtree
data
Retourne la ressource de l'élément de l'arbre de boîtes à cocher, ou
NULL s'il n'a pas été trouvé.
(PECL newt >= 0.1)
newt_checkbox_tree_get_current — Retourne l'élément sélectionné de l'arbre des boîtes à cocher
Cette méthode retourne l'élément sélectionné de l'arbre des boîtes à cocher.
checkboxtree
Retourne l'élément courant (sélectionné) de l'arbre des boîtes à cocher.
(PECL newt >= 0.1)
newt_checkbox_tree_get_entry_value —
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
checkboxtree
data
(PECL newt >= 0.1)
newt_checkbox_tree_get_multi_selection —
$checkboxtree
, string $seqnum
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
checkboxtree
seqnum
(PECL newt >= 0.1)
newt_checkbox_tree_get_selection —
$checkboxtree
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
checkboxtree
(PECL newt >= 0.1)
newt_checkbox_tree_multi —
$left
, int $top
, int $height
, string $seq
[, int $flags
] )Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
left
top
height
seq
flags
(PECL newt >= 0.1)
newt_checkbox_tree_set_current —
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
checkboxtree
data
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_checkbox_tree_set_entry_value —
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
checkboxtree
data
value
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_checkbox_tree_set_entry —
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
checkboxtree
data
text
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_checkbox_tree_set_width —
$checkbox_tree
, int $width
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
checkbox_tree
width
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_checkbox_tree —
$left
, int $top
, int $height
[, int $flags
] )Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
left
top
height
flags
(PECL newt >= 0.1)
newt_checkbox —
$left
, int $top
, string $text
, string $def_value
[, string $seq
] )Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
left
top
text
def_value
seq
(PECL newt >= 0.1)
newt_clear_key_buffer — Jette le contenu de l'entrée du tampon du terminal sans attendre d'autre entrée additionnelle
Jette le contenu de l'entrée du tampon du terminal sans attendre d'autre entrée additionnelle
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_cls —
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_component_add_callback —
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
component
func_name
data
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_component_takes_focus —
$component
, bool $takes_focus
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
component
takes_focus
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_create_grid —
$cols
, int $rows
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
cols
rows
(PECL newt >= 0.1)
newt_cursor_off —
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_cursor_on —
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_delay —
$microseconds
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
microseconds
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_draw_form —
$form
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
form
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_draw_root_text — Affiche la chaîne de caractères à la position indiquée
$left
, int $top
, string $text
)Affiche la chaîne de caractères à la position indiquée.
left
Numéro de colonne
Note:
Si
leftest négatif, la position est mesurée à partir du côté opposé de l'écran.
top
Numéro de ligne
Note:
Si
topest négatif, la position est mesurée à partir du côté opposé de l'écran.
text
Texte à afficher.
Aucune valeur n'est retournée.
Exemple #1 Exemple avec newt_draw_root_text()
Ce code démontre l'affichage des titres dans les deux coins de l'écran.
<?php
newt_init();
newt_cls();
newt_draw_root_text (2, 0, "Un peu de texte");
newt_refresh();
sleep(1);
newt_draw_root_text (-30, 0, "Du texte dans l'autre coin");
newt_refresh();
sleep(1);
newt_finished();
?>
(PECL newt >= 0.1)
newt_entry_get_value —
$entry
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
entry
(PECL newt >= 0.1)
newt_entry_set_filter —
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
entry
filter
data
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_entry_set_flags —
$entry
, int $flags
, int $sense
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
entry
flags
sense
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_entry_set —
$entry
, string $value
[, bool $cursor_at_end
] )Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
entry
value
cursor_at_end
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_entry —
$left
, int $top
, int $width
[, string $init_value
[, int $flags
]] )Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
left
top
width
init_value
flags
(PECL newt >= 0.1)
newt_finished — Arrête l'interface newt
Arrête l'interface newt. Cette fonction est appelée lorsque le programme est prêt à être arrêté.
Retourne 1 en cas de succès ou 0 en cas d'échec.
(PECL newt >= 0.1)
newt_form_add_component — Ajoute un seul composant à la forme
$form
, resource $component
)Ajoute un seul composant à la forme qui est passé dans le premier paramètre.
form
Forme à laquelle le composant sera ajouté
component
Composant à ajouter à la forme
Aucune valeur n'est retournée.
Exemple #1 Exemple avec newt_form_add_component()
<?php
$form = newt_form();
$options = array("Authentication configuration", "Firewall configuration",
"Mouse configuration", "Network configuration", "Printer configuration",
"System services");
$list = newt_listbox(3, 2, 10);
foreach ($options as $l_item) {
newt_listbox_add_entry($list, $l_item, $l_item);
}
newt_form_add_component($form, $list);
?>
(PECL newt >= 0.1)
newt_form_add_components — Ajoute plusieurs composants à la forme
$form
, array $components
)
Ajoute plusieurs composants à la forme form.
form
Forme à laquelle les composants seront ajoutés
components
Tableau de composants à ajouter à la forme
Aucune valeur n'est retournée.
Exemple #1 Exemple avec newt_form_add_components()
<?php
$form = newt_form();
$b1 = newt_button(5, 12, "Run Tool");
$b2 = newt_button(21, 12, "Quit");
newt_form_add_components($form, array($b1, $b2));
?>
(PECL newt >= 0.1)
newt_form_add_hot_key —
$form
, int $key
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
form
key
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_form_destroy — Détruit une forme
$form
)Cette fonction libère les ressources mémoires utilisées par la forme et tous les composants qui avaient été ajoutés à la forme (en incluant les composants qui sont sur des formes filles). Une fois que la forme est détruite, aucun des composants qui appartenaient à la forme ne peut être utilisé.
form
Composant forme, qui sera détruit
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_form_get_current —
$form
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
form
(PECL newt >= 0.1)
newt_form_run — Exécute une forme
$form
, array &$exit_struct
)Cette fonction exécute la forme qui lui est passée.
form
Composant forme
exit_struct
Tableau, utilisé pour retourner des informations après l'exécution des composants de la forme. Les clés et leur valeur sont décrites dans la table suivante :
| Clé Index | Type de Valeur | Description |
|---|---|---|
| reason | entier | La raison indiquant pourquoi la forme a été quittée. Les valeurs possibles sont définies ici. |
| watch | ressource | Lien de ressource, spécifié dans newt_form_watch_fd() |
| key | entier | Raccourci |
| component | ressource | Composant, qui a causé la forme à quitter |
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_form_set_background —
$from
, int $background
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
from
background
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_form_set_height —
$form
, int $height
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
form
height
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_form_set_size —
$form
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
form
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_form_set_timer —
$form
, int $milliseconds
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
form
milliseconds
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_form_set_width —
$form
, int $width
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
form
width
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_form_watch_fd —
$form
, resource $stream
[, int $flags
] )Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
form
stream
flags
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_form — Crée une forme
$vert_bar
[, string $help
[, int $flags
]]] )Crée une nouvelle forme.
vert_bar
Barre de défilement vertical qui devrait être associée à la forme
help
Chaîne de caractères d'aide
flags
Drapeaux variés
Retourne le lien ressource du composant de la forme créé ou FALSE en cas
d'erreur.
Exemple #1 Exemple avec newt_form()
Affiche un simple bouton "Quitter", qui ferme l'application une fois qu'il est pressé.
<?php
newt_init();
newt_cls();
$myform = newt_form();
$button = newt_button (5, 12, "Quitter");
newt_form_add_component ($myform, $button);
newt_refresh ();
newt_run_form ($myform);
newt_finished ();
newt_form_destroy ($myform);
?>
(PECL newt >= 0.1)
newt_get_screen_size — Remplit les références passées avec la taille courante du terminal
&$cols
, int &$rows
)Remplit les références passées avec la taille courante du terminal.
cols
Nombre de colonnes dans le terminal
rows
Nombre de lignes dans le terminal
Aucune valeur n'est retournée.
Exemple #1 Exemple avec newt_get_screen_size()
Ce code affiche la taille de l'écran de votre terminal.
<?php
newt_init();
newt_get_screen_size (&$cols, &$rows);
newt_finished();
print "Votre taille de terminal est : {$cols}x{$rows}\n";
?>
L'exemple ci-dessus va afficher :
Votre taille de terminal est : 138x47
(PECL newt >= 0.1)
newt_grid_add_components_to_form —
$grid
, resource $form
, bool $recurse
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
grid
form
recurse
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_grid_basic_window —
$text
, resource $middle
, resource $buttons
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
text
middle
buttons
(PECL newt >= 0.1)
newt_grid_free —
$grid
, bool $recurse
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
grid
recurse
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_grid_get_size —
$grid
, int &$width
, int &$height
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
grid
width
height
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_grid_h_close_stacked —
$element1_type
, resource $element1
[, int $...
[, resource $...
]] )Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
element1_type
element1
(PECL newt >= 0.1)
newt_grid_h_stacked —
$element1_type
, resource $element1
[, int $...
[, resource $...
]] )Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
element1_type
element1
(PECL newt >= 0.1)
newt_grid_place —
$grid
, int $left
, int $top
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
grid
left
top
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_grid_set_field —
$grid
, int $col
, int $row
, int $type
, resource $val
, int $pad_left
, int $pad_top
, int $pad_right
, int $pad_bottom
, int $anchor
[, int $flags
] )Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
grid
col
row
type
val
pad_left
pad_top
pad_right
pad_bottom
anchor
flags
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_grid_simple_window —
$text
, resource $middle
, resource $buttons
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
text
middle
buttons
(PECL newt >= 0.1)
newt_grid_v_close_stacked —
$element1_type
, resource $element1
[, int $...
[, resource $...
]] )Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
element1_type
element1
(PECL newt >= 0.1)
newt_grid_v_stacked —
$element1_type
, resource $element1
[, int $...
[, resource $...
]] )Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
element1_type
element1
(PECL newt >= 0.1)
newt_grid_wrapped_window_at —
$grid
, string $title
, int $left
, int $top
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
grid
title
left
top
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_grid_wrapped_window —
$grid
, string $title
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
grid
title
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_init — Initialise newt
Initialise l'interface newt. Cette fonction doit être appelée avant n'importe quelle autre fonction newt.
Retourne 1 en cas de succès ou 0 en cas d'échec.
(PECL newt >= 0.1)
newt_label_set_text —
$label
, string $text
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
label
text
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_label —
$left
, int $top
, string $text
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
left
top
text
(PECL newt >= 0.1)
newt_listbox_append_entry —
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
listbox
text
data
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_listbox_clear_selection —
$listbox
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
listbox
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_listbox_clear —
$listobx
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
listobx
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_listbox_delete_entry —
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
listbox
key
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_listbox_get_current —
$listbox
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
listbox
(PECL newt >= 0.1)
newt_listbox_get_selection —
$listbox
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
listbox
(PECL newt >= 0.1)
newt_listbox_insert_entry —
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
listbox
text
data
key
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_listbox_item_count —
$listbox
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
listbox
(PECL newt >= 0.1)
newt_listbox_select_item —
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
listbox
key
sense
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_listbox_set_current_by_key —
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
listbox
key
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_listbox_set_current —
$listbox
, int $num
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
listbox
num
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_listbox_set_data —
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
listbox
num
data
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_listbox_set_entry —
$listbox
, int $num
, string $text
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
listbox
num
text
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_listbox_set_width —
$listbox
, int $width
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
listbox
width
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_listbox —
$left
, int $top
, int $height
[, int $flags
] )Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
left
top
height
flags
(PECL newt >= 0.1)
newt_listitem_get_data —
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
item
(PECL newt >= 0.1)
newt_listitem_set —
$item
, string $text
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
item
text
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_listitem —
$left
, int $top
, string $text
, bool $is_default
, resouce $prev_item
, mixed $data
[, int $flags
] )Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
left
top
text
is_default
prev_item
data
flags
(PECL newt >= 0.1)
newt_open_window — Ouvre une fenêtre de la taille et la position spécifiée
$left
, int $top
, int $width
, int $height
[, string $title
] )Ouvre une fenêtre de la taille et la position spécifiée.
left
Emplacement du coin haut gauche de la fenêtre (numéro de colonne)
top
Emplacement du coin haut gauche de la fenêtre (numéro de ligne)
width
Largeur de la fenêtre
height
Hauteur de la fenêtre
title
Titre de la fenêtre
Retourne 1 en cas de succès ou 0 en cas d'échec.
(PECL newt >= 0.1)
newt_pop_help_line — Replace la ligne d'aide courante avec une provenant de la pile
Replace la ligne d'aide courante avec une provenant de la pile.
Note:
Il est important de ne pas appeler la fonction newt_pop_help_line() plus que newt_push_help_line().
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_pop_window — Supprime la fenêtre de premier plan de l'affichage
Supprime la fenêtre de premier plan de l'affichage et redessine le secteur d'affichage sur lequel la fenêtre se trouvait.
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_push_help_line — Sauvegarde la ligne d'aide courante sur la pile et affiche la nouvelle ligne
$text
] )Sauvegarde la ligne d'aide courante sur la pile et affiche la nouvelle ligne.
text
Nouveau message d'aide
Note:
Si non spécifié, la ligne d'aide est supprimée.
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_radio_get_current —
$set_member
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
set_member
(PECL newt >= 0.1)
newt_redraw_help_line —
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_reflow_text —
$text
, int $width
, int $flex_down
, int $flex_up
, int &$actual_width
, int &$actual_height
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
text
width
flex_down
flex_up
actual_width
actual_height
(PECL newt >= 0.1)
newt_refresh — Met à jour les portions modifiées de l'écran
Pour améliorer les performances, newt met à jour seulement l'affichage lorsque c'est requis et non lorsque le programme lui demande d'écrire dans le terminal. Les applications peuvent forcer newt pour mettre à jour immédiatement les portions modifiées de l'écran en appelant cette fonction.
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_resize_screen —
$redraw
] )Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
redraw
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_resume — Récupère l'interface de newt après l'appel de newt_suspend()
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_run_form — Exécute une forme
$form
)Cette fonction exécute la forme qui lui est passée en argument.
form
Composant forme
Le composant qui a arrêté la forme.
Note:
Notez que cette fonction n'est pas similaire aux conventions de nom de newt. Il s'agit d'une plus vieille interface qui ne fonctionnera pas pour toutes les formes. Elle a été laissée dans newt seulement pour compatibilité des applications. Il s'agit d'une interface plus simple que la nouvelle newt_form_run() et est toujours utilisée plus souvent en pratique. Lorsqu'une application a terminée d'une forme, elle la détruit et tous les composants que la forme contient.
(PECL newt >= 0.1)
newt_scale_set —
$scale
, int $amount
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
scale
amount
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_scale —
$left
, int $top
, int $width
, int $full_value
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
left
top
width
full_value
(PECL newt >= 0.1)
newt_scrollbar_set —
$scrollbar
, int $where
, int $total
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
scrollbar
where
total
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_set_help_callback —
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
function
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_set_suspend_callback — Assigne la fonction de rappel appelée sur suspension
newt_set_suspend_callback() assigne une fonction de rappel qui sera appelée lorsque l'utilisateur appuiera sur la touche de suspension (normalement ^Z). Si aucune fonction de rappel n'est configurée, la commande de suspension est ignorée.
function
Une fonction de rappel, qui accepte un argument : data
data
Cette donnée sera passée à la fonction de rappel
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_suspend — Indique à newt de retourner à l'état initial du terminal
Indique newt de retourner à l'état initial du terminal. Une fois cela fait, l'application est suspendue (en envoyant à elle-même un SIGTSTP, embranche sur un programme enfant ou fait n'importe quoi d'autre qu'elle aime).
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_textbox_get_num_lines —
$textbox
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
textbox
(PECL newt >= 0.1)
newt_textbox_reflowed —
$left
, int $top
, char $*text
, int $width
, int $flex_down
, int $flex_up
[, int $flags
] )Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
left
top
*text
width
flex_down
flex_up
flags
(PECL newt >= 0.1)
newt_textbox_set_height —
$textbox
, int $height
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
textbox
height
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_textbox_set_text —
$textbox
, string $text
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
textbox
text
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_textbox —
$left
, int $top
, int $width
, int $height
[, int $flags
] )Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
left
top
width
height
flags
(PECL newt >= 0.1)
newt_vertical_scrollbar —
$left
, int $top
, int $height
[, int $normal_colorset
[, int $thumb_colorset
]] )Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
left
top
height
normal_colorset
thumb_colorset
(PECL newt >= 0.1)
newt_wait_for_key — Ne continue pas tant qu'une touche n'est pas appuyée
Cette fonction ne continue pas tant qu'une touche n'est pas appuyée. La frappe est alors ignorée. Si une touche est déjà dans le tampon du terminal, cette fonction jette la frappe et continue immédiatement.
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_win_choice —
$title
, string $button1_text
, string $button2_text
, string $format
[, mixed $args
[, mixed $...
]] )Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
title
button1_text
button2_text
format
args
(PECL newt >= 0.1)
newt_win_entries —
$title
, string $text
, int $suggested_width
, int $flex_down
, int $flex_up
, int $data_width
, array &$items
, string $button1
[, string $...
] )Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
title
text
suggested_width
flex_down
flex_up
data_width
items
button1
button2
Exemple #1 Exemple avec newt_win_entries()
<?php
newt_init();
newt_cls();
$entries[] = array('text' => 'First name:', 'value' => &$f_name);
$entries[] = array('text' => 'Last name:', 'value' => &$l_name);
$rc = newt_win_entries("User information", "Please enter your credentials:", 50, 7, 7, 30, $entries, "Ok", "Back");
newt_finished ();
if ($rc != 2) {
echo "Your name is: $f_name $l_name\n";
}
?>
(PECL newt >= 0.1)
newt_win_message —
$title
, string $button_text
, string $format
[, mixed $args
[, mixed $...
]] )Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
title
button_text
format
args
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_win_messagev —
$title
, string $button_text
, string $format
, array $args
)Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
title
button_text
format
args
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_win_ternary —
$title
, string $button1_text
, string $button2_text
, string $button3_text
, string $format
[, mixed $args
[, mixed $...
]] )Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
title
button1_text
button2_text
button3_text
format
args
Les fonctions readline implémente une interface de la bibliothèque GNU Readline. Ce sont des fonctions qui fournissent des lignes de commandes éditables. Un exemple est fourni montrant comment Bash vous permet d'utiliser les flèches pour insérer des caractères ou scroller dans l'historique des commandes. De part la nature de cette bibliothèque, vous ne devriez pas en avoir besoin dans vos applications Web mais par contre, cela peut être très utile lors de l'écriture de scripts utilisés depuis la ligne de command.
Note: Cette extension n'est pas disponible sur les plates-formes Windows.
Pour utiliser les fonctions readline, vous devez installer la bibliothèque libreadline. Vous pouvez la trouver sur la page d'accueil du projet GNU Readline, ici : » http://cnswww.cns.cwru.edu/~chet/readline/rltop.html. Elle est maintenu par Chet Ramey, qui est également l'auteur de Bash.
Vous pouvez également utiliser ces fonctions avec la bibliothèque libedit, une alternative non-GPL à la bibliothèque readline. La bibliothèque libedit est sous licence BSD et est disponible au téléchargement depuis » http://www.thrysoee.dk/editline/.
Pour utiliser ces fonctions, vous devez compiler PHP, en version CGI ou CLI. Vous devez aussi utiliser l'option de compilation --with-readline[=DIR] . Si vous souhaitez utiliser la bibliothèque libedit readline, en remplacement, compilez PHP avec l'option --with-libedit[=DIR] .
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
| Nom | Défaut | Modifiable | Historique |
|---|---|---|---|
| cli.pager | "" | PHP_INI_ALL | Disponible depuis PHP 5.4.0. |
| cli.prompt | "\\b \\> " | PHP_INI_ALL | Disponible depuis PHP 5.4.0. |
Voici un éclaircissement sur l'utilisation des directives de configuration.
cli.pager
string
Outil externe pour afficher la sortie depuis la ligne de commande.
cli.prompt
string
Prompt de la ligne de commande.
Cette extension ne définit aucune ressource.
Cette extension ne définit aucune constante.
(PHP 4, PHP 5)
readline_add_history — Ajoute une ligne à l'historique
$line
)Ajoute une ligne à l'historique.
line
La ligne à ajouter à l'historique.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PHP 5 >= 5.1.0)
readline_callback_handler_install — Initialise l'interface et le terminal de rappel de readline, affiche le prompt et retourne immédiatement
Définie une interface de rappel pour readline, affiche le
prompt et retourne immédiatement.
Appeler cette fonction deux fois sans effacer au préalable l'interface
de rappel précédente effacera automatiquement
et proprement l'ancienne interface.
La fonctionnalité de rappel est très utile lorsque combinée à la fonction stream_select() permettant l'interconnexion IO / entrée utilisateur, à la différence de readline().
prompt
Le message de prompt.
callback
La fonction callback prend
un paramètre : l'entrée utilisateur retournée.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemple #1 Exemple d'interface de rappelde Readline
<?php
function rl_callback($ret)
{
global $c, $prompting;
echo "You entered: $ret\n";
$c++;
if ($c > 10) {
$prompting = false;
readline_callback_handler_remove();
} else {
readline_callback_handler_install("[$c] Entrer quelque chose : ", 'rl_callback');
}
}
$c = 1;
$prompting = true;
readline_callback_handler_install("[$c] Entrer quelque chose : ", 'rl_callback');
while ($prompting) {
$w = NULL;
$e = NULL;
$n = stream_select($r = array(STDIN), $w, $e, null);
if ($n && in_array(STDIN, $r)) {
// lit un caractère, appelera la fonction de callback lorsqu'une nouvelle ligne est entrée
readline_callback_read_char();
}
}
echo "Le prompt est désactivé. Tout a été effectué.\n";
?>
(PHP 5 >= 5.1.0)
readline_callback_handler_remove — Efface un gestionnaire de rappel readline
Efface un gestionnaire de rappel installé précédemment et restaure les paramètres du terminal.
Retourne TRUE si un gestionnaire de rappel précédemment installé a été effacé
ou FALSE s'il n'a pas été trouvé.
Voir la fonction readline_callback_handler_install() pour un exemple concernant l'utilisation de l'interface de rappel readline.
(PHP 5 >= 5.1.0)
readline_callback_read_char — Lit un caractère et informe l'interface de rappel readline
Lit un caractère de l'entrée utilisateur. Lorsqu'une ligne est reçue, la fonction informe l'interface de rappel readline installée en utilisant readline_callback_handler_install() qu'une ligne est prête à être entrée.
Aucune valeur n'est retournée.
Voir la fonction readline_callback_handler_install() pour un exemple concernant l'utilisation de l'interface de rappel readline.
(PHP 4, PHP 5)
readline_clear_history — Efface l'historique
Efface l'historique.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PHP 4, PHP 5)
readline_completion_function — Enregistre une fonction de complétion
Enregistre une nouvelle fonction de complétion. C'est la même fonctionnalité que lorsque vous utilisez la touche de tabulation sous Bash.
function
Vous devez fournir le nom d'une fonction qui accepte un nom partiel de commande, et retourne une liste de fonctions complète possibles.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PHP 4, PHP 5)
readline_info — Lit ou modifie diverses variables internes de readline
Lit/modifie diverses variables internes.
varname
Un nom de variable.
newvalue
Si fourni, ce sera la nouvelle valeur à définir.
Appelée sans paramètre, readline_info() retourne une tableau contenant les valeurs des paramètres de Readline. Les éléments seront indexés par les clés suivantes : "done", "end", "erase_empty_line", "library_version", "line_buffer", "mark", "pending_input", "point", "prompt", "readline_name" et "terminal_name".
Si appelée avec un ou deux paramètres, l'ancienne valeur est retournée.
(PHP 4, PHP 5)
readline_list_history — Liste l'historique
Liste l'historique.
Retourne un tableau avec la liste de toutes les lignes de commandes de l'historique. Les éléments sont indexés numériquement, à partir de 0.
(PHP 5 >= 5.1.0)
readline_on_new_line — Informe readline que le curseur est passé à une nouvelle ligne
Informe readline que le curseur est passé à une nouvelle ligne.
Aucune valeur n'est retournée.
(PHP 4, PHP 5)
readline_read_history — Lit l'historique
$filename
] )
Lit une ligne de l'historique depuis le fichier filename.
filename
Chemin vers le fichier contenant l'historique des commandes.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PHP 5 >= 5.1.0)
readline_redisplay — Demande à readline de refaire l'affichage
Demande à readline de refaire l'affichage.
Aucune valeur n'est retournée.
(PHP 4, PHP 5)
readline_write_history — Écrit dans l'historique
$filename
] )
Écrit l'historique dans le fichier filename.
filename
Chemin vers le fichier à sauvegarder.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PHP 4, PHP 5)
readline — Lit une ligne
$prompt
] )Retourne une ligne entrée par l'utilisateur. Vous devez ajouter cette ligne à l'historique vous-même, avec la fonction readline_add_history().
prompt
Vous pouvez spécifier une chaîne de caractères à utiliser comme prompt à l'utilisateur.
Retourne une chaîne de caractères depuis l'utilisateur. La ligne retournée a été débarrassée du caractère final de nouvelle ligne.
Exemple #1 Exemple avec readline()
<?php
// Lit 3 commandes de l'utilisateur
for ($i=0; $i < 3; $i++) {
$line = readline("Commande : ");
readline_add_history($line);
}
// Liste l'historique
print_r(readline_list_history());
// Liste les variables
print_r(readline_info());
?>
Les fonctions bzip2 sont utilisées pour lire et écrire de façon transparente les fichiers compressés bzip2 (.bz2).
Cette extension utilise les fonctions » bzip2 de la bibliothèque écrite par Julian Seward. Ce module nécessite bzip2/libbzip2, version >= 1.0.x.
Le support bzip2 par PHP n'est pas activé par défaut. Vous devez utiliser l'option de configuration --with-bz2[=DIR] lors de la compilation de PHP pour l'activer.
Cette extension ne définit aucune directive de configuration.
Cette extension définit un type de ressource : un pointeur de fichier identifiant le fichier bz2.
Cette extension ne définit aucune constante.
Cet exemple ouvre un fichier temporaire et y écrit une chaîne de test, puis, affiche le contenu de ce fichier.
Exemple #1 Petit exemple avec bzip2
<?php
$filename = "/tmp/testfile.bz2";
$str = "Ceci est une chaîne de test.\n";
// Ouvre un fichier en écriture
$bz = bzopen($filename, "w");
// Écrit une chaîne
bzwrite($bz, $str);
// Ferme le fichier
bzclose($bz);
// Ouvre le fichier en lecture
$bz = bzopen($filename, "r");
// Lit 10 caractères
echo bzread($bz, 10);
// Affiche le contenu du fichier et on le ferme
echo bzread($bz);
bzclose($bz);
?>
(PHP 4 >= 4.0.4, PHP 5)
bzclose — Ferme un fichier bzip2
$bz
)
bzclose() ferme le fichier bzip2
représenté par le pointeur bz.
bz
Le pointeur de fichier. Il doit être valide et doit pointer vers un fichier ouvert avec succès par la fonction bzopen().
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PHP 4 >= 4.0.4, PHP 5)
bzcompress — Compresse une chaîne avec bzip2
bzcompress() compresse la chaîne
source et retourne les données ainsi encodées.
source
La chaîne à compresser.
blocksize
Spécifie la taille de bloc utilisée durant la compression et doit être un nombre de 1 à 9, sachant que 9 représente la meilleure compression, mais qu'elle utilise plus de ressources pour se faire.
workfactor
Contrôle le comportement de la compression dans les pires cas de données hautement répétitives. Cette valeur peut aller de 0 à 250 (0 est une valeur spéciale).
En dehors de workfactor, le résultat sera le même.
La chaîne compressée ou un numéro d'erreur si une erreur survient.
Exemple #1 Compression de données
<?php
$str = "donnée simple";
$bzstr = bzcompress($str, 9);
echo $bzstr;
?>
(PHP 4 >= 4.0.4, PHP 5)
bzdecompress — Décompresse une chaîne bzip2
bzdecompress() décompresse la chaîne
source, contenant des données compressées bzip2.
source
La chaîne à décompresser.
small
Si ce paramètre vaut TRUE, un autre algorithme de décompression sera utilisé :
il consomme moins de mémoire (le maximum demandé tombe autour de
2300 ko), mais fonctionne globalement à la moitié de
la vitesse.
Reportez-vous à la » documentation bzip2 pour plus de détails sur cette fonctionnalité.
La chaîne décompressée ou un numéro d'erreur si une erreur survient.
Exemple #1 Décompression d'une chaîne
<?php
$start_str = "phrase à compresser";
$bzstr = bzcompress($start_str);
echo "Chaîne compressée : ";
echo $bzstr;
echo "\n<br />\n";
$str = bzdecompress($bzstr);
echo "Chaîne décompressée : ";
echo $str;
echo "\n<br />\n";
?>
(PHP 4 >= 4.0.4, PHP 5)
bzerrno — Retourne le code d'erreur bzip2
$bz
)
bzerrno() retourne le code d'erreur
du fichier bz2 représenté par le pointeur bz.
bz
Le pointeur de fichier. Il doit être valide et doit pointer vers un fichier ouvert avec succès avec la fonction bzopen().
Retourne le code erreur sous la forme d'un entier.
(PHP 4 >= 4.0.4, PHP 5)
bzerror — Retourne le numéro et le message d'erreur bzip2 dans un tableau
$bz
)
bzerror() retourne un tableau associatif avec
le numéro et le message d'erreur du fichier bz2 représenté par le
pointeur bz.
bz
Le pointeur de fichier. Il doit être valide et doit pointer vers un fichier ouvert avec succès par la fonction bzopen().
Retourne un tableau associatif, avec le code erreur dans l'entrée errno, et le message d'erreur dans l'entrée errstr.
Exemple #1 Exemple avec bzerror()
<?php
$error = bzerror($bz);
echo $error["errno"];
echo $error["errstr"];
?>
(PHP 4 >= 4.0.4, PHP 5)
bzerrstr — Retourne le message d'erreur bzip2
$bz
)
bzerrstr() retourne le message d'erreur
du fichier bz2 représenté par le pointeur bz.
bz
Le pointeur de fichier. Il doit être valide et doit pointer vers un fichier ouvert avec succès par la fonction bzopen().
Retourne une chaîne contenant le message d'erreur.
(PHP 4 >= 4.0.4, PHP 5)
bzflush — Force l'écriture de toutes les données compressées
$bz
)
bzflush() force l'écriture de toutes les données
bzip2 mises en tampon pour le fichier représenté par
bz.
bz
Le pointeur de fichier. Il doit être valide et doit pointer vers un fichier ouvert avec succès par la fonction bzopen().
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
(PHP 4 >= 4.0.4, PHP 5)
bzopen — Ouvre un fichier compressé avec bzip2
$filename
, string $mode
)bzopen() ouvre un fichier bzip2 (.bz2) en écriture ou en lecture.
filename
Le nom du fichier à ouvrir.
mode
Similaire à la fonction fopen(),
seules les options 'r' (pour lecture), et 'w' (pour écriture)
sont supportées. Toute autre option fera que la fonction
retournera FALSE.
Si l'ouverture échoue, bzopen() retourne FALSE,
sinon, il retourne un pointeur vers le fichier ouvert.
Exemple #1 Exemple avec bzopen()
<?php
$file = "/tmp/foo.bz2";
$bz = bzopen($file, "r") or die("Impossible d'ouvrir le fichier $file pour lecture");
bzclose($bz);
?>
(PHP 4 >= 4.0.4, PHP 5)
bzread — Lecture binaire d'un fichier bzip2
$bz
[, int $length = 1024
] )bzread() lit depuis le pointeur de fichier bzip2 donné.
La lecture s'arrête lorsque length (non-compressé)
octets ont été lus ou si la fin du fichier est atteint, le premier des deux qui
survient.
bz
Le pointeur de fichier. Il doit être valide et doit pointer vers un fichier ouvert avec succès par la fonction bzopen().
length
Si non spécifié, bzread() lira 1024 (non-compressé) octets à la fois. Un maximum de 8192 octets non-compressés sera lu à la fois.
Retourne les données non-compressées ou FALSE si une erreur survient.
Exemple #1 Exemple avec bzread()
<?php
$file = "/tmp/foo.bz2";
$bz = bzopen($file, "r") or die("Impossible d'ouvrir le fichier $file");
$decompressed_file = '';
while (!feof($bz)) {
$decompressed_file .= bzread($bz, 4096);
}
bzclose($bz);
echo "Le contenu du fichier $file est : <br />\n";
echo $decompressed_file;
?>
(PHP 4 >= 4.0.4, PHP 5)
bzwrite — Écriture binaire dans un fichier bzip2
$bz
, string $data
[, int $length
] )
bzwrite() écrit le contenu de la chaîne
data dans le fichier bzip2 représenté
par bz.
bz
Le pointeur de fichier. Il doit être valide et doit pointer vers un fichier ouvert avec succès par la fonction bzopen().
data
Les données écrites.
length
Si fourni, l'écriture s'arrêtera après que length
(non-compressé) octets aient été écrits ou bien que la fin de
data soit atteinte, le premier des deux qui survient.
Retourne le nombre d'octets écrits ou FALSE si une erreur survient.
Exemple #1 Exemple avec bzwrite()
<?php
$str = "donné non-compressée";
$bz = bzopen("/tmp/foo.bz2", "w");
bzwrite($bz, $str, strlen($str));
bzclose($bz);
?>
LZF est un algorithme de compression très rapide, idéal pour économiser de l'espace disque sans trop de perte de temps. Il peut être optimisé pour la vitesse ou pour la compression au moment de la compilation. Cette extension utilise la bibliothèque » liblzf créée par Marc Lehmann.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Cette extension » PECL n'est pas intégrée à PHP. Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/lzf.
Si vous voulez utiliser ces fonctions, vous devez compiler PHP avec le support lzf en utilisant l'option de configuration --with-lzf[=DIR] . Vous pouvez également passer l'option --enable-lzf-better-compression pour optimiser LZF d'un point de vue d'espace au détriment de la vitesse.
Les utilisateurs de Windows doivent activer la bibliothèque php_lzf.dll dans le php.ini pour pouvoir utiliser ces fonctions. Aucune bibliothèque DLL pour cette extension PECL n'est actuellement disponible. Reportez-vous à la section Compilation sous Windows.
Cette extension ne définit aucune directive de configuration.
Cette extension ne définit aucune ressource.
Cette extension ne définit aucune constante.
(PECL lzf >= 0.1.0)
lzf_compress — Compression LZF
$data
)
lzf_compress() compresse les données
data en utilisant l'encodage LZF.
data
La chaîne de caractères à compresser.
Retourne les données compressées ou FALSE si une erreur survient.
(PECL lzf >= 0.1.0)
lzf_decompress — Décompression LZF
$data
)
lzf_compress() décompresse les données
data en utilisant l'encodage LZF.
data
La chaîne compressée.
Retourne les données compressées ou FALSE si une erreur survient.
(PECL lzf >= 1.0.0)
lzf_optimized_for — Détermine le mode d'optimisation de l'extension LZF
Détermine le mode d'optimisation de l'extension LZF.
Retourne 1 si LZF a été optimisé pour la vitesse, 0 pour la compression.
L'extension phar fournit un moyen de mettre une application PHP complète dans un fichier unique appelé un "phar" (PHP Archive) pour une installation et une configuration aisées. En plus de ce service, l'extension fournit aussi une classe d'abstraction de format de fichier pour créer et manipuler des fichiers tar et zip à travers la classe PharData, tout comme PDO fournit une interface unifiée pour accéder à des base de données différentes. Mais à l'inverse de PDO, qui ne peut pas transposer les données d'une base à l'autre, Phar a la possibilité de convertir des fichiers tar, zip et phar avec une simple ligne de code. Regardez Phar::convertToExecutable() pour avoir un exemple.
Qu'est-ce que phar? Les archives phar sont en fait un moyen pratique de grouper plusieurs fichiers en un seul. Ainsi, une archive phar permet de distribuer une application PHP complète dans un fichier unique et de l'exécuter à partir de ce fichier sans pour autant l'extraire sur le disque. De plus, des archives phar peuvent être exécutées par PHP aussi facilement que n'importe quel autre fichier, aussi bien en ligne de commande que via un serveur web. Phar est une sorte de clé USB pour les applications PHP.
Phar implémente cette fonctionnalité via un flux. Normalement, pour utiliser un fichier externe à partir d'un script PHP, vous devez utiliser la fonction include.
Exemple #1 Utiliser un fichier externe
<?php
include '/chemin/vers/le/fichier/externe.php';
?>
On peut considérer que PHP traduit en fait /chemin/vers/le/fichier/externe.php en un flux file:///chemin/vers/le/fichier/externe.php, et qu'il utilise de façon cachée les fonctions de flux de fichiers plats pour accéder à des fichiers locaux.
Pour utiliser un fichier nommé fichier.php contenu dans une archive phar /chemin/vers/monphar.phar, la syntaxe est quasi similaire à la syntaxe file:// ci-dessus.
Exemple #2 Utilier un fichier contenu dans une archive phar
<?php
include 'phar:///chemin/vers/monphar.phar/fichier.php';
?>
En fait, on peut traiter une archive phar comme s'il s'agissait d'un disque externe, en utilisant n'importe laquelle des fonctions relatives à fopen(), opendir() et mkdir() pour lire, changer ou créer des nouveaux fichiers ou répertoires au sein de l'archive phar. Celà permet à des applications PHP complètes d'être distribuées dans un seul fichier et d'être exécutées à partir de celui-ci
L'utilisation la plus courant d'une archive phar est de distribuer une application complète en un seul fichier. Par exemple, l'installeur PEAR qui est inclus avec les versions de PHP est distribué grâce à une archive phar. pour utiliser l'archive phar ainsi distribuée, celle-ci peut-être exécutée via la ligne de commande ou via un navigateur web.
Les archives phar peuvent être distribuées sous forme de fichiers tar, de fichiers zip ou de fichiers phar spécialement conçus pour l'extensions phar. Chaque format de fichier a ses avantages et ses inconvénients. Les fichiers zip et tar peuvent être extraits par n'importe quel outil tiers qui peut lire le format, mais requièrent l'extension phar pour être exécutés par PHP. Le format de fichier phar est unique et dédié à l'extension phar et peut être créé uniquement par celle-ci ou par le paquet PEAR » PHP_Archive, mais a l'avantage de ne pas nécessiter l'installation de l'extension phar pour que l'application empaquetée puisse être exécutée.
En d'autres mots, même avec l'extension phar désactivée, il est possible d'exécuter ou d'inclure une archive basée sur phar. Accéder à des fichiers individuels au sein d'une archive phar n'est possible qu'avec l'extension phar à moins que l'archive phar n'ait été créée par PHP_Archive.
L'extension phar est aussi capable de convertir une archive phar à partir d'un tar vers un fichier zip ou phar en une seule commande :
Exemple #3 Convertir une archive phar au format tar
<?php
$phar = new Phar('monphar.phar');
$pgz = $phar->convertToExecutable(Phar::TAR, Phar::GZ); // produit monphar.phar.tar.gz
?>
Phar peut compresser des fichiers individuels ou une archive entière en utilisant la compression gzip ou bzip2, et peut vérifier l'intégrité de l'archive automatiquement en utilisant des fonctions de signature md5(), sha1(), sha256(), ou sha512().
Enfin, l'extension phar est orientée sécurité, elle désactive par défaut les accès en écriture sur les archives phar exécutables et requiert la désactivation au niveau système du paramètre phar.readonly du php.ini pour créer ou modifier des archives phar. Des archives tar et zip sans le marqueur exécutable peuvent toujours être créées ou modifiées en utilisant la classe PharData.
Si vous créez des applications dans le but de les distribuer, vous devriez lire Comment créer des archives Phar. Si vous voulez davantage d'informations sur les différences entre les formats de fichier que phar supporte, vous devriez lire Phar, Tar et Zip.
Si vous utilisez des applications phar, il y a des astuces très utiles dans Comment utiliser des archives Phar
Le mot phar est la contraction de PHP et de Archive et est grandement inspiré du mot jar (Java Archive) familier aux développeurs Java.
L'implémentation des archives Phar est basée sur le paquet PEAR » PHP_Archive, et les détails d'implémentations sont les mêmes, bien que l'extension Phar soit plus puissante. En plus, celle-ci permet à la plupart des applications PHP d'être exécutées sans modification alors que les archives basées sur PHP_Archive requièrent souvent beaucoup de modification pour fonctionner.
Phar requiert PHP 5.2.0 ou plus récent. Des fonctionnalités supplémentaires requièrent l'extension SPL pour tirer parti de l'itération et de l'accès sous forme de tableau au contenu d'un fichier Phar. Le flux phar ne requiert aucune extension supplémentaire pour fonctionner.
Vous pouvez éventuellement souhaiter activer les extensions zlib et bzip2 pour tirer parti du support phar compressé. De plus, pour exploiter les signatures OpenSSL, l'extension OpenSSL doit être activée.
A noter qu'un bogue dans le filtre de flux zlib.deflate corrigé en PHP 5.2.6 et plus récent pourrait causer la troncature des archives phar compressées en gzip ou bzip2.
L'extension Phar est incluse dans PHP depuis PHP 5.3.0. Phar peut aussi être installé depuis l'extension PECL pour les versions précédentes de PHP versions, la » page PECL de Phar contient plus d'informations et l'historique.
Les utilisateurs de Windows doivent inclure php_phar.dll dans php.ini pour utiliser cette extension.
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
| Nom | Défaut | Modifiable | Historique |
|---|---|---|---|
| phar.readonly | "1" | PHP_INI_ALL | |
| phar.require_hash | "1" | PHP_INI_ALL | |
| phar.extract_list | "" | PHP_INI_ALL | Disponible de phar 1.1.0 à 1.2.3, supprimé en 2.0.0. |
| phar.cache_list | "" | PHP_INI_SYSTEM | Disponible à partir de phar 2.0.0. |
Voici un éclaircissement sur l'utilisation des directives de configuration.
phar.readonly
booléen
Cette option désactive la création ou la modification des archives Phar en utilisant le flux phar ou le support en écriture sur les objets Phar. Ce paramètre devrait toujours être activé sur des machines de production, car le support en écriture sur les archives phar pourrait mener à la création de virus basés sur PHP en cas d'utilisation conjuguée avec des vulnérabilités communes.
Note:
Ce paramètre ne peut être désactivé que dans php.ini pour des raisons de sécurité. Si phar.readonly est désactivé dans php.ini, l'utilisateur peut activer phar.readonly dans un script ou le désactiver plus tard. Si phar.readonly est activé dans php.ini, un script pourrait "réactiver" sans danger la variable INI, mais ne pourrait pas la désactiver.
phar.require_hash
booléen
Cette option forcera toutes les archives Phar ouvertes à contenir un type de signature (à ce jour MD5, SHA1, SHA256 et SHA512 sont supportés), et toute archive Phar ne contenant pas de signature sera rejetée.
Note:
Ce paramètre ne peut être désactivé que dans php.ini pour des raisons de sécurité. Si phar.require_hash est désactivé dans php.ini, l'utilisateur peut activer phar.require_hash dans un script ou le désactiver plus tard. Si phar.require_hash est activé dans php.ini, un script pourrait "réactiver" sans danger la variable INI, mais ne pourrait pas la désactiver.
Ce paramètre n'affecte pas la lecture des fichiers tar avec la classe PharData.
phar.extract_list
chaîne de caractères
Ce paramètre INI a été supprimé en phar 2.0.0.
Permet la correspondance entre le chemin complet d'une archive phar ou son alias et l'emplacement de ses fichiers extraits. Le format de ce paramètre est name=archive,name2=archive2. Cela permet l'extraction de fichiers phar sur le disque, et permet à phar d'agir comme une sorte de correspondance vers des fichiers extraits sur disque. C'est souvent utilisé pour des raisons de performance ou pour aider au débogage de phar.
Exemple #1 Exemple d'utilisation de phar.extract_list
dans php.ini: phar.extract_list = archive=/chemin/complet/vers/archive/,arch2=/chemin/complet/vers/arch2 <?php include "phar://archive/content.php"; include "phar://arch2/foo.php"; ?>
phar.cache_list
chaîne de caractères
Ce paramètre INI a été ajouté en phar 2.0.0
Permet aux correspondances d'archives phar d'être traitées au démarrage du serveur web, augmentant de ce fait les performance d'accès aux fichiers contenus dans une archive phar et les rendant très proche d'un accès à des fichiers d'une installation classique sur disque.
Exemple #2 Exemple d'utilisation de phar.cache_list
dans php.ini (windows):
phar.cache_list =C:\chemin\vers\phar1.phar;C:\chemin\vers\phar2.phar
dans php.ini (unix):
phar.cache_list =/chemin/vers/phar1.phar:/chemin/vers/phar2.phar
L'extension Phar fournit le flux phar, qui permet l'accès de façon transparente aux fichiers contenus dans un phar. Pour davantage d'information, lisez le format de fichier Phar
Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.
| Constante | Valeur | Description |
|---|---|---|
Phar::NONE
(integer)
|
0x00000000 | aucune compression |
Phar::COMPRESSED
(integer)
|
0x0000F000 | masque de bits pouvant être utilisé avec les drapeaux de fichier pour déterminer si une compression est utilisée |
Phar::GZ
(integer)
|
0x00001000 | compression zlib (gzip) |
Phar::BZ2
(integer)
|
0x00002000 | compression bzip2 |
| Constante | Valeur | Description |
|---|---|---|
Phar::SAME
(integer)
|
0 | Conserve le même format de fichier |
Phar::PHAR
(integer)
|
1 | format de fichier phar |
Phar::TAR
(integer)
|
2 | format de fichier tar |
Phar::ZIP
(integer)
|
3 | format de fichier zip |
| Constante | Valeur | Description |
|---|---|---|
Phar::MD5
(integer)
|
0x0001 | signature avec l'algorithme md5 |
Phar::SHA1
(integer)
|
0x0002 | signature avec l'algorithme sha1 |
Phar::SHA256
(integer)
|
0x0003 | signature avec l'algorithme sha256 (requiert l'extension hash) |
Phar::SHA512
(integer)
|
0x0004 | signature avec l'algorithme sha512 (requiert l'extension hash) |
Phar::OPENSSL
(integer)
|
0x0010 | signature avec une paire de clé privée/publique OpenSSL. C'est une véritable signature à clé asymétrique/ |
| Constante | Valeur | Description |
|---|---|---|
Phar::PHP
(integer)
|
1 | utilisée pour renseigner le paramètre d'écrasement mime de Phar::webPhar() et faire en sorte que l'extension soit parsée comme un fichier PHP |
Phar::PHPS
(integer)
|
2 | utilisée pour renseigner le paramètre d'écrasement mime de Phar::webPhar() et faire en sorte que l'extension soit parsée comme un fichier PHP via highlight_file() |
Les archives Phar sont identiques dans le concept aux archives JAR de Java, mais sont conçues plus spécifiquement pour les besoins et la flexibilité des applications PHP. Une archive Phar est utilisée pour distribuer une application PHP complète ou une bibliothèque sous forme d'un fichier unique. Une application sous forme d'archive Phar est utilisée exactement de la même façon que n'importe quelle autre application PHP :
php applicationsympa.phar
L'utilisation d'une bibliothèque sous forme d'archive Phar est la même que n'importe quelle autre bibliothèque PHP :
<?php
include 'bibliothequesympa.phar';
?>
Le flux phar fournit le coeur de l'extension phar, et est décrit en détails ici. Le flux phar permet l'accès aux fichiers contenus dans une archive phar via les fonctions standards de fichier fopen(), opendir(), et toute autre fonctionnant sur des fichiers normaux. Le flux phar supporte toutes les opérations de lecture/écriture à al fois su les fichiers et sur les répertoires.
<?php
include 'phar://bibliothequesympa.phar/fichier/interne.php';
header('Content-type: image/jpeg');
// les phars peuvent être atteint via le chemin complet ou via des alias
echo file_get_contents('phar:///chemin/complet/vers/bibliothequesympa.phar/images/wow.jpg');
?>
La classe Phar implémente des fonctionnalités avancées pour accéder aux fichiers et créer des archives phar. La classe Phar est décrite en détails ici.
<?php
try {
// ouvre un phar existant
$p = new Phar('bibliothequesympa.phar', 0);
// Phar étend la classe DirectoryIterator de SPL
foreach (new RecursiveIteratorIterator($p) as $file) {
// $file est une classe PharFileInfo et hérité de SplFileInfo
echo $file->getFileName() . "\n";
echo file_get_contents($file->getPathName()) . "\n"; // affiche le contenu;
}
if (isset($p['fichier/interne.php'])) {
var_dump($p['fichier/interne.php']->getMetadata());
}
// crée un nouveau phar - phar.readonly doit être à 0 dans php.ini
// phar.readonly est activé par défaut pour des raisons de sécurité.
// Sur des serveurs de production, les Phars n'ont pas besoin d'être créés,
// juste d'être exécutés.
if (Phar::canWrite()) {
$p = new Phar('nouveauphar.tar.phar', 0, 'nouveauphar.tar.phar');
// On crée une archive Phar basée sur tar, compressée par gzip (.tar.gz)
$p = $p->convertToExecutable(Phar::TAR, Phar::GZ);
// crée une transaction - rien n'est écrit dans nouveauphar.phar
// jusqu'à ce que stopBuffering() ne soit appelé, bien qu'un stockage temporaire soit requis
$p->startBuffering();
// ajoute tous les fichiers de /chemin/vers/leprojet dans le phar avec le préfixe "projet"
$p->buildFromIterator(new RecursiveIteratorIterator(new DirectoryIterator('/chemin/vers/leprojet')), '/chemin/vers/');
// ajoute un nouveau fichier en utilisant l'API d'accès par tableau
$p['fichier1.txt'] = 'Information';
$fp = fopen('grosfichier.dat', 'rb');
// copie toutes les données du flux
$p['data/grosfichier.dat'] = $fp;
if (Phar::canCompress(Phar::GZ)) {
$p['data/grosfichier.dat']->compress(Phar::GZ);
}
$p['images/wow.jpg'] = file_get_contents('images/wow.jpg');
// toute valeur peut être sauvegardée comme métadonnée spécifique au fichier
$p['images/wow.jpg']->setMetadata(array('mime-type' => 'image/jpeg'));
$p['index.php'] = file_get_contents('index.php');
$p->setMetadata(array('bootstrap' => 'index.php'));
// sauvegarde l'archive phar sur le disque
$p->stopBuffering();
}
} catch (Exception $e) {
echo 'N\'a pas pu ouvrir le Phar: ', $e;
}
?>
D'autre part, la vérification du contenu du fichier phar peut être faite en utilisant un des algorithme de signature symétrique (MD5, SHA1, SHA256 et SHA512 si ext/hash est activée) et en utilisant la signature asymétrique par clé publique/privée de OpenSSL (nouveauté de Phar 2.0.0). Pour tirer parti de la signature OpenSSL, vous devez générer une paire de clés publique/privée et utiliser la clé privée pour signer avec Phar::setSignatureAlgorithm(). En plus, la clé publique, extraite en utilisant ce code :
<?php
$public = openssl_get_publickey(file_get_contents('private.pem'));
$pkey = '';
openssl_pkey_export($public, $pkey);
?>
Depuis la version 2.0.0, la classe Phar fournit aussi trois méthodes statiques, Phar::webPhar(), Phar::mungServer() et Phar::interceptFileFuncs() qui sont cruciales pour empaqueter des applications PHP visant à être utilisée sur un système de fichiers classique ou en tant qu'application web. Phar::webPhar() implémente un contrôleur qui route les appels HTTP vers le bon endroit de l'archive phar. Phar::mungServer() est utilisé pour modifier les valeurs du tableau $_SERVER pour dire aux applications d'utiliser ces valeurs. Phar::interceptFileFuncs() dit à Phar d'intercepter les appels à fopen(), file_get_contents(), opendir(), et à toutes les fonctions basées sur stat (file_exists(), is_readable(), etc) et route tous les chemins relatif vers les bons endroits de l'archive phar.
Par exemple, empaqueter une version de la célèbre application phpMyAdmin dans une archive phar nécessite juste ce simple script et, dès lors, phpMyAdmin.phar.tar.php peut être accédé comme un fichier classique à partir de votre serveur web, après avoir modifié le couple utilisateur/motdepasse :
<?php
@unlink('phpMyAdmin.phar.tar.php');
copy('phpMyAdmin-2.11.3-english.tar.gz', 'phpMyAdmin.phar.tar.php');
$a = new Phar('phpMyAdmin.phar.tar.php');
$a->startBuffering();
$a["phpMyAdmin-2.11.3-english/config.inc.php"] = '<?php
/* Servers configuration */
$i = 0;
/* Server localhost (config:root) [1] */
$i++;
$cfg[\'Servers\'][$i][\'host\'] = \'localhost\';
$cfg[\'Servers\'][$i][\'extension\'] = \'mysqli\';
$cfg[\'Servers\'][$i][\'connect_type\'] = \'tcp\';
$cfg[\'Servers\'][$i][\'compress\'] = false;
$cfg[\'Servers\'][$i][\'auth_type\'] = \'config\';
$cfg[\'Servers\'][$i][\'user\'] = \'root\';
$cfg[\'Servers\'][$i][\'password\'] = \'\';
/* End of servers configuration */
if (strpos(PHP_OS, \'WIN\') !== false) {
$cfg[\'UploadDir\'] = getcwd();
} else {
$cfg[\'UploadDir\'] = \'/tmp/pharphpmyadmin\';
@mkdir(\'/tmp/pharphpmyadmin\');
@chmod(\'/tmp/pharphpmyadmin\', 0777);
}';
$a->setStub('<?php
Phar::interceptFileFuncs();
Phar::webPhar("phpMyAdmin.phar", "phpMyAdmin-2.11.3-english/index.php");
echo "phpMyAdmin is intended to be executed from a web browser\n";
exit -1;
__HALT_COMPILER();
');
$a->stopBuffering();
?>
Le flux Phar supporte totalement fopen() pour les lectures/écritures (pas les concaténations), unlink(), stat(), fstat(), fseek(), rename() et le opérations de flux sur les répertoires opendir() et depuis la version 2.0.0, rmdir() et mkdir().
La compression et les métadonnées individuelles par fichier peuvent aussi être manipulées au sein de l'archive Phar en utilisant les contextes de flux :
<?php
$context = stream_context_create(array('phar' =>
array('compress' => Phar::GZ)),
array('metadata' => array('user' => 'cellog')));
file_put_contents('phar://mon.phar/unfichier.php', 0, $context);
?>
Le flux phar n'agit pas sur les fichiers distants et ne peut pas considérer les fichiers distants, etc... même si les options INI allow_url_fopen et allow_url_include sont désactivées.
Bien qu'il soit possible de créer des archives phar de zéro en utilisant juste les opérations sur les flux, il est préférable d'utiliser la fonctionnalité incluse dans la classe Phar. Le flux est mieux utilisé pour les opérations de lecture.
La classe Phar supporte la lecture et la manipulation des archives Phar, ainsi que l'itération à travers la fonctionnalité héritée de la classe RecursiveDirectoryIterator. Avec le support de l'interface ArrayAccess, les fichiers contenus dans une archive Phar peuvent être accédés comme s'ils étaient membres d'un tableau associatif.
La classe PharData étend la classe Phar, et permet la création et la modification d'archives tar et zip non exécutables (données) même si phar.readonly=1 dans php.ini. Ainsi, PharData::setAlias() et PharData::setStub() sont toutes deux désactivées car les concepts d'alias et de conteneur sont restreints aux archives phar exécutables.
Il est important de noter que quand une archive Phar est créée, le chemin complet doit être passé au constructeur de l'objet Phar. Un chemin relatif empêcherait l'initialisation.
En supposant que $p est un objet initialisé de cette façon :
<?php
$p = new Phar('/chemin/vers/monphar.phar', 0, 'monphar.phar');
?>
Une archive Phar vide sera créée en tant que /chemin/vers/monphar.phar, ou si /chemin/vers/monphar.phar existe déjà, il sera ouvert de nouveau. Le terme monphar.phar démontre le concept d'un alias qui peut être utilisé pour référencer /chemin/vers/monphar.phar dans des URL comme ceci :
<?php
// ces deux appels à file_get_contents() sont équivalents si
// /chemin/vers/monphar.phar a un alias explicite de "monphar.phar"
// dans son mainfeste, ou si le phar a été initialisé avec l'instantiation de
// l'objet Phar de l'exemple précedent
$f = file_get_contents('phar:///chemin/vers/monphar.phar/nimportequoi.txt');
$f = file_get_contents('phar://monphar.phar/nimportequoi.txt');
?>
Avec l'objet Phar $p nouvellement créé, les choses suivantes sont possibles :
De plus, l'objet Phar est le seul moyen d'accéder aux métadonnées spécifiques de Phar, via Phar::getMetadata(), et c'est aussi le seul moyen de régler ou de récupérer le conteneur du chargeur de l'archive Phar via Phar::getStub() et Phar::setStub(). De plus, la compression pour l'archive Phar entière peut être manipulée seulement via la classe Phar.
La liste complète des fonctionnalités de l'objet Phar est documentée ci-dessous.
La classe PharFileInfo étend la classe SplFileInfo et ajoute plusieurs méthodes pour manipuler les métadonnées spécifiques à Phar d'un fichier contenu dans un Phar, telles que manipuler la compression ou les métadonnées.
Sera entièrement écrit plus tard. Avant de lire ceci, soyez sûr de lire Comment utiliser des archives Phar.
Se documenter sur Phar::buildFromIterator() et les spécificités des choix de format de fichier disponible pour les archives peut être un bon début. Une bonne compréhension de ce qu'est et de ce que fait un conteneur (stub) est cruciale pour la création d'archive phar, ce qui fait de Phar::setStub() et Phar::createDefaultStub() également un bon point de départ. Si vous distribuer des applications web, il est important de connaître Phar::webPhar() et la méthode associée Phar::mungServer(). Toute application qui accède à ses propres fichiers devrait aussi considérer l'utilisation de Phar::interceptFileFuncs().
Toute les archives Phar contiennent de trois à quatre sections:
Un conteneur
Un manifest décrivant le contenu
Le contenu du fichier
Une signature (facultative) pour vérifier l'intégrité (uniquement avec le format de fichier phar)
Un conteneur Phar est un simple fichier PHP. Le conteneur minimal contient :
<?php __HALT_COMPILER();
Un conteneur doit contenir au moins le jeton __HALT_COMPILER(); en guise de conclusion. Typiquement, un conteneur comportera les fonctionnalités de chargement suivantes :
<?php
Phar::mapPhar();
include 'phar://monphar.phar/index.php';
__HALT_COMPILER();
Il n'y a aucune restriction sur le contenu d'un conteneur Phar, si ce n'est le besoin d'être conclu
par __HALT_COMPILER();. Le tag fermant PHP ?>
?>
Dans une archive phar basée sur tar ou zip, le conteneur est stocké dans le fichier .phar/stub.php. Le conteneur par défaut des archives Phar basées sur phar contient approximativement 7ko de code pour extraire le contenu du phar et l'exécuter. Regardez la fonction Phar::createDefaultStub() pour davantage de détails.
L'alias phar est stocké, dans le cas d'une archive phar basée sur tar ou zip, dans le fichier .phar/alias.txt en tant que texte plein.
Quels sont les avantages et les inconvénients de chacun des trois formats supportés par l'extension phar? Ce tableau tente de répondre à cette question.
| Fonctionnalité | Phar | Tar | Zip |
|---|---|---|---|
| Format de fichier standard | Non | Oui | Oui |
| Peut être exécuté sans l'extension Phar [1] | Oui | Non | Non |
| Compression par fichier | Oui | Non | Oui |
| Compression pour toute l'archive | Oui | Oui | Non |
| Validation par signature de toute l'archive | Oui | Oui | Oui (PHP 5.3.1+) |
| Support d'applications spécifiquement Web | Oui | Oui | Oui |
| Métadonnées par fichier | Oui | Oui | Oui |
| Métadonnées pour toute l'archive | Oui | Oui | Oui |
| Création/modification d'archive [2] | Oui | Oui | Oui |
| Support complet de toutes les fonctions de flux | Oui | Oui | Oui |
| Peut être créée/modifiée même si phar.readonly=1 [3] | Non | Oui | Oui |
[1] PHP ne peut accéder directement au contenu d'une archive Phar sans que l'extension Phar soit installée si elle utilise un conteneur qui extrait le contenu de l'archive phar. Le conteneur créé par Phar::createDefaultStub() extrait l'archive phar et exécute son contenu à partir d'un répertoire temporaire si aucune extension phar n'est trouvée.
[2] Tous les accès en écriture nécessitent que phar.readonly soit désactivé dans le php.ini ou directement via la ligne de commande.
[3] Seules les archives tar ou zip sans .phar dans leur nom et sans conteneur exécutable .phar/stub.php peuvent être créées si phar.readonly=1.
Les archives basées sur le format de fichier tar sont conformes au format moderne USTAR. Le design des en-têtes du fichier tar le rend plus efficace que le format de fichier zip et aussi efficace que le format de fichier phar quand il s'agit d'accéder aux données. Les noms de fichiers sont limités à 255 octets, y compris le chemin complet au sein de l'archive phar basée sur tar. Ces archives peuvent être intégralement compressées au format gzip ou bzip2 tout en restant exécutables par l'extension Phar.
Pour compresser une archive entière, utilisez Phar::compress(). Pour décompresser une archive entière, utilisez Phar::decompress().
Les archives basées sur le format de fichier zip supportent de nombreuses fonctionnalités incluses dans le format zip. Les métadonnées par fichier ou sur toute l'archive sont stockées dans les commentaires du fichier zip et de l'archive zip en tant que chaîne de caractères sérialisée. Les commentaires zip déjà existants seront lus sans problème en tant que chaîne. Les lectures/écritures compressées sont supportées par la compression zlib, et uniquement les lectures compressées par la compression bzip2. Il n'y a pas de limite sur le nombre de fichiers au sein d'une archive phar basée sur zip. Les répertoires vides sont stockés dans l'archive zip comme des fichiers avec un slash final, comme mon/repertoire/
Le format de fichier phar est composé de conteneur/manifeste/contenu/signature, et stocke les informations cruciales de ce qui est contenu dans l'archive phar dans son manifeste.
Le manifeste Phar est un format hautement optimisé qui permet la spécification fichier par fichier de la compression, des permissions et même des métadonnées utilisateur tels que l'utilisateur ou le groupe propriétaire. Toutes les valeurs de plus d'un octet sont stockées sous forme petit-boutiste, Ã l'exception de la version de l'API qui est stockée pour des raisons historiques en 3 morceaux grand-boutistes.
Tous les drapeaux non utilisés sont réservés pour un usage futur et ne doivent pas être utilisés pour stocker des informations personnalisées. Utilisez les métadonnées par fichier pour stocker des métadonnées personnalisées sur des fichiers particuliers.
Le format de fichier basique du manifeste d'une archive Phar est le suivant :
| Taille en octets | Description |
|---|---|
| 4 octets | Longueur du manifeste en octets (limitée à 1 Mo) |
| 4 octets | Nombre de fichiers dans le Phar |
| 2 octets | Version de l'API du manifest Phar (à ce jour 1.0.0) |
| 4 octets | Drapeaux "bitmappés" globaux du Phar |
| 4 octets | Longueur de l'alias Phar |
| ?? | L'alias Phar (longueur basée sur la valeur précédente) |
| 4 octets | Longueur des métadonnées Phar (0 si aucune) |
| ?? | métadonnées Phar sérialisées, stockées dans un format serialize() |
| au moins 24 * nombre d'octets des entrées | Entrées pour chaque fichier |
Voici les drapeaux "bitmappés" actuellement reconnus par l'extension Phar pour le bitmap plein global de Phar :
| Valeur | Description |
|---|---|
| 0x00010000 | Si présent, le Phar contient une signature de vérification |
| 0x00001000 | Si présent, le Phar contient au moins 1 fichier qui est compressé grâce à zlib |
| 0x00002000 | Si présent, le Phar contient au moins 1 fichier qui est compressé grâce à bzip |
Chaque fichier du manifeste contient les informations suivantes :
| Taille en octets | Description |
|---|---|
| 4 octets | Longueur du nom de fichier en octets |
| ?? | Nom de fichier (longueur basée sur la valeur précédente) |
| 4 octets | Taille du fichier décompressé en octets |
| 4 octets | Timestamp Unix du fichier |
| 4 octets | Taille du fichier compressé en octets |
| 4 octets | Somme de contrôle CRC32 du contenu décompressé du fichier |
| 4 octets | Drapeaux bitmappés spécifiques au fichier |
| 4 octets | Longueur des métadonnées du fichier sérialisées (0 si aucune) |
| ?? | métadonnées du fichier sérialisées, stockées dans un format serialize() |
A noter qu'à partir de l'API 1.1.1, les répertoires vides sont stockés comme des noms de fichier avec un slash final comme mon/repertoire/
Les valeurs reconnues de drapeaux bitmappés spécifiques au fichier sont :
| Valeur | Description |
|---|---|
| 0x000001FF | Ces bits sont réservés pour définir des permissions spécifiques au fichier. Celles-ci sont utilisées pour fstat() et peuvent être utilisées pour recréer les permissions souhaitées en cas d'extraction. |
| 0x00001000 | Si présent, le fichier est compressé grâce à zlib |
| 0x00002000 | Si présent, le fichier est compressé grâce à bzip |
Les Phar qui contiennent une signature ont toujours la signature ajoutée à la fin du Phar, après le chargeur, le manifeste et le contenu. Les deux types de signature supportés à ce jour sont MD5 et SHA1.
| Longueur en octets | Description |
|---|---|
| 16 ou 20 octets | La signature actuelle, 20 octets pour une SHA1, 16 octets pour une MD5, 32 octets pour une SHA256, et 64 octets pour une SHA512. |
| 4 octets | Les drapeaux de signature. 0x0001 est utilisé pour définir une signature MD5, 0x0002 pour une SHA1, 0x0004 pour une SHA256 et 0x0008 pour une SHA512. Le support des signatures SHA256 et SHA512 a été introduit avec l'API version 1.1.0. |
| 4 octets | GBMB magique utilisé pour définir la présence d'une signature. |
(No version information available, might only be in SVN)
La classe Phar fournit une interface de haut niveau pour accéder et créer des archives phar.
$format = 9021976
[, int $compression = 9021976
[, string $extension
]]] )$format = 9021976
[, int $compression = 9021976
[, string $extension
]]] )$alias
[, string $index = "index.php"
[, string $f404
[, array $mimetypes
[, array $rewrites
]]]]] )(Unknown)
Phar::addEmptyDir — Ajoute un répertoire vide à l'archive phar
$dirname
)Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Grâce à cette méthode, un répertoire vide est créé avec le chemin dirname. Cette méthode est identique à ZipArchive::addEmptyDir().
dirname
Le nom du répertoire vide à créer dans l'archive phar
pas de valeur de retour, une exception est levée en cas d'échec.
Exemple #1 Un exemple avec Phar::addEmptyDir()
<?php
try {
$a = new Phar('/chemin/vers/phar.phar');
$a->addEmptyDir('/chemin/complet/vers/fichier');
// démontre comment le fichier est stocké
$b = $a['chemin/complet/vers/fichier']->isDir();
} catch (Exception $e) {
// traite les erreurs ici
}
?>
(Unknown)
Phar::addFile — Ajoute un fichier du système de fichiers à l'archive phar
$file
[, string $localname
] )Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Grâce à cette méthode, tout fichier ou URL peut être ajouté à l'archive phar. Si le second paramètre optionnel localname est spécifié, le fichier sera stocké dans l'archive de ce nom, sinon le paramètre file est utilisé comme chemin vers lequel stocker l'archive. Les URL doivent être locales, sans quoi une exception est levée. Cette méthode est identique à ZipArchive::addFile().
file
Chemin absolu ou relatif vers un fichier du disque à ajouter à l'archive phar.
localname
Chemin où le fichier sera stocké dans l'archive.
Pas de valeur de retour, une exception est levée en cas d'échec.
Exemple #1 Un exemple avec Phar::addFile()
<?php
try {
$a = new Phar('/chemin/vers/phar.phar');
$a->addFile('/chemin/complet/vers/fichier');
// démontre comment le fichier est stocké
$b = $a['chemin/complet/vers/fichier']->getContent();
$a->addFile('/chemin/complet/vers/fichier', 'mon/fichier.txt');
$c = $a['mon/fichier.txt']->getContent();
// démontre l'utilisation d'URL
$a->addFile('http://www.exemple.com', 'exemple.html');
} catch (Exception $e) {
// traite les erreurs ici
}
?>
(Unknown)
Phar::addFromString — Ajoute un fichier du système de fichiers à l'archive phar
$localname
, string $contents
)Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Grâce à cette méthode, toute chaîne peut être ajoutée à l'archive phar. Le fichier sera stocké dans l'archive avec localname en tant que chemin. Cette méthode est identique à ZipArchive::addFromString().
localname
Chemin dans lequel le fichier sera stocké dans l'archive.
contents
Le contenu de fichier à stocker
Pas de valeur de retour, une exception est levée en cas d'échec.
Exemple #1 Un exemple avec Phar::addFromString()
<?php
try {
$a = new Phar('/chemin/vers/phar.phar');
$a->addFromString('chemin/vers/fichier.txt', 'mon fichier simple');
$b = $a['chemin/vers/fichier.txt']->getContent();
// pour ajouter du contenu à partir d'un descripteur de flux pour des gros fichiers, utilisez offsetSet()
$c = fopen('/chemin/vers/grosfichier.bin');
$a['grosfichier.bin'] = $c;
fclose($c);
} catch (Exception $e) {
// traite les erreurs ici
}
?>
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::apiVersion — Retourne la version de l'API
Retourne la version de l'API du format de fichier phar qui sera utilisée pour la création de phars. L'extension Phar supporte la lecture des versions d'API 1.0.0 et supérieures. L'API version 1.1.0 est requise pour les hachages SHA-256 et SHA-512, et l'API version 1.1.1 est requise pour stocker des répertoires vides.
La version de l'API, par exemple "1.0.0".
Exemple #1 Un exemple avecPhar::apiVersion()
<?php
echo Phar::apiVersion();
?>
L'exemple ci-dessus va afficher :
1.1.1
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::buildFromDirectory — Construit une archive phar à partir des fichiers d'un répertoire
$base_dir
[, string $regex
] )Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Remplit une archive phar à partir du contenu d'un répertoire. Le second paramètre, optionnel, est une expression rationnelle (pcre) utilisée pour exclure des fichiers. Tout fichier dont le nom satisfait l'expression rationnelle sera inclus, les autres seront exclus. Pour un contrôle plus fin, utilisez Phar::buildFromIterator().
base_dir
Le chemin absolu ou relatif vers le répertoire contenant tous les fichiers à ajouter à l'archive.
regex
Une expression rationnelle optionnelle utilisée pour filtrer la liste des fichiers. Seuls les fichiers dont le nom satisfait l'expression rationnelle seront inclus dans l'archive.
Phar::buildFromDirectory() retourne un tableau associatif faisant correspondre le chemin interne du fichier avec le chemin complet sur le système de fichiers.
Cette méthode lève une exception BadMethodCallException quand elle est incapable d'instancier l'itérateur de répertoire interne, ou une exception PharException s'il y a eu des erreurs lors de la sauvegarde de l'archive.
Exemple #1 Un exemple avecPhar::buildFromDirectory()
<?php
// crée avec l'alias "projet.phar"
$phar = new Phar('projet.phar', 0, 'projet.phar');
// ajoute des fichiers dans le projet
$phar->buildFromDirectory(dirname(__FILE__) . '/projet');
$phar->setStub($phar->createDefaultWebStub('cli/index.php', 'www/index.php'));
$phar2 = new Phar('projet2.phar', 0, 'projet2.phar');
// ajoute tous les fichiers dans le projet, mais juste les fichiers .php
$phar->buildFromDirectory(dirname(__FILE__) . '/projet', '/\.php$/');
$phar->setStub($phar->createDefaultStub('cli/index.php', 'www/index.php'));
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::buildFromIterator — Construit une archive phar à partir d'un itérateur
Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Remplit une archive phar à partir d'un itérateur. Deux styles d'itérateur sont supportés : les itérateurs qui font correspondre le nom de fichier au sein du phar avec le nom d'un fichier sur le disque, et les itérateurs comme DirectoryIterator qui retournent des objets SplFileInfo. Pour les itérateurs qui retournent des objets SplFileInfo, le second paramètre est obligatoire.
iter
Un itérateur qui associe un fichier avec une position, ou bien retourne des objets SplFileInfo.
base_directory
Pour les itérateurs qui retournent des objets SplFileInfo, la portion de chemin absolu de chaque fichier qu'il faut supprimer lors de l'ajout à l'archive phar.
Phar::buildFromIterator() retourne un tableau associatif qui associe la représentation interne du fichier à un chemin absolu dans le système.
Exemple #1 Exemple avec Phar::buildFromIterator() et SplFileInfo
Pour la plupart des archives phar, l'archive reflète l'arborescence d'un répertoire, et le second style est le plus utile. Par exemple, pour créer une archive phar contenant les fichiers de l'arborescence du répertoire :
/chemin/vers/projet/
config/
dist.xml
debug.xml
lib/
file1.php
file2.php
src/
processthing.php
www/
index.php
cli/
index.php
Ce code peut être utilisé pour ajouter à l'archive "projet.phar" :
<?php
// crée avec l'alias "projet.phar"
$phar = new Phar('projet.phar', 0, 'projet.phar');
$phar->buildFromIterator(
new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('/chemin/vers/projet')),
'/chemin/vers/projet');
$phar->setStub($phar->createDefaultStub('cli/index.php', 'www/index.php'));
?>
Le fichier projet.phar peut alors être utilisé immédiatement. Phar::buildFromIterator() ne règle pas les paramètres tels que la compression ou les métadonnées; ceci peut cependant être fait après avoir créé l'archive phar.
Il est intéressant de noter que Phar::buildFromIterator() peut aussi être utilisé pour copier les éléments d'une archive phar existante, car l'objet Phar hérite de DirectoryIterator :
<?php
// crée avec l'alias "projet.phar"
$phar = new Phar('projet.phar', 0, 'projet.phar');
$phar->buildFromIterator(
new RecursiveIteratorIterator(
new Phar('/chemin/vers/unautrephar.phar')),
'phar:///chemin/vers/unautrephar.phar/chemin/vers/projet');
$phar->setStub($phar->createDefaultWebStub('cli/index.php', 'www/index.php'));
?>
Exemple #2 Exemple avec Phar::buildFromIterator() et d'autres itérateurs
La seconde forme d'itérateur peut être utilisée avec n'importe quel itérateur qui retourne une correspondance clé => valeur, tels que ArrayIterator :
<?php
// crée avec l'alias "projet.phar"
$phar = new Phar('projet.phar', 0, 'projet.phar');
$phar->buildFromIterator(
new ArrayIterator(
array(
'interne/fichier.php' => dirname(__FILE__) . '/unfichier.php',
'unautre/fichier.jpg' => fopen('/chemin/vers/grosfichier.jpg', 'rb'),
)));
$phar->setStub($phar->createDefaultWebStub('cli/index.php', 'www/index.php'));
?>
Cette méthode émet une exception UnexpectedValueException
quand l'itérateur retourne des valeurs fausses, telles qu'une clé
entière à la place d'une chaîne; une exception
BadMethodCallException quand un itérateur
basé sur SplFileInfo est passé sans paramètre
base_directory, ou une exception
PharException s'il y a eu des erreurs lors de la
sauvegarde de l'archive phar.
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::canCompress — Détermine si l'extension phar supporte une la compression en utilisant soit zip soit bzip2
$type = 0
] )Cette méthode doit être utilisée pour déterminer si la compression est possible avant de charger une archive phar qui contient des fichiers compressés.
type
Phar::GZ et Phar::BZ2 peuvent être utilisées pour déterminer si la compression est possible avec respectivement zlip ou bzip2.
TRUE si la compression/décompression est disponible, FALSE sinon.
Exemple #1 Un exemple avec Phar::canCompress()
<?php
if (Phar::canCompress()) {
echo file_get_contents('phar://pharcompresse.phar/interne/fichier.txt');
} else {
echo 'compression non disponible';
}
?>
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::canWrite — Détermine si l'extension phar supporte la création et l'écriture des phars
Cette méthode statique détermine si l'accès en écriture a été désactivé dans le php.ini du système via la variable INI phar.readonly.
TRUE si l'accès en écriture est possible, FALSE sinon.
Exemple #1 Un exemple avec Phar::canWrite()
<?php
if (Phar::canWrite()) {
file_put_contents('phar://monphar.phar/fichier.txt', 'coucou');
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::compress — Compresse l'archive Phar complète en utilisant la compression Gzip ou Bzip2
$compression
[, string $extension
] )Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Dans le cas des archives phar basées sur tar ou sur phar, cette méthode compresse l'archive complète en utilisant la compression gzip ou bzip2. Le fichier qui en résulte peut être traité avec la commande gzip/bzip2, ou accédée directement et de façon transparente avec l'extension Phar.
Dans le cas des archives phar basées sur Zip, cette méthode échoue en lançant une exception. L'extension zlib doit être activée pour compresser avec gzip, tandis que l'extension bzip2 doit être activée pour compresser avec bzip2. Comme avec toutes les fonctionnalités qui modifient le contenu d'un phar, la variable INI phar.readonly doit être à off pour fonctionner.
En plus, cette méthode renomme automatiquement l'archive, en suffisant son nom par .gz, .bz2 ou en enlevant l'extension si Phar::NONE est passée pour supprimer la compression. Sinon, une extension de fichier peut aussi être spécifiée en utilisant le second paramètre.
compression
La compression doit être soit Phar::GZ, soit Phar::BZ2 pour bénéficier de la compression, ou bien Phar::NONE pour éliminer la compression.
extension
Par défaut, l'extension est .phar.gz ou .phar.bz2 pour compresser les archives phar, et .phar.tar.gz ou .phar.tar.bz2 pour compresser les archives tar. Pour décompresser, les extensions par défaut sont .phar et .phar.tar.
Retourne un objet Phar.
Lève une exception BadMethodCallException si la variable INI phar.readonly est à on, si l'extension zlib n'est pas disponible, ou si l'extension bzip2 n'est pas activée.
Exemple #1 Un exemple avec Phar::compress()
<?php
$p = new Phar('/chemin/vers/mon.phar', 0, 'mon.phar');
$p['monfichier.txt'] = 'salut';
$p['monfichier2.txt'] = 'salut';
$p1 = $p->compress(Phar::GZ); // copie vers /chemin/vers/mon.phar.gz
$p2 = $p->compress(Phar::BZ2); // copie vers /chemin/vers/mon.phar.bz2
$p3 = $p2->compress(Phar::NONE); // exception: /chemin/vers/mon.phar existe déjà
?>
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::compressAllFilesBZIP2 — Compresse tous les fichiers de l'archive Phar courante en utilisant la compression Bzip2
Note:
Cette méthode a été supprimée de l'extension phar depuis la version 2.0.0. Vous pouvez utiliser Phar::compress(), Phar::decompress(), Phar::compressFiles() et Phar::decompressFiles() à la place.
Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Cette méthode compresse tous les fichiers de l'archive Phar en utilisant la compression bzip2. L'extension bzip2 doit être activée pour pouvoir bénéficier de cette fonctionnalité. De plus, si un ou des fichiers ont déjà été compressés en utilisant la compression gzip, l'extension zlib doit être activée pour pouvoir décompresser les fichiers et les re-compresser avec l'algorithme bzip2. Comme avec toutes les fonctionnalités qui modifient le contenu d'un phar, la variable INI phar.readonly doit être à off pour fonctionner.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Lève une exception BadMethodCallException si la variable INI phar.readonly est on, si l'extension bzip2 n'est pas disponible, ou si un ou des fichiers ont été déjà compressés avec la compression gzip et que l'extension zlib n'est pas activée.
Exemple #1 Un exemple avec Phar::compressAllFilesBZIP2()
<?php
$p = new Phar('/chemin/vers/mon.phar', 0, 'mon.phar');
$p['monfichier.txt'] = 'salut';
$p['monfichier2.txt'] = 'salut';
foreach ($p as $file) {
var_dump($file->getFileName());
var_dump($file->isCompressed());
var_dump($file->isCompressedBZIP2());
var_dump($file->isCompressedGZ());
}
$p->compressAllFilesBZIP2();
foreach ($p as $file) {
var_dump($file->getFileName());
var_dump($file->isCompressed());
var_dump($file->isCompressedBZIP2());
var_dump($file->isCompressedGZ());
}
?>
L'exemple ci-dessus va afficher :
string(10) "monfichier.txt" bool(false) bool(false) bool(false) string(11) "monfichier2.txt" bool(false) bool(false) bool(false) string(10) "monfichier.txt" bool(true) bool(true) bool(false) string(11) "monfichier2.txt" bool(true) bool(true) bool(false)
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::compressAllFilesGZ — Compresse tous les fichiers de l'archive Phar courante en utilisant la compression Gzip
Note:
Cette méthode a été supprimée de l'extension phar depuis la version 2.0.0. Vous pouvez utiliser Phar::compress(), Phar::decompress(), Phar::compressFiles() et Phar::decompressFiles() à la place.
Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Pour les archives phar basées sur tar, cette méthode compresse l'archive complète en utilisant la compression gzip. Le fichier qui en résulte peut être traité avec la commande gunzip, ou accédée directement et de façon transparente avec l'extension Phar.
Pour les archives phar basées sur Zip, cette méthode compresse tous les fichiers de l'archive Phar en utilisant la compression gzip. L'extension zlib doit être activée pour pouvoir bénéficier de cette fonctionnalité. De plus, si un ou des fichiers ont déjà été compressés en utilisant la compression bzip2, l'extension bzip2 doit être activée pour pouvoir décompresser les fichiers et les re-compresser avec l'algorithme gzip. Comme avec toutes les fonctionnalités qui modifient le contenu d'un phar, la variable INI phar.readonly doit être à off pour fonctionner.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Lève une exception BadMethodCallException si la variable INI phar.readonly est à on, si l'extension zlib n'est pas disponible, ou si un ou des fichiers ont déjà été compressés avec l'algorithme bzip2 et que l'extension bzip2 n'est pas activée.
Exemple #1 Un exemple avec Phar::compressAllFilesGZ()
<?php
$p = new Phar('/chemin/vers/mon.phar', 0, 'mon.phar');
$p['monfichier.txt'] = 'salut';
$p['monfichier2.txt'] = 'salut';
foreach ($p as $file) {
var_dump($file->getFileName());
var_dump($file->isCompressed());
var_dump($file->isCompressedBZIP2());
var_dump($file->isCompressedGZ());
}
$p->compressAllFilesGZ();
foreach ($p as $file) {
var_dump($file->getFileName());
var_dump($file->isCompressed());
var_dump($file->isCompressedBZIP2());
var_dump($file->isCompressedGZ());
}
?>
L'exemple ci-dessus va afficher :
string(10) "monfichier.txt" bool(false) bool(false) bool(false) string(11) "monfichier2.txt" bool(false) bool(false) bool(false) string(10) "monfichier.txt" bool(true) bool(false) bool(true) string(11) "monfichier22.txt" bool(true) bool(false) bool(true)
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::compressFiles — Compresse tous les fichiers de l'archive Phar courante'
$compression
)Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Pour les archives phar basées sur tar, cette méthode lève une exception BadMethodCallException car la compression de fichier individuelle au sein d'une archive tar n'est pas supportée par le format de fichier. Utilisez Phar::compress() pour compresser une archive phar basée sur tar en entier.
Pour les extensions phar basées sur Zip, cette méthode compresse tous les fichiers de l'archive Phar en utilisant la compression spécifiée. Les extensions zlib ou bzip2 doivent être activée pour tirer parti de cette fonctionnalité. De plus, si un ou des fichiers ont déjà été compressé en utilisant la compression bzip2/zlib, l'extension adéquate doit être activée pour décompresser les fichiers avant de les recompresser. extensions must be enabled to take advantage of this feature. In addition, if any files are already compressed using bzip2/zlib compression, the respective extension must be enabled in order to decompress the files prior to re-compressing. Comme avec toutes les fonctionnalités qui modifient le contenu d'un phar, la variable INI phar.readonly doit être à off pour fonctionner.
compression
La compression doit être soit Phar::GZ, soit Phar::BZ2 pour bénéficier de la compression, ou bien Phar::NONE pour éliminer la compression.
Aucune valeur n'est retournée.
Lève une exception BadMethodCallException si la variable INI phar.readonly est à on, si l'extension zlib n'est pas disponible, ou si un ou des fichiers ont été compressés avec l'algorithme bzip2 et que l'extension bzip2 n'est pas activée.
Exemple #1 Un exemple avec Phar::compressFiles()
<?php
$p = new Phar('/chemin/vers/mon.phar', 0, 'mon.phar');
$p['monfichier.txt'] = 'salut';
$p['monfichier2.txt'] = 'salut';
foreach ($p as $file) {
var_dump($file->getFileName());
var_dump($file->isCompressed());
var_dump($file->isCompressed(Phar::BZ2));
var_dump($file->isCompressed(Phar::GZ));
}
$p->compressFiles(Phar::GZ);
foreach ($p as $file) {
var_dump($file->getFileName());
var_dump($file->isCompressed());
var_dump($file->isCompressed(Phar::BZ2));
var_dump($file->isCompressed(Phar::GZ));
}
?>
L'exemple ci-dessus va afficher :
string(10) "monfichier.txt" bool(false) bool(false) bool(false) string(11) "monfichier2.txt" bool(false) bool(false) bool(false) string(10) "monfichier.txt" int(4096) bool(false) bool(true) string(11) "monfichier2.txt" int(4096) bool(false) bool(true)
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::__construct — Construit un objet d'archive Phar
$fname
[, int $flags
[, string $alias
]] )
fname
Le chemin vers une archive Phar existante ou à créer
flags
Les drapeaux à passer à la classe parente RecursiveDirectoryIterator.
alias
Alias avec lequel on doit faire référence à l'archive lors de l'appels aux fonctionnalités de flux.
Lève une exception BadMethodCallException si la méthode est appelée deux fois, ou UnexpectedValueException si l'archive ne peut pas être ouverte.
Exemple #1 Un exemple avec Phar::__construct()
<?php
try {
$p = new Phar('/path/to/my.phar', FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::KEY_AS_FILENAME,
'mon.phar');
} catch (UnexpectedValueException $e) {
die('Ne peut pas ouvrir mon.phar');
} catch (BadMethodCallException $e) {
echo 'techniquement, ça ne peut pas arriver';
}
// ça fonctionne maintenant
echo file_get_contents('phar://mon.phar/exemple.txt');
// et ça fonctionne comme si nous avions tapé
echo file_get_contents('phar:///chemin/vers/mon.phar/exemple.txt');
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::convertToData — Convertit une archive phar en un fichier non-exécutable
$format = 9021976
[, int $compression = 9021976
[, string $extension
]]] )Convertit une archive phar exécutable en un fichier tar ou zip. Pour rendre le tar ou le zip non exécutable, le conteneur phar et l'alias phar sont supprimés de l'archive nouvellement créée.
Si aucun changement n'est spécifié, cette méthode émet une exception BadMethodCallException si l'archive est dans le format de fichier phar. Pour les archives basées sur tar ou zip, cette méthode convertit l'archive en une archive non exécutable.
En cas de succès, la méthode crée une nouvelle archive sur le disque et retourne un objet PharData. L'ancienne archive n'est pas supprimée du disque, ce qui devrait être fait manuellement à la fin du procédé.
format
Ce doit être l'un des formats Phar::TAR
ou Phar::ZIP. Si ce paramètre est NULL,
le format de fichier actuel sera conservé.
compression
Ce doit être Phar::NONE pour aucune compression globale, Phar::GZ la une compression basée sur zlib et Phar::BZ2 pour une compression basée sur bzip2.
extension
Ce paramètre est utilisée pour écraser l'extension par défaut d'une archive convertie. A noter que .phar ne peut pas être utilisé dans le nom de fichier d'une archive tar ou zip non-exécutable.
Si on convertit vers une archive basée sur tar, les extensions par défaut sont .tar, .tar.gz, et .tar.bz2 selon la compression spécifiée. Pour les archives phar basées sur zip, l'extension par défaut est .zip.
La méthode retourne un objet PharData en cas de succès et émet une exception en cas d'échec.
Cette méthode émet une exception BadMethodCallException si elle n'est pas capable de compresser, si une méthode de compression inconnue a été spécifiée ou si l'archive demandée a été mise en tampon avec Phar::startBuffering() sans être conclue avec Phar::stopBuffering(), et émet une exception PharException si un quelconque problème a été rencontré pendant la phase de création de l'archive.
Exemple #1 Un exemple avec Phar::convertToData()
Utilisons Phar::convertToData():
<?php
try {
$tarphar = new Phar('monphar.phar.tar');
// notez bien que monphar.phar.tar n'est *pas* effacé
// on convertit vers le format de fichier tar non exéctuable
// crée monphar.tar
$tar = $tarphar->convertToData();
// on convertit vers le format de fichier zip non exéctuable et crée monphar.zip
$zip = $tarphar->convertToData(Phar::ZIP);
// crée monphar.tbz
$tgz = $tarphar->convertToData(Phar::TAR, Phar::BZ2, '.tbz');
// crée monphar.phar.tgz
$phar = $tarphar->convertToData(Phar::PHAR); // émet une exception
} catch (Exception $e) {
// on traite les erreurs ici
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::convertToExecutable — Convertit une archive phar vers un autre format de fichier d'archive phar exécutable
$format = 9021976
[, int $compression = 9021976
[, string $extension
]]] )Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Cette méthode est utilisée pour convertir une archive phar vers un autre format de fichier. Par exemple, elle peut être utilisée pour créer une archive phar basée sur tar en partant d'une archive phar basée sur zip ou à partir d'une archive phar exécutable basée sur le format de fichier phar. De plus, elle peut aussi être utilisée pour appliquer une compression globale à une archive basée sur tar ou sur phar.
Si aucun changement n'est précisé, cette méthode lève une exception BadMethodCallException.
En cas de succès, la méthode crée une nouvelle archive sur le disque et retourne un objet Phar. L'ancienne archive n'est pas supprimée du disque, ce qui devrait être fait manuellement à la fin du procédé.
format
Ce doit être l'un des formats Phar::PHAR, Phar::TAR,
ou Phar::ZIP. Si ce paramètre est NULL, le format de fichier actuel sera
conservé.
compression
Ce doit être Phar::NONE pour aucune compression globale, Phar::GZ la une compression basée sur zlib et Phar::BZ2 pour une compression basée sur bzip2.
extension
Ce paramètre est utilisée pour écraser l'extension par défaut d'une archive convertie. A noter que toutes les archives phar basée sur zip ou sur tar doivent comporter .phar dans leur extension pour être traitées comme une archive phar.
Si on convertit vers une archive basée sur phar, les extensions par défaut sont .phar, .phar.gz, ou .phar.bz2 selon la compression spécifiée. Pour les archives phar basées sur tar, les extensions par défaut sont .phar.tar, .phar.tar.gz, et .phar.tar.bz2. Pour les archives phar basées sur zip, l'extension par défaut est .phar.zip.
La méthode retourne un objet Phar en cas de succès et lève une exception en cas d'échec.
Cette méthode lève une exception BadMethodCallException si elle n'est pas capable de compresser, si une méthode de compression inconnue a été spécifiée ou si l'archive demandée a été mise en tampon avec Phar::startBuffering() sans être conclue avec Phar::stopBuffering(), lève une exception UnexpectedValueException si le support en écriture a été désactivé et lève une exception PharException si un quelconque problème a été rencontré pendant la phase de création de l'archive.
Exemple #1 Un exemple avec Phar::convertToExecutable()
Utilisons Phar::convertToExecutable() :
<?php
try {
$tarphar = new Phar('monphar.phar.tar');
// on le convertit vers le format de fichier phar
// notez bien que monphar.phar.tar n'est *pas* effacé
$phar = $tarphar->convertToExecutable(Phar::PHAR); // crée monphar.phar
$phar->setStub($phar->createDefaultStub('cli.php', 'web/index.php'));
// crée monphar.phar.tgz
$compressed = $phar->convertToExecutable(Phar::TAR, Phar::GZ, '.phar.tgz');
} catch (Exception $e) {
// on traite les erreurs ici
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::copy — Copie un fichier appartenant à une archive vers un autre fichier de la même archive
$oldfile
, string $newfile
)Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Copie un fichier appartenant à une archive vers un nouveau fichier de la même archive. C'est une alternative orientée objet à l'utilisation de copy() avec un flux phar.
oldfile
newfile
Retourne TRUE en cas de succès, mais il est plus sûr d'encadrer l'appel à cette méthode
dans un bloc try/catch et de considérer son succès si aucune exception n'est levée.
Lève une exception UnexpectedValueException si le fichier source n'existe pas, si le fichier destination existe déjà, si l'accès en écriture est désactivé, si ouvrir l'un ou l'autre des fichiers échoue, si la lecture du fichier source échoue, ou lève une exception PharException si l'écriture des changement dans le phar échoue.
Exemple #1 Exemple avec Phar::copy()
Cet exemple montre comment utiliser Phar::copy() et la comparaison en terme de performance avec l'équivalent utilisant le flux phar. La différence principale entre les deux méthodes concerne la gestion des erreurs. Toutes les méthodes Phar lèvent des exceptions, là où les fonctions de flux utilisent trigger_error().
<?php
try {
$phar = new Phar('monphar.phar');
$phar['a'] = 'salut';
$phar->copy('a', 'b');
echo $phar['b']; // affiche "salut"
} catch (Exception $e) {
// traite les erreurs
}
// l'équivalent en terme de flux du code ci-dessus
// des E_WARNING sont retournés plutôt que des exceptions
copy('phar://monphar.phar/a', 'phar//monphar.phar/c');
echo file_get_contents('phar://monphar.phar/c'); // affiche "salut"
?>
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::count — Retourne le nombre d'entrées (fichiers) dans l'archive Phar
Le nombre de fichiers contenus dans le phar, ou 0 (le nombre zéro) si aucun.
Exemple #1 Un exemple avec Phar::count()
<?php
// on s'assure que le phar n'existe pas
@unlink('lenouveauphar.phar');
try {
$p = new Phar(dirname(__FILE__) . '/lenouveauphar.phar', 0, 'le nouveauphar.phar');
} catch (Exception $e) {
echo 'Ne peut pas créer le phar:', $e;
}
echo 'Le nouveau phar a ' . $p->count() . " entrées\n";
$p['file.txt'] = 'salut';
echo 'Le nouveau phar a ' . $p->count() . " entrées\n";
?>
L'exemple ci-dessus va afficher :
Le nouveau phar a 0 entrées Le nouveau phar a 1 entrées
(Unknown)
Phar::createDefaultStub — Crée un conteneur de chargement d'une archive Phar
$indexfile
[, string $webindexfile
]] )Cette méthode est destinée à la création de conteneurs spécifique au format de fichier phar et n'est pas conçue pour être utilisée avec des archives phar basées sur tar ou sur zip.
Les archives Phar contiennent un chargeur ou un conteneur écrit en PHP qui est exécuté quand l'archive est exécutée soit par une inclusion
<?php
include 'monphar.phar';
?>
php monphar.phar
Cette méthode fournit un moyen simple et facile de créer un conteneur qui lancera un fichier de démarrage à partir de l'archive phar. En plus, des fichiers différents peuvent être spécifiés pour exécuter l'archive à partir de la ligne de commande ou d'un serveur web. Le conteneur de chargement appelle alors Phar::interceptFileFuncs() pour permettre l'empaquetage facile d'applications PHP accédant au système de fichiers. Si l'extension phar n'est pas présente, le conteneur de chargement extraira l'archive phar vers un répertoire temporaire et traitera les fichiers. Une fonction d'extinction effacera les fichier temporaires à la fin.
Retourne une chaîne de caractères contenant un conteneur de chargement personnalisé qui permet à l'archive Phar créée de fonctionner avec ou sans l'extension Phar d'activée.
Lève une exception UnexpectedValueException si un des paramètres est plus long que 400 octets.
Exemple #1 Exemple avec Phar::createDefaultStub()
<?php
try {
$phar = new Phar('monphar.phar');
$phar->setStub($phar->createDefaultStub('cli.php', 'web/index.php'));
} catch (Exception $e) {
// traite les erreurs
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::decompress — Décompresse l'archive tar complète
$extension
] )Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Pour les archives phar basées sur tar et sur phar, cette méthode décompresse l'archive complète.
Pour les archives phar bases sur Zip, cette méthode échoue et lève une exception. L'extension zlib doit être active pour décompresser une archive compressée grâce à gzip, et l'extension bzip2 doit être active pour décompresser une archive compressée grâce à bzip2. Comme avec toutes les fonctionnalités qui modifient le coutenu d'un phar, la variable INI phar.readonly doit être à off pour fonctionner.
De plus, cette méthode change automatiquement l'extension de l'archive, .phar Par défaut pour les archives phar, ou .phar.tar pour les archives phar basées sur tar. Sinon, une extension de fichier peut aussi être spécifiée en utilisant le second paramètre.
extension
Pour décompresser, les extension de fichier par défaut sont .phar et .phar.tar. Utilisez ce paramètre pour spécifier une autre extension de fichier. A noter que toutes les archives phar exécutables doivent contenir .phar dans leur nom de fichier.
Un objet Phar est retourné.
Lève une exception BadMethodCallException si la variable INI phar.readonly est à on, si l'extension zlib n'est pas disponible, ou si l'extension bzip2 n'est pas activée.
Exemple #1 Un exemple avec Phar::decompress()
<?php
$p = new Phar('/chemin/vers/mon.phar', 0, 'mon.phar.gz');
$p['monfichier.txt'] = 'salut';
$p['monfichier.txt'] = 'salut';
$p3 = $p2->decompress(); // crée /chemin/vers/mon.phar
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::decompressFiles — Décompresse tous les fichiers de l'archive Phar courante
Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Pour les archives phar basées sur tar, cette méthode lève une exception BadMethodCallException, car la compression individuelle des fichiers au sein d'une archive tar n'est pas supportée par le format de fichier. Utilisez Phar::compress() pour compresser en archive phar basée sur tar en entier.
Pour les archives phar basées sur Zip ou sur phar, cette méthode décompresse tous les fichiers de l'archive Phar. Les extensions zlib ou bzip2 doivent être activées pour tirer parti de cette fonctionnalité si n'importe lequel des fichiers est compressé en utilisant une la compression bzip2/zlib. Comme avec toutes les fonctionnalités qui modifient le contenu d'un phar, la variable INI phar.readonly doit être à off pour fonctionner.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Lève une exception BadMethodCallException si la variable INI phar.readonly est à on, si l'extension zlib n'est pas disponible ou si un des fichiers est compressé en utilisant la compression bzip2 et que l'extension bzip2 n'est pas activée.
Exemple #1 Un exemple avec Phar::decompressFiles()
<?php
$p = new Phar('/chemin/vers/mon.phar', 0, 'mon.phar');
$p['monfichier.txt'] = 'salut';
$p['monfichier2.txt'] = 'salut';
$p->compressFiles(Phar::GZ);
foreach ($p as $file) {
var_dump($file->getFileName());
var_dump($file->isCompressed());
var_dump($file->isCompressed(Phar::BZ2));
var_dump($file->isCompressed(Phar::GZ));
}
$p->decompressFiles();
foreach ($p as $file) {
var_dump($file->getFileName());
var_dump($file->isCompressed());
var_dump($file->isCompressed(Phar::BZ2));
var_dump($file->isCompressed(Phar::GZ));
}
?>
L'exemple ci-dessus va afficher :
string(10) "monfichier.txt" int(4096) bool(false) bool(true) string(11) "monfichier2.txt" int(4096) bool(false) bool(true) string(10) "monfichier.txt" bool(false) bool(false) bool(false) string(11) "monfichier2.txt" bool(false) bool(false) bool(false)
(PHP >= 5.3.0, PECL phar >= 1.2.0)
Phar::delMetadata — Efface les méta-données globales du phar
Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Efface les méta-données globales du phar
retourne TRUE en cas de succès, mais il est plus sûr de vérifier si des exceptions sont levées,
et de considérer que tout s'est bien passé si aucune n'est levée.
Lève une exception PharException si des erreurs apparaissent pendant l'écriture sur le disque.
Exemple #1 Un exemple avec Phar::delMetaData()
<?php
try {
$phar = new Phar('monphar.phar');
var_dump($phar->getMetadata());
$phar->setMetadata("salut");
var_dump($phar->getMetadata());
$phar->delMetadata();
var_dump($phar->getMetadata());
} catch (Exception $e) {
// traite les erreurs
}
?>
L'exemple ci-dessus va afficher :
NULL string(8) "salut" NULL
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::delete — Efface un fichier au sein d'une archive phar
$entry
)Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Efface une fichier au sein d'une archive phar. C'est l'équivalent fonctionnel de l'appel à unlink() dans un contexte de flux, comme décrit dans l'exemple suivant...
entry
Chemin du fichier à effacer au sein de l'archive.
retourne TRUE en cas de succès, mais il est plus sûr de vérifier si des exceptions sont levées,
et de considérer que tout s'est bien passé si aucune n'est levée.
Lève une exception PharException si des erreurs apparaissent pendant l'écriture sur le disque.
Exemple #1 Un exemple avec Phar::delete()
<?php
try {
$phar = new Phar('monphar.phar');
$phar->delete('efface/moi.php');
// c'est équivalent à :
unlink('phar://monphar.phar/efface/moi.php');
} catch (Exception $e) {
// traite les erreurs
}
?>
(Unknown)
Phar::extractTo — Extrait le contenu d'une archive phar vers un répertoire
$pathto
[, string|array $files
[, bool $overwrite = false
]] )Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Extrait tous les fichiers d'une archive phar vers le disque. Les fichiers et les dossiers extraits
conservent les permissions à l'identique de l'intérieur de l'archive. Les paramètres optionnels permettent
un éventuel contrôle sur quel fichier est extrait et si des fichiers déjà existants sur le disque
peuvent être écrasés. Le second paramètre files peut être soit le nom d'un fichier ou d'un
répertoire, soit un tableau de noms de fichiers et de répertoires à extraire. Par défaut, cette méthode n'écrasant
pas les fichiers existants, le troisième paramètre peut être passé à TRUE pour activer l'écrasement de fichiers.
Cette méthode est identique à ZipArchive::extractTo().
pathto
Chemin du fichier à effacer au sein de l'archive.
files
Le nom d'un fichier ou d'un répertoire ou un tableau de fichiers/répertoires à extraire
overwrite
Le passer à TRUE pour activer l'écrasement des fichiers existants
retourne TRUE en cas de succès, mais il est plus sûr de vérifier si des exceptions sont levées,
et de considérer que tout s'est bien passé si aucune n'est levée.
Lève une exception PharException si des erreurs apparaissent pendant l'écriture sur le disque.
Exemple #1 Un exemple avec Phar::extractTo()
<?php
try {
$phar = new Phar('monphar.phar');
$phar->extractTo('/chemin/complet'); // extrait tous les fichiers
$phar->extractTo('/autre/chemin', 'fichier.txt'); // extrait seulement fichier.txt
$phar->extractTo('/ce/chemin',
array('fichier1.txt', 'fichier2.txt')); // extrait seulement 2 fichiers
$phar->extractTo('/troisieme/chemin', null, true); // extrait tous les fichiers, en écrasant
} catch (Exception $e) {
// traite les erreurs
}
?>
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::getMetadata — Retourne les méta-données de l'archive phar
Récupère les méta-données de l'archive. Celles-ci peuvent être n'importe quelle variable PHP pouvant être sérialisée.
Aucun paramètre.
n'importe quelle variable PHP pouvant être sérialisée et qui est stockée comme méta-donnée de l'archive Phar,
ou NULL si aucune méta-donnée n'est stockée.
Exemple #1 Un exemple avec Phar::getMetadata()
<?php
// on s'assure que le phar n'existe pas
@unlink('nouveauphar.phar');
try {
$p = new Phar(dirname(__FILE__) . '/nouveauphar.phar', 0, 'nouveauphar.phar');
$p['fichier.php'] = '<?php echo "salut";';
$p->setMetadata(array('bootstrap' => 'fichier.php'));
var_dump($p->getMetadata());
} catch (Exception $e) {
echo 'Ne peut pas modifier le phar :', $e;
}
?>
L'exemple ci-dessus va afficher :
array(1) {
["bootstrap"]=>
string(8) "fichier.php"
}
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::getModified — Indique si le fichier phar a été modifié
Détermine si une archive phar a eu soit un fichier interne effacé ou si le contenu d'un fichier a changé d'une façon ou d'une autre.
Aucun paramètre.
TRUE si le phar a été modifié depuis son ouverture, FALSE sinon.
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::getSignature — Retourne la signature MD5/SHA1/SHA256/SHA512 d'une archive Phar
Retourne la signature de vérification d'une archive phar sous forme d'une chaîne de caractères hexadécimale.
Un tableau avec la signature de l'archive ouverte avec le hash en guise de clé et
"MD5", "SHA-1", "SHA-256"
ou "SHA-512" comme hash_type. Cette signature est un hachage
calculé à partir du contenu de l'archive entière; elle peut être utilisée pour vérifier
l'intégrité de l'archive. Une signature valide est absolument requise pour toutes les archives phar
exécutables si la variable INI phar.require_hash vaut TRUE.
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::getStub — Retourne le chargeur PHP ou le conteneur de chargement d'une archive Phar
Les archives phar contiennent un chargeur, ou conteneur (stub), écrit en PHP qui est exécuté quand l'archive elle-même est exécutée soit par inclusion :
<?php
include 'monphar.phar';
?>
php monphar.phar
Retourne une chaîne de caractères avec le contenu du conteneur de chargement (stub) de l'archive phar courante.
Lève une exception RuntimeException s'il n'est pas possible de lire le conteneur de chargement de l'archive Phar.
Exemple #1 Exemple avec Phar::getStub()
<?php
$p = new Phar('/chemin/vers/mon.phar', 0, 'mon.phar');
echo $p->getStub();
echo "==SUIVANT==\n";
$p->setStub("<?php
function __autoload($class)
{
include 'phar://' . str_replace('_', '/', $class);
}
Phar::mapPhar('monphar.phar');
include 'phar://monphar.phar/demarrage.php';
__HALT_COMPILER(); ?>");
echo $p->getStub();
?>
L'exemple ci-dessus va afficher :
<?php __HALT_COMPILER(); ?>
==SUIVANT==
<?php
function __autoload($class)
{
include 'phar://' . str_replace('_', '/', $class);
}
Phar::mapPhar('monphar.phar');
include 'phar://monphar.phar/demarrage.php';
__HALT_COMPILER(); ?>
(PHP >= 5.3.0, PECL phar >= 1.2.0)
Phar::getSupportedCompression — Retourne un tableau des algorithmes de compression supportés
Aucun paramètre.
Retourne un tableau contenant l'un des algorithmes Phar::GZ ou Phar::BZ2, selon la disponibilité de l'extension zlib ou de l'extension bz2.
(PHP >= 5.3.0, PECL phar >= 1.1.0)
Phar::getSupportedSignatures — Retourne un tableau des types de signature supportés
Retourne un tableau des types de signature supportés
Aucun paramètre.
Retourne un tableau contenant un ou plusieurs des types MD5, SHA-1, SHA-256, SHA-512.
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::getVersion — Retourne les informations de version de l'archive Phar
Retourne la version de l'API d'une archive Phar ouverte.
La version de l'API de l'archive ouverte. A ne pas confondre avec la version dAPI que l'extension phar chargée utilisera pour créer de nouveaux phar. Chaque archive Phar a la version d'API codée en dur dans son manifeste. Pour davantage d'information, regardez le format de fichier Phar.
(PHP >= 5.3.0, PECL phar >= 1.2.0)
Phar::hasMetadata — Détermine si le phar a ou non des méta-données
Détermine si le phar a ou non des méta-données.
Aucun paramètre.
Retourne TRUE si des méta-données sont présentes, FALSE sinon.
Exemple #1 Un exemple avec Phar::hasMetadata()
<?php
try {
$phar = new Phar('monphar.phar');
var_dump($phar->hasMetadata());
$phar->setMetadata(array('deschoses' => 'salut'));
var_dump($phar->hasMetadata());
$phar->delMetadata();
var_dump($phar->hasMetadata());
} catch (Exception $e) {
// traite les erreurs
}
?>
L'exemple ci-dessus va afficher :
bool(false) bool(true) bool(false)
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::interceptFileFuncs — Informe phar qu'il doit intercepter les fonctions de fichiers
Informe phar d'intercepter fopen(), readfile(), file_get_contents(), opendir() et toutes les fonctions relatives à stat. Si n'importe laquelle de ces fonctions est appelée depuis l'archive phar avec un chemin relatif, l'appel est modifié pour accéder à un fichier au sein de l'archive. Les chemins absolus sont supposés être des tentatives de chargement de fichiers externes à partir du système de fichiers.
Cette fonction rend possible l'exécution d'applications PHP conçues pour être lancées en dehors d'un disque dur, en tant qu'application phar.
Aucun paramètre.
Exemple #1 Exemple avec Phar::interceptFileFuncs()
<?php
Phar::interceptFileFuncs();
include 'phar://' . __FILE__ . '/fichier.php';
?>
En supposant que ce phar est nommé /chemin/vers/monphar.phar est qu'il contient fichier.php et fichier2.txt, si fichier.php contient ce code :
Exemple #2 Un exemple avec Phar::interceptFileFuncs()
<?php
echo file_get_contents('fichier2.txt');
?>
Normalement, PHP chercherait dans le répertoire courant le fichier nommé file2.txt, c'est à dire dans le répertoire de fichier.php ou le répertoire courant de l'utilisateur de la ligne de commande. Phar::interceptFileFuncs() dit à PHP de considérer phar:///chemin/vers/monphar.phar/ comme répertoire courant et ainsi ouvre dans l'exemple ci-dessus le fichier phar:///chemin/vers/monphar.phar/fichier2.txt.
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::isBuffering — Détermine si les opérations d'écriture du Phar sont mises en tampons ou sont directement inscrites sur le disque
Cette méthode peut être utilisée pour déterminer si un Phar sauvera ses changements immédiatement sur le disque ou si un appel à la fonction Phar::stopBuffering() est nécessaire pour inscrire les modifications.
La mise en tampon de l'écriture du Phar se fait par archive; la mise en tampon de l'archive Pharfoo.phar n'affecte en rien les changements faits sur l'archive Phar bar.phar.
Retourne TRUE si les opérations d'écriture sont mises en tampons,
FALSE sinon.
Exemple #1 Un exemple avec Phar::isBuffering()
<?php
$p = new Phar(dirname(__FILE__) . '/nouveauphar.phar', 0, 'nouveauphar.phar');
$p2 = new Phar('pharexistant.phar');
$p['fichier1.txt'] = 'salut';
var_dump($p->isBuffering());
var_dump($p2->isBuffering());
?>
=2=
<?php
$p->startBuffering();
var_dump($p->isBuffering());
var_dump($p2->isBuffering());
$p->stopBuffering();
?>
=3=
<?php
var_dump($p->isBuffering());
var_dump($p2->isBuffering());
?>
L'exemple ci-dessus va afficher :
bool(false) bool(false) =2= bool(true) bool(false) =3= bool(false) bool(false)
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::isCompressed — Retourne Phar::GZ ou PHAR::BZ2 si l'archive entière est compressée (.tar.gz/tar.bz, etc)
Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Retourne Phar::GZ ou PHAR::BZ2 si l'archive entière est compressée
(.tar.gz/tar.bz, etc). Les archives phar basées sur Zip ne peuvent
pas être compressées en tant que fichier, et cette méthode retournera
toujours FALSE si une archive phar basée sur Zip est interrogée.
Aucun paramètre.
Phar::GZ, Phar::BZ2 ou FALSE
Exemple #1 Exemple avec Phar::isCompressed()
<?php
try {
$phar1 = new Phar('monphar.zip.phar');
var_dump($phar1->isCompressed());
$phar2 = new Phar('monpharnoncompresse.tar.phar');
var_dump($phar2->isCompressed());
$phar2->compressAllFilesGZ();
var_dump($phar2->isCompressed() == Phar::GZ);
} catch (Exception $e) {
}
?>
L'exemple ci-dessus va afficher :
bool(false) bool(false) bool(true)
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::isFileFormat — Retourne TRUE si l'archive phar est basée sur le formats de fichier tar/phar/zip selon le paramètre
$format
)
format
Soit Phar::PHAR, soit Phar::TAR, soit Phar::ZIP pour tester le format de fichier de l'archive.
Retourne TRUE si l'archive phar utilise le format de fichier spécifié en paramètre
Une exception PharException est levée sur le paramètre est un format de fichier inconnu.
(PHP >= 5.3.0, PECL phar >= 1.2.0)
Phar::isValidPharFilename — Détermine si le nom de fichier spécifié est un nom de fichier valide pour une archive phar
$filename
[, bool $executable = true
] )Détermine si le nom de fichier spécifié est une nom de fichier valide pour une archive phar, qui sera reconnue comme telle par l'extension phar. Ceci peut être utilisé pour tester un nom sans avoir à instancier une archive phar et à attraper l'inévitable Exception qui sera levée si un nom de fichier non valide est spécifié.
filename
Le nom ou le chemin complet vers une archive phar non encore créée
executable
Ce paramètre détermine si le nom de fichier doit être traité comme celui d'une archive phar exécutable ou comme une archive de données non exécutable.
Retourne TRUE si le nom de fichier est valide, FALSE sinon.
(Unknown)
Phar::isWritable — Retourne TRUE si l'archive phar peut être modifiée
Cette méthode retourne TRUE si phar.readonly est à 0
et que l'archive phar actuelle sur le disque n'est pas en lecture seule.
Aucun paramètre.
Retourne TRUE si l'archive phar peut être modifiée
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::loadPhar — Charge n'importe quelle archive phar avec un alias
$filename
[, string $alias
] )Cette méthode peut être utilisée pour lire le contenu d'une archive Phar externe. C'est principalement utile pour assigner un alias à un phar de telle façon que les références ultérieures au phar puissent être faites à l'aide d'un alias plus court ou pour charger des archives Phar qui contiennent seulement des données et qui ne sont pas destinées à être exécutées/incluses dans des scripts PHP.
filename
le chemin relatif ou absolu vers l'archive phar à ouvrir
alias
L'alias qui pourra être utilisé pour se référer à l'archive phar. Notez que de nombreuses archives phar spécifient un alias explicite au sein de l'archive phar, et une exception PharException sera levée si un nouvel alias est spécifié dans ce cas.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Une exceptionPharException est levée si un alias est passé alors que l'archive phar a déjà un alias explicite
Exemple #1 Un exemple avec Phar::loadPhar()
Phar::loadPhar peut être utilisée n'importe où pour charger une archive phar externe alors que Phar::mapPhar devrait être utilisée dans un conteneur de chargement pour un Phar.
<?php
try {
Phar::loadPhar('/chemin/vers/phar.phar', 'mon.phar');
echo file_get_contents('phar://mon.phar/fichier.txt');
} catch (PharException $e) {
echo $e;
}
?>
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::mapPhar — Lit le phar exécuté et charge son manifeste
$alias
[, int $dataoffset = 0
]] )Cette méthode statique peut être utilisée seulement au sein du conteneur de chargement d'une archive Phar pour initialiser le phar quand il est exécuté directement ou quand il est inclus dans un autre script.
alias
L'alias qui peut être utilisé dans l'URL phar:// pour se référer à l'archive plutôt que d'utiliser son chemin complet.
dataoffset
Variable inutilisée, présente par souci de compatibilité avec la bibliothèque PHP_Archive de PEAR.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Une exception PharException est levée si la méthode n'est pas appelée directement au sein de l'exécution de PHP, si aucun jeton __HALT_COMPILER(); n'est trouvé dans le fichier source actuel ou si le fichier ne peut pas être ouvert en lecture.
Exemple #1 Exemple avec Phar::mapPhar()
mapPhar ne doit être utilisé qu'au sein du conteneur de chargement d'un phar. Utilisez loadPhar pour charger un phar externe en mémoire.
Voici un exemple de conteneur de chargement Phar qui utilise mapPhar.
<?php
function __autoload($class)
{
include 'phar://mon.phar/' . str_replace('_', '/', $class) . '.php';
}
try {
Phar::mapPhar('mon.phar');
include 'phar://mon.phar/demarrage.php';
} catch (PharException $e) {
echo $e->getMessage();
die('Ne peut pas initialiser le Phar');
}
__HALT_COMPILER();
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::mount — Monte un chemin ou un fichier externe à un emplacement virtuel au sein de l'archive phar
$pharpath
, string $externalpath
)Tout comme le concept unix de montage d'un périphérique externe à un endroit de l'arborescence, Phar::mount() permet de se référer à des fichiers et des répertoires externes comme s'ils étaient à l'intérieur de l'archive.
pharpath
Le chemin interne au sein de l'archive phar à utiliser en tant que point de montage. Doit être un chemin relatif dans l'archive phar, et ne doit pas déjà exister.
externalpath
Un chemin ou une URL vers un fichier ou un répertoire externe à monter au sein de l'archive
Aucun retour. Une exception PharException est levée en cas d'échec.
Lève une exception PharException si un problème est rencontré lors du montage.
Exemple #1 Un exemple avec Phar::mount()
L'exemple suivant présente l'accès à un fichier de configuration externe comme s'il était un chemin au sein de l'archive phar.
Tout d'abord, le code au sein de l'archive phar :
<?php
$configuration = simplexml_load_string(file_get_contents(
Phar::running(false) . '/config.xml'));
?>
Ensuite le code externe utilisé pour monter le fichier de configuration :
<?php
// on commence par configurer l'association entre le fichier config.xml abstrait
// et celui sur le disque
Phar::mount('phar://config.xml', '/home/example/config.xml');
// on lance maintenant l'application
include '/chemin/vers/archive.phar';
?>
Une autre méthode est de mettre le code de montage au sein du conteneur de chargement de l'archive phar. Voici un exemple pour configurer un fichier de configuration par défaut si aucune configuration utilisateur n'est faite :
<?php
// on commence par configurer l'association entre le fichier config.xml abstrait
// et celui sur le disque
if (defined('EXTERNAL_CONFIG')) {
Phar::mount('config.xml', EXTERNAL_CONFIG);
if (file_exists(__DIR__ . '/extra_config.xml')) {
Phar::mount('extra.xml', __DIR__ . '/extra_config.xml');
}
} else {
Phar::mount('config.xml', 'phar://' . __FILE__ . '/default_config.xml');
Phar::mount('extra.xml', 'phar://' . __FILE__ . '/default_extra.xml');
}
// on lance maintenant l'application
include 'phar://' . __FILE__ . '/index.php';
__HALT_COMPILER();
?>
... et le code externe pour charger cette archive phar :
<?php
define('EXTERNAL_CONFIG', '/home/exemple/config.xml');
// on lance maintenant l'application
include '/chemin/vers/archive.phar';
?>
(Unknown)
Phar::mungServer — Définit une liste de maximum 4 variables $_SERVER qui doivent être modifiées lors de l'exécution
$munglist
)Phar::mungServer() doit être appelée seulement dans le conteneur de chargement d'une archive phar.
Définit une liste de maximum 4 variables $_SERVER qui doiventt être modifiées lors de l'exécution. Les variables qui peuvent être modifiées pour effacer les traces de l'exécution phar sont REQUEST_URI, PHP_SELF, SCRIPT_NAME et SCRIPT_FILENAME.
Seule, cette méthode ne fait rien. Elle prend effet seulement quand elle est combinée à Phar::webPhar() et seulement si le fichier demandé est un fichier PHP à parser. Notez que les variables PATH_INFO et PATH_TRANSLATED sont toujours modifiées.
Les valeurs de départ des variables qui sont modifiées sont stockées dans le tableau SERVER avec le préfixe PHAR_ et donc par exemple SCRIPT_NAME sera stockée en tant que PHAR_SCRIPT_NAME.
munglist
un tableau contenant n'importe laquelle des variables REQUEST_URI, PHP_SELF, SCRIPT_NAME et SCRIPT_FILENAME en tant qu'indices de chaînes de caractères. Les autres valeurs déclenchent une exception et Phar::mungServer() est sensible à la casse.
Aucun retour.
Lève une exception UnexpectedValueException si un quelconque problème est trouvé dans les données passées.
Exemple #1 Un exemple avec Phar::mungServer()
<?php
// exemple de conteneur
Phar::mungServer(array('REQUEST_URI'));
Phar::webPhar();
__HALT_COMPILER();
?>
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::offsetExists — détermine si un fichier existe dans le phar
$offset
)C'est une implémentation de l'interface ArrayAccess qui permet la manipulation directe du contenu d'une archive Phar en utilisant les crochets d'accès au tableau.
offsetExists() est appelé comme isset() est appelé.
offset
Le nom de fichier (en chemin relatif) à chercher dans le Phar.
Retourne TRUE si le fichier existe dans le phar, FALSE sinon.
Exemple #1 Un exemple avec Phar::offsetExists()
<?php
$p = new Phar(dirname(__FILE__) . '/mon.phar', 0, 'mon.phar');
$p['premierfichier.txt'] = 'premier fichier';
$p['secondfichier.txt'] = 'second fichier';
// les lignes suivantes font appel à offsetExists() de façon indirecte
var_dump(isset($p['premierfichier.txt']));
var_dump(isset($p['pasla.txt']));
?>
L'exemple ci-dessus va afficher :
bool(true) bool(false)
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::offsetGet — Obtient un objet PharFileInfo à partir d'un fichier
$offset
)C'est une implémentation de l'interface ArrayAccess qui permet la manipulation directe du contenu d'une archive Phar en utilisant les crochets d'accès au tableau. Phar::offsetGet() est utilisé pour extraire des fichiers d'une archive Phar.
offset
Le nom de fichier (en chemin relatif) à chercher dans le Phar.
Un objet PharFileInfo est retourné et peut être utilisé pour intégrer le contenu d'un fichier ou pour récupérer des informations sur le fichier courant.
Cette méthode émet une exception BadMethodCallException si le fichier n'existe pas dans l'archive Phar.
Exemple #1 Exemple avec Phar::offsetGet()
Comme avec toutes les classes qui implémentent l'interface ArrayAccess, Phar::offsetGet() est automatiquement appelée quand les crochets d'accès à un tableau sont utilisés ([]).
<?php
$p = new Phar(dirname(__FILE__) . '/monphar.phar', 0, 'monphar.phar');
$p['existe.txt'] = "le fichier existe\n";
try {
// appelle automatiquement offsetGet()
echo $p['existe.txt'];
echo $p['nexistepas.txt'];
} catch (BadMethodCallException $e) {
echo $e;
}
?>
L'exemple ci-dessus va afficher :
le fichier existe Entry nexistepas.txt does not exist
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::offsetSet — met le contenu d'un fichier interne à l'archive à l'identique du contenu d'un fichier externe
$offset
, string $value
)Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
C'est une implémentation de l'interface ArrayAccess qui permet la manipulation directe du contenu d'une archive Phar en utilisant les crochets d'accès au tableau. offsetSet est utilisé pour modifier un fichier existant ou pour ajouter un nouveau fichier à l'archive Phar.
offset
Le nom de fichier (en chemin relatif) à chercher dans le Phar.
value
Contenu du fichier.
Aucune valeur de retour.
Si phar.readonly est à 1, une exception BadMethodCallException est levée, car modifier un Phar n'est permis que quand phar.readonly est à 0. Une exception PharException est levée s'il y a eu un problème lors de l'écriture des changements de l'archive Phar sur le disque.
Exemple #1 Un exemple avec Phar::offsetSet()
offsetSet ne doit pas être accédé directement, mais plutôt via l'opérateur d'accès au tableau, [].
<?php
$p = new Phar('/chemin/vers/mon.phar', 0, 'mon.phar');
try {
// appelle offsetSet
$p['fichier.txt'] = 'Salut';
} catch (Exception $e) {
echo 'Ne peut pas modifier fichier.txt:', $e;
}
?>
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::offsetUnset — Efface un fichier d'un phar
$offset
)Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
C'est une implémentation de l'interface ArrayAccess qui permet la manipulation directe du contenu d'une archive Phar en utilisant les crochets d'accès au tableau. offsetUnset est utilisé pour supprimer un fichier existant et est appelé par la fonction unset().
offset
Le nom de fichier (en chemin relatif) à chercher dans le Phar.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Si phar.readonly est à 1, une exception BadMethodCallException est levée, car modifier un Phar n'est permis que quand phar.readonly est à 0.Une exception PharException est levée s'il y a eu un problème lors de l'écriture des changements de l'archive Phar sur le disque.
Exemple #1 Un exemple avec Phar::offsetUnset()
<?php
$p = new Phar('/chemin/vers/mon.phar', 0, 'mon.phar');
try {
// efface fichier.txt de mon.phar en appelant offsetUnset
unset($p['fichier.txt']);
} catch (Exception $e) {
echo 'Ne peut pas effacer fichier.txt: ', $e;
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::running — Retourne le chemin complet sur le disque ou l'URL phar complète de l'archive phar couramment exécutée
$retphar = true
] )Retourne le chemin complet de l'archive phar exécutée. C'est bien entendu utilisé un peu comme la constante magique __FILE__ et a des effets uniquement au sein d'une archive phar en train d'être exécutée.
Dans le conteneur de chargement d'une archive, Phar::running() retourne
"". Utilisez simplement __FILE__
pour accéder au phar courant au sein d'un conteneur de chargement.
retphar
Si FALSE, le chemin complet sur le disque vers le phar est retourné.
Si TRUE, une URL phar complète est retournée.
Retourne le chemin de fichier si valide, sinon une chaîne vide.
Exemple #1 Un exemple avec Phar::running()
Pour l'exemple suivant, on suppose que le fichier phar est /chemin/vers/mon.phar.
<?php
$a = Phar::running(); // $a vaut "phar:///chemin/vers/mon.phar"
$b = Phar::running(false); // $b vaut "/chemin/vers/mon.phar"
?>
(PHP >= 5.3.0, PECL phar >= 1.2.1)
Phar::setAlias — Fixe l'alias de l'archive Phar
$alias
)Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Fixe l'alias de l'archive Phar et l'écrit en tant qu'alias permanent de cette archive phar. Un alias peut être utilisé à l'intérieur d'une archive phar pour s'assurer que l'utilisation du flux phar pour accéder à des fichiers internes fonctionnera toujours quelque soit l'emplacement de l'archive phar sur le système de fichiers. Une alternative consiste à se fier à l'interception de include faite par Phar ou d'utiliser Phar::interceptFileFuncs() et d'utiliser des chemins relatifs.
alias
Une petite chaîne avec laquelle on se référera à cette archive lors des accès avec le flux phar.
Une exception UnexpectedValueException est levée quand l'accès en écriture est désactivé et une exception PharException est levée si l'alias est déjà utilisé ou si un problème a été rencontré lors de l'écriture des changements sur le disque.
Exemple #1 Un exemple avec Phar::setAlias()
<?php
try {
$phar = new Phar('monphar.phar');
$phar->setAlias('monp.phar');
} catch (Exception $e) {
// traite les erreurs
}
?>
(Unknown)
Phar::setDefaultStub — Utilisé pour fixer le chargeur PHP ou le conteneur de chargement d'une archive Phar en tant que chargeur par défaut
$index
[, string $webindex
]] )Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Cette méthode est un raccourci qui combine les fonctionnalités de Phar::createDefaultStub() et de Phar::setStub().
index
Chemin relatif au sein de l'archive phar a exécuter si lancée à partir de la ligne de commande
webindex
Chemin relatif au sein de l'archive phar a exécuter si lancée à partir d'un navigateur
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Une exception UnexpectedValueException est levée si phar.readonly est activée dans le php.ini. Une exception PharException est levée si des problèmes sont rencontrés lors de l'écriture des changements sur disque.
Exemple #1 Un exemple avec Phar::setDefaultStub()
<?php
try {
$phar = new Phar('monphar.phar');
$phar->setDefaultStub('cli.php', 'web/index.php');
// est identique à :
// $phar->setStub($phar->createDefaultStub('cli.php', 'web/index.php'));
} catch (Exception $e) {
// traite les erreurs
}
?>
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::setMetadata — Fixe les métadonnées de l'archive phar
Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Phar::setMetadata() doit être utilisée pour stocker des données personnalisées qui décrivent l'archive phar, en tant qu'entité à part entière. PharFileInfo::setMetadata() doit être utilisée pour les métadonnées spécifiques aux fichiers. Les métadonnées peuvent diminuer les performance de chargement d'une archive phar si les données sont importantes.
Une utilisation possible des métadonnées est la spécification des fichiers à utiliser au sein de l'archive pour la lancer, ou l'emplacement d'un fichier de manifeste comme le fichier package.xml de » PEAR. De façon générale, toute donnée utile qui décrit l'archive phar peut être stockée.
metadata
Toute variable PHP contenant des informations à stocker et qui décrit l'archive phar
Aucune valeur n'est retournée.
Exemple #1 Un exemple avec Phar::setMetadata()
<?php
// on s'assure que le phar n'existe pas déjà
@unlink('nouveau.phar');
try {
$p = new Phar(dirname(__FILE__) . '/nouveau.phar', 0, 'nouveau.phar');
$p['fichier.php'] = '<?php echo "salut"';
$p->setMetadata(array('chargeur' => 'fichier.php'));
var_dump($p->getMetadata());
} catch (Exception $e) {
echo 'Ne peut pas créer/modifier le phar :', $e;
}
?>
L'exemple ci-dessus va afficher :
array(1) {
["chargeur"]=>
string(11) "fichier.php"
}
(PHP >= 5.3.0, PECL phar >= 1.1.0)
Phar::setSignatureAlgorithm — Fixe et applique l'algorithme de signature d'un phar
Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Fixe et applique l'algorithme de signature d'un phar. L'algorithme de signature doit être Phar::MD5, Phar::SHA1, Phar::SHA256, Phar::SHA512, ou Phar::OPENSSL.
Notez que toutes les archives phar exécutables ont une signature créée automatiquement, SHA1 par défaut. Les archives de données basées sur tar ou sur zip (créées avec la classe PharData) doivent avoir leur signature créée et assignée explicitement via Phar::setSignatureAlgorithm().
sigtype
Un des algorithmes Phar::MD5, Phar::SHA1, Phar::SHA256, Phar::SHA512, ou Phar::OPENSSL
privatekey
Le contenu d'une clé privée OpenSSL, telle qu'extraite d'un certificat ou d'un fichier de clé OpenSSL :
<?php
$private = openssl_get_privatekey(file_get_contents('private.pem'));
$pkey = '';
openssl_pkey_export($private, $pkey);
$p->setSignatureAlgorithm(Phar::OPENSSL, $pkey);
?>
Aucune valeur n'est retournée.
Lève une exception UnexpectedValueException pour de nombreuses erreurs et une exception PharException si des problèmes surviennent durant l'écriture des changements sur le disque.
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::setStub — Utilisé pour spécifier le chargeur PHP ou le conteneur de chargement d'une archive Phar
$stub
)Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Cette méthode est utilisée pour ajouter un chargeur PHP à une nouvelle archive Phar, ou pour remplacer le conteneur de chargement d'une archive Phar existante.
Le conteneur de chargement d'une archive Phar est utilisé quand une archive est incluse directement comme dans cet exemple :
<?php
include 'monphar.phar';
?>
Le chargeur n'est pas utilisé quand un fichier est inclus via le flux phar comme ceci :
<?php
include 'phar://monphar.phar/unfchier.php';
?>
stub
Une chaîne ou une ressource de flux ouvert à utiliser comme conteneur exécutable pour cette archive phar.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Une exception UnexpectedValueException est levée si phar.readonly est activé dans le php.ini. Une exception PharException est levée si des problèmes sont rencontrés lors de l'écriture des changement sur le disque.
Exemple #1 Un exemple avec Phar::setStub()
<?php
try {
$p = new Phar(dirname(__FILE__) . '/nouveau.phar', 0, 'nouveau.phar');
$p['a.php'] = '<?php var_dump("Salut");';
$p->setStub('<?php var_dump("Premier"); Phar::mapPhar("nouveau.phar"); __HALT_COMPILER(); ?>');
include 'phar://nouveau.phar/a.php';
var_dump($p->getStub());
$p['b.php'] = '<?php var_dump("Tout le monde");';
$p->setStub('<?php var_dump("Second"); Phar::mapPhar("nouveau.phar"); __HALT_COMPILER(); ?>');
include 'phar://nouveau.phar/b.php';
var_dump($p->getStub());
} catch (Exception $e) {
echo 'Erreur lors de l'écriture de nouveau.phar: ', $e;
}
?>
L'exemple ci-dessus va afficher :
string(5) "Salut"
string(79) "<?php var_dump("Premier"); Phar::mapPhar("nouveau.phar"); __HALT_COMPILER(); ?>"
string(13) "Tout le monde"
string(78) "<?php var_dump("Second"); Phar::mapPhar("nouveau.phar"); __HALT_COMPILER(); ?>"
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::startBuffering — Démarre la mise en tampon de écritures Phar, ne modifie pas l'objet Phar sur le disque
Bien que techniquement inutile, la méthode Phar::startBuffering() peut fournir un gain de performance lors de la création ou la modification d'une archive Phar avec un grand nombre de fichiers. D'ordinaire, chaque fois qu'un fichier au sein de l'archive Phar est créé ou modifié, l'archive Phar entière et recréée en incluant les changements. De cette manière, l'archive sera toujours à jour vis à vis des opération qui y sont appliquées.
Alors que ceci peut paraître inutile lors de la création d'un archive Phar simple, ça prend tout son sens lors de l'écriture en une fois de l'archive Phar entière. De même, il est souvent nécessaire de faire une série de changements et de s'assurer qu'ils sont tous possibles avant d'écrire sur le disque, un peu comme les transactions des base de données relationnelles. Les fonctions Phar::startBuffering()/Phar::stopBuffering() sont disponibles dans ce but.
La mise en tampon Phar s'effectue par archive, le tampon actif pour l'archive Phar foo.phar n'affecte pas les changements faits à l'archive Phar bar.phar.
Aucune valeur n'est retournée.
Exemple #1 Un exemple avec Phar::startBuffering()
<?php
// on s'assure que le phar n'existe pas déjà
@unlink('nouveau.phar');
try {
$p = new Phar(dirname(__FILE__) . '/nouveau.phar', 0, 'nouveau.phar');
} catch (Exception $e) {
echo 'Ne peut pas créer le phar:', $e;
}
echo 'Le nouveau phar a ' . $p->count() . " entrées\n";
$p->startBuffering();
$p['fichier.txt'] = 'salut';
$p['fichier2.txt'] = 'jolie';
$p['fichier2.txt']->setCompressedGZ();
$p['fichier3.txt'] = 'môme';
$p['fichier3.txt']->setMetadata(42);
$p->setStub("<?php
function __autoload($class)
{
include 'phar://monphar.phar/' . str_replace('_', '/', $class) . '.php';
}
Phar::mapPhar('monphar.phar');
include 'phar://monphar.phar/demarrage.php';
__HALT_COMPILER();");
$p->stopBuffering();
?>
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::stopBuffering — Arrête la mise en tampon des écritures Phar et provoque l'écriture que le disque
Phar::stopBuffering() est utilisée en conjonction avec la méthode Phar::startBuffering(). Phar::startBuffering() peut fournir un gain de performance lors de la création ou la modification d'une archive Phar avec un grand nombre de fichiers. D'ordinaire, chaque fois qu'un fichier au sein de l'archive Phar est créé ou modifié, l'archive Phar entière et recréée en incluant les changements. De cette manière, l'archive sera toujours à jour vis à vis des opération qui y sont appliquées.
Alors que ceci peut paraître inutile lors de la création d'un archive Phar simple, ça prend tout son sens lors de l'écriture en une fois de l'archive Phar entière. De même, il est souvent nécessaire de faire une série de changements et de s'assurer qu'ils sont tous possibles avant d'écrire sur le disque, un peu comme les transactions des base de données relationnelles. Les fonctions Phar::startBuffering()/Phar::stopBuffering() sont disponibles dans ce but.
La mise en tampon Phar s'effectue par archive, le tampon actif pour l'archive Phar foo.phar n'affecte pas les changements faits à l'archive Phar bar.phar.
Aucune valeur n'est retournée.
Une exception PharException est levée si des problèmes sont rencontrés lors de l'écriture des changements sur le disque.
Exemple #1 Un exemple Phar::stopBuffering()
<?php
$p = new Phar(dirname(__FILE__) . '/nouveau.phar', 0, 'nouveau.phar');
$p['fichier1.txt'] = 'salut';
$p->startBuffering();
var_dump($p->getStub());
$p->setStub("<?php
function __autoload(\$class)
{
include 'phar://nouveau.phar/' . str_replace('_', '/', \$class) . '.php';
}
Phar::mapPhar('nouveau.phar');
include 'phar://nouveau.phar/demarrage.php';
__HALT_COMPILER();");
$p->stopBuffering();
var_dump($p->getStub());
?>
L'exemple ci-dessus va afficher :
string(24) "<?php __HALT_COMPILER();"
string(195) "<?php
function __autoload($class)
{
include 'phar://' . str_replace('_', '/', $class);
}
Phar::mapPhar('nouveau.phar');
include 'phar://nouveau.phar/demarrage.php';
__HALT_COMPILER();"
(PECL phar < 2.0.0)
Phar::uncompressAllFiles — Décompresse tous les fichiers de l'archive Phar courante
Note:
Cette méthode a été supprimée de l'extension phar depuis la version 2.0.0. Vous pouvez utiliser Phar::compress(), Phar::decompress(), Phar::compressFiles() et Phar::decompressFiles() à la place.
Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Cette méthode décompresse tous les fichiers de l'archive Phar. Si un des fichiers est déjà compressé en utilisant la compression gzip, l'extension zlib doit être activée pour décompresser le fichier, et si un des fichiers est déjà compressé en utilisant la compression bzip2, l'extension bzip2 doit être activée pour décompresser le fichier. Comme avec toutes les fonctionnalités qui modifient le contenu d'un As with all functionality that modifies the contents of phar, la variable INI phar.readonly doit être à off pour que ça fonctionne.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Lève une exception BadMethodCallException si la variable INI phar.readonly est à on, si l'extension bzip2 n'est pas activée alors qu'au moins un fichier est compressé avec la compression bzip2 ou si au moins un des fichiers est compressé avec la compression gzip et que l'extension zlib n'est pas activée.
Exemple #1 Un exemple avec Phar::uncompressAllFiles()
<?php
try {
$p = new Phar('/chemin/vers/mon.phar', 0, 'mon.phar');
$p['monfichier.txt'] = 'salut';
$p['monfichier2.txt'] = 'salut';
$p->compressAllFilesGZ();
foreach ($p as $file) {
var_dump($file->getFileName());
var_dump($file->isCompressed());
var_dump($file->isCompressedBZIP2());
var_dump($file->isCompressedGZ());
}
$p->uncompressAllFiles();
foreach ($p as $file) {
var_dump($file->getFileName());
var_dump($file->isCompressed());
var_dump($file->isCompressedBZIP2());
var_dump($file->isCompressedGZ());
}
} catch (Exception $e) {
echo 'Les opération d'écriture sur mon.phar ont échoué : ', $e;
}
?>
L'exemple ci-dessus va afficher :
string(10) "monfichiere.txt" bool(true) bool(false) bool(true) string(11) "monfichier2.txt" bool(true) bool(false) bool(true) string(10) "monfichier.txt" bool(false) bool(false) bool(false) string(11) "monfichier2.txt" bool(false) bool(false) bool(false)
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::unlinkArchive — Efface complètement une archive phar du disque et de la mémoire
$archive
)Efface complètement une archive phar du disque et de la mémoire
archive
Le chemin sur le disque vers l'archive phar.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Une exception PharException est levée si des pointeurs sont ouverts vers des fichiers de l'archive phar, ou si des objets Phar, PharData, ou PharFileInfo réfèrent à l'archive phar.
Exemple #1 Un exemple avec Phar::unlinkArchive()
<?php
// utilisation simple
Phar::unlinkArchive('/chemin/vers/mon.phar');
// un exemple plus commun :
$p = new Phar('mon.phar');
$fp = fopen('phar://mon.phar/fichier.txt', 'r');
// cela crée 'mon.phar.gz'
$gp = $p->compress(Phar::GZ);
// enlève toutes les références à l'archive
unset($p);
fclose($fp);
// efface maintenant toute trace de l'archive
Phar::unlinkArchive('mon.phar');
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::webPhar — mapPhar pour les phars orientés web. Contrôleur pour les applications web
$alias
[, string $index = "index.php"
[, string $f404
[, array $mimetypes
[, array $rewrites
]]]]] )Phar::mapPhar() pour les phars orientés web. Cette méthode parse $_SERVER['REQUEST_URI'] et route les requêtes d'un navigateur vers un fichier interne à l'archive. Dans le principe, cela simule un serveur web, en routant des requêtes vers le bon fichier, en envoyant les bons en-têtes et analysant le fichier PHP comme il convient. Cette méthode puissante permet de convertir facilement des applications PHP en archive phar. Combinée avec Phar::mungServer() et Phar::interceptFileFuncs(), n'importe quelle application web peut être utilisée sans changement à partir de l'archive phar.
Phar::webPhar() doit être appelé uniquement à partir du conteneur de chargement d'une archive phar (lisez ceci pour en savoir davantage sur les conteneurs).
alias
L'alias qui peut être utilisé dans l'URL phar:// pour se référer à l'archive, plutôt que son chemin complet.
index
L'emplacement au sein de l'archive de l'index de répertoire.
f404
L'emplacement du script à exécuter quand un fichier n'est pas trouvé. Ce script doit envoyer des en-têtes HTTP 404 corrects.
mimetypes
Un tableau faisant correspondre des extensions de fichier supplémentaires à des types MIME. Si les correspondances par défaut suffisent, passez un tableau vide. Par défaut, ces correspondances sont les suivantes :
<?php
$mimes = array(
'phps' => Phar::PHPS, // passage vers highlight_file()
'c' => 'text/plain',
'cc' => 'text/plain',
'cpp' => 'text/plain',
'c++' => 'text/plain',
'dtd' => 'text/plain',
'h' => 'text/plain',
'log' => 'text/plain',
'rng' => 'text/plain',
'txt' => 'text/plain',
'xsd' => 'text/plain',
'php' => Phar::PHP, // parse en tant que PHP
'inc' => Phar::PHP, // parse en tant que PHP
'avi' => 'video/avi',
'bmp' => 'image/bmp',
'css' => 'text/css',
'gif' => 'image/gif',
'htm' => 'text/html',
'html' => 'text/html',
'htmls' => 'text/html',
'ico' => 'image/x-ico',
'jpe' => 'image/jpeg',
'jpg' => 'image/jpeg',
'jpeg' => 'image/jpeg',
'js' => 'application/x-javascript',
'midi' => 'audio/midi',
'mid' => 'audio/midi',
'mod' => 'audio/mod',
'mov' => 'movie/quicktime',
'mp3' => 'audio/mp3',
'mpg' => 'video/mpeg',
'mpeg' => 'video/mpeg',
'pdf' => 'application/pdf',
'png' => 'image/png',
'swf' => 'application/shockwave-flash',
'tif' => 'image/tiff',
'tiff' => 'image/tiff',
'wav' => 'audio/wav',
'xbm' => 'image/xbm',
'xml' => 'text/xml',
);
?>
rewrites
Un tableau faisant correspondre des URI à des fichiers internes, simulant le mod_rewrite de apache. Par exemple:
<?php
array(
'moninfo' => 'moninfo.php'
);
?>
Aucune valeur n'est retournée.
Lève une exception PharException quand le fichier interne ne peut pas être
ouvert ou si l'appel est fait en dehors d'un conteneur. Si un valeur de tableau non valide est passée dans
mimetypes ou dans rewrites, une exception
UnexpectedValueException est levée.
Exemple #1 Exemple avec Phar::webPhar()
Dans l'exemple ci-dessous, le phar créé affichera Salut tout le monde si quelqu'un appelle /monphar.phar/index.php ou /monphar.phar, et affichera la source de index.phps si /monphar.phar/index.phps est appelé.
<?php
// l'archive phar est créée :
try {
$phar = new Phar('monphar.phar');
$phar['index.php'] = '<?php echo "Salut tout le monde"; ?>';
$phar['index.phps'] = '<?php echo "Salut tout le monde"; ?>';
$phar->setStub('<?php
Phar::webPhar();
__HALT_COMPILER(); ?>');
} catch (Exception $e) {
// on traite les erreurs ici
}
?>
(No version information available, might only be in SVN)
La classe PharData fournit une interface de haut niveau pour accéder et créer des archives tar et zip non exécutables. Du fait que ces archives ne contiennent pas de conteneur et qu'elles ne puissent être exécutées par l'extension phar, il est possible de créer et de manipuler des fichiers zip et tar normaux en utilisant la classe PharData même si le paramètre phar.readonly du php.ini est à 1.
$format = 9021976
[, int $compression = 9021976
[, string $extension
]]] )$format = 9021976
[, int $compression = 9021976
[, string $extension
]]] )$alias
[, string $index = "index.php"
[, string $f404
[, array $mimetypes
[, array $rewrites
]]]]] )(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::addEmptyDir — Ajoute un répertoire vide à l'archive tar/zip
$dirname
)Avec cette méthode, un répertoire vide est créé avec le chemin dirname. Cette méthode est identique à ZipArchive::addEmptyDir().
dirname
Le nom du répertoire vide à créer dans l'archive phar
aucune valeur de retour, une exception est levée en cas d'échec.
Exemple #1 Un exemple avec PharData::addEmptyDir()
<?php
try {
$a = new PharData('/chemin/vers/mon.tar');
$a->addEmptyDir('/chemin/complet/vers/fichier');
// montre comment le fichier est stocké
$b = $a['chemin/complet/vers/fichier']->isDir();
} catch (Exception $e) {
// les erreurs sont traitées ici
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::addFile — Ajoute un fichier du système de fichiers à l'archive tar/zip
Avec cette méthode, n'importe quel fichier ou URL peut être ajouté à l'archive tar/zip. Si le second paramètre optionnel localname est spécifié, le fichier sera stocké dans l'archive avec ce nom, sans quoi le paramètre file est utilisé comme chemin vers lequel stocker le fichier au sein de l'archive. Les URL doivent avoir un nom local sans quoi une exception est levée. Cette méthode est identique à ZipArchive::addFile().
file
Chemin relatif ou absolu vers un fichier du disque à ajouter à l'archive phar.
localname
Chemin vers lequel le fichier sera stocké au sein de l'archive.
aucune valeur de retour, une exception est levée en cas d'échec.
Exemple #1 Un exemple avec PharData::addFile()
<?php
try {
$a = new PharData('/chemin/vers/mon.tar');
$a->addFile('/chemin/complet/vers/fichier');
// montre comment le fichier est stocké
$b = $a['chemin/complet/vers/fichier']->getContent();
$a->addFile('/chemin/complet/vers/fichier', 'mon/fichier.txt');
$c = $a['mon/fichier.txt']->getContent();
// montre l'utilisation des URLs
$a->addFile('http://www.exemple.com', 'exemple.html');
} catch (Exception $e) {
// les erreurs sont traitées ici
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::addFromString — Ajoute un fichier du système de fichiers à l'archive tar/zip
$localname
, string $contents
)Ajoute une chaîne de caractères à l'archive tar/zip. Le fichier sera stocké dans l'archive avec le chemin localname. Cette méthode est identique à ZipArchive::addFromString().
localname
Chemin vers lequel le fichier sera stocké au sein de l'archive.
contents
Le contenu du fichier à stocker
Aucune valeur de retour, une exception est levée en cas d'échec.
Exemple #1 Exemple avec PharData::addFromString()
<?php
try {
$a = new PharData('/chemin/vers/mon.tar');
$a->addFromString('chemin/vers/fichier.txt', 'mon fichier simple');
$b = $a['chemin/vers/fichier.txt']->getContent();
// pour ajouter du contenu à partir d'un gestionnaire de flux pour des gros fichier, utilisez offsetSet()
$c = fopen('/chemin/vers/grosfichier.bin');
$a['grosfichier.bin'] = $c;
fclose($c);
} catch (Exception $e) {
// les erreurs sont traitées ici
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::buildFromDirectory — Construit une archive tar/zip à partir des fichiers d'un répertoire
Remplit une archive tar/zip à partir du contenu d'un répertoire. Le second paramètre optionnel est une expression rationnelle (pcre) utilisée pour exclure des fichiers. N'importe quel fichier dont le nom satisfait sera inclus, tous les autres seront exclus. Pour un contrôle plus fin, utilisez PharData::buildFromIterator().
base_dir
Le chemin relatif ou absolu vers le répertoire contenant tous les fichiers à ajouter à l'archive.
regex
Une expression rationnelle optionnelle qui est utilisée pour filtrer la liste des fichiers. Seuls les fichiers dont le nom satisfont l'expression seront inclus dans l'archive.
Phar::buildFromDirectory() retourne un tableau associatif faisant correspondre un chemin de fichier interne vers un chemin complet sur le système de fichiers.
Cette méthode soulève une exception BadMethodCallException quand elle est incapable d'instancier les itérateurs interne de répertoire, ou une exception PharException si des erreurs ont été rencontrée lors de l'enregistrement de l'archive phar.
Exemple #1 Un exemple avec PharData::buildFromDirectory()
<?php
$phar = new PharData('projet.tar');
// ajoute tous les fichiers au projet
$phar->buildFromDirectory(dirname(__FILE__) . '/projet');
$phar2 = new PharData('projet2.zip');
// ajoute tous les fichiers au projet en n'incluant que les fichiers php
$phar->buildFromDirectory(dirname(__FILE__) . '/projet', '/\.php$/');
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::buildFromIterator — Construit une archive tar ou zip à partir d'un itérateur
Remplit une archive tar ou zip à partir d'un itérateur. Deux styles d'itérateurs sont supportés, les itérateurs qui font correspondre le chemin de fichier au sein de l'archive avec le chemin sur le disque, et les itérateurs comme DirectoryIterator qui retournent des objets SplFileInfo. Pour les itérateurs qui retournent des objets SplFileInfo, le second paramètre est requis.
Exemple #1 Exemple avec PharData::buildFromIterator() et SplFileInfo
Pour la plupart des archive tar/zip, l'archive reflétera la structure de répertoire actuelle, et le second style est le plus utile. Par exemple, pour créer une archive tar/zip contenant les fichiers contenant la structure de répertoire ci-dessous :
/chemin/vers/projet/
config/
dist.xml
debug.xml
lib/
fichier1.php
fichier2.php
src/
processthing.php
www/
index.php
cli/
index.php
Ce code peut être utilisé pour ajouter des fichiers à l'archive "projet.tar" tar :
<?php
$phar = new PharData('projet.tar');
$phar->buildFromIterator(
new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('/chemin/vers/projet')),
'/chemin/vers/projet');
?>
Le fichier projet.tar peut alors être effacé immédiatement. PharData::buildFromIterator() ne règle pas les paramètres tels que la compression, les métadonnées, ce qui peut être fait après avoir créé l'archive tar/zip.
A noter que Phar::buildFromIterator() peut aussi être utilisé pour copier le contenu d'une archive phar, tar ou zip existante, car l'objet PharData est dérivé de DirectoryIterator :
<?php
$phar = new PharData('projet.tar');
$phar->buildFromIterator(
new RecursiveIteratorIterator(
new Phar('/chemin/vers/unautrephar.phar')),
'phar:///chemin/vers/unautrephar.phar/chemin/vers/projet');
$phar->setStub($phar->createDefaultStub('cli/index.php', 'www/index.php'));
?>
Exemple #2 Exemple avec PharData::buildFromIterator() et d'autres itérateurs
La seconde forme d'itérateur peut être utilisée avec n'importe quel itérateur qui retourne une association clé => valeur, tel que ArrayIterator :
<?php
$phar = new PharData('projet.tar');
$phar->buildFromIterator(
new ArrayIterator(
array(
'interne/fichier.php' => dirname(__FILE__) . '/unfichier.php',
'unautre/fichier.jpg' => fopen('/chemin/vers/grosfichier.jpg', 'rb'),
)));
?>
iter
N'importe quel itérateur qui fait correspondre de façon associative un fichier tar/zip ou qui retourne des objets SplFileInfo
base_directory
Pour les itérateurs qui retournent des objets SplFileInfo, la partie du chemin complet vers le fichier à enlever lors de l'ajout à l'archive tar/zip
PharData::buildFromIterator() retourne un tableau associatif faisant correspondre un chemin de fichier interne avec un chemin complet vers le fichier sur le système de fichiers.
Cette méthode retourne une exception UnexpectedValueException quand
l'itérateur retourne des valeurs incorrectes, comme une clé entière plutôt qu'une chaîne,
une exception BadMethodCallException quand un itérateur basé sur
SplFileInfo-based est passé sans paramètre base_directory, ou une
exception PharException si des erreurs ont été rencontrées lors de
la sauvegarde de l'archive phar.
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::compress — Compresse l'archive tar/zip complète en utilisant la compression Gzip ou Bzip2
$compression
[, string $extension
] )Pour les archives tar, cette méthode compresse l'archive entière en utilisant la compressions gzip ou bzip2. Le fichier qui en résulte peut être manipulé avec la commande gunzip/bunzip, ou être accédé directement et de façon transparente avec l'extension Phar.
Pour les archives zip, cette méthode échoue en levant une exception. L'extension zlib doit être activée pour compresser avec gzip, l'extension bzip2 doit être activée pour compresser avec bzip2.
De plus, cette méthode renomme automatiquement l'archive, en la suffixant par .gz, .bz2 ou en enlevant l'extension si Phar::NONE est spécifié pour enlever la compression. Sinon, une extension de fichier peut être spécifiée avec le second paramètre.
compression
La compression doit être Phar::GZ ou Phar::BZ2 pour appliquer une compression, ou Phar::NONE pour l'enlever.
extension
Par défaut, l'extension est .tar.gz ou .tar.bz2 pour compresser un tar, et .tar pour décompresser.
Un objet PharData est retourné.
Soulève une exception BadMethodCallException si l'extension zlib n'est pas disponible, ou si l'extension bzip2 n'est pas activée.
Exemple #1 Un exemple avec PharData::compress()
<?php
$p = new PharData('/chemin/vers/mon.tar');
$p['monfichier.txt'] = 'salut';
$p['monfichier2.txt'] = 'salut';
$p1 = $p->compress(Phar::GZ); // copie vers /chemin/vers/mon.phar.gz
$p2 = $p->compress(Phar::BZ2); // copie vers /chemin/vers/mon.phar.bz2
$p3 = $p2->compress(Phar::NONE); // exception: /chemin/vers/mon.phar existe déjà
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::compressFiles — Compresse tous les fichiers de l'archive tar/zip courante
$compression
)Pour les archives basées sur tar, cette méthode soulève une exception BadMethodCallException car la compression individuelle des fichiers d'une archive tar n'est pas supportée par ce format de fichiers. Utilisez PharData::compress() pour compresser une archive basée sur tar complète.
Pour les archives basées sur Zip, cette méthode compresse tous les fichiers de l'archive en utilisant la compression spécifiée. Les extensions zlib ou bzip2 doivent être activées pour tirer parti de cette fonctionnalité. De plus, si au moins un fichier est déjà compressé en utilisant la compression bzip2/zlib, l'extension adéquate être activée pour décompresser les fichiers avant de les re-compresser.
compression
La compression doit être Phar::GZ ou Phar::BZ2 pour appliquer une compression, ou Phar::NONE pour l'enlever.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Soulève une exception BadMethodCallException si la variable INI phar.readonly est à on, si l'extension zlib n'est pas disponible ou si au moins un fichier est compressé via bzip2 et que l'extension bzip2 n'est pas activée.
Exemple #1 Un exemple avec PharData::compressFiles()
<?php
$p = new Phar('/chemin/vers/mon.phar', 0, 'mon.phar');
$p['monfichier.txt'] = 'salut';
$p['monfichier2.txt'] = 'salut';
foreach ($p as $file) {
var_dump($file->getFileName());
var_dump($file->isCompressed());
var_dump($file->isCompressed(Phar::BZ2));
var_dump($file->isCompressed(Phar::GZ));
}
$p->compressFiles(Phar::GZ);
foreach ($p as $file) {
var_dump($file->getFileName());
var_dump($file->isCompressed());
var_dump($file->isCompressed(Phar::BZ2));
var_dump($file->isCompressed(Phar::GZ));
}
?>
L'exemple ci-dessus va afficher :
string(14) "monfichier.txt" bool(false) bool(false) bool(false) string(15) "monfichier2.txt" bool(false) bool(false) bool(false) string(14) "monfichier.txt" int(4096) bool(false) bool(true) string(15) "monfichier2.txt" int(4096) bool(false) bool(true)
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::__construct — Construit un objet d'archive tar ou zip non-exécutable
$fname
[, int $flags
[, string $alias
[, int $format = Phar::TAR
]]] )
fname
Chemin vers une archive tar/zip existante ou à créer
flags
Drapeaux à passer à la classe parente Phar RecursiveDirectoryIterator.
alias
L'alias de l'archive Phar à utiliser lors des appels aux fonctionnalités de flux.
format
Une des constantes de format de fichier disponible dans la classe Phar.
Soulève une exception BadMethodCallException si appelée deux fois, une exception UnexpectedValueException si l'archive phar ne peut pas être ouverte.
Exemple #1 Un exemple avec PharData::__construct()
<?php
try {
$p = new PharData('/chemin/vers/mon.tar', CURRENT_AS_FILEINFO | KEY_AS_FILENAME);
} catch (UnexpectedValueException $e) {
die('Ne peut pas ouvrir mon.tar');
} catch (BadMethodCallException $e) {
echo 'techniquement, ça ne peut pas arriver';
}
echo file_get_contents('phar:///chemin/vers/mon.tar/exemple.txt');
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::convertToData — Convertit une archive phar en une archive tar ou zip non-exécutable
Cette méthode est utilisée pour convertir une archive non exécutable tar ou zip en un autre format non-exécutable.
Si aucun changement n'est demandé, cette méthode, cette méthode soulève une exception BadMethodCallException. Cette méthode doit être utilisée pour convertir une archive tar au format zip et vice-versa. Bien qu'il soit possible de changer la compression d'une archive tar avec cette méthode, il est préférable d'utiliser la méthode PharData::compress() pour rester cohérent au niveau de la logique.
En cas de succès, cette méthode crée une nouvelle archive sur le disque et retourne un objet PharData. L'ancienne archive n'est pas effacée du disque, ceci devant être fait manuellement une fois le traitement terminé.
format
Le format doit être Phar::TAR ou
Phar::ZIP. S'il vaut NULL, le format de fichier actuel sera conservé.
compression
La compression doit être Phar::NONE pour éviter la compression de l'archive complète, Phar::GZ pour la compression basée sur zlib, et Phar::BZ2 pour la compression basée sur bzip.
extension
Ce paramètre est utilisé pour écrase l'extension de fichier par défaut de l'archive convertie. Notez que .phar ne peut pas être utilisé n'importe où dans le nom de fichier d'une archive tar ou zip non-exécutable.
En cas de conversion vers une archive phar basée sur tar, les extensions par défaut sont .tar, .tar.gz et .tar.bz2 selon la compression spécifiée. Pour les archives basées sur zip, l'extension par défaut est .zip.
Cette méthode retourne un objet PharData en cas de succès et soulève une exception en cas d'échec.
Cette méthode soulève une exception BadMethodCallException quand elle est incapable de compresser, quand une méthode de compression inconnue a été spécifiée, quand l'archive demandée est mise en tampon avec Phar::startBuffering() et qu'elle n'a pas été conclue avec Phar::stopBuffering(), et soulève une exception PharException si un quelconque problème est rencontré lors de la création du phar.
Exemple #1 Un exemple avec PharData::convertToData()
Utilisons PharData::convertToData():
<?php
try {
$tarphar = new PharData('monphar.tar');
// notez que monphar.tar n'est *pas* effacé
// le convertir au format tar non-exécutable
// crée monphar.zip
$zip = $tarphar->convertToData(Phar::ZIP);
// crée monphar.tbz
$tgz = $zip->convertToData(Phar::TAR, Phar::BZ2, '.tbz');
// crée monphar.phar.tgz
$phar = $tarphar->convertToData(Phar::PHAR); // soulève une exceptions
} catch (Exception $e) {
// les erreurs sont traitées ici
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::convertToExecutable — Convertit une archive tar/zip non-exécutable en une archive phar exécutable
Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Cette méthode est utilisée pour convertit une archive tar ou zip non-exécutable en une archive phar exécutable. N'importe lequel des trois formats de fichier (phar, tar ou zip) peut être utilisé et la compression de l'archive complète est aussi possible.
Si aucun changement n'est demandé, cette méthode soulève une exception BadMethodCallException.
En cas de succès, cette méthode crée une nouvelle archive sur le disque et retourne un objet Phar. L'ancienne archive n'est pas effacée du disque, ceci devant être fait manuellement une fois le traitement terminé.
format
Le format doit être Phar::PHAR, Phar::TAR
ou Phar::ZIP. S'il vaut NULL, le format de fichier actuel sera conservé.
compression
La compression doit être Phar::NONE pour éviter la compression de l'archive complète, Phar::GZ pour la compression basée sur zlib, et Phar::BZ2 pour la compression basée sur bzip.
extension
Ce paramètre est utilisé pour écrase l'extension de fichier par défaut de l'archive convertie. Notez que toute les archives basées sur tar et sur zip doivent contenir .phar dans leur extension de fichier pour pouvoir être traitées comme des archives phar.
En cas de conversion vers une archive basée sur phar, les extensions par défaut sont .phar, .phar.gz ou .phar.bz2 selon la compression spécifiée. Pour les archives phar basées sur tar, les extensions par défaut sont .phar.tar, .phar.tar.gz et .phar.tar.bz2. Pour les archives phar basées sur zip, l'extension par défaut est .phar.zip.
Cette méthode retourne un objet Phar en cas de succès et soulève une exception en cas d'échec.
Cette méthode soulève une exception BadMethodCallException quand elle est incapable de compresser, quand une méthode de compression inconnue a été spécifiée, quand l'archive demandée est mise en tampon avec Phar::startBuffering() et qu'elle n'a pas été conclue avec Phar::stopBuffering(), soulève une exception UnexpectedValueException si le support en écriture est désactivé, et soulève une exception PharException si des problèmes ont été rencontrés lors de la création du phar.
Exemple #1 Un exemple avec PharData::convertToExecutable()
Utilisons PharData::convertToExecutable() :
<?php
try {
$tarphar = new PharData('monphar.tar');
// le convertit au format de fichier phar
// notez que monphar.tar n'est *pas* effacé
$phar = $tarphar->convertToExecutable(Phar::PHAR); // crée monphar.phar
$phar->setStub($phar->createDefaultStub('cli.php', 'web/index.php'));
// crée monphar.phar.tgz
$compressed = $tarphar->convertToExecutable(Phar::TAR, Phar::GZ, '.phar.tgz');
} catch (Exception $e) {
// les erreurs sont traitées ici
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::copy — Copie un fichier un fichier interne à l'archive phar vers un autre fichier au sein de la même archive
$oldfile
, string $newfile
)Copie un fichier interne à l'archive tar/zip vers un autre fichier au sein de la même archive. C'est une alternative orientée objet à l'utilisation de copy() avec le gestionnaire de flux phar.
oldfile
newfile
retourne TRUE en cas de succès, mais il est plus sûr d'encadrer l'appel à la méthode dans un bloc
try/catch est de considérer son succès si aucune exception n'est levée.
lève une exception UnexpectedValueException si le fichier source n'existe pas, si le fichier de destination existe déjà, si le support en écriture est désactivé, si l'ouverture d'un des deux fichiers échoue ou si la lecture du fichier source échoue; ou lève une exception PharException si l'écriture des changements de l'archive phar échoue.
Exemple #1 Un exemple avec PharData::copy()
Cet exemple montre l'utilisation de PharData::copy() et de son équivalent en terme de gestionnaire de flux. La différence principale entre les deux façons de faire concerne la gestion des erreurs. Toutes les méthodes PharData soulèvent des exceptions, alors que le gestionnaire de flux utilise trigger_error().
<?php
try {
$phar = new PharData('monphar.tar');
$phar['a'] = 'salut';
$phar->copy('a', 'b');
echo $phar['b']; // affiche "phar://myphar.tar/b"
} catch (Exception $e) {
// on traite les erreurs
}
// l'équivalent en terme de flux de l'exemple ci-dessus.
// des E_WARNINGS sont lancés en cas d'erreur à la place d'exceptions.
copy('phar://monphar.tar/a', 'phar//monphar.tar/c');
echo file_get_contents('phar://monphar.tar/c'); // affiche "salut"
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::decompress — Décompresse l'archive Phar entière
$extension
] )Décompresse l'archive entière, si c'est une archive tar.
Pour les archives Zip, cette méthode échoue et lève une exception. L'extension zlib doit être activée pour décompresser une archive compressée avec gzip et l'extension bzip2 doit être disponible pour décompresser une archive compressée avec bzip2.
De plus, cette méthode renomme automatiquement l'extension de fichier de l'archive, .tar par défaut. Sinon, une extension de fichier peut être spécifiée avec le second paramètre.
extension
Pour décompresser, l'extension par défaut est .phar.tar. Utilisez ce paramètre pour spécifier une autre extension de fichier. Gardez à l'esprit que les archives non-exécutables ne peuvent pas contenir .phar dans leur nom de fichier.
Un objet PharData est retourné.
Soulève une exception BadMethodCallException si l'extension zlib n'est pas disponible ou si l'extension bzip2 n'est pas activée.
Exemple #1 Exemple avec PharData::decompress()
<?php
$p = new PharData('/chemin/vers/mon.tar', 0, 'mon.tar.gz');
$p['monfichier.txt'] = 'salut';
$p['monfichier2.txt'] = 'salut';
$p3 = $p2->decompress(); // crée /chemin/vers/mon.tar
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::decompressFiles — Décompresse tous les fichiers de l'archive zip courante
Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Pour les archives basées sur tar, cette méthode soulève une exception BadMethodCallException, car la compression individuelle des fichiers au sein d'une archive tar n'est pas supportée par le format de fichier. Utilisez PharData::compress() pour compresser une archive basée sur tar complète.
Pour les archives basées sur Zip, cette méthode décompresse tous les fichiers de l'archive. Les extensions zlib ou bzip2 doivent être activées pour tirer parti de cette fonctionnalité si au moins un des fichiers est compressé avec bzip2/zlib.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Soulève une exception BadMethodCallException si l'extension zlib n'est pas disponible ou si au moins un des fichiers est compressé avec bzip2 et que l'extension bzip2 n'est pas activée.
Exemple #1 Un exemple avec PharData::decompressFiles()
<?php
$p = new PharData('/chemin/vers/mon.zip');
$p['monfichier.txt'] = 'salut';
$p['monfichier2.txt'] = 'salut';
$p->compressFiles(Phar::GZ);
foreach ($p as $file) {
var_dump($file->getFileName());
var_dump($file->isCompressed());
var_dump($file->isCompressed(Phar::BZ2));
var_dump($file->isCompressed(Phar::GZ));
}
$p->decompressFiles();
foreach ($p as $file) {
var_dump($file->getFileName());
var_dump($file->isCompressed());
var_dump($file->isCompressed(Phar::BZ2));
var_dump($file->isCompressed(Phar::GZ));
}
?>
L'exemple ci-dessus va afficher :
string(14) "monfichier.txt" int(4096) bool(false) bool(true) string(15) "monfichier2.txt" int(4096) bool(false) bool(true) string(14) "monfichier.txt" bool(false) bool(false) bool(false) string(15) "monfichier2.txt" bool(false) bool(false) bool(false)
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::delMetadata — Efface les méta-données globales d'une archive zip
Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Efface les méta-données globales de l'archive zip
retourne TRUE en cas de succès, mais il est préférable de vérifier les exception soulevées
et de considérer le succès si aucune ne l'est.
Soulève une exception PharException si des erreurs sont rencontrés lors de l'écriture des changements sur le disque.
Exemple #1 Un exemple avec PharData::delMetaData()
<?php
try {
$phar = new PharData('monphar.zip');
var_dump($phar->getMetadata());
$phar->setMetadata("salut");
var_dump($phar->getMetadata());
$phar->delMetadata();
var_dump($phar->getMetadata());
} catch (Exception $e) {
// on traite les erreurs
}
?>
L'exemple ci-dessus va afficher :
NULL string(5) "salut" NULL
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::delete — Efface un fichier au sein de l'archive tar/zip
$entry
)Efface un fichier au sein de l'archive. C'est l'équivalent fonctionnel de l'appel à unlink() à l'aide du gestionnaire de flux phar, comme montré dans l'exemple ci-dessous.
entry
Chemin du fichier à effacer au sein de l'archive.
retourne TRUE en cas de succès, mais il est préférable de vérifier les exception soulevées
et de considérer le succès si aucune ne l'est.
Soulève une exception PharException si des erreurs sont rencontrés lors de l'écriture des changements sur le disque.
Exemple #1 Un exemple avec PharData::delete()
<?php
try {
$phar = new PharData('monphar.zip');
$phar->delete('efface/moi.php');
// c'est l'équivalent de :
unlink('phar://monphar.phar/efface/mon.php');
} catch (Exception $e) {
// on traite les erreurs
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::extractTo — Extrait le contenu d'une archive tar/zip vers un répertoire
$pathto
[, string|array $files
[, bool $overwrite = false
]] )
Extrait tous les fichiers d'une archive tar/zip vers le disque. Les fichiers et les répertoires extraits
conservent les permissions telles qu'au sein de l'archive. Les paramètres optionnels permettent un
éventuel contrôle sur quels fichiers seront extraits et si les fichiers déjà présents sur le disque
peuvent être écrasés. Le second paramètre files peut être le nom d'un fichier ou d'un répertoire
à extraire, ou tableau de nom de fichiers et de répertoires à extraire. Par défaut, cette méthode n'écrasera
aucun fichier déjà existant, à moins que le troisième paramètre soit à TRUE. Cette méthode est identique à
ZipArchive::extractTo().
pathto
Chemin au sein de l'archive des fichiers à effacer.
files
Le nom d'un fichier ou d'un répertoire à extraire, ou un tableau de fichiers/répertoires à extraire
overwrite
Le passer à TRUE pour activer l'écrasement des fichiers déjà existants
retourne TRUE en cas de succès, mais il est préférable de vérifier les exception soulevées
et de considérer le succès si aucune ne l'est.
Soulève une exception PharException si des erreurs sont rencontrés lors de l'écriture des changements sur le disque.
Exemple #1 Un exemple avec PharData::extractTo()
<?php
try {
$phar = new PharData('monphar.tar');
$phar->extractTo('/chemin/complet'); // extrait tous les fichiers
$phar->extractTo('/un/autre/chemin', 'fichier.txt'); // extrait seulement fichier.txt
$phar->extractTo('/ce/chemin',
array('fichier1.txt', 'fichier2.txt')); // extrait seulement 2 fichiers
$phar->extractTo('/troisieme/chemin', null, true); // extrait tous les fichiers, en écrasant
} catch (Exception $e) {
// on traite les erreurs
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::isWritable — Vérifie si l'archive tar/zip peut être modifiée
Cette méthode retourne TRUE si l'archive tar/zip sur le disque n'est pas en lecture seule.
Contrairement à Phar::isWritable(), les archives tar/zip de données
peuvent être modifiées même si phar.readonly est à 1.
Aucun paramètre.
Retourne TRUE si l'archive tar/zip peut être modifiée
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::offsetSet — remplit un fichier au sein de l'archive tar/zip avec le contenu d'un fichier externe ou d'une chaîne de caractères
$offset
, string $value
)C'est une implémentation de l'interface ArrayAccess permettant la manipulation directe du contenu d'une archive tar/zip en utilisant les crochets, opérateurs d'accès au tableau. offsetSet est utilisé pour modifier un fichier existant ou pour ajouter un nouveau fichier à l'archive tar/zip.
offset
Le chemin (relatif) du fichier à modifier au sein de l'archive tar ou zip.
value
Contenu du fichier.
Aucune valeur de retour.
Soulève une exception PharException si des problèmes ont été rencontrés lors de l'écriture sur le disque des changements de l'archive tar/zip.
Exemple #1 Un exemple avec PharData::offsetSet()
offsetSet ne doit pas être accédé directement, mais plutôt utilisé via l'opérateur [].
<?php
$p = new PharData('/chemin/vers/mon.tar');
try {
// appelle offsetSet
$p['fichier.txt'] = 'Salut';
} catch (Exception $e) {
echo 'Ne peut pas modifier fichier.txt:', $e;
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::offsetUnset — efface un fichier d'une archive tar/zip
$offset
)C'est une implémentation de l'interface ArrayAccess permettant la manipulation directe du contenu d'une archive tar/zip en utilisant les crochets, opérateurs d'accès au tableau. offsetUnset est utilisé pour effacer un fichier existant et est appelé par la construction de langage unset().
offset
Le chemin (relatif) du fichier à modifier au sein de l'archive tar ou zip.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Soulève une exception PharException si des problèmes ont été rencontrés lors de l'écriture sur le disque des changements de l'archive tar/zip.
Exemple #1 Un exemple avec PharData::offsetUnset()
<?php
$p = new PharData('/chemin/vers/mon.zip');
try {
// efface fichier.txt de mon.zip en appelant offsetUnset
unset($p['fichier.txt']);
} catch (Exception $e) {
echo 'Ne peut pas effacer fichier.txt: ', $e;
}
?>
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::setAlias — fonction inutile (Phar::setAlias n'est pas valide pour PharData)
$alias
)Les archives tar/zip non exécutables ne peuvent pas avoir d'alias, donc cette méthode ne fait que soulever une exception.
alias
Une courte chaîne de caractères à laquelle se référer pour faire appel à l'archive via le gestionnaire de flux phar. Ce paramètre est ignoré.
Soulève une exception PharException lors de l'appel à la méthode
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::setDefaultStub — fonction inutile (Phar::setDefaultStub n'est pas valide pour PharData)
$index
[, string $webindex
]] )Les archives tar/zip non-exécutables ne peuvent pas avoir de conteneur de chargement, donc cette méthode ne fait que soulever une exception.
index
Chemin relatif au sein de l'archive phar à exécuter en cas d'accès à partir de la ligne de commande
webindex
Chemin relatif au sein de l'archive phar à exécuter en cas d'accès à partir d'un navigateur
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Soulève une exception PharException lors de l'appel à la méthode
(PHP >= 5.3.0, PECL phar >= 1.0.0)
Phar::setMetadata — Fixe les méta-données de l'archive
Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Phar::setMetadata() doit être utilisé pour stocker des méta-données personnalisées qui décrivent quelque chose à propos de l'archive phar en tant qu'entité complète. PharFileInfo::setMetadata() doit être utilisé pour les méta-données spécifiques aux fichiers. Les méta-données peuvent dégrader les performances de chargement d'une archive phar si les données sont trop lourdes.
Les méta-données peuvent être utilisées pour spécifier quel fichier au sein de l'archive doit être utilisé pour charger l'archive ou l'emplacement d'un fichier de manifeste comme le fichier package.xml de » PEAR. De manière générale, n'importe quelle donnée utile décrivant l'archive phar peut être stockée.
metadata
N'importe quelle variable PHP contenant de l'information à stocker pour décrire l'archive phar
Aucune valeur n'est retournée.
Exemple #1 Un exemple avec Phar::setMetadata()
<?php
// on s'assure que le phar n'existe pas
@unlink('nouveauphar.phar');
try {
$p = new Phar(dirname(__FILE__) . '/nouveauphar.phar', 0, 'nouveauphar.phar');
$p['fichier.php'] = '<?php echo "salut"';
$p->setMetadata(array('chargement' => 'fichier.php'));
var_dump($p->getMetadata());
} catch (Exception $e) {
echo 'Ne peut pas créer/modifier le phar:', $e;
}
?>
L'exemple ci-dessus va afficher :
array(1) {
["chargement"]=>
string(11) "fichier.php"
}
(PHP >= 5.3.0, PECL phar >= 1.1.0)
Phar::setSignatureAlgorithm — Assigne l'algorithme de signature d'un phar et l'applique
$sigtype
)Note:
Cette méthode nécessite que la variable de configuration INI phar.readonly soit définie à 0 pour fonctionner avec les objets Phar. Sinon, une exception PharException sera lançée.
Assigne l'algorithme de signature d'un phar et l'applique. L'algorithme de signature doit être Phar::MD5, Phar::SHA1, Phar::SHA256, Phar::SHA512, ou Phar::PGP (PGP n'est pas encore supporté et implique Phar::SHA1).
sigtype
Un algorithme parmi Phar::MD5, Phar::SHA1, Phar::SHA256, Phar::SHA512, or Phar::PGP
Aucune valeur n'est retournée.
Soulève une exception UnexpectedValueException pour beaucoup d'erreurs, une exception BadMethodCallException si l'appel est fait pour une archive phar basée sur tar ou sur zip, une exception PharException si des problèmes sont rencontrés lors de l'écriture des changements sur le disque.
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharData::setStub — fonction inutile (Phar::setStub n'est pas valide pour PharData)
$stub
)Les archives tar/zip non-exécutables ne peuvent pas avoir de conteneur de chargement, donc cette méthode ne fait que soulever une exception.
stub
Une chaîne de caractères ou un gestionnaire de flux ouvert à utiliser en tant que conteneur de chargement exécutable pour l'archive phar. Ce paramètre est ignoré.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Soulève une exception PharException lors de tout appel à la méthode
(No version information available, might only be in SVN)
La classe PharFileInfo fournit une interface de haut niveau pour accéder au contenu et aux attributs d'un fichier contenu dans une archive phar.
(PHP >= 5.3.0, PECL phar >= 1.0.0)
PharFileInfo::chmod — Fixe les bits de permission spécifiques aux fichiers
$permissions
)PharFileInfo::chmod() permet de fixer les bits d'exécution des fichiers, ainsi que ceux de lecture seule. Ceux d'écriture sont ignorés car fixés au démarrage par la variable INI phar.readonly. Comme avec toutes les fonctionnalités qui modifient le contenu d'un phar, la variable INI phar.readonly doit être à off pour réussir si le fichier est au sein d'une archive Phar. Les fichiers au sein d'une archive PharData n'ont pas cette restriction.
Aucune valeur n'est retournée.
Exemple #1 Un exemple avec PharFileInfo::chmod()
<?php
// on s'assure que le phar n'existe pas
@unlink('nouveauphar.phar');
try {
$p = new Phar('nouveauphar.phar', 0, 'nouveauphar.phar');
$p['fichier.sh'] = '#!/usr/local/lib/php
<?php echo "salut"; ?>';
// met le bit d'exécution
$p['fichier.sh']->chmod(0555);
var_dump($p['fichier.sh']->isExecutable());
} catch (Exception $e) {
echo 'Ne peut pas créer/modifier le phar: ', $e;
}
?>
L'exemple ci-dessus va afficher :
bool(true)
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharFileInfo::compress — Compresse l'entrée Phar courante avec une des compressions zlib ou bzip2
$compression
)Cette méthode compresse le fichier au sein de l'archive Phar en utilisant l'une des compressions bzip2 ou zlib. Les extensions bzip2 ou zlib doivent être activées pour tirer parti de cette fonctionnalité. De plus, si le fichier est déjà compressé, l'extension adéquate doit être activée pour le décompresser. Comme avec toutes les fonctionnalités qui modifient le contenu d'un phar, la variable INI phar.readonly doit être à off pour réussir si le fichier est au sein d'une archive Phar. Les fichiers au sein d'archives PharData n'ont pas cette restriction.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Soulève une exception BadMethodCallException si la variable INI phar.readonly est à on, ou si l'extension bzip2/zlib n'est pas disponible.
Exemple #1 Un exemple avec PharFileInfo::compress()
<?php
try {
$p = new Phar('/chemin/vers/mon.phar', 0, 'mon.phar');
$p['monfichier.txt'] = 'salut';
$file = $p['monfichier.txt'];
var_dump($file->isCompressed(Phar::BZ2));
$p['monfichier.txt']->compress(Phar::BZ2);
var_dump($file->isCompressed(Phar::BZ2));
} catch (Exception $e) {
echo 'Ne peut pas créer/modifier mon.phar : ', $e;
}
?>
L'exemple ci-dessus va afficher :
bool(false) bool(true)
(PHP >= 5.3.0, PECL phar >= 1.0.0)
PharFileInfo::__construct — Construit un objet d'entrée Phar
$entry
)Cette méthode ne doit pas être appelé directement. A la place, un objet PharFileInfo est initialisé en appelant Phar::offsetGet() via un accès de type tableau.
entry
L'URL complète pour récupérer un fichier. Si vous voulez récupérer les informations du fichier mon/fichier.php du phar boo.phar, vous devrez préciser phar://boo.phar/mon/fichier.php.
Soulève une exception BadMethodCallException si __construct() est appelé deux fois. Soulève une exception UnexpectedValueException si l'URL du phar demandé est mal formée, si le phar ne peut pas être ouvert ou si le fichier ne peut pas être trouvé au sein du phar.
Exemple #1 Exemple avec PharFileInfo::__construct()
<?php
try {
$p = new Phar('/chemin/vers/mon.phar', 0, 'mon.phar');
$p['fichierdetest.txt'] = "salut\nmon\npote";
$file = $p['fichierdetest.txt'];
foreach ($file as $line => $text) {
echo "ligne numéro $line: $text";
}
// ceci marche aussi
$file = new PharFileInfo('phar:///chemin/vers/mon.phar/fichierdetest.txt');
foreach ($file as $line => $text) {
echo "ligne numéro $line: $text";
}
} catch (Exception $e) {
echo 'L'opération Phar a échoué : ', $e;
}
?>
L'exemple ci-dessus va afficher :
ligne numéro 1: salut ligne numéro 2: mon ligne numéro 3: pote ligne numéro 1: salut ligne numéro 2: mon ligne numéro 3: pote
(PHP >= 5.3.0, PECL phar >= 2.0.0)
PharFileInfo::decompress — Décompresse l'entrée Phar courante au sein du phar
Cette méthode décompresse le fichier au sein de l'archive Phar. Selon la façon dont le fichier est compressé, les extensions bzip2 ou zlib doivent être activées pour tirer parti de cette fonctionnalité. Comme avec toutes les fonctionnalités qui modifient le contenu d'un phar, la variable INI phar.readonly doit être à off pour réussir si le fichier est dans une archive Phar. Les fichiers au sein d'archives PharData n'ont pas cette restriction.
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Soulève une exception BadMethodCallException si la variable INI phar.readonly est à on, ou si l'extension bzip2/zlib n'est pas disponible.
Exemple #1 Exemple avec PharFileInfo::decompress()
<?php
try {
$p = new Phar('/chemin/vers/mon.phar', 0, 'mon.phar');
$p['monfichier.txt'] = 'salut';
$file = $p['monfichier.txt'];
$file->compress(Phar::GZ);
var_dump($file->isCompressed());
$p['monfichier.txt']->decompress();
var_dump($file->isCompressed());
} catch (Exception $e) {
echo 'Ne peut pas créer/modifier mon.phar: ', $e;
}
?>
L'exemple ci-dessus va afficher :
int(4096) bool(false)
(PHP >= 5.3.0, PECL phar >= 1.2.0)
PharFileInfo::delMetadata — Efface les métadonnées de l'entrée
Efface les métadonnées de l'entrée, s'il y en a.
Pas de paramètres.
Retourne TRUE en cas de succès, FALSE si l'entrée ne possédait pas de métadonnées.
Comme avec toutes les fonctionnalités qui modifient le contenu d'un phar, la variable INI
phar.readonly doit être à off pour réussir si le fichier est
au sein d'une archive Phar. Les fichiers au sein d'archives
PharData n'ont pas cette restriction.
Soulève une exception PharException si des erreurs ont été rencontrées lors de l'écriture des changements sur le disque, et une exception BadMethodCallException si l'accès en écriture est désactivé.
Exemple #1 Un exemple avec PharFileInfo::delMetaData()
<?php
try {
$a = new Phar('monphar.phar');
$a['salut'] = 'salut';
var_dump($a['salut']->delMetadata());
$a['salut']->setMetadata('mon pote');
var_dump($a['salut']->delMetadata());
var_dump($a['salut']->delMetadata());
} catch (Exception $e) {
// on traite les erreurs
}
?>
L'exemple ci-dessus va afficher :
bool(false) bool(true) bool(false)
(PHP >= 5.3.0, PECL phar >= 1.0.0)
PharFileInfo::getCRC32 — Retourne le code CRC32 ou soulève une exception si le CRC n'a pas été vérifié
Retourne la somme de contrôle crc32() du fichier au sein de l'archive Phar.
La somme de contrôle crc32() du fichier au sein de l'archive Phar.
Soulève une exception BadMethodCallException si le CRC32 du fichier n'a pas encore été vérifié. Ceci n'arrive normalement pas, car le CRC est vérifié à l'ouverture du fichier en lecture ou en écriture.
Exemple #1 Exemple avec PharFileInfo::getCRC32()
<?php
try {