Brambilla 0 Denunciar post Postado Novembro 23, 2012 Bom dia estou com problemas em importar arquivo XML muito Grande, devido a operação que tem que fazer gravar no Banco ele é derrubado a conexão e dando o Erro 500 avisando sobre o tempo limite da conexão o que eu poderia fazer para executar o arquivo sem problemas, o servidor é Windows <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <?php set_time_limit(0); require("../include/config.php"); require("../include/funcao.php"); $id_cliente = 721; // compra facil $url = ("http://www.integracaoafiliados.com.br/xml/comprafacil/?id_afiliado=5331gr35"); $url = urlencode($url); $xml = simplexml_load_file($url); /* Lê o arquivo XML e recebe um objeto com as informações */ /* Percorre o objeto e imprime na tela as informações de cada contato */ //$exp = fopen("produto_exportado.csv","w"); //fwrite($exp, "titulo; preco; url; imagem \n "); $n = 0; foreach ($xml as $campo=> $valor) { $n++; if($n == 1000) {$n = 0; sleep(50);} $cip_prod = $valor->CIP; $url = $valor->URL ; $titulo = $valor->NOMEPRODUTO; $desc = $valor->DESCRICAO; $desc = nl2br($desc); $desc = addslashes($desc); $desc = mysql_real_escape_string($desc); $categoria = $valor->DEPARTAMENTO; $desc_sub = $valor->SUBDEPARTAMENTO; $tamanho = $valor->REFERENCIAS->REFERENCIA->TAMANHO; $ativo = $valor->REFERENCIAS->REFERENCIA->ATIVO; $caracteristicas = $valor->REFERENCIAS->REFERENCIA->VARIACAOREFERENCIA->CARACTERISTICAS->CARACTERISTICA; $preco = $valor->REFERENCIAS->REFERENCIA->PRECODE; $preco_por = $valor->REFERENCIAS->REFERENCIA->PRECOPOR; $img = $valor->REFERENCIAS->REFERENCIA->URLIMAGEM; echo '------ <br>CIP:'.$cip_prod; echo '<br>url_prod: '.$url; echo '<br>Titulo: '.$titulo; echo '<br>Desc:: '.$desc; echo '<br>Categoria: '.$categoria; echo '<br>Sub Categoria: '.$desc_sub; echo '<br>Tamanho: '.$tamanho; echo '<br>Ativo: '.$ativo; echo '<br>Caracteristicas: '.$caracteristicas; echo '<br>Preco DE: '.$preco; echo '<br>PRECO POR: '.$preco_por; echo '<br>img: '.$img; echo '<br>status: '; //print_r($valor); $sq_ca=Fsql("select * from setor where desc_setor = '$categoria' and id_cliente = '$id_cliente'", '1. con cat'); if(mysql_num_rows($sq_ca)) { $dd_ca=mysql_fetch_array($sq_ca); $id_setor = $dd_ca['id_setor']; Fsql("update setor set atualiza_setor=1 where id_setor='$id_setor'", 'up sta'); } else { $in1=Fsql("insert into setor (desc_setor, id_cliente, ativa_setor, atualiza_setor) values ('$categoria', '$id_cliente', 1, 1)", '2. in cat'); $id_setor = mysql_insert_id(); } if($desc_sub != '') { $sq_su=Fsql("select * from sub_cat where desc_sub = '$desc_sub' and id_setor='$id_setor' and id_cliente = '$id_cliente'", '3 con sub'); if(mysql_num_rows($sq_su)) { $dd_su=mysql_fetch_array($sq_su); $id_sub = $dd_su['id_sub']; Fsql("update sub_cat set atualiza_sub=1 where id_sub='$id_sub'", 'up sta'); } else { Fsql("insert into sub_cat (desc_sub, id_setor, id_cliente, ativa_sub, atualiza_sub) values ('$desc_sub', '$id_setor', '$id_cliente', 1, 1)", '4 in sub_cat'); $id_sub = mysql_insert_id(); } } $sq_ve=Fsql("select * from produto where cod_produto = '$cip_prod' and id_cliente='$id_cliente'", '5. Ver Prod'); if(mysql_num_rows($sq_ve)) { $dd_pr=mysql_fetch_array($sq_ve); $id_produto = $dd_pr['id_produto']; Fsql("update produto set titulo_produto = '$titulo', valor_produto = '$preco', pre_por_produto = '$preco_por', url_produto = '$url', desc_produto = '$desc', id_setor = '$id_setor', id_sub = '$id_sub', quant_produto=1, atualiza_produto=1 where cod_produto = '$cip_prod' and id_cliente ='$id_cliente'", '4. Up Prod'); if($img != '') { Fsql("update foto set caminho_foto='$img' where id_produto = '$id_produto'", '5, up img'); } echo 'Atualizado'; $tamanho; $caracteristicas; } else { Fsql("insert into produto (titulo_produto, cod_produto, valor_produto, pre_por_produto, url_produto, desc_produto, id_cliente, ativa_produto, id_setor, id_sub, quant_produto, atualiza_produto) values ('$titulo', '$cip_prod', '$preco', '$preco_por', '$url', '$desc', '$id_cliente', 1, '$id_setor', '$id_sub', '1', 1)", '6. In Prod'); if($img != '') { $id_produto = mysql_insert_id(); Fsql("insert into foto (id_produto, caminho_foto) values ('$id_produto', '$img')", '7 in foto'); } echo 'Inserido'; } echo '<br>----------------------<br><br>'; } ?> Att. Brambilla Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Novembro 23, 2012 Uma sugestão seria ao invés de usar simplexml_load_file() seria você usar simplexml_load_string() sendo o argumento dessa função uma string lida com fread() a partir de uma stream aberta com fopen(). O motivo dessa sugestão é que através de fseek() você consegue mover o ponteio de leitura para outra parte do arquivo. Dessa forma, ao invés de usar sleep() você pode simular uma paginação indireta controlando a posição à qual você procurará via querystring, de forma automática por ecoar uma tag meta refresh. Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Novembro 23, 2012 Se o XML for realmente muito grande, então DOM ou SimpleXML não vai resolver seu problema. O que acontece é que, para ler o XML dessa forma, todo o conteúdo deve ser carregado em memória. Em vez do SimpleXML ou DOM, utilize XMLReader :seta: http://php.net/manual/en/book.xmlreader.php Compartilhar este post Link para o post Compartilhar em outros sites
amixel 0 Denunciar post Postado Novembro 23, 2012 Você pode baixar o arquivo XML no seu servidor e dividir em partes e ler. por cada parte. assim, você vai poderá dividir o procesamento em partes, é uma ideia somente, também a ideia Joao Neto é Boa. aqui tenho uma função para baixar o arquivo: /// função para fazer download de uma imagem ou arquivo. function download($url,$destino) { $ch = curl_init($url); $fp = fopen($destino, "w+"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_TIMEOUT, 120000); curl_setopt($ch, CURLOPT_FILE, $fp); curl_exec($ch); curl_close($ch); fclose($fp); } Compartilhar este post Link para o post Compartilhar em outros sites
Brambilla 0 Denunciar post Postado Novembro 28, 2012 Gostei das dica já estou vendo para fazer com o XMLReader como faria em cima deste código, alteraria muito? Obrigado Boa noite estou tentando a dica do João Batista Neto usando o XMLReader os valores estão vindo, esta se repetindo várias vezes o mesmo produto, teria como pegar uma vez o valor? $xml = new XMLReader(); $xml->open($url); while ($xml->read()) { if( $xml->nodeType == XMLReader::ELEMENT ) { $campo = $xml->localName; //echo $campo.' | '; if ( $xml->read()) { $valor = $xml->value; if($campo == 'URL' && $valor != '') { $url = $xml->value ; } if($campo == 'NOMEPRODUTO' && $valor != '') { $produto = $xml->value; } if($campo == 'CIR' && $valor != '') { $cip_prod = $xml->value ; } if($campo == 'DESCRICAO' && $valor != '') { $desc = $xml->value ; } if($campo == 'DEPARTAMENTO' && $valor != '') { $categoria = $xml->value ; } if($valor != '') { echo '-- <strong>CIP:</strong> '.$cip_prod.'<br> <strong>Nome:</strong> '.$produto.'<br> <strong>URL:</strong> '.$url.'<br /> <strong>Descrição: </strong>'.$desc.'<br /> <strong>Categoria:</strong> '.$categoria; } } } //echo '<br>'; } Att. Brambilla Bom consegui pegar os valores seguindo esta tutorial http://www.vrusso.com.br/blog/2009/05/manipulando-xml-em-grande-escala-com-php/ bom o fato que voltei a estaca 0 continua dando o erro que estava dando Error Summary HTTP Error 500.0 - Internal Server Error c:\php\php-cgi.exe - The FastCGI process exceeded configured request timeout o que mais eu poderia fazer? o servidor é Windows Compartilhar este post Link para o post Compartilhar em outros sites
Leozitho 81 Denunciar post Postado Novembro 28, 2012 Como a mensagem de erro informa está passando do tempo limite configurado no FastCGI, daí da erro de timeout. Você está rodando o PHP com IIS? Se for, é provável que o arquivo de configuração do FastCGI esteja no seguinte caminho: C:\Windows\System32\inetsrv\fcgiext.ini O que você precisa fazer é localizar este arquivo de configuração e alterar o tempo de timeout. Compartilhar este post Link para o post Compartilhar em outros sites
Brambilla 0 Denunciar post Postado Novembro 28, 2012 Isso mesmo Leozitho Aparece o FastCGI mesmo, problema que esta hospedado no UolHost e eu creio que não consigo alterar, estou aguardando o retorno deles. Direto no código eu colocar o time_limit ou algo assim não funcionaria também né? Compartilhar este post Link para o post Compartilhar em outros sites
Leozitho 81 Denunciar post Postado Novembro 28, 2012 Você utiliza apenas PHP em sua aplicação? Se sim, eu recomendo que solicite a migração para um servidor Linux, o Windows não é o mais indicado para rodar aplicações PHP em ambiente de produção. Direto no código eu colocar o time_limit ou algo assim não funcionaria também né? Não funcionaria, pois o timeout não está ocorrendo no PHP. Compartilhar este post Link para o post Compartilhar em outros sites
Brambilla 0 Denunciar post Postado Setembro 10, 2013 Oláestou utilizando agora Linux hospedagem Hostgator para fazer leitura do XML sem problemas, mais para consultar e atualizar o banco (mysql) está dando problemas tentei utilizar o flush(); e o sleep() a cada 1000 registros; para exibir o andamento e para dar um respiro no servidor em algum momento ele está dando o erro e para por ai Extra content at the end of the document xml no xmlreader: expand se for recomeçado vai até um momento e ocorre isso teria como fazer o processo inteiro sem ocorrer este erro? Obrigado Compartilhar este post Link para o post Compartilhar em outros sites
eduardoherden 9 Denunciar post Postado Setembro 10, 2013 une o sistema com jquery, a cada 100 registros inseridos você pede pra ele dar 1min de descanço no serveer Compartilhar este post Link para o post Compartilhar em outros sites
Brambilla 0 Denunciar post Postado Setembro 11, 2013 Consegui utilizar o sleep mesmo coloquei a cada 300 linhas dar um intervalo de 10 segundos mais ele faz um numero de registros e chega dar um erro Warning: XMLReader::expand() [xmlreader.expand]: http://v2.afilio.com.br/aff/aff_get_boutique.php?boutiqueid=28291-895654:74224: parser error : Couldn't find end of Start Tag link in /home/click264/public_html/importacao/dafiti_sports.php on line 23Warning: XMLReader::expand() [xmlreader.expand]: <link in /home/click264/public_html/importacao/dafiti_sports.php on line 23Warning: XMLReader::expand() [xmlreader.expand]: ^ in /home/click264/public_html/importacao/dafiti_sports.php on line 23Warning: XMLReader::expand() [xmlreader.expand]: An Error Occured while expanding in /home/click264/public_html/importacao/dafiti_sports.php on line 23Catchable fatal error: Argument 1 passed to DOMDocument::importNode() must be an instance of DOMNode, boolean given in/home/click264/public_html/importacao/dafiti_sports.php on line 25 o que seria isso? att. Brambilla Compartilhar este post Link para o post Compartilhar em outros sites
Leozitho 81 Denunciar post Postado Setembro 11, 2013 Hospedagem compartilhada não serve para rodar recursos pesados, o aconselhável é você contratar um servidor dedicado, cloud ou VPS. Compartilhar este post Link para o post Compartilhar em outros sites
Brambilla 0 Denunciar post Postado Outubro 3, 2013 Iremos mudar mesmo, mais não nada que eu possa resolver até mudarmos de servidor? estou tentando ler o xml desta forma $xml = new XMLReader();$xml->open($url);while ($xml->read()) { switch ($xml->nodeType) { case (XMLReader::ELEMENT): { if($xml->localName == "produto") { } } } } Mais estou com este problema Warning: XMLReader::read() [xmlreader.read]: URL_XML:1: parser error : Document is empty in /home/XXX/public_html/importacao/TESTE.phpon line 14 Warning: XMLReader::read() [xmlreader.read]: <?xml version="1.0" encoding="UTF-8"?> in/home/XXX/public_html/importacao/TESTE.php on line 14 Warning: XMLReader::read() [xmlreader.read]: ^ in /home/XXX/public_html/importacao/TESTE.php on line 14 Warning: XMLReader::read() [xmlreader.read]: An Error Occured while reading in /home/XXX/public_html/importacao/TESTE.php on line 14 O que poderia ser? Obrigado Compartilhar este post Link para o post Compartilhar em outros sites