SC_LOOKUP + CURL = Mysql server has gone away

Olá,

Tenho uma aplicação do tipo blank, e nela tenho um código semelhante ao abaixo:

[code]$sql1 = “comando SELECT SQL”;
sc_lookup(rst1, $sql1);

foreach({rst1} as $v)
{
$sql2 = “COMANDO SELECT SQL”;
sc_lookup(rst2, $sql2);

foreach({rst2} as $v2)
{
/CODIGO PARA COMUNICACAO EXTERNA VIA CURL/
}
}[/code]

O código acima apenas executa um select e pra cada registro percorrido executa outro e também o percorre, e para cada item é executado o CURL para outro servidor, e propositalmente este script chamado consome 4 segundos para responder.

E como resultado após 10 segundos o erro mysql server has gone away PDO:execute() é retornado.

Mesmo que eu faça os selects acima, armazene o resultado em outro array, e depois faça a conexão com CURL o erro é o mesmo.

Precisaria ajustar esse tempo no BD, mas não tenho essa opção por ser compartilhado.

A solução é abrir a conexão e fechar em seguida, para cada ciclo do foreach, dessa forma o tempo limite não será excedido. Utilizando os comandos nativos do PHP é possível fazer isso, porém perco as facilidades de gerenciamento de conexões do scriptcase (V9), que é não precisar deixar senha e usuário e host no código fonte, e sim num gerenciador do scriptcase.

Não encontrei alguma macro do scriptcase para fazer abertura e fechamento de conexão.

Alguém pode me dar uma força?

Obrigado desde já.

O sc_lookup é só usado para checar se um registro existe ou pegar uns campos de retorno de um registro.

Para abrir uma tabela / SQL para rotinas que vão retornar várias linhas/registros, use o sc_select,
com o sc_select, você pode fechar a conexão depois de usar.

Modelo Exemplo do uso do sc_lookup:

/* Macro sc_select */

$sql ="
SELECT
    CodigoClienteID,
    NomeCliente,
    CPF
FROM
    clientes
";

sc_select(meus_dados, $sql);

/* Erro no select */
if ({meus_dados} === false) {
     // Sua Base + _erro
	 sc_error_message("Ocorreu um erro no acesso ao<BR>banco de dados: {meus_dados_erro}.<BR>");
}
else {

	 /* Inclua aqui sua rotina de processamento */

	 // Qtde de Registros Retornados.
	 $QtdeRegistros=$meus_dados->RecordCount();

     if ($meus_dados->EOF) {

         sc_error_message("Nenhum valor foi retornado pelo banco.<BR>");	 
	 
	 } else {

		 while (!$meus_dados->EOF) {
		 
				{CodigoClienteID} = $meus_dados->fields[0]; // ou $meus_dados->fields['CodigoClienteID']
				{NomeCliente} = $meus_dados->fields[1]; // ou $meus_dados->fields['NomeCliente']
				{CPF} = $meus_dados->fields[2]; // ou $meus_dados->fields['CPF']
				
				// Avança para o próximo registro do BANCO DE DADOS.
				$meus_dados->MoveNext();
				
		 } // while (!$meus_dados->EOF)
	 
	 } // if ($meus_dados->EOF)	 
	 
	 // Limpa tudo até a conexão
	 $meus_dados->Close();

} // sc_select(meus_dados,    ** Nao deixar aspas aqui...

Resolveu o problema, muito obrigado!