Como solucionar um script PHP que causa uma falha de Segmenação?

1

Eu postei isso no stackoverflow.com também porque não tenho certeza se isso é um problema de programação ou um problema no servidor. Estou usando o ubuntu 9.10, apache2, mysql5 e php5.

Eu notei um problema incomum com alguns dos meus programas php. Às vezes, ao visitar uma página como profile.edit.php, o navegador lança uma caixa de diálogo pedindo para baixar a página profile.edit.php. Quando eu baixá-lo, não há nada no arquivo. profile.edit.php deve ser um formulário da web que edita informações do usuário.

Eu notei isso em algumas das minhas outras páginas php também. Eu olho nos meus logs de erro do apache e vejo uma mensagem de falha de segmentação:

[Mon Mar 08 15:40:10 2010] [notice] child pid 480 exit signal Segmentation fault (11)

E também, o problema pode ou não aparecer dependendo de qual servidor eu implantar meu aplicativo também.

Detalhes adicionais Isso não acontece o tempo todo embora. Isso só acontece às vezes. Por exemplo, profile.edit.php será carregado corretamente. Mas assim que eu apertar o botão salvar (formulário action="profile.edit.php? Save = true"), a página me pede para fazer o download de profile.edit.php. Será que às vezes meus scripts php consomem muitos recursos?

Código de amostra

Após salvar a ação, meu profile.edit.php inclui um arquivo data_access_object.php. Eu tracei o código em data_access_object.php para esta linha aqui

 if($params[$this->primaryKey])
 {
                        $q = "UPDATE $this->tableName SET ".implode(', ', $fields)." WHERE ".$this->primaryKey." = ?$this->primaryKey";
                        $this->bind($this->primaryKey, $params[$this->primaryKey], $this->tblFields[$this->primaryKey]['mysqlitype']);
}
 else
{
$q = "INSERT $this->tableName SET ".implode(', ', $fields);
}
// Code executes perfectly up to this point
// echo 'print this'; exit; // if i uncomment this line, profile.edit.php will actually show 'print this'.  If I leave it commented, the browser will ask me to download profile.edit.php
if(!$this->execute($q)){ $this->errorSave = -3; return false;}
// When I jumped into the function execute(), every line executed as expected, right up to the return statement.  

E se isso ajudar, aqui está a função execute ($ sql) em data_access_object.php

function execute($sql)
{

        // find all list types and explode them
        // eg. turn ?listId into ?listId0,?listId1,?listId2 
        $arrListParam = array_bubble_up('arrayName', $this->arrBind);

        foreach($arrListParam as $listName)
           if($listName)
           {
                $explodeParam = array();
                $arrList = $this->arrBind[$listName]['value'];
                foreach($arrList as $key=>$val)
                {
                        $newParamName = $listName.$key;
                        $this->bind($newParamName,$val,$this->arrBind[$listName]['type']);
                        $explodeParam[] = '?'.$newParamName;
                }
                $sql = str_replace("?$listName", implode(',',$explodeParam), $sql);
           }

        // replace all ?varName with ? for syntax compliance
        $sqlParsed = preg_replace('/\?[\w\d_\.]+/', '?', $sql);
        $this->stmt->prepare($sqlParsed);

        // grab all the parameters from the sql to create bind conditions
        preg_match_all('/\?[\w\d_\.]+/', $sql, $matches);
        $matches = $matches[0];

        // store bind conditions
        $types = ''; $params = array();
        foreach($matches as $paramName)
        {
                $types .= $this->arrBind[str_replace('?', '', $paramName)]['type'];
                $params[] = $this->arrBind[str_replace('?', '', $paramName)]['value'];
        }

        $input = array('types'=>$types) + $params;



        // bind it
        if(!empty($types))
        call_user_func_array(array($this->stmt, 'bind_param'), $input);

        $stat = $this->stmt->execute();
        if($GLOBALS['DEBUG_SQL'])
                echo '<p style="font-weight:bold;">SQL error after execution:</p> ' . $this->stmt->error.'<p>&nbsp;</p>';

        $this->arrBind = array();
        return $stat;
}
    
por John 08.03.2010 / 21:59

1 resposta

2

PHP geralmente segfaults por causa da recursão infinita. Se for esse o caso (embora eu não veja nenhum no código que você postou), instale a extensão XDebug que adiciona um limite de recursão seguro e emitirá um erro normal.

Caso contrário, pode ser bug no próprio PHP. Experimente uma versão mais recente (você encontrará uma de última geração em snaps.php.net )

    
por 08.03.2010 / 23:41