Почему PHP выдает «Ошибка сегментации (11)» после «mysql_connect» или «mysql_close»?

16860
Shawn

У меня Ubuntu-9.04 и я использую XAMPP-1.7.2 для разработки веб-приложения. Проблема в том, что когда я пытаюсь просмотреть PHP-файл, который я написал, посетив сайт localhost/folder/file.php, Firefox предлагает мне загрузить его, а не показывать мне файл в виде веб-страницы. Если я скачаю его и открою в моем любимом текстовом редакторе, я получу пустой файл, в котором ничего нет ...

ОБНОВЛЕНИЕ: работает на другом сервере Ну, я загрузил страницу на другой сервер, и я вижу это хорошо! Так что проблема не в Firefox. И не с самим кодом. Мой сервер или его конфигурация должны быть проблемой. Это дает кому-то из вас ключ к пониманию того, что происходит?

ОБНОВЛЕНИЕ: Изоляция проблемы Firefox предлагает загрузить только первый из этих трех файлов:

test1.php предлагается для скачивания

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

Вывод test2.php : Предупреждение: mysql_close (): ресурс MySQL-Link не указан в /opt/lampp/htdocs/test.php в строке 3

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

test3.php выводит пустую страницу

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

Я знаю, что мой сервер запущен и работает, и он говорит мне, что PHP5 включен и работает.

Вот что я получаю в журнале ошибок XAMPP при возникновении проблемы (усечено и отформатировано для ясности):

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

О, и Firefox может видеть файл без проблем на моем другом компьютере (Windows XP SP3 и easyPHP в качестве сервера) Кто-нибудь знает, что я могу сделать, чтобы решить эту проблему?

ОБНОВЛЕНИЕ: использование error_log ()

Вот моя попытка использования 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"); ?> 

Вот что выдает в журнале ошибок XAMPP (для ясности):

