Por que o PHP lança “Falha de segmentação (11)” depois de “mysql_connect”, ou sobre “mysql_close”?

1

Tenho o Ubuntu-9.04 e estou usando o XAMPP-1.7.2 para desenvolver um aplicativo da web. O problema é que quando eu tento visualizar um arquivo PHP que eu escrevi, visitando localhost/folder/file.php , o Firefox me oferece para baixá-lo em vez de me mostrar o arquivo como uma página da web. Se eu baixar e abrir no meu editor de texto favorito, eu recebo um arquivo vazio sem nada ...

UPDATE: funciona em outro servidor Bem, eu carreguei a página para outro servidor, e posso ver tudo bem! Então o problema não é com o Firefox. Nem é com o código em si. Meu servidor ou sua configuração deve ser o problema. Isso dá a qualquer um de vocês uma pista sobre o que está acontecendo?

UPDATE: isolando o problema O Firefox oferece para baixar apenas o primeiro desses três arquivos:

test1.php é oferecido como um download

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

outputs de test2.php : Aviso: mysql_close (): nenhum recurso do MySQL-Link fornecido em /opt/lampp/htdocs/test.php na linha 3

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

test3.php gera uma página em branco

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

Eu sei que meu servidor está funcionando e ele me diz que o PHP5 está ligado e funcionando também.

Aqui está o que eu recebo no log de erros do XAMPP quando o problema ocorre (truncado e formatado para clareza):

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

Ah, e o Firefox pode ver o arquivo sem um problema no meu outro computador (Windows XP SP3 e EasyPHP como servidor) Alguém sabe o que posso fazer para resolver este problema?

UPDATE: usando error_log ()

Aqui está minha tentativa de usar 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");
?>

Isto é o que produz no log de erros do XAMPP (trucado para maior clareza):

[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)
    
por Shawn 24.09.2009 / 17:03

4 respostas

1

Cheira a sua instalação do mysql. O mysql está sendo executado como um serviço? Sua conta root realmente não tem senha? Quais extensões do mysql são carregadas no php.ini? Há um php_mssql.dll que pode ser facilmente confundido com php_msql.dll , mas tenho certeza de que php_mssql.dll é apenas para janelas.

Você editou seu arquivo php.ini /opt/lampp/php/php.ini? Isso pode ajudar na depuração:

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

Também vale a pena olhar, o número da porta usado. $ MYSQL_TCP_PORT está definido? Como sobre a entrada mysql-tcp em / etc / services?

Atualização: Você já tentou verificar o valor de retorno da função de conexão? Eu estou querendo saber se o seu exemplo é muito pequeno. Tente fazer com que seu teste seja assim:

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

?> 

Este exemplo garante que você envie algo que se pareça com HTML, se o script falhar ou não. Consegui reproduzir os seus sintomas sem definir a senha do root, portanto, aparentemente, não é apenas uma boa prática, mas é necessário que ela não seja vazia.

Consegui transformar seu problema em uma solução por

  1. Definindo a senha do root
  2. retornando algo do script ao conectar

Em vez de passar "" como a senha de root, se realmente não for nada, tente usar mysql.default_password como senha. O valor padrão para mysql.default_password é NULL.

    
por 25.09.2009 / 21:55
2

Isso pode ser um problema de hardware ou um problema de configuração do Apache / PHP. Eu geralmente vejo o Sinal 11 com problemas de memória. Observe as suas configurações para garantir que o limite de memória do PHP não seja maior do que o limite de memória do Apache ou semelhante.

Parece que o seu php_mod está travando no meio do programa, então o Apache está apenas lançando o arquivo php em você com um cabeçalho de tipo de conteúdo não-html, o que faz com que o seu navegador o trate como um download. Isso é apenas um palpite, no entanto. Você precisa coletar mais algumas informações.

Adicione algumas chamadas error_log() ao seu programa PHP para que você possa isolar quando a falha realmente ocorrer no seu código. Se isso não ajudar a restringi-lo, configure o Apache para criar um core dump e use gdb para descobrir onde o segfault começa. Minha aposta é mod_php.so.

    
por 24.09.2009 / 20:27
1

Você diz que tudo está funcionando e que arquivos simples estão aparecendo bem. Mas, em seguida, alguns arquivos estão solicitando que você salve o arquivo PHP. Isso significa que você terá que verificar o código das páginas em que está quebrando e pedindo para salvar.

É mais do que provável que você tenha uma linha no código que esteja matando o servidor ou apenas fazendo com que pare de analisar o PHP.

Esta pode ser uma extensão específica que está sendo usada por aquela página ou pode ser outra função killbot que dificulta o servidor de ficar sentado ali com os braços cruzados.

Seus logs de erro mostram que a última coisa a acontecer antes de empurrar a caixa de diálogo de salvamento na sua face é uma conexão com o banco de dados. Siga o código de volta para isso e certifique-se de que ele esteja sólido antes de passar para a próxima possível trilha de problemas que pode ou não surgir.

Como você pode ver o arquivo sem problemas em outro setup, neste caso o easyPHP, o problema é muito sobre a configuração do XAMPP e uma configuração que está sendo ativada pelo código.

    
por 24.09.2009 / 17:39
0

Eu encontrei exatamente o mesmo erro. Certifique-se de que os privilégios de usuário do mysql estão definidos corretamente.

Faça o login na linha de comando e confirme que você é capaz de fazer login, alternar para o banco de dados relacionado e visualizar tabelas e registros. Basta entrar com o comando: 'mysql -u user -p' e disparar algumas consultas.

    
por 26.10.2009 / 16:20