Pergunta

Estou tendo problemas usando a classe mysqli em PHP e eu não tenho sido capaz de encontrar a qualquer lugar resposta.

No meu script uma classe cria uma conexão mysqli que ele usa toda sua funções. Depois, esse script Forks. A ligação é utilizado pelas crianças, bem como, mas eu estou correndo para o problema da conexão que está sendo fechado (Servidor MySQL foi embora) no pai quando os filhos morrem.

Antes de eu mudei para mysqli (estava apenas usando mysql) Eu simplesmente chamado mysql_ping para garantir que a conexão db estava lá antes de realizar a consulta no processo pai. Mysqli tem uma função de ping semelhantes, mas que na verdade não se reconectar se a conexão é ido. Eu tentei usar o mysqli.reconnect = ON configuração global sem sorte (usando php.ini e ini_set).

A função php mysql_connect permite que você pegue uma conexão já existente, por isso, se eu estava usando mysql em vez de mysqli, eu poderia simplesmente reutilizar a conexão no direito da criança após o processo bifurcada. MAS mysqli não parecem ter qualquer funcionalidade ...

A única coisa que eu podia fazer era chamada mysqli-> ping () e se essa falsa voltou então reconectar-se ao banco de dados no pai. Isto é terrivelmente ineficiente, e eu seria muito melhor descobrir como fazê-lo corretamente com mysqli (e sem necessidade de reconecta manuais) que ter que mudar de volta para mysql ..

Todas as sugestões?

Foi útil?

Solução

O doc para mysqli_ping() diz que se você definir a opção global mysqli.reconnect a 1 (no seu php.ini), então mysqli_ping() irá reconectar quando detecta a conexão desapareceu.

Update: Desde que eu respondi a essa pergunta em 2009, PHP tem a maioria mudou-se para usar o mysqlnd motorista por padrão, em vez de libmysql . Como mencionado no comentário abaixo, mysqlnd não suporta a função mysqli_ping(), e os desenvolvedores PHP fez isso intencionalmente, de acordo com o seu "não corrigir" resposta em https://bugs.php.net/bug.php?id=52561

Assim parece haver nenhuma solução para a reconexão automática no PHP mais.

Outras dicas

u pode tentar algo um pouco diferente .. em vez de pingue .. tentar enviar uma consulta de baixa intensidade realmente simples como "escolha agora ()" e veja se você obter quaisquer resultados melhores.

Você não pode usar conexões persistentes? Além disso, é que realmente necessário para fork ()?

function IsConnected() {
    if (empty($this->_connectionID) === FALSE && mysqli_ping($this->_connectionID) === TRUE) {
        return true; // still have connect
    }
    $this->_connectionID = false;
    return false; // lose connection
}

Use http://www.php.net/manual/ en / mysqli.real-connect.php ... reinstalação php e verificar suas configurações php.ini

Eu acho que você precisa mysqli.reconnect set em my.cng, que é a configuração mysql, ao invés de php.ini, eu não conseguia mudar reconexão através ini_set, mas meu administrador de sistemas fez isso em my.cnf .

Assim, pouco confuso que outros têm feito isso dentro php.ini ....

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top