Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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);//$exp = fopen("produto_exportado.csv","w");
//fwrite($exp, "titulo; preco; url; imagem \n ");
$n = 0;
foreach ($xml as $campo=> $valor) $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'); $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');
} $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'); $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;
} 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
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
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);
}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
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.
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é?
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.
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
une o sistema com jquery,
a cada 100 registros inseridos você pede pra ele dar 1min de descanço no serveer
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 23
Warning: XMLReader::expand() [xmlreader.expand]: <link in /home/click264/public_html/importacao/dafiti_sports.php on line 23
Warning: XMLReader::expand() [xmlreader.expand]: ^ in /home/click264/public_html/importacao/dafiti_sports.php on line 23
Warning: XMLReader::expand() [xmlreader.expand]: An Error Occured while expanding in /home/click264/public_html/importacao/dafiti_sports.php on line 23
Catchable 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
Hospedagem compartilhada não serve para rodar recursos pesados, o aconselhável é você contratar um servidor dedicado, cloud ou VPS.
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
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.