Warum wirft PHP nach "mysql_connect" oder bei "mysql_close" "Segmentation fault (11)"?

17288
Shawn

Ich habe Ubuntu-9.04 und verwende XAMPP-1.7.2, um eine Webanwendung zu entwickeln. Das Problem ist, dass localhost/folder/file.phpFirefox mir beim Herunterladen einer PHP-Datei, die ich geschrieben habe, anbietet, sie herunterzuladen, anstatt mir die Datei als Webseite anzuzeigen. Wenn ich es herunterlade und in meinem bevorzugten Texteditor öffne, bekomme ich eine leere Datei mit nichts darin ...

UPDATE: Funktioniert auf einem anderen Server Nun, ich habe die Seite auf einen anderen Server hochgeladen und ich kann sie gut sehen! Das Problem liegt also nicht bei Firefox. Es ist auch nicht mit dem Code selbst. Mein Server oder seine Konfiguration muss das Problem sein. Gibt das einem von Ihnen einen Hinweis darauf, was passiert?

UPDATE: Isolieren des Problems, das Firefox anbietet, nur die erste dieser drei Dateien herunterzuladen:

test1.php wird als Download angeboten

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

test2.php gibt Folgendes aus : Warnung: mysql_close (): Keine MySQL-Link-Ressource in /opt/lampp/htdocs/test.php in Zeile 3 angegeben

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

test3.php gibt eine leere Seite aus

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

Ich weiß, dass mein Server läuft und er sagt mir, dass PHP5 läuft und läuft.

Folgendes bekomme ich im XAMPP-Fehlerprotokoll, wenn das Problem auftritt (aus Gründen der Übersichtlichkeit abgeschnitten und formatiert):

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

Oh, und Firefox kann die Datei ohne Probleme auf meinem anderen Computer sehen (Windows XP SP3 und easyPHP als Server). Weiß jemand, was ich tun kann, um dieses Problem zu lösen?

UPDATE: using error_log ()

Hier ist mein Versuch, error_log () zu verwenden: 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"); ?> 

Dies wird im XAMPP-Fehlerprotokoll (aus Gründen der Übersichtlichkeit) erzeugt:

