Comment imprimer un journal de débogage?


129

J'aimerais déboguer du code PHP, mais je suppose que l'impression d'un journal à l'écran ou à un fichier me convient.

Comment imprimer un journal en code PHP?

L'habituel print/ printfsemble aller à la sortie HTML et non à la console.

J'ai un serveur Apache exécutant le code PHP.


Votre script s'exécute-t-il dans un navigateur Web ou dans une console (c'est-à-dire analysé à l'aide de php.exe plutôt qu'apache / iis)?
danielrsmith

Vous devriez regarder cette question, a un peu de code de journalisation utile: stackoverflow.com/questions/5769537/...
Ben

de quelle langue venez-vous? Juste pour que vous php soit très différent des autres langages compilés
Ibu

1
@lbu: en effet .. Je ne pensais pas, printfquestion obtiendrait ce nombre upvotes ...
eugene

error_log ($ chaîne);
Thewebus

Réponses:


186

Une astuce moins connue est que mod_php mappe stderr au journal Apache. Et, il y a un flux pour cela, donc file_put_contents('php://stderr', print_r($foo, TRUE))va bien vider la valeur de $foodans le journal des erreurs Apache.


1
+ oned pour avoir mentionné cela, btw, vous pouvez également définir la valeur de error_log sur 'php: // stdout' lors du débogage d'une application console et faire apparaître les messages d'erreur directement sur la console, c'est-à-dire: error_log ("Vous avez foiré!", 3 , "php: // stdout");
stefgosselin

4
+1 Il m'a fallu trop de temps pour trouver cette réponse. C'est tout ce que je cherchais vraiment. Je ne savais pas comment voir ce que contenait mon tableau (fonctionnant sous Drupal).
SteveS

Je suggérerais également d'utiliser var_export($foo, true)au lieu de print_r($foo, true)if print_rne vous donne pas les informations de type dont vous avez besoin.
Ben

Ne serait-ce pas la même chose que error_log (print_r ($ foo)); ?
Brunis

143
error_log(print_r($variable, TRUE)); 

pourrait être utile


2
Malheureusement, c'est la solution la plus pratique. Xdebug est trop lourd pour l'exécuter tout le temps. A voté pour vous
Phung

26

Vous pouvez utiliser error_log pour envoyer à vos serveurs le fichier journal des erreurs (ou un autre fichier facultatif si vous le souhaitez)


21

Si vous êtes sous Linux:

file_put_contents('your_log_file', 'your_content');

ou

error_log ('your_content', 3, 'your_log_file');

puis en console

tail -f your_log_file

Cela montrera en continu la dernière ligne mise dans le fichier.


9

Vous devez changer votre état d'esprit. Vous écrivez PHP, pas tout ce que vous avez l'habitude d'écrire. Le débogage en PHP ne se fait pas dans un environnement console.

En PHP, vous disposez de 3 catégories de solutions de débogage:

  1. Sortie sur une page Web (voir la bibliothèque dBug pour une meilleure vue des choses).
  2. Écrire dans un fichier journal
  3. Débogage en session avec xDebug

Apprenez à les utiliser au lieu d'essayer de faire en sorte que PHP se comporte comme n'importe quel autre langage auquel vous êtes habitué.


31
En tant que personne qui passe beaucoup de temps à écrire des applications de console et divers scripts non Web , je serai poliment en désaccord avec cela.
stefgosselin

Je travaille beaucoup à la maintenance et au développement d'applications de console et dans ma mauvaise interprétation en anglais de la question, j'avais supposé qu'il cherchait à déboguer une application de console. Xdebug est bien et très pratique bien que j'aime les informations de débogage directement dans mon éditeur
stefgosselin

1
@Stefgosselin: Netbeans fait à peu près la même chose, même si le meilleur que j'ai vu avec xDebug était avec Aptana.
Sylverdrag

1
J'utilise xDebug sur Netbeans et cela fonctionne bien la plupart du temps. Mais, il y a des moments où vous devez enregistrer des éléments dans un fichier.
cosan

essayez-les aussi ... vous pourrez en faire plus! stackoverflow.com/a/44050914/2053479
ganesh

5

Êtes-vous en train de déboguer sur la console? Il existe différentes options pour déboguer PHP. La fonction la plus couramment utilisée pour le débogage rapide et sale est var_dump .

Cela étant dit et à l'écart, bien que var_dump soit génial et que beaucoup de gens font tout avec juste cela, il existe d'autres outils et techniques qui peuvent pimenter un peu les choses.

