Deux fois par mois, nous revoyons certains des articles préférés de nos lecteurs au cours de l'histoire de Nettuts.+.
Même après avoir utilisé PHP pendant des années, nous sommes tombés sur des fonctions et des fonctionnalités que nous ne connaissions pas. Certains d'entre eux peuvent être très utiles, mais sous-utilisés. Dans cet esprit, j'ai compilé une liste de neuf fonctions et fonctionnalités PHP extrêmement utiles que vous devriez connaître..
Vous savez peut-être déjà que PHP vous permet de définir des fonctions avec des arguments facultatifs. Mais il y a aussi une méthode pour permettre un nombre complètement arbitraire d'arguments de fonction.
Tout d'abord, voici un exemple avec seulement des arguments optionnels:
// fonction avec 2 arguments optionnels function foo ($ arg1 = ", $ arg2 =") echo "arg1: $ arg1 \ n"; echo "arg2: $ arg2 \ n"; foo ('bonjour', 'monde'); / * affiche: arg1: hello arg2: monde * / foo (); / * affiche: arg1: arg2: * /
Voyons maintenant comment construire une fonction qui accepte un nombre quelconque d’arguments. Cette fois, nous allons utiliser func_get_args ():
// oui, la liste d'arguments peut être vide function foo () // retourne un tableau de tous les arguments passés $ args = func_get_args (); foreach ($ args sous la forme $ k => $ v) echo "arg". ($ k + 1). ": $ v \ n"; foo (); / * n'imprime rien * / foo ('bonjour'); / * affiche arg1: hello * / foo ('hello', 'world', 'again'); / * affiche arg1: hello arg2: monde arg3: encore une fois * /
De nombreuses fonctions PHP ont des noms longs et descriptifs. Cependant, il peut être difficile de savoir ce qu'une fonction nommée glob () fait à moins de connaître ce terme d'ailleurs.
Pensez-y comme à une version plus performante de la fonction scandir (). Il peut vous permettre de rechercher des fichiers en utilisant des modèles.
// récupère tous les fichiers php $ files = glob ('*. php'); print_r ($ fichiers); / * La sortie ressemble à: Array ([0] => phptest.php [1] => pi.php [2] => post_output.php [3] => test.php) * /
Vous pouvez récupérer plusieurs types de fichiers comme ceci:
// récupère tous les fichiers php ET les fichiers txt $ files = glob ('*. php, txt', GLOB_BRACE); print_r ($ fichiers); / * La sortie ressemble à: Array ([0] => phptest.php [1] => pi.php [2] => post_output.php [3] => test.php [4] => log.txt [5 ] => test.txt) * /
Notez que les fichiers peuvent en fait être retournés avec un chemin, en fonction de votre requête:
$ files = glob ('? /images/a*.jpg'); print_r ($ fichiers); / * La sortie ressemble à: Array ([0] =>? /images/apple.jpg [1] =>? /images/art.jpg) * /
Si vous voulez obtenir le chemin complet de chaque fichier, vous pouvez simplement appeler la fonction realpath () sur les valeurs renvoyées:
$ files = glob ('? /images/a*.jpg'); // applique la fonction à chaque élément du tableau $ files = array_map ('realpath', $ files); print_r ($ fichiers); / * La sortie ressemble à: Array ([0] => C: \ wamp \ www \ images \ apple.jpg [1] => C: \ wamp \ www \ images \ art.jpg) * /
En observant l'utilisation de la mémoire de vos scripts, vous pourrez optimiser votre code.
PHP a un ramasse-miettes et un gestionnaire de mémoire assez complexe. La quantité de mémoire utilisée par votre script. peut monter et descendre pendant l'exécution d'un script. Pour obtenir l'utilisation actuelle de la mémoire, nous pouvons utiliser la fonction memory_get_usage (), et pour obtenir la quantité de mémoire la plus utilisée à tout moment, nous pouvons utiliser la fonction memory_get_peak_usage ().
echo "Initial:" .memory_get_usage (). "octets \ n"; / * Imprime Initial: 361400 octets * / // utilisons de la mémoire pour ($ i = 0; $ i < 100000; $i++) $array []= md5($i); // let's remove half of the array for ($i = 0; $i < 100000; $i++) unset($array[$i]); echo "Final: ".memory_get_usage()." bytes \n"; /* prints Final: 885912 bytes */ echo "Peak: ".memory_get_peak_usage()." bytes \n"; /* prints Peak: 13687072 bytes */
Pour cela, nous allons utiliser la fonction getrusage (). Gardez à l'esprit que ceci n'est pas disponible sur les plates-formes Windows.
print_r (getrusage ()); / * prints Array ([ru_oublock] => 0 [ru_inblock] => 0 [ru_msgsnd] => 2 [ru_msgrcv] => 3 [ru_maxrss] => 12692 [ru_ixrss] => 764 [ru_idrss] => 3864 [ru_minflt] => 94 [ru_majflt] => 0 [ru_nsignals] => 1 [ru_nvcsw] => 67 [ru_nivcsw] => 4 [ru_nswap] => 0 [ru_utime.tv_usec] => 0 [ru_utime.tv_sec] => 0 [ ru_stime.tv_usec] => 6269 [ru_stime.tv_sec] => 0) * /
Cela peut sembler un peu cryptique, sauf si vous avez déjà un fond d’administration système. Voici l'explication de chaque valeur (vous n'avez pas besoin de les mémoriser):
Pour savoir combien de temps le script a consommé en puissance de traitement, nous devons examiner les valeurs "heure de l'utilisateur" et "heure du système". Les parties secondes et microsecondes sont fournies séparément par défaut. Vous pouvez diviser la valeur en microsecondes par 1 million et l'ajouter à la valeur en secondes pour obtenir le nombre total de secondes sous forme de nombre décimal..
Voyons un exemple:
// sommeil pendant 3 secondes (non occupé) sleep (3); $ data = getrusage (); echo "Temps utilisateur:". ($ data ['ru_utime.tv_sec'] + $ data ['ru_utime.tv_usec'] / 1000000); echo "Heure système:". ($ data ['ru_stime.tv_sec'] + $ data ['ru_stime.tv_usec'] / 1000000); / * affiche l'heure de l'utilisateur: 0.011552 l'heure du système: 0 * /
Bien que l'exécution du script prenne environ 3 secondes, l'utilisation du processeur est très très basse. En effet, lors de la mise en veille, le script ne consomme pas de ressources du processeur. De nombreuses autres tâches peuvent prendre du temps réel, mais ne peuvent pas utiliser le temps processeur, comme attendre des opérations sur le disque. Comme vous le voyez, l’utilisation de la CPU et la durée réelle du runtime ne sont pas toujours les mêmes..
Voici un autre exemple:
// boucle 10 millions de fois (occupé) pour ($ i = 0; $ i<10000000;$i++) $data = getrusage(); echo "User time: ". ($data['ru_utime.tv_sec'] + $data['ru_utime.tv_usec'] / 1000000); echo "System time: ". ($data['ru_stime.tv_sec'] + $data['ru_stime.tv_usec'] / 1000000); /* prints User time: 1.424592 System time: 0.004204 */
Cela a pris environ 1,4 seconde de temps processeur, presque entièrement du temps utilisateur, puisqu'il n'y avait aucun appel système..
Heure système correspond à la durée pendant laquelle la CPU effectue des appels système pour le noyau pour le compte du programme. Voici un exemple de cela:
$ start = microtime (true); // continue d'appeler microtime pendant environ 3 secondes avec (microtime (true) - $ start < 3) $data = getrusage(); echo "User time: ". ($data['ru_utime.tv_sec'] + $data['ru_utime.tv_usec'] / 1000000); echo "System time: ". ($data['ru_stime.tv_sec'] + $data['ru_stime.tv_usec'] / 1000000); /* prints User time: 1.088171 System time: 1.675315 */
Nous avons maintenant un peu d’utilisation du temps système. Cela est dû au fait que le script appelle plusieurs fois la fonction microtime (), qui effectue une requête via le système d'exploitation pour extraire l'heure..
Aussi, vous remarquerez peut-être que les chiffres ne totalisent pas tout à fait 3 secondes. Ceci est dû au fait qu'il y avait probablement d'autres processus sur le serveur également et que le script n'utilisait pas 100% de la CPU pendant toute la durée des 3 secondes..
PHP fournit des constantes magiques utiles pour récupérer le numéro de ligne actuel (__LIGNE__
), chemin du fichier (__FICHIER__
), chemin du répertoire (__DIR__
), nom de la fonction (__UNE FONCTION__
), nom du cours (__CLASSE__
), nom de la méthode (__METHOD__) et espace de noms (__NAMESPACE__
).
Nous n'allons pas couvrir chacun d'eux dans cet article, mais je vais vous montrer quelques cas d'utilisation..
Lorsque vous incluez d’autres scripts, c’est une bonne idée d’utiliser le
__FICHIER__
constante (ou aussi__DIR__
, à partir de PHP 5.3):
// ceci est relatif au chemin du script chargé // cela peut poser des problèmes lors de l'exécution de scripts depuis différents répertoires require_once ('config / database.php'); // ceci est toujours relatif au chemin de ce fichier // peu importe où il a été inclus à partir de require_once (dirname (__ FILE__). '/config/database.php');
En utilisant __LIGNE__
facilite le débogage. Vous pouvez localiser les numéros de ligne:
// du code //? my_debug ("un message de débogage", __LINE__); / * affiche la ligne 4: un message de débogage * / // encore du code //? my_debug ("un autre message de débogage", __LINE__); / * affiche la ligne 11: un autre message de débogage * / function my_debug ($ msg, $ line) echo "Ligne $ line: $ msg \ n";
Il peut y avoir des situations où vous devez générer une chaîne unique. J'ai vu beaucoup de gens utiliser le md5 ()
fonctionne pour cela, même si ce n’est pas exactement ce que je veux dire:
// génère une chaîne unique echo md5 (time (). mt_rand (1,1000000));
Il existe en fait une fonction PHP nommée uniqid () qui doit être utilisée pour cela.
// génère une chaîne unique echo uniqid (); / * affiche 4bd67c947233e * / // génère une autre chaîne unique echo uniqid (); / * imprime 4bd67c9472340 * /
Vous remarquerez peut-être que même si les chaînes sont uniques, elles semblent similaires pour les premiers personnages. En effet, la chaîne générée est liée à l'heure du serveur. Cela a en fait un effet secondaire intéressant, car chaque nouvel identifiant généré vient plus tard dans l'ordre alphabétique, de sorte qu'il peut être trié.
Pour réduire les chances d'obtenir un doublon, vous pouvez passer un préfixe ou le deuxième paramètre pour augmenter l'entropie:
// avec le préfixe echo uniqid ('foo_'); / * affiche foo_4bd67d6cd8b8f * / // avec plus d'entropie. echo uniqid (", true); / * affiche 4bd67d6cd8b926.12135106 * / // echo uniqid ('bar _', true); / * affiche bar_4bd67d367b650.436846 / *
Cette fonction générera des chaînes plus courtes que md5 ()
, ce qui vous fera également économiser de l'espace.
Avez-vous déjà eu besoin de stocker une variable complexe dans une base de données ou un fichier texte? Vous n'avez pas besoin de trouver une solution sophistiquée pour convertir vos tableaux ou objets en chaînes formatées, car PHP dispose déjà de fonctions à cet effet..
Il existe deux méthodes populaires de sérialisation des variables. Voici un exemple qui utilise les termes serialize () et unserialize ():
// un tableau complexe $ myvar = array ('hello', 42, array (1, 'deux'), 'apple'); // conversion en chaîne $ string = serialize ($ myvar); echo $ string; / * affiche a: 4: i: 0; s: 5: "bonjour"; i: 1; i: 42; i: 2; a: 2: i: 0; i: 1; i: 1; s : 3: "deux"; i: 3; s: 5: "apple"; * / // vous pouvez reproduire la variable originale $ newvar = unserialize ($ string); print_r ($ newvar); / * affiche Array ([0] => hello [1] => 42 [2] => Array ([0] => 1 [1] => deux) [3] => pomme) * /
C'était la méthode de sérialisation PHP native. Cependant, depuis que JSON est devenu si populaire ces dernières années, ils ont décidé de l’ajouter à PHP 5.2. Maintenant, vous pouvez utiliser le json_encode ()
et json_decode ()
fonctionne aussi bien:
// un tableau complexe $ myvar = array ('hello', 42, array (1, 'deux'), 'apple'); // conversion en chaîne $ string = json_encode ($ myvar); echo $ string; / * affiche ["bonjour", 42, [1, "deux"], "pomme"] * / // vous pouvez reproduire la variable originale $ newvar = json_decode ($ string); print_r ($ newvar); / * affiche Array ([0] => hello [1] => 42 [2] => Array ([0] => 1 [1] => deux) [3] => pomme) * /
Il est plus compact et, surtout, compatible avec javascript et de nombreux autres langages. Cependant, pour les objets complexes, certaines informations peuvent être perdues.
Quand on parle de compression, on pense généralement aux fichiers, tels que les archives ZIP. Il est possible de compresser de longues chaînes en PHP, sans impliquer aucun fichier d'archive.
Dans l'exemple suivant, nous allons utiliser les fonctions gzcompress () et gzuncompress ():
$ string = "Lorem ipsum dolor sit amet, consectetur elit of adipiscing. Identifiez-vous sans pareil. Nula facilisi. Praesent pulvinar, sapien vel feugiat vestibulum, nulla dui pretium ouci, non-ultricies elit lacus quis analte Consectur elip adipiscing elit. Aliquam pretium ullamcorper urna quis iaculis. Etym a massa turpis tempor luctus. Curabitur el el mollis congue. Praesent ipsum diam, consectetur vitae ornare a nunc. Non, il n'y a pas de mots-clés dans le dictionnaire, mais le mot de passe est différent, et le mot de passe est juste, mais le mot de passe est différent. . "; $ compressé = gzcompress ($ chaîne); echo "Taille originale:". strlen ($ string). "\ n"; / * impression Format original: 800 * / echo "Format compressé:". strlen ($ compressé). "\ n"; / * affiche la taille compressée: 418 * / // le récupère $ original = gzuncompress ($ compressé);
Nous avons réussi à atteindre une réduction de taille de presque 50%. De plus, les fonctions gzencode () et gzdecode () obtiennent des résultats similaires, en utilisant un algorithme de compression différent..
Il existe une fonction appelée register_shutdown_function (), qui vous permettra d’exécuter du code juste avant la fin du script.
Imaginez que vous souhaitiez capturer des statistiques de référence à la fin de l'exécution de votre script, telles que le temps nécessaire à son exécution:
// capture l'heure de début $ start_time = microtime (true); // fait des trucs //? // affiche combien de temps le script a pris echo "exécution a pris:". (microtime (true) - $ start_time). "secondes."
Au début, cela peut sembler trivial. Vous ajoutez simplement le code au bas du script et il s'exécute avant la fin. Toutefois, si vous appelez la fonction exit (), ce code ne sera jamais exécuté. De plus, s'il y a une erreur fatale ou si le script est terminé par l'utilisateur (en appuyant sur le bouton Stop du navigateur), il est possible qu'il ne s'exécute pas à nouveau..
Lorsque vous utilisez register_shutdown_function (), votre code sera exécuté quelle que soit la raison pour laquelle le script s'est arrêté:
$ start_time = microtime (true); register_shutdown_function ('mon_shutdown'); // fait des trucs //? function my_shutdown () global $ start_time; echo "exécution a pris:". (microtime (true) - $ start_time). "secondes."
Êtes-vous au courant d'autres fonctionnalités de PHP qui ne sont pas largement connues mais qui peuvent être très utiles? S'il vous plaît partager avec nous dans les commentaires. Et merci d'avoir lu!