[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) 
1
Ich bin nicht sicher, ob error_log synchrone Protokolldateien erzwingt: Meldungen aus mehreren Quellen * werden * möglicherweise nicht in der genauen Reihenfolge angezeigt, in der die Meldungen generiert werden. Obwohl es unwahrscheinlich ist, könnte der tatsächliche Fehler * vor der Ausführung von * error_log aufgetreten sein. (Obwohl der Download, den Firefox versucht, * nicht * Ihr Problem ist, können Sie versuchen, zu sehen, welche HTTP-Header mit dieser Datei gesendet werden. Insbesondere der Inhaltstyp sagt Ihnen wahrscheinlich, was der Browser von ihm erwartet. Sehen Sie zum Beispiel , das Net-Panel in Firebug: http://getfirebug.com/net.html) Arjan vor 14 Jahren 0
Sollte dies nicht bei Stack Overflow sein? Brian Ortiz vor 14 Jahren 4
Ich habe mir die HTTP-Header angesehen, aber wenn Firefox das Herunterladen einer Seite anbietet, wird unter der Registerkarte "Net" nichts angezeigt. Ich kann mir also nicht mal die Kopfzeilen ansehen ... Was bedeutet das, wie Firefox die Datei sieht? Shawn vor 14 Jahren 0

4 Antworten auf die Frage

2
mikedub

This could be a hardware problem or an Apache/PHP configuration problem. I've usually seen Signal 11 with memory problems. Look at your configs to make sure that the PHP memory limit isn't higher than the Apache memory limit or similar.

It sounds like your php_mod is crashing mid-program, so Apache is just tossing the php file at you with a non-html content-type header, which makes your browser treat it as a download. That's just a guess, though. You need to gather some more information.

Add some error_log() calls to your PHP program so that you can isolate when the crash actually occurs in your code. If that doesn't help narrow it down, set up Apache to create a core dump and use gdb to figure out where the segfault starts. My bet is mod_php.so.

Ich habe versucht, error_log zu verwenden, indem ich ganz am Anfang eine der fehlerhaften Dateien hinzufügte, aber errorLog.txt bleibt leer. Ich habe auch versucht , shawninder@gmail.com als eigene E-Mail zu verwenden, aber nichts passiert. Was das Einrichten von Apache angeht, kann ich anscheinend nicht finden, wie das geht. Eigentlich finde ich sehr wenig Informationen darüber, wie Sie in XAMPP etwas einstellen können ... Shawn vor 14 Jahren 0
Ich habe den Kernspeicherauszug gelesen und kann es ehrlich gesagt nicht verstehen. Ich weiß, dass ich mein System durchbrechen kann, wenn ich zu viele Dinge mache, die ich in der Befehlszeile nicht verstehe. Daher zögere ich, diese bestimmte Reise zu unternehmen. Ich habe meine Frage oben bearbeitet, weil ich feststellen konnte, wo das Problem auftritt. Könnten Sie es überprüfen und mir sagen, ob der Kernspeicherauszug wirklich das ist, was ich brauche? Vielen Dank Shawn vor 14 Jahren 0
Ich vermute, dass es ein Berechtigungsproblem beim Erstellen von errorLog.txt gibt. Warum nicht das zweite und dritte Argument fallen lassen? Dann wird Ihre Nachricht zu Ihrer Standarddatei error_log hinzugefügt. Wenn Sie mit dem Core-Dump nicht vertraut sind, sollten Sie dies wahrscheinlich nicht tun. Meine nächste Frage ist: Was wird nach dem Download in der Datei test1.php angezeigt? mikedub vor 14 Jahren 0
Ich habe error_log mit nur einem Argument ausprobiert und es hat funktioniert. Ich habe meinen ursprünglichen Beitrag bearbeitet und die Ergebnisse meines Versuchs hinzugefügt. Was ist in der heruntergeladenen Datei: nichts. Ich lade es herunter und öffne es in gedit, und ich bekomme eine leere Datei (0 Bytes, übrigens). Auch das wurde in meinem ursprünglichen Beitrag bearbeitet. Wie Sie sehen, führt es alles bis zu mysql_close () aus. dann stürzt es ab. Beim Download ist die Datei jedoch leer. Was bedeutet das? Vielen Dank für Ihre bisherige Hilfe. Shawn vor 14 Jahren 0
Nun, es isoliert das Problem für den MySQL-Client in PHP. Ich würde den Code aus Beispiel 1 auf der Manpage `mysql_close` [http://us.php.net/mysql_close] ausprobieren, um zu sehen, ob Ihre Verbindung tatsächlich erstellt wird oder ob der Aufruf von` mysql_close` den Segfault verursacht. mikedub vor 14 Jahren 0
Beispiel # 1 auf der Manpage mysql_close funktioniert einwandfrei. Es zeigt "Erfolgreich verbunden" an. Shawn vor 14 Jahren 0
1
random

You say it's all up and running and that simple files are showing up okay. But then some files are prompting you to save the PHP file. This means you'll have to look at the code of those pages where it's breaking and asking you to save.

It's more than likely you have a line in the code that is killing the server or just making it give up parsing the PHP.

This could be a particular extension that's being used by that page or it could be another killbot function that hobbles the server into just sitting there with its arms crossed.

Your error logs show that the last thing to happen before it shoves the save dialog in your face is a connect to the database. Follow the code back to that and make sure that's solid before moving onto the next possible troubleshooting breadcrumb that may or may not arise.

Since you can see the file with no problem on another set up, in this case easyPHP, the problem is very much on the XAMPP set up and a configuration that is being tripped up by the code.

Wie kann ich also feststellen, was bei der XAMPP-Einrichtung und -Konfiguration falsch ist? Oder wie kann ich feststellen, was in meinem Code falsch ist, der XAMPP durcheinander bringt? Shawn vor 14 Jahren 0
@Shawn, was ist mit der Behebung des * Zugriffs für den Benutzer 'Benutzer' @ 'localhost' * in Ihrem MySQL-Setup verweigert? Arjan vor 14 Jahren 2
@Shawn Arjan hat Recht. Beginnen Sie mit dem Debuggen in der Zeile, in der Sie sich nicht bei der Datenbank anmelden können. Ihre Einstellungen sind wahrscheinlich zwischen XAMPP und easyPHP nicht identisch, und dazu gehört auch das Datenbank-Setup. random vor 14 Jahren 0
Nun, ich habe das Problem mit Zugriff verweigert, jetzt bekomme ich nur noch den Segmentierungsfehler (ich habe meine Frage bearbeitet) Shawn vor 14 Jahren 0
1
DaveParillo

Smells like your mysql install. Is mysql running as a service? Does your root account really have no password? What mysql extensions are loaded in php.ini? There's a php_mssql.dll which can easily be mistaken for php_msql.dll, but I'm fairly certain the php_mssql.dll is for windows only.

Have you edited your php.ini /opt/lampp/php/php.ini? These may help with debugging:

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 

Also worth looking at, the port number used. Is $MYSQL_TCP_PORT set? How about the mysql-tcp entry in /etc/services?

Update: Have you tried checking the return value of the connect function? I'm wondering if you example is too minimal. Try making your test look like this:

<?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); ?> 

This example ensure you send something back that looks like HTML whether your script fails or not. I was able to reproduce your symptoms with no root password set, so it's apparently not only good practice, but it's required to be non-empty.

I was able to turn your problem into a a solution by

  1. Setting the root password
  2. returning something from the script on connect

Instead of passing in "" as the root password, if it really is nothing, try using mysql.default_password as the password. The default value for mysql.default_password is NULL.

Wie kann ich feststellen, ob mysql als Dienst ausgeführt wird? Ich weiß nicht, ob mein Root ein Passwort hat oder nicht, aber ich habe den Beispielcode mit vielen verschiedenen Benutzern mit und ohne Passwörter ausprobiert. Bei Erweiterungen habe ich seit der ersten Installation von XAMPP keine installiert. Ich kann die php_mssql.dll nirgendwo finden. Ich habe echo ($ MYSQL_TCP_PORT) ausprobiert. Folgendes bekomme ich. Hinweis: Undefinierte Variable: MYSQL_TCP_PORT in /opt/lampp/htdocs/test.php in Zeile 2 Die anderen Einstellungen in der php.ini ändern nichts an meinem Problem. Shawn vor 14 Jahren 0
Schauen Sie sich Ihr XAMPP-Kontrollfeld an: Anwendungen -> Andere -> XAMPP-Kontrollfeld. Wenn Sie das Kennwort nicht festgelegt haben, ist es standardmäßig leer. Wenn Sie das Kennwort ** gesetzt haben, hat das von Ihnen verwendete Beispiel ein leeres, sodass die Verbindung fehlschlagen würde (aber ich würde keinen Absturz erwarten). Sie sollten nicht ** php_mssql.dll finden, es ist eine Windows-DLL - wenn Sie jedoch versehentlich diese Erweiterung aktiviert haben, können alle möglichen schlechten Dinge passieren. Sie sollten erwägen, `/ opt / lampp / lampp security` auszuführen DaveParillo vor 14 Jahren 0
Das ist interessant. Ich habe mich immer gefragt, warum es auf der Anwendungsregisterkarte keinen Eintrag für XAMPP gibt. In der Tat kann ich den Link "Others" nicht finden, von dem Sie sprechen. In Anwendungen habe ich nur Zubehör, Spiele, Grafik, Internet, Office, Programmierung, Sound & Video, System-Tools und Hinzufügen / Entfernen ... Und ich kann nichts XAMPP-bezogenes finden. Ich starte XAMPP einfach mit sudo / opt / lampp / lampp start Shawn vor 14 Jahren 0
Schnelle Sicherheitsüberprüfung ... Ihre XAMPP-Seiten sind NICHT durch ein Kennwort geschützt. Möchten Sie ein Passwort festlegen? [ja] nein MySQL ist über das Netzwerk erreichbar. Normalerweise wird das nicht empfohlen. Soll ich es ausschalten? [ja] ja ... Der MySQL / phpMyAdmin-Benutzer pma hat kein Passwort gesetzt !!! Möchten Sie ein Passwort festlegen? [yes] yes ... Festlegen eines neuen MySQL-PMA-Passworts. Das pma-Passwort von phpMyAdmin auf das neue einstellen. MySQL hat kein Root-Passwort gesetzt !!! Möchten Sie ein Passwort festlegen? [ja] nein Das FTP-Passwort für den Benutzer "nobody" ist immer noch auf "lampp" gesetzt. Möchten Sie das Passwort ändern? [ja] nein Fertig so gut? Shawn vor 14 Jahren 0
Kannst du dich mit phpMyAdmin verbinden? DaveParillo vor 14 Jahren 0
Shawn - Ich konnte dein Problem reproduzieren und habe eine Lösung. Es war nichts falsch mit Ihrer Installation. Es ist der Code. Überprüfen Sie meine aktualisierte Antwort. DaveParillo vor 14 Jahren 0
Die Verbindung mit phpMyAdmin funktioniert. Ich habe den letzten Code ausprobiert, den Sie gepostet haben. Alles funktioniert, ich bekomme eine Liste aller Datenbanken. Aber danach, wo die mysql_close () -Anweisung erfolgt, erhalte ich die Meldung "Warnung: Unbekannt: 1 Ergebnismenge (n) nicht freigegeben. Verwenden Sie mysql_free_result, um Ergebnismengen freizugeben, die mit mysql_query () in Unknown in Zeile 0 angefordert wurden". Ich habe versucht, Ihren Code ein wenig zu ändern, indem Sie einfach den Parameter aus der mysql_close ($ db) -Anweisung (stattdessen mit mysql_close ()) herausnehmen, und Firefox bietet die Möglichkeit, die Datei herunterzuladen! Was bedeutet das? Shawn vor 14 Jahren 0
Wenn Firefox das Herunterladen einer Datei anbietet, liegt dies daran, dass die Seite nicht im Browser gerendert werden kann. In diesem Fall wahrscheinlich, weil keine Ausgabe erfolgt. Eigentlich wäre mein Code korrekter, wenn die close-Anweisung im else enthalten wäre. Ich sehe diesen Fehler nicht in meiner Installation, auch am 9.04. Streng genommen ist das Schließen nicht erforderlich, da Sie keine dauerhafte Verbindung herstellen. Hilft das Entfernen der Schließlinie? DaveParillo vor 14 Jahren 0
Das gleiche Skript ohne mysql_close (); Die Anweisung funktioniert wie bei mysql_close ($ db) ;: Die Seite wird MIT der Warnung angezeigt. Die Warnung betrifft also nicht die Anweisung mysql_close. Vielleicht geht es um das automatische Schließen der Verbindung? Shawn vor 14 Jahren 0
Selbst als ich Ihre anderen Symptome reproduzierte, habe ich diese spezielle Warnung nie gesehen - ich dachte, Ihre Probleme wären meistens a) Sie dachten, Ihre Verbindung sei Kerndumping, und b) Firefox hat Ihr Skript nicht ausgeführt, sondern angeboten, es zu speichern. Die untere Zeile ist, dass der Aufruf von mysql_close () in dieser Situation nicht benötigt wird. Siehe die PHP-Seite zum Freigeben von Ressourcen: http://us.php.net/manual/de/language.types.resource.php#language.types.resource.self-destruct. DaveParillo vor 14 Jahren 0
Wenn auf Ihren Webseiten immer noch Warnungen angezeigt werden, haben Sie möglicherweise `display_errors = On` in Ihrer php.ini-Datei festgelegt. DaveParillo vor 14 Jahren 0
Denken Sie, dass meine Verwendung von mysql_close, wenn es nicht benötigt wird, das Problem verursacht? Und wenn ja, warum auf meinem Server und nicht auf einem anderen Server (und nicht auf dem Server, den ich auf meinem anderen Computer eingerichtet habe)? Warum bekomme ich die Fehler? Sie weisen offensichtlich darauf hin, dass etwas nicht stimmt, also würde ich sie gerne lösen, anstatt nur zu sagen "Zeige sie nicht". Gibt es vielleicht eine Referenzseite, auf der Fehlermeldungen genauer erklärt werden? Shawn vor 14 Jahren 0
Beginnen Sie mit der Manpage http://us.php.net/mysql_close. Es besagt, dass Sie normalerweise keine mysql_close aufrufen müssen und dass, wenn beim Aufruf keine Ressource verfügbar ist, ein Fehler ausgegeben wird. Ihre anderen Installationen verwenden unterschiedliche Betriebssysteme und möglicherweise unterschiedliche PHP-Versionen. Offen gesagt würde mich ein anderes Verhalten, insbesondere beim Umgang mit Ressourcenfreigaben, nicht überraschen. DaveParillo vor 14 Jahren 0
Oh, ich glaube, ich verstehe endlich, dass das Erhalten dieser Warnung das NORMAL-Verhalten ist. Liegt das daran, dass ich mit mysql_fetch_array auf jede zurückgegebene Zeile zugegriffen habe, sodass keine anderen Ressourcen freigegeben werden müssen? Beim Beenden des Skripts sucht php jedoch immer noch nach nicht freigegebenen Ressourcen. Habe ich das richtig verstanden? Shawn vor 14 Jahren 0
Du hast es! 8-) DaveParillo vor 14 Jahren 0
0

Ich habe genau den gleichen Fehler festgestellt. Stellen Sie sicher, dass die mysql-Benutzerrechte richtig eingestellt sind.

Melden Sie sich in der Befehlszeile an und bestätigen Sie, dass Sie sich anmelden können, wechseln Sie zu der betreffenden Datenbank und sehen Sie Tabellen und Datensätze. Melden Sie sich einfach mit dem Befehl "mysql -u user -p" an und lösen Sie einige Abfragen aus.