Pour vous aider en cas de débogage dans une page Web, enveloppez des <pre> </pre>balises autour de votre instruction de vidage pour vous donner une mise en forme appropriée sur les tableaux et les objets.

C'est à dire:

<div> some html code ....
      <a href="<?php $tpl->link;?>">some link to test</a>
</div>

      dump $tpl like this:

    <pre><?php var_dump($tpl); ?></pre>

Enfin, assurez-vous que le débogage de votre gestion des erreurs est configuré pour afficher les erreurs. L'ajout de ceci en haut de votre script peut être nécessaire si vous ne pouvez pas accéder à la configuration du serveur pour ce faire.

error_reporting(E_ALL);
ini_set('display_errors', '1');

Bonne chance!


2

Si vous ne souhaitez pas intégrer un framework comme Zend , vous pouvez utiliser la méthode trigger_error pour vous connecter au journal des erreurs php.


2

Simplement, c'est trigger_error:

 trigger_error("My error");

mais vous ne pouvez pas mettre de tableaux ou d'objets donc utilisez

var_dump

trigger_error est probablement le meilleur moyen d'écrire dans vos journaux d'erreurs. Vous vous remercierez lorsque vous voudrez modifier les lignes de journal avec des données personnalisées plus tard.
Anshul

2

Vous pouvez également écrire dans un fichier comme celui-ci:

$logFilePath = '../logs/debug.text';
ob_start();

// if you want to concatenate:
if (file_exists($logFilePath)) {
    include($logFilePath);
}
// for timestamp
$currentTime = date(DATE_RSS);

// echo log statement(s) here
echo "\n\n$currentTime - [log statement here]";

$logFile = fopen($logFilePath, 'w');
fwrite($logFile, ob_get_contents());
fclose($logFile);
ob_end_flush();

Assurez-vous que les autorisations appropriées sont définies pour que php puisse accéder et écrire dans le fichier ( 775).


1

Vous pouvez utiliser le module php curl pour passer des appels vers http://liveoutput.com/ . Cela fonctionne très bien dans un environnement d'entreprise sécurisé où certaines restrictions dans le php.ini existent qui restreignent l'utilisation de file_put_contents.


1

C'est un excellent outil pour le débogage et la journalisation php: PHp Debugger & Logger

Cela fonctionne dès la sortie de la boîte avec seulement 3 lignes de code. Il peut envoyer des messages à la console js pour le débogage ajax et peut remplacer le gestionnaire d'erreurs. Il vide également des informations sur des variables comme var_dump () et print_r (), mais dans un format plus lisible. Très bel outil!


1

J'en ai utilisé beaucoup, mais comme j'ai généralement besoin de déboguer lors du développement, et depuis que je développe sur localhost, j'ai suivi les conseils des autres et j'écris maintenant dans la console de débogage JavaScript du navigateur (voir http: //www.codeforest. net / debugging-php-dans-navigateurs-javascript-console ).

Cela signifie que je peux regarder la page Web que mon PHP génère dans mon navigateur et appuyer sur F12 pour afficher / masquer rapidement toute trace de débogage.

Comme je suis constamment à la recherche des outils de développement pour le débogueur, la mise en page CSS, etc., il est logique de regarder ma connexion PHP là-bas.

Si quelqu'un décide de nous ce code, j'ai fait un changement mineur. Après

function debug($name, $var = null, $type = LOG) {

J'ai ajouté

$name = 'PHP: ' . $name;

C'est parce que mon serveur PHP génère du code HTML contenant du JavaScript et je trouve utile de faire la distinction entre la sortie de PHP et JS.

(Remarque: je mets actuellement à jour ceci pour me permettre d'activer et de désactiver différents types de sortie: depuis PHP, depuis JS et l'accès à la base de données)


1

J'utilise cakephp donc j'utilise:

$this->log(YOUR_STRING_GOES_HERE, 'debug');

0

Vous pouvez utiliser:

<?php
echo '<script>console.log("debug log")</script>';
?>

2
cela a beaucoup de frais généraux. pourquoi invoquer javascript pour une simple sortie d'erreur?
clockw0rk

-8

Vous pouvez utiliser

<?php
{
    AddLog("anypage.php","reason",ERR_ERROR);
}
?>

ou si vous souhaitez imprimer cette déclaration dans un journal, vous pouvez utiliser

AddLog("anypage.php","string: ".$string,ERR_DEBUG_LOW);

8
AddLog? Ce n'est pas une fonction native.
stefgosselin
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.