Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Rafael_Estefano

Tempo de resposta muito alto

Recommended Posts

Bom dia a todos.

Meu problema é o seguinte:

Estou acessando um xml com um login e uma senha, este xml retorna um id de acesso, pego esse id de acesso para acessar um outro xml que me traz uma listagem de produtos e várias informações sobre cada produto.

Quanto executo este processo e o retorno é menos que até uns 150 produtos vai tranquilo, ele me retorna todos os dados que preciso, mas quando a quantidade de produtos retornados é maior que isso, dá um erro de execução.

 

a função que faz este processo é a seguinte:

 

    function atualiza($idUsuario){
        $filename = "http://xxxxx/consulta?tipoRetorno=XML&nomeClasse=Consulta.Produto&sessionID=".$idUsuario."&idFilial=3&retornarImagens=0&numeroRegistros=10000";
        echo "$filename<BR>";
        $xmlDoc = new DOMDocument();
        $xmlDoc->load($filename);
        $no = $xmlDoc->getElementsByTagName("consulta");
        foreach ($no as $no){
            $no2 = $no->getElementsByTagName("objeto");

            foreach ($no2 as $no2){
                $codigo = $no2->getAttribute("Codigo");
                $descricao = $no2->getAttribute("Descricao");
                $precoVenda = number_format((double)$no2->getAttribute("PrecoVenda"), 2, ",", ".");
                $estoque = $no2->getAttribute("Estoque");
                echo "$codigo - $descricao - R$$precoVenda - $estoque<BR>";
            }
        }
    }

Alguma sugestão do que possa fazer pra resolver o problema?

 

Desde já agradeço pela colaboração.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu acho que você pode fazer só um foreach e tirar algumas atribuições desnecessárias:

Trocar isto

        foreach ($no as $no){
            $no2 = $no->getElementsByTagName("objeto");

            foreach ($no2 as $no2){
                $codigo = $no2->getAttribute("Codigo");
                $descricao = $no2->getAttribute("Descricao");
                $precoVenda = number_format((double)$no2->getAttribute("PrecoVenda"), 2, ",", ".");
                $estoque = $no2->getAttribute("Estoque");
                echo "$codigo - $descricao - R$$precoVenda - $estoque<BR>";
            }
        }

Por isto

foreach ($no->getElementsByTagName('objeto') as $no2)
{
    $precoVenda = number_format((double)$no2->getAttribute("PrecoVenda"), 2, ",", ".");
    echo "$no2->getAttribute('Codigo') - $no2->getAttribute('Descricao') - R$$precoVenda - $no2->getAttribute('Estoque')<br />";
}

Além disto, você pode setar set_time_limit como 0.

http://br.php.net/manual/pt_BR/function.set-time-limit.php

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito Obrigado Carlos, a situação já amenizou, agora consigo extrair o relatório de até 450 produtos, porém preciso de mais do que isso, ao meu ver o que está acontecendo é que o script php tenta carregar o arquivo php, tanto é que demora um pouco pra executar, mas chega uma hora que o tempo expira e zera o arquivo e o relatório vem zerado.

 

Existe alguma forma de mandar carregar o rquivo xml e pausar o script, e constinuar executando somente quando o arquivo estiver completamente carregado?

 

Ps: boa redução de código http://forum.imasters.com.br/public/style_emoticons/default/natal_biggrin.gif

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existe alguma forma de mandar carregar o rquivo xml e pausar o script, e continuar executando somente quando o arquivo estiver completamente carregado?

 

Não entendi esta parte. O que você quis dizer?

 

Outra opção, como eu disse antes, é definir o set_time_limit como 0.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se o seu problema for lentidão, utilize uma base de dados, como o MySQL.

Usar XML dessa forma só te trará dor de cabeça, esse não é o objetivo do XML.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu utilizei o set_time limit conforme sugerido, foi o que amenizou a situação.

mas o problema está na requisição do xml, e não na execuçao do código php.

 

preecisaria de alguma coisa que só deixasse o código continuar rodando se o arquivo xml fosse completamente carregado.

 

Infelizmente não tenho acesso a base de dados da qual o sistema que gera este xml utiliza, se tivesse seria bem mais fácil.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda não consegui entender o que você quer dizer com carregar o XML inteiro antes de executar o PHP. Se for o caso, você pode trocar o DOMDocument por SimpleXML.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Também não entendi isso do XML carregar...

Bom, eu aconselharia criar alguma rotina, exportar esse XML pra um MySQL e fazer as consultas numa base de dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu posso controlar a quantidade de produtos que o xml retorna.

O que está acontecendo é que se o xml contém um quantidade grande de retornos ele começa a carregar o xml, mas parece que algum tempo expira, o xml não é carregado completamente e o relatório vem sem nenhum ítem. Se configuro o relatório para menos ítens funciona normalmente.

 

Lembrando que este xml é coletado traves de um endereço de internet. não está em arquivo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Lembrando que este xml é coletado traves de um endereço de internet. não está em arquivo.

Não tem muita diferença.

 

O que está acontecendo é que se o xml contém um quantidade grande de retornos ele começa a carregar o xml, mas parece que algum tempo expira, o xml não é carregado completamente e o relatório vem sem nenhum ítem. Se configuro o relatório para menos ítens funciona normalmente.

Claro, você apenas está limitando a quantidade de resultados a serem EXIBIDOS, mas ele abre o arquivo por completo, XML não foi feito para armazenar dados dessa forma.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não não, se você raparar na string filename, ela é constituida de um endereço com alguns parâmetros

 

$filename = "http://189.22.20.2:9090/consulta?tipoRetorno=XML&nomeClasse=Consulta.Produto&sessionID=".$idUsuario."&idFilial=3&retornarImagens=0&numeroRegistros=10000";

 

esta requisição gera um xml de acordo com os parâmetros que eu enviar, se eu colocar o parametro numeroRegistros=10, vai me retornar um xml com 10 registros e carregar bem rápido, agora se colocar numeroRegistros=1000 vai demorar bem mais tempo pra carregar e vai acontecer o problema no qual estou mencionando...

 

ficou mais claro ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Claro, mas isso não muda o que eu falei, nem mesmo o propósito do seu tópico que é obter um código que te possibilite visualizar um número maior de registros.

 

O que eu estou te dizendo até agora é que o XML não tem esse propósito que você quer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah como eu queria ter acesso À base de dados... seria tão mais fácil... hehehe

Meu problema está nesta linha:

$xmlDoc->load($filename);

 

o script estoura o tempo de carregar o xml e retorna um xml em branco.

 

Precisaria saber de alguma forma retardar o limite de tempo da função load. Está aí o meu problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue erro gerado pelo php:

 

Warning: DOMDocument::load(http://189.22.20.2:9090/consulta?tipoRetorno=XML&nomeClasse=Consulta.Produto&sessionID=BDCC59160707BA5AE9933734D2CAA930&idFilial=3&retornarImagens=0&numeroRegistros=600) [domdocument.load]: failed to open stream: HTTP request failed! in C:\Arquivos de programas\Apache Software Foundation\Apache2.2\htdocs\marc_ilha\atualizaProdutos.class.php on line 15

 

Warning: DOMDocument::load() [domdocument.load]: I/O warning : failed to load external entity "http://189.22.20.2:9090/consulta?tipoRetorno=XML&nomeClasse=Consulta.Produto&sessionID=BDCC59160707BA5AE9933734D2CAA930&idFilial=3&retornarImagens=0&numeroRegistros=600" in C:\Arquivos de programas\Apache Software Foundation\Apache2.2\htdocs\marc_ilha\atualizaProdutos.class.php on line 15

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.