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> </p>';
$this->arrBind = array();
return $stat;
}