[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
Я не уверен, что в error_log применяются синхронные файлы журналов: сообщения из нескольких источников * могут * не отображаться в том порядке, в котором они были сгенерированы. Таким образом, хотя это маловероятно, фактическая ошибка * могла * произойти * до того, как * error_log был выполнен. (И хотя загрузка, которую пробует Firefox, * не * ваша проблема, вы можете попытаться увидеть, какие HTTP-заголовки отправляются вместе с этим файлом. Особенно Content-Type, вероятно, скажет вам, что браузер думает, что он получил. См., Например, Сетевая панель в Firebug: http://getfirebug.com/net.html) Arjan 14 лет назад 0
Разве это не должно быть в переполнении стека? Brian Ortiz 14 лет назад 4
Я попытался просмотреть заголовки HTTP, но когда Firefox предлагает загрузить страницу, на вкладке Сеть ничего не появляется. Так что я даже не могу взглянуть на заголовки ... Что это значит о том, как firefox видит файл? Shawn 14 лет назад 0

4 ответа на вопрос

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.

Я попытался использовать error_log, добавив в самом начале один из неисправных файлов, но errorLog.txt остается пустым. Я также пытался использовать , shawninder@gmail.com, как мой собственный адрес электронной почты, но все же ничего не происходит. Что касается настройки Apache, я не могу найти, как это сделать. На самом деле, я нахожу очень мало информации о настройке чего-либо в XAMPP ... Shawn 14 лет назад 0
Я прочитал о дампе ядра и, честно говоря, не могу этого понять. Я знаю, что могу сломать свою систему, если я сделаю слишком много вещей, которые я не понимаю в командной строке, поэтому я не решаюсь пойти именно на это. Я редактировал мой вопрос выше, потому что мне удалось определить, где возникает проблема. Не могли бы вы проверить это и сказать мне, действительно ли мне нужен дамп ядра? Спасибо Shawn 14 лет назад 0
Я предполагаю, что есть проблема с разрешениями при создании errorLog.txt. Почему бы не отбросить второй и третий аргументы? Затем ваше сообщение будет добавлено в файл ошибок по умолчанию. Если вам неудобно делать дамп ядра, то, вероятно, не стоит. Мой следующий вопрос: что появляется в файле test1.php после его загрузки? mikedub 14 лет назад 0
Я попытался error_log только с одним аргументом, и это сработало. Я отредактировал свой оригинальный пост, добавив результаты своей попытки. Что касается того, что находится в загруженном файле: ничего. Я загружаю его и открываю в gedit, и я получаю пустой файл (0 байт, кстати). Это тоже было отредактировано в моем оригинальном сообщении. Как видите, он выполняет все до mysql_close (); тогда это терпит крах. Тем не менее, файл пуст при загрузке .. Что это значит? Большое спасибо за вашу помощь до сих пор. Shawn 14 лет назад 0
Well, it isolates the problem to the MySQL client in PHP. I'd try the code from Example #1 on the `mysql_close` man page[http://us.php.net/mysql_close] to see if your connection actually gets created or whether the `mysql_close` call is causing the segfault. mikedub 14 лет назад 0
Пример # 1 на странице справки mysql_close работает нормально. Он отображает «Подключено успешно». Shawn 14 лет назад 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.

Так как же определить, что не так в настройке и настройке XAMPP? Или как мне определить, что не так в моем коде, который портит XAMPP? Shawn 14 лет назад 0
@Shawn, как насчет исправления этого * Доступ запрещен для пользователя 'user' @ 'localhost' * в вашей настройке MySQL ...? Arjan 14 лет назад 2
@ Шон Арджан прав, начните отладку со строки, где говорится, что вы не можете войти в базу данных. Ваши настройки, вероятно, не совпадают между XAMPP и easyPHP, и это включает в себя настройку базы данных. random 14 лет назад 0
Ну, я решил проблему отказа в доступе, теперь я получаю только ошибку сегментации (я отредактировал свой вопрос) Shawn 14 лет назад 0
1
DaveParillo

Пахнет как ваша MySQL установка. MySQL работает как сервис? У вашей корневой учетной записи действительно нет пароля? Какие расширения MySQL загружаются в php.ini? Есть такой, php_mssql.dllкоторый можно легко принять за php_msql.dll, но я вполне уверен, что php_mssql.dllэто только для окон.

Вы редактировали свой php.ini /opt/lampp/php/php.ini? Это может помочь с отладкой:

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 

Также стоит посмотреть, номер порта используется. Установлен ли $ MYSQL_TCP_PORT? Как насчет записи mysql-tcp в / etc / services?

Обновление: Вы пытались проверить возвращаемое значение функции подключения? Мне интересно, если вы пример слишком минимален. Попробуйте сделать ваш тест похожим на это:

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

Этот пример гарантирует, что вы отправляете что-то обратно, похожее на HTML, независимо от того, работает ваш скрипт или нет Я смог воспроизвести ваши симптомы без установленного пароля root, так что это, очевидно, не только хорошая практика, но она должна быть непустой.

Я смог превратить вашу проблему в решение

  1. Установка пароля root
  2. возвращая что-то из скрипта при подключении

Вместо того, чтобы вводить "" в качестве пароля root, если это действительно ничего, попробуйте использовать mysql.default_password в качестве пароля. Значением по умолчанию для mysql.default_password является NULL.

Как я могу узнать, работает ли mysql как сервис? Я не знаю, есть ли в моем корне пароль или нет, но я пробовал пример кода для разных пользователей, с паролями и без паролей, но безрезультатно. Что касается расширений, я не устанавливал их с тех пор, как впервые установил XAMPP. Я не могу найти php_mssql.dll нигде. Я попробовал эхо ($ MYSQL_TCP_PORT); вот что я получаю. Примечание: неопределенная переменная: MYSQL_TCP_PORT в /opt/lampp/htdocs/test.php в строке 2. Другие настройки в php.ini ничего не меняют в моей проблеме. Shawn 14 лет назад 0
Попробуйте посмотреть на панели управления XAMPP: Приложения -> Другое -> Панель управления XAMPP. Если вы не установили пароль, то по умолчанию он пуст. Если вы ** установили ** пароль, в используемом вами примере он пустой, поэтому соединение не будет установлено (но я не ожидаю сбоя). Вы не должны ** найти ** php_mssql.dll, это Windows DLL - однако, если вы случайно включили это расширение, могут произойти все виды плохих вещей. Вы должны рассмотреть запуск `/ opt / lampp / lampp security` DaveParillo 14 лет назад 0
Это интересно. Мне всегда было интересно, почему на вкладке приложений нет записи для XAMPP. Действительно, я не могу найти ссылку «Другие», о которой вы говорите. В приложениях у меня есть только Аксессуары, Игры, Графика, Интернет, Офис, Программирование, Звук и Видео, Системные инструменты и Добавить / Удалить ... И я не могу найти ничего, связанного с XAMPP. Я просто запускаю XAMPP с помощью sudo / opt / lampp / lampp start Shawn 14 лет назад 0
Быстрая проверка безопасности ... Ваши страницы XAMPP НЕ защищены паролем. Вы хотите установить пароль? [да] нет MySQL доступен через сеть. Обычно это не рекомендуется. Вы хотите, чтобы я выключил его? [да] да ... у пользователя MySQL / phpMyAdmin pma пароль не установлен !!! Вы хотите установить пароль? [да] да ... Установка нового пароля MySQL pma. Установка пароля pma phpMyAdmin на новый. MySQL не имеет установленного корневого пароля !!! Вы хотите установить пароль? [да] нет Пароль FTP для пользователя «nobody» по-прежнему имеет значение «lampp». Вы хотите сменить пароль? [да] нет Готово. это хорошо? Shawn 14 лет назад 0
Можете ли вы подключиться с помощью phpMyAdmin? DaveParillo 14 лет назад 0
Shawn - I was able to reproduce your problem & have a solution. There was nothing wrong with your install. It's the code. Checkout my updated answer. DaveParillo 14 лет назад 0
Подключение с phpMyAdmin работает. Я попробовал последний код, который вы опубликовали. Все работает, я получаю список всех баз данных. Но после этого, когда выполняется оператор mysql_close (), я получаю «Предупреждение: Неизвестно: 1 набор (-ов) не освобожден. Используйте mysql_free_result для освобождения наборов результатов, которые были запрошены с помощью mysql_query () в строке« Неизвестно »в строке 0». Я попытался слегка изменить ваш код, просто убрав параметр из оператора mysql_close ($ db) (используя вместо этого mysql_close ()), и в результате Firefox предложил загрузить файл! Что это значит? Shawn 14 лет назад 0
When firefox offers to download a file, it's because it doesn't know how to render your page in the browser. In this case, probably because there is no output. Actually, my code would be more correct to have the close statement inside the else. I don't see this error on my install, also on 9.04. Strictly speaking, the close isn't needed as you are not opening a persistent connection. Does removing the close line help? DaveParillo 14 лет назад 0
Тот же скрипт без mysql_close (); оператор работает так же, как и когда mysql_close ($ db) ;: страница отображается с предупреждением. Так что я думаю, что предупреждение не касается оператора mysql_close. Может быть, это касается автоматического закрытия соединения? Shawn 14 лет назад 0
Even when I reproduced your other symptoms, I never saw this particular warning - I thought your problems were mostly a) you thought your connection was core dumping and b) firefox was not executing your script, but offering to save it. The bottom line is that the mysql_close() call in not needed in this situation. See the php page in freeing resources: http://us.php.net/manual/en/language.types.resource.php#language.types.resource.self-destruct. DaveParillo 14 лет назад 0
Если на ваших веб-страницах по-прежнему появляются предупреждения, возможно, вы оставили параметр display_errors = On в вашем файле php.ini. DaveParillo 14 лет назад 0
Вы думаете, что мое использование mysql_close, когда оно не нужно, вызывает проблему? И если так, то почему на моем сервере, а не на другом (и не на сервере, который я настроил на другом компьютере)? Что касается ошибок, почему я их получаю? Они явно указывают на то, что что-то не так, поэтому я хотел бы решить их, а не просто сказать «не показывать их». Возможно, была бы справочная страница, где сообщения об ошибках объясняются более подробно? Shawn 14 лет назад 0
Start with the http://us.php.net/mysql_close man page. It states that you usually don't need to call mysql_close and that if there is no resource to free when called, it throws an error. Your other installations are using different OS's and possibly different php versions. Frankly, different behavior, especially in how freeing resources is handled would not suprise me. DaveParillo 14 лет назад 0
О, я думаю, я наконец понял, что получение этого предупреждения - НОРМАЛЬНОЕ поведение. Будет ли это потому, что я получил доступ к каждой возвращаемой строке с помощью mysql_fetch_array, поэтому другие ресурсы не нужно освобождать? Тем не менее, при завершении сценария php по-прежнему проверяет наличие любого несвободного ресурса. Я правильно понял? Shawn 14 лет назад 0
Ты понял! 8-) DaveParillo 14 лет назад 0
0

Я столкнулся с точно такой же ошибкой. Убедитесь, что пользовательские привилегии mysql установлены правильно.

Войдите в командную строку и подтвердите, что вы можете войти, переключиться на соответствующую базу данных и просмотреть таблицы и записи. Просто войдите в систему с помощью команды: 'mysql -u user -p' и запустите некоторые запросы.