Cela a été demandé 1 000 fois et j'ai parcouru les différents articles avant de poster ceci, mais je n'ai pas trouvé de réponse. Tant que j'ai programmé avec PHP, cela a toujours été un cauchemar de travailler. Est-ce que quelqu'un peut me dire ce que je fais mal ici?
J'ai error_log défini dans le fichier ini avec error_reporting = E_ALL | E_STRICT
Que manque-t-il d'autre? Cela me le donnait généralement. Je veux cet ensemble dans le fichier ini et non dans mes scripts.
Une autre chose intéressante qui se passe est que lorsque je tente volontairement de créer une erreur dans un de mes scripts, Apache redémarre encore et encore.
Ceci est mon journal des événements après une erreur. Butin à l'horodatage
Wed Nov 04 19:34:23 2009] [notice] Apache/2.2.14 (Win32) PHP/5.3.0 configured -- resuming normal operations
[Wed Nov 04 19:34:23 2009] [notice] Server built: Sep 28 2009 22:41:08
[Wed Nov 04 19:34:23 2009] [notice] Parent: Created child process 1700
[Wed Nov 04 19:34:23 2009] [notice] Child 1700: Child process is running
[Wed Nov 04 19:34:23 2009] [notice] Child 3008: Released the start mutex
[Wed Nov 04 19:34:23 2009] [notice] Child 1700: Acquired the start mutex.
[Wed Nov 04 19:34:23 2009] [notice] Child 1700: Starting 64 worker threads.
[Wed Nov 04 19:34:23 2009] [notice] Child 1700: Starting thread to listen on port 80.
[Wed Nov 04 19:34:24 2009] [notice] Child 3008: All worker threads have exited.
[Wed Nov 04 19:34:24 2009] [notice] Child 3008: Child process is exiting
[Wed Nov 04 19:34:53 2009] [notice] Parent: child process exited with status 128 -- Restarting.
[Wed Nov 04 19:34:53 2009] [notice] Apache/2.2.14 (Win32) PHP/5.3.0 configured -- resuming normal operations
[Wed Nov 04 19:34:53 2009] [notice] Server built: Sep 28 2009 22:41:08
[Wed Nov 04 19:34:53 2009] [notice] Parent: Created child process 3656
[Wed Nov 04 19:34:53 2009] [notice] Child 3656: Child process is running
[Wed Nov 04 19:34:53 2009] [notice] Child 3656: Acquired the start mutex.
[Wed Nov 04 19:34:53 2009] [notice] Child 3656: Starting 64 worker threads.
[Wed Nov 04 19:34:53 2009] [notice] Child 3656: Starting thread to listen on port 80.
[Wed Nov 04 19:34:53 2009] [notice] Parent: child process exited with status 128 -- Restarting.
[Wed Nov 04 19:34:54 2009] [notice] Apache/2.2.14 (Win32) PHP/5.3.0 configured -- resuming normal operations
[Wed Nov 04 19:34:54 2009] [notice] Server built: Sep 28 2009 22:41:08
[Wed Nov 04 19:34:54 2009] [notice] Parent: Created child process 3980
[Wed Nov 04 19:34:54 2009] [notice] Child 3980: Child process is running
[Wed Nov 04 19:34:54 2009] [notice] Child 3980: Acquired the start mutex.
[Wed Nov 04 19:34:54 2009] [notice] Child 3980: Starting 64 worker threads.
[Wed Nov 04 19:34:54 2009] [notice] Child 3980: Starting thread to listen on port 80.
[Wed Nov 04 19:34:54 2009] [notice] Parent: child process exited with status 128 -- Restarting.
[Wed Nov 04 19:34:54 2009] [notice] Apache/2.2.14 (Win32) PHP/5.3.0 configured -- resuming normal operations
[Wed Nov 04 19:34:54 2009] [notice] Server built: Sep 28 2009 22:41:08
[Wed Nov 04 19:34:54 2009] [notice] Parent: Created child process 1600
[Wed Nov 04 19:34:54 2009] [notice] Child 1600: Child process is running
[Wed Nov 04 19:34:54 2009] [notice] Child 1600: Acquired the start mutex.
[Wed Nov 04 19:34:54 2009] [notice] Child 1600: Starting 64 worker threads.
[Wed Nov 04 19:34:54 2009] [notice] Child 1600: Starting thread to listen on port 80.
[Wed Nov 04 19:34:55 2009] [notice] Parent: child process exited with status 128 -- Restarting.
[Wed Nov 04 19:34:55 2009] [notice] Apache/2.2.14 (Win32) PHP/5.3.0 configured -- resuming normal operations
[Wed Nov 04 19:34:55 2009] [notice] Server built: Sep 28 2009 22:41:08
[Wed Nov 04 19:34:55 2009] [notice] Parent: Created child process 1068
[Wed Nov 04 19:34:55 2009] [notice] Child 1068: Child process is running
[Wed Nov 04 19:34:55 2009] [notice] Child 1068: Acquired the start mutex.
[Wed Nov 04 19:34:55 2009] [notice] Child 1068: Starting 64 worker threads.
[Wed Nov 04 19:34:55 2009] [notice] Child 1068: Starting thread to listen on port 80.
[Wed Nov 04 19:34:55 2009] [notice] Parent: child process exited with status 128 -- Restarting.
[Wed Nov 04 19:34:55 2009] [notice] Apache/2.2.14 (Win32) PHP/5.3.0 configured -- resuming normal operations
[Wed Nov 04 19:34:55 2009] [notice] Server built: Sep 28 2009 22:41:08
[Wed Nov 04 19:34:55 2009] [notice] Parent: Created child process 3220
[Wed Nov 04 19:34:56 2009] [notice] Child 3220: Child process is running
[Wed Nov 04 19:34:56 2009] [notice] Child 3220: Acquired the start mutex.
[Wed Nov 04 19:34:56 2009] [notice] Child 3220: Starting 64 worker threads.
[Wed Nov 04 19:34:56 2009] [notice] Child 3220: Starting thread to listen on port 80.
Vous devez également définir log_errors = On
dans le fichier php.ini.
Si quelqu'un d'autre a des difficultés à enregistrer les erreurs dans son environnement de développement local, voici ce qui a été résolu:
Sur Windows, error_log
doit être défini sur le chemin complet du journal pour que error_log()
fonctionne (error_log = c:\Apache\php_errors.log
). Cependant, si error_log = php_errors.log
sans chemin d'accès, php pourra toujours enregistrer les erreurs de démarrage telles que
PHP Startup: Unable to load dynamic library 'ext\php_mysqli.dll' - The specified module could not be found
Le problème que j'ai rencontré était que le journal des erreurs que j'avais désigné était protégé en écriture. Tous mes paramètres .htaccess étaient corrects, PHP ne pouvait tout simplement pas écrire dans le journal des erreurs car il ne disposait d'aucune permission. Cela a réglé le problème pour moi:
chmod 777 watermellon-app-errors.log
Évidemment, vous allez vouloir changer le fichier .log en n’importe quel fichier que vous utilisez pour un journal.
error_log
:Assurez-vous que le fichier /etc/php-fpm.d/www.conf
ne contient pas les paramètres php_admin_value
pour error_log. Recherchez les éléments suivants et commentez-les à l'aide d'un point-virgule:
; NOTE: If these are set, ini_set('error_log', 'path') will have no effect
; inside your php code, and this will be forced to be the value always.
; php_admin_value[error_log] = /var/log/php-fpm/www-error.log
; php_admin_flag[log_errors] = on
Puis redémarrez php-fpm:
systemctl restart php-fpm
error_log
à l’aide deLes paramètres php_admin_value
dans les fichiers de configuration Apache ne peuvent pas être remplacés, assurez-vous de ne pas avoir de valeur php_admin_value pour le paramètre error_log
dans les fichiers de configuration Apache. Vérifiez également les paramètres php_value
au cas où.
PHP Site Web - Comment modifier les paramètres de configuration
Si la directive error_log est définie, le fichier sera utilisé pour enregistrer les erreurs php. S'il n'est pas défini, les erreurs seront consignées dans le journal Apache. Jetez un coup d’œil à http://us3.php.net/manual/fr/errorfunc.configuration.php#ini.error-log .
Le fichier error_log et le répertoire dans lequel il se trouve doivent être accessibles en écriture à l'utilisateur sous lequel s'exécute Apache. Si le fichier n'est pas créé, cela est probablement dû à un problème d'autorisations.
Je ne sais pas vraiment pourquoi Apache planterait sur vous, mais j'imagine que c'est un problème d'autorisations.
Je ne comprends pas pourquoi , mais le journal des erreurs fonctionne maintenant. Voici ce que j'ai fait. J'ai abandonné et commenté la directive error_log et fermé le fichier ini. J'ai exécuté le script avec l'erreur d'analyse pour voir qu'Apache se plantait toujours et j'ai l'erreur PHP dans le fichier journal. C'est bizarre parce que error_log n'est plus activé dans le fichier ini et que mon script n'utilise pas ini_set ().
Quelqu'un a-t-il une explication à cette folie? En outre, Apache ne plante plus.
Dans mon cas, sur un serveur de développement CentOS, après un yum update
complet, l’autorisation sur/var/log/http a été remplacée par 700 et l’utilisateur a été 'root', de sorte que l’utilisateur 'Apache' n’a pas pu entrez ou écrivez dedans. Il était toujours capable d'écrire dans le fichier existant /var/log/httpd/error.log mais il n'a pas été possible de créer un nouveau fichier, car j'utilise des fichiers journaux avec suffixe de date . commander
chown Apache /var/log/httpd
résolu le problème.
Si vous utilisez Fedora, SELinux (activé par défaut) empêchera Apache/httpd d’ajouter des erreurs à votre fichier journal même si votre fichier est spécifié dans le fichier php.ini et que son répertoire qui contient toutes les autorisations autorisées.
Vous pouvez voir si cela se produit en consultant votre fichier journal système dans/var/log/messages
La solution idéale consiste à configurer SELinux pour autoriser l'accès au fichier journal.
La solution la plus rapide consiste à désactiver SELinux dans/etc/selinux/config en définissant SELINUX sur disabled.
Vous devrez ensuite redémarrer votre système pour que la modification soit prise en compte.
Voici comment cela fonctionne sur mon Ubuntu (Apache 2.4.7, PHP 5.5.9):
script en ligne de commande:
error_log
si log_errors = On
. Paramètres dans /etc/php5/cli/php.ini
;demande web via Apache:
log_errors = On
(/etc/php5/Apache2/php.ini
), l'erreur est ajoutée au chemin indiqué par la directive ErrorLog
Apache dans l'hôte virtuel. Si cette directive n'existe pas, le chemin d'accès php.ini error_log
est utilisé;log_errors = Off
pas les journaux sont écrits n'importe où;Autant que je me souvienne, cela a presque fonctionné de la sorte dans la plupart des piles Linux
Comme bradym l'a dit, vérifiez si vous avez des autorisations d'écriture sur le répertoire où se trouve votre journal des erreurs php pour l'utilisateur Apache. Si vous avez créé un fichier journal avec des autorisations écrites, cela ne suffit pas, le répertoire devrait aussi en avoir.
Voici mon guide de dépannage pour les appels error_log()
ne fonctionnant pas.
Examinez la configuration de votre serveur pour savoir où se trouve le fichier journal des erreurs par défaut.
Cela dépend du serveur que vous utilisez. Pour commencer, jetez un œil à l’option ErrorLog
d’Apache si vous utilisez Apache ou l’option error_log
- de Nginx si vous utilisez Nginx. Assurez-vous qu'il est défini sur un fichier. Si vous utilisez un outil tel que Valet, notez qu'il utilise un logiciel serveur tel que Nginx en coulisse.
Vérifiez les autorisations du fichier journal des erreurs de votre serveur.
Sur les systèmes de type Unix, il doit être accessible en écriture au bon utilisateur et au bon groupe, et les autorisations du répertoire parent et de tous ses ancêtres doivent également être correctes. Utilisez chmod
et chown
.
Vérifiez la configuration de PHP dans les fichiers .ini
.
Plus précisément, recherchez les codes log_errors = On
et error_reporting = E_ALL | E_STRICT
et error_log = /tmp/example/php_errors.log
(voir la documentation pour les paramètres log_errors
, error_reporting
et error_log
paramètres de configuration). Pour trouver le fichier .ini
, examinez le résultat de phpinfo();
. Si error_log
n'est pas défini, il se connecte par défaut au journal des erreurs du serveur, mentionné dans les étapes précédentes. Si error_log
est défini sur un fichier, celui-ci devrait déjà exister et être accessible en écriture, comme dans les étapes précédentes. N'oubliez pas de redémarrer le serveur après les changements de configuration.
Vérifiez que les paramètres de PHP ne sont pas modifiés par la configuration du serveur.
La configuration de votre serveur (même .htaccess
) peut modifier les paramètres de configuration PHP. Dans Apache, ceci est fait en utilisant php_admin_value
et php_admin_flag
( docs ). Par exemple, vous pouvez trouver dans votre fichier .htaccess
cette ligne: php_admin_flag[log_errors] = off
. N'oubliez pas de redémarrer le serveur après les changements de configuration.
À ce stade, vous devriez pouvoir créer un fichier de test test.php
avec le contenu <?php error_log("test");
, redémarrer votre serveur et ouvrir l’URL de votre navigateur. Le nom test
devrait également s'afficher dans votre journal des erreurs (le un spécifié par error_log =
). Mais continuez à lire.
Vérifiez que les paramètres de PHP ne sont pas modifiés au moment de l'exécution.
L'option log_errors
peut être modifiée à l'exécution en exécutant ini_set('log_errors', 1);
, de même que les autres options de configuration error_reporting
et error_log
. Notez également qu’il existe une fonction error_reporting()
PHP spéciale qui modifie la configuration au moment de l’exécution. Recherchez dans votre base de code toutes les invocations de ini_set
ou error_reporting
. WordPress, par exemple, les exécute en fonction de la valeur de WP_DEBUG
.
Autres points à examiner: Vous rencontrez peut-être des problèmes d’autorisation dans SELinux (voir cette réponse ).
Error_log = "C:\php\Log\error.log" ne fonctionnait pas pour moi non plus. La solution pour moi était de ne pas créer le fichier error.log vous-même, car PHP le fera pour vous. Voir le tableau de messages PHP. J'utilise PHP 5.2 sur un serveur Windows 2008
Cela a fait le tour pour moi.
setsebool -P httpd_unified 1
S'il vous plaît noter que ce serait la méthode préférée ci-dessous pour essayer d'abord:
semanage fcontext -a -t httpd_sys_rw_content_t 'errorLogNameHere.error.log
restorecon -v 'errorLogNameHere.error.log'
Cette réponse a été dérivée des journaux de l'exécution de cette ligne de commande:
journalctl -xe
Plus d'informations sur le système sur lequel je travaillais: PHP 7.0 et CentOS 7
Pas sûr que ce ne soit pas évident, mais le problème était la configuration d'Apache pour l'écriture de fichiers. J'ai essayé chmod 777, chmod a + w sur le répertoire de journalisation, mais cela n'a pas fonctionné pour moi.
J'espère que cela peut aider quelqu'un.