2012-12-11 5 views
4

J'essaye d'obtenir l'utilisation de php: // stderr pour écrire des logs pour fonctionner. J'utilise le framework Slim qui utilise @fopen('php://stderr', 'w') pour la journalisation et je veux vraiment que cela fonctionne.Écrire dans php: // stderr

Les cas de tests suivants devraient fonctionner, mais seul le premier fait:

// 1. error_log - works fine 
error_log("Written through the error_log function", 0); 

// 2. PHP wrapper, ie php://stderr - does not work 
$stderr = fopen('php://stderr', 'w'); 
fwrite($stderr, "Written through the PHP error stream"); 
fclose($stderr); 


// 3. PHP wrapper also, different syntax, just to be safe - no effect either 
file_put_contents("php://stderr","Hello World"); 


// 4. PHP wrapper, this time using this elusive constant referred to in the manual - result: "Notice: Use of undefined constant STDERR - assumed 'STDERR' ", ie: failed also! 
file_put_contents(STDERR, "Hello World"); 

que je cherchais le manuel PHP et googler beaucoup, mais sans beaucoup d'aide.

En particulier, la citation suivante du manuel PHP on wrappers est source de confusion:

Il est recommandé d'utiliser simplement les constantes STDIN, STDOUT et STDERR au lieu de flux d'ouverture manuellement à l'aide de ces [référence php:// stdin, php: // stdout et php: // stderr] wrappers «

... étant donné l'avis constant non défini ci-dessus (je soupçonne que ces constantes peuvent être pour une utilisation avec PHP CLI -seulement -..? mais la page que je cite ne l'indique pas.)

Je me demandais si cela pourrait être une chose Windows que je cours XAMPP avec PHP 5.3.8 pour le développement, mais étant donné le manque de sujets sur Google et les commentaires sur PHP.net, je ne suis plus si sûr . Je n'ai pas accès aux journaux de mon serveur de production pour que je puisse les tester.

+0

Oh Dieu merci, je pensais que j'étais le seul qui avait la constante étrangement «STDERR» parfois indéfini. Où avez-vous testé votre exemple de code? Que se passe-t-il lorsque vous l'exécutez entièrement par lui-même, via Apache? Il devrait apparaître dans le journal des erreurs * Apache *, non? Cela n'apparaît-il pas seulement lorsque vous êtes à l'invite de commande et/ou que vous passez par ce cadre? – Charles

+3

Ils sont CLI uniquement: http://php.net/manual/fr/features.commandline.io-streams.php –

+0

Lorsque je lance le script, le cas 1 apparaît OK, le cas 4. apparaît dans le journal en raison de la constante manquante seulement (ceci est logique maintenant étant donné que ceux-ci sont uniquement CLI). Cependant, les cas 2 et 3 sont introuvables. –

Répondre

7

Peu importe, je l'ai. Je ne comprends pas bien la différence entre php://stderr et error_log:

error_log écrit à l'erreur de PHP journal (par exemple: D: \ xampp \ php de \ logs \ php_error_log)

php://stderr écrit au serveur/erreur Apache journal (par exemple: D: \ xampp \ apache \ logs \ error.log)

Espérons que cela aide quelqu'un d'autre.

+0

pendant que je suis là, dans php: // stderr, est-ce que stderr fait référence au journal des erreurs du serveur ou au journal des erreurs d'Apache? (Je comprends qu'ils peuvent être les mêmes en pratique mais je suis curieux quant à la sémantique.) –

+2

Techniquement, php: // stderr fait référence au flux STDERR pour le processus, mais lors de l'exécution dans un hôte Apache en tant que module, ceci sera le STDERR du processus Apache. S'il s'agit d'une application CLI ou CGI, ce ne sera pas le cas. –

+0

@richremer, Mon STDERR écrit avec succès dans 'C: \ xampp \ apache \ logs \ error.log', mais où STDOUT est-il écrit? – Pacerier

1

Si vous utilisez simplement un serveur web PHP intégré (à partir de PHP 5.4.0) alors php://stderr sera affiché sur l'écran de la console qui a lancé le serveur web PHP intégré.