Pourquoi PHP lance-t-il «Segmentation fault (11)» après «mysql_connect» ou sur «mysql_close»?


1

J'ai Ubuntu-9.04 et j'utilise XAMPP-1.7.2 pour développer une application Web. Le problème est que lorsque j'essaie de visualiser un fichier PHP que j'ai écrit en visitant localhost/folder/file.php, Firefox me propose de le télécharger au lieu de le montrer sous forme de page Web. Si je le télécharge et que je l'ouvre dans mon éditeur de texte préféré, je reçois un fichier vide ne contenant rien.

UPDATE: Fonctionne sur un autre serveur Eh bien, j'ai téléchargé la page sur un autre serveur et je peux très bien la voir! Donc, le problème n'est pas avec Firefox. Ce n'est pas non plus avec le code lui-même. Mon serveur ou sa configuration doit être le problème. Cela vous donne-t-il un indice sur ce qui se passe?

UPDATE: Isoler le problème Firefox propose de ne télécharger que le premier de ces trois fichiers:

test1.php est offert en téléchargement

<?php
    mysql_connect("localhost","root","");
    mysql_close();
?>

sorties test2.php : Avertissement: mysql_close (): non, ressource MySQL-Link fournie dans /opt/lampp/htdocs/test.php à la ligne 3

<?php
    //mysql_connect("localhost","root","");
    mysql_close();
?>

test3.php génère une page vierge

<?php
    mysql_connect("localhost","root","");
    //mysql_close();
?>

Je sais que mon serveur est opérationnel et il me dit que PHP5 est activé et qu'il fonctionne également.

Voici ce que je trouve dans le journal des erreurs XAMPP lorsque le problème survient (tronqué et formaté pour plus de clarté):

[notice] child pid 7338 exit signal Segmentation fault (11)

Oh, et firefox peut voir le fichier sans problème sur mon autre ordinateur (Windows XP SP3 et easyPHP en tant que serveur) Est-ce que quelqu'un sait ce que je peux faire pour résoudre ce problème?

UPDATE: using error_log ()

Voici ma tentative d'utilisation de error_log (): test4.php

<?php
    error_log("Start of file reached by PHP");
    mysql_connect("localhost","root","");
    error_log("mysql_connect executed");
    mysql_close();
    error_log("mysql_close executed");
?>

Voici ce qu'il produit dans le journal des erreurs XAMPP (expliqué par souci de clarté):

[error] [client 127.0.0.1] Start of file reached by PHP
[error] [client 127.0.0.1] mysql_connect executed
[notice] child pid 5338 exit signal Segmentation fault (11)

Je ne sais pas si error_log applique les fichiers journaux synchrones: les messages provenant de plusieurs sources peuvent ne pas apparaître dans l'ordre exact dans lequel ils sont générés. Donc, bien que cela soit peu probable, l’erreur réelle s’est peut- être produite avant l’ exécution de error_log. (Et bien que le téléchargement que Firefox essaie ne soit pas votre problème, vous pouvez essayer de voir quels en-têtes HTTP sont envoyés avec ce fichier. En particulier, Content-Type vous indiquera probablement ce que le navigateur pense avoir reçu. Voir, par exemple, le Panneau réseau dans Firebug: getfirebug.com/net.html )
Arjan

4
Cela ne devrait-il pas être sur Stack Overflow?
Brian Ortiz

J'ai essayé de regarder les en-têtes HTTP, mais lorsque Firefox propose de télécharger une page, rien ne s'affiche sous l'onglet Net. Donc, je ne peux même pas regarder les en-têtes ... Qu'est-ce que cela signifie pour la façon dont firefox voit le fichier?
Shawn

Réponses:


1

Ça sent votre installation mysql. Est-ce que mysql fonctionne en tant que service? Votre compte root n'a-t-il vraiment pas de mot de passe? Quelles extensions mysql sont chargées dans php.ini? Il y en a un php_mssql.dllqui peut facilement être confondu avec php_msql.dll, mais je suis à peu près certain que ce php_mssql.dlln'est que pour les fenêtres.

Avez-vous édité votre php.ini /opt/lampp/php/php.ini? Ceux-ci peuvent aider au débogage:

error_reporting  =  E_ALL & ~E_NOTICE
display_errors = On
display_startup_errors = On ;but you'll want to turn this off soon ;)
mysql.trace_mode = On

Il convient également de regarder le numéro de port utilisé. Est-ce que $ MYSQL_TCP_PORT est défini? Qu'en est-il de l'entrée mysql-tcp dans / etc / services?

Mise à jour: Avez-vous essayé de vérifier la valeur de retour de la fonction de connexion? Je me demande si votre exemple est trop minimal. Essayez de faire ressembler votre test à ceci:

<?php

