Ir para conteúdo

POWERED BY:

Arquivado

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

Brambilla

Importar XML => PHP Pesado

Recommended Posts

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

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

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

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

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

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

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

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

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

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

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

×

Informação importante

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