$db = mysql_connect("localhost","root","myrootpassword");
if (!$db) {
    die('Could not connect: ' . mysql_error());
}
else {
    $result = mysql_query("show databases");
   print "
   <h1>Test executed from ". $_SERVER['SCRIPT_NAME']. "</h1>

    \n";
    print "Script name: ". $_SERVER['SCRIPT_FILENAME'] ." <hr>\n";
    while ($line = mysql_fetch_array($result))
    {
        print "$line[0]<br>\n";
    }
}       
mysql_close($db);

?> 

Cet exemple garantit que vous renvoyez quelque chose qui ressemble au HTML, que votre script échoue ou non. J'ai été en mesure de reproduire vos symptômes sans mot de passe root. C'est donc apparemment non seulement une bonne pratique, mais il doit être non vide.

J'ai pu transformer votre problème en une solution en

  1. Définition du mot de passe root
  2. renvoyer quelque chose du script sur connect

Au lieu de passer "" en tant que mot de passe root, si ce n'est rien, essayez d'utiliser mysql.default_password en tant que mot de passe. La valeur par défaut de mysql.default_password est NULL.


Comment savoir si mysql fonctionne en tant que service? Je ne sais pas si ma racine a un mot de passe ou non, mais j'ai essayé l'exemple de code avec de nombreux utilisateurs différents, avec ou sans mots de passe, en vain. En ce qui concerne les extensions, je n’en ai installé aucune depuis la première installation de XAMPP. Je ne trouve nulle part php_mssql.dll. J'ai essayé echo ($ MYSQL_TCP_PORT); voici ce que je reçois Avis: Variable non définie: MYSQL_TCP_PORT dans /opt/lampp/htdocs/test.php en ligne 2 Les autres paramètres de php.ini ne modifient en rien mon problème.
Shawn

Essayez de regarder votre panneau de configuration XAMPP: Applications -> Autres -> Panneau de configuration XAMPP. Si vous n'avez pas défini le mot de passe, il est vide par défaut. Si vous avez défini le mot de passe, l'exemple que vous utilisez a un vide, de sorte que la connexion échouerait (mais je ne s'attendre à un accident). Vous ne devriez pas trouver php_mssql.dll, c'est une dll Windows - cependant, si vous avez activé cette extension par inadvertance, toutes sortes de mauvaises choses peuvent arriver. Vous devriez envisager de courir/opt/lampp/lampp security
DaveParillo le

C'est intéressant. Je me suis toujours demandé pourquoi il n'y a pas d'entrée pour XAMPP dans l'onglet Applications. En effet, je ne trouve pas le lien Autres dont vous parlez. Dans les applications, je n'ai que des accessoires, des jeux, des graphismes, Internet, Office, Programmation, Son et vidéo, des outils système et Ajouter / Supprimer ... Et je ne trouve rien qui soit lié à XAMPP. Je viens de commencer XAMPP avec sudo / opt / lampp / lampp start
Shawn le

Contrôle de sécurité rapide ... Vos pages XAMPP ne sont PAS sécurisées par un mot de passe. Voulez-vous définir un mot de passe? [oui] non MySQL est accessible via le réseau. Normalement, ce n'est pas recommandé. Voulez-vous que je l'éteigne? [oui] oui ... L'utilisateur pma de MySQL / phpMyAdmin n'a pas de mot de passe défini !!! Voulez-vous définir un mot de passe? [oui] oui ... Définition du nouveau mot de passe MySQL pma. Définir le mot de passe pma de phpMyAdmin sur le nouveau. MySQL n'a pas de mot de passe root !!! Voulez-vous définir un mot de passe? [oui] non Le mot de passe FTP de l'utilisateur 'nobody' est toujours défini sur 'lampp'. Voulez-vous changer le mot de passe? [oui] non Fait. c'est bon?
Shawn

Pouvez-vous vous connecter en utilisant phpMyAdmin?
DaveParillo

2

Cela pourrait être un problème matériel ou un problème de configuration Apache / PHP. J'ai généralement vu Signal 11 avec des problèmes de mémoire. Regardez vos configurations pour vous assurer que la limite de mémoire PHP n'est pas supérieure à la limite de mémoire Apache ou similaire.

On dirait que votre php_mod plante à mi-programme, donc Apache vous jette le fichier php avec un en-tête de type de contenu non html, ce qui permet à votre navigateur de le traiter comme un téléchargement. C'est juste une supposition, cependant. Vous devez collecter plus d'informations.

Ajoutez des error_log()appels à votre programme PHP afin d’isoler le moment où le crash se produit réellement dans votre code. Si cela ne résout pas le problème, configurez Apache de manière à créer un vidage de mémoire et gdbà déterminer le début du segfault. Mon pari est mod_php.so.


J'ai essayé d'utiliser error_log en ajoutant <? Php error_log ("Début du fichier atteint par PHP \ n", 3, "/opt/lampp/htdocs/webÉchange/SiteWeb_V5/errorLog.txt"); ?> au tout début d'un des fichiers défectueux, mais errorLog.txt reste vide. J'ai aussi essayé d'utiliser <? Php error_log ("La fin du fichier atteint par PHP", 1, "shawninder@gmail.com", "De: shawninder@gmail.com"); ?>, shawninder@gmail.com étant mon propre courrier électronique, mais rien ne se passe. En ce qui concerne la configuration d'Apache, je n'arrive pas à trouver comment faire cela. En fait, je trouve très peu d'informations sur la configuration de XAMPP ...
Shawn

J'ai lu sur le dépotoir, et franchement, je ne peux pas le comprendre. Je sais que je peux casser mon système si je fais trop de choses que je ne comprends pas dans la ligne de commande, alors j'hésite à faire ce journal en particulier. J'ai édité ma question ci-dessus parce que j'ai réussi à isoler où le problème se produit. Pourriez-vous vérifier et me dire si le dépotoir est vraiment ce dont j'ai besoin? Merci
Shawn

Je suppose qu'il existe un problème d'autorisations lors de la création de errorLog.txt. Pourquoi ne pas abandonner les deuxième et troisième arguments? Ensuite, votre message sera ajouté à votre fichier error_log par défaut. Si vous n'êtes pas à l'aise pour effectuer le vidage de la base, vous ne devriez probablement pas. Ma question suivante est la suivante: qu'est-ce qui apparaît dans le fichier test1.php après l'avoir téléchargé?
Mikedub

J'ai essayé error_log avec un seul argument et cela a fonctionné. J'ai édité mon message original, en ajoutant les résultats de mon essai. Pour ce qui est dans le fichier téléchargé: rien. Je le télécharge et l'ouvre dans gedit, et j'obtiens un fichier vierge (0 octet, btw). Cela aussi a été édité dans mon post original. Comme vous pouvez le voir, il exécute tout jusqu'à mysql_close (); alors il se bloque. Pourtant, le fichier est vierge au téléchargement. Qu'est-ce que cela signifie? Merci beaucoup pour votre aide jusqu'à maintenant.
Shawn

Eh bien, cela isole le problème du client MySQL en PHP. J'essaierais le code de l'exemple n ° 1 de la mysql_closepage de manuel [ us.php.net/mysql_close] pour voir si votre connexion est réellement créée ou si l' mysql_closeappel est à l'origine du segfault.
Mikedub

1

Vous dites que tout est opérationnel et que de simples fichiers apparaissent correctement. Mais certains fichiers vous invitent à enregistrer le fichier PHP. Cela signifie que vous devrez regarder le code de ces pages où il est brisé et vous demander de sauvegarder.

Il est fort probable que le code tue une ligne qui tue le serveur ou qui l'oblige simplement à abandonner l'analyse syntaxique de PHP.

Cela pourrait être une extension particulière utilisée par cette page ou une autre fonction killbot qui empêche le serveur de rester assis là, les bras croisés.

Vos journaux d’erreur indiquent que la dernière chose à faire avant d’enfouir la boîte de dialogue de sauvegarde dans votre visage est une connexion à la base de données. Suivez le code et assurez-vous qu'il est solide avant de passer au prochain fil d'Ariane de dépannage possible qui peut ou non se produire.

Etant donné que vous pouvez voir le fichier sans problème sur une autre configuration, dans ce cas easyPHP, le problème tient essentiellement à la configuration de XAMPP et à une configuration déclenchée par le code.


Alors, comment puis-je déterminer ce qui ne va pas dans la configuration et l'installation de XAMPP? Ou comment déterminer ce qui ne va pas dans mon code et qui perturbe XAMPP?
Shawn

2
@Shawn, qu'en est-il de la résolution de cet accès refusé pour l'utilisateur '@@' localhost ' dans votre configuration MySQL ...?
Arjan

@Shawn Arjan a raison, commencez le débogage à partir de la ligne où il est indiqué que vous ne pouvez pas vous connecter à la base de données. Vos paramètres ne sont probablement pas les mêmes entre XAMPP et easyPHP, ce qui inclut la configuration de la base de données.
aléatoire

Eh bien, j'ai résolu le problème de l'accès refusé, maintenant je ne reçois que l'erreur de segmentation (j'ai modifié ma question)
Shawn le

0

J'ai rencontré exactement la même erreur. Assurez-vous que les privilèges d'utilisateur mysql sont définis correctement.

Connectez-vous à la ligne de commande et confirmez que vous êtes en mesure de vous connecter, basculez vers la base de données concernée et affichez les tables et les enregistrements. Connectez-vous simplement avec la commande: 'mysql -u user -p' et lancez des requêtes.

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.