fmda 0 Denunciar post Postado Abril 13, 2013 Eu estou usando este codigo abaixo, para ler um xml e gravar no banco ou apenas escrever na tela. Porém ele faz um por um e aí que vem meu problema, como faço para passar varios xml, xml1, xml2... e ele ler e gravando em tela mesmo um em baixo do outro $xml1 = simplexml_load_file('url_do_xml'); $x = 0; foreach ($xml1->Data as $gravar){ #mysql_query("INSERT INTO tabela (id, referencia) VALUES ('$gravar->Id', '$gravar->Referencia'"); if(mysql_affected_rows() != -1){ $x++; } echo "$gravar->Id<br>"; } e meu segundo problema é, quando eu passar varios xml ele vai ler todos e depois jogar na tela, mas aí se o xml for grande, ferrou vai dar timeout ou algo do tipo. como faço pra imprmir em tela a cada xml que ele le? up para ajudar, porque ta tenso, n estou consegundo Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Abril 13, 2013 Se postar a estrutura e/ou URL do XML, já ajuda. Compartilhar este post Link para o post Compartilhar em outros sites
fmda 0 Denunciar post Postado Abril 13, 2013 opa, malz. a estrutura do xml é esta (diminui pra ficar mais facil, é simples) <response> <Data> <Id>info</Id> <Referencia>url_info</Referencia> </Data> <Status>ok</Stat></response> Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Abril 13, 2013 Você tem vários nós "response" ? não rolaria postar uma estrutura completa ? Hugssss!! Compartilhar este post Link para o post Compartilhar em outros sites
fmda 0 Denunciar post Postado Abril 14, 2013 só tem este no, a estrutura é identica a esta, so que varios xml desta forma. consigo ler 1 por 1, mas precisaria ler varios url de xml e ir jogando os dados seja num textarea mesmo. porque assim deixo ele rodando ate ler os 100, 200 xml e no final copia estes dados Compartilhar este post Link para o post Compartilhar em outros sites
fmda 0 Denunciar post Postado Abril 17, 2013 up, já consegui fazer ele le um por um mas estou precisando que a cada leitura de um link ele imprimi na tela e vai lendo os outros e vai escrevendo creio que assim nao ha sobrecarga de link e consigo ler todos. porque são cercas de 1000xml <?php$arquivos_xml = array ('xml','xml1','xml2');$i = 0;while(!empty($arquivos_xml[$i])) {echo $arquivos_xml[$i].'<br />';$url_do_xml = 'url_do_xml'.$arquivos_xml[$i].'.xml';$xml1 = simplexml_load_file($url_do_xml);$x = 0;foreach ($xml1->Data as $gravar){ #mysql_query("INSERT INTO tabela (id, referencia) VALUES ('$gravar->Id', '$gravar->Referencia'"); if(mysql_affected_rows() != -1){ $x++; } echo "$gravar->Id<br>";}$i++;}?> Porém ainda fico com o maior problema que é, são muitas url de xml e desta forma ele le tudo em memoria e so no final imprime todos os dados.pra aliviar o servidor e não da erro, precisaria que a cada url ele imprimisse na tela, assim fica mais tranquilo pro servidor, creio eutem como a cada url que ele le, imprimir num textarea ou arquivo txt, algo que fica mais leve pro lado do server? Compartilhar este post Link para o post Compartilhar em outros sites
ESerra 744 Denunciar post Postado Abril 17, 2013 Para liberar o buffer de saída antes do fim da execução do script trabalhe com ob_end_flush() e flush(), no próprio manual mostra exemplo disto. Compartilhar este post Link para o post Compartilhar em outros sites
fmda 0 Denunciar post Postado Abril 19, 2013 Sera que o ob_end_flush e flush resolve este priblme abaixo? eu tentei ler 50 xml neste codigo acima e sempre me retorna isso Error 503 Service Unavailable Service Unavailable Guru Meditation: XID: 959121182 Varnish cache server uo, um forum deste tamanho e apenas um unico usuario ajudando :( n consegui resolver este erro ainda Compartilhar este post Link para o post Compartilhar em outros sites
findrai 11 Denunciar post Postado Abril 20, 2013 Brother, vamos lá. Primeiro, o timeout a gente resolve com o "set_time_limit()". A função aceita apenas um parâmetro, que é em segundos o tempo que vc quer para dar timeout (especificação: http://www.php.net/manual/en/function.set-time-limit.php). Considerando que o código que vc postou já funciona, segue uma forma de fazer com vários XMLs: <?php set_time_limit(3600); //1 hora pra dar timeout $xmls = array( 'url_xml1', 'url_xml2', 'url_xml3', 'url_xml4', 'url_xml5', 'url_xml6' ); foreach ($xmls as $xml) { $x = 0; foreach ($xml1->Data as $gravar){ #mysql_query("INSERT INTO tabela (id, referencia) VALUES ('$gravar->Id', '$gravar->Referencia'"); if(mysql_affected_rows() != -1){ $x++; } echo "$gravar->Id<br>"; } $i++; } ?> Espero que dê certo. Conseguindo ou não, avise-nos. Abraços. Compartilhar este post Link para o post Compartilhar em outros sites
fmda 0 Denunciar post Postado Abril 21, 2013 ainda não resolveu sempre retorna Error 503 Service Unavailable Service UnavailableGuru Meditation:XID: 959121182 Varnish cache server pesquisando achei que poderia usar algo assim que encontrei na net, so ta dificil encaixar ?phpfunction download_page($path){$ch = curl_init();curl_setopt($ch, CURLOPT_URL,$path);curl_setopt($ch, CURLOPT_FAILONERROR,1);curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);curl_setopt($ch, CURLOPT_TIMEOUT, 15);$retValue = curl_exec($ch);curl_close($ch);return $retValue;}$sXML = download_page('http://alanstorm.com/atom');$oXML = new SimpleXMLElement($sXML);foreach($oXML->entry as $oEntry){echo $oEntry->title . "\n";}?> Compartilhar este post Link para o post Compartilhar em outros sites
findrai 11 Denunciar post Postado Abril 21, 2013 Perdão amigo, eu achei que vc precisava apenas da lógica do loop. Bom, pra ler o XML eu recomendo usar o simplexml_load_file(). Seguindo a estrutura que vc postou no começou, montei o código de como seria: <?php set_time_limit(3600); //1 hora pra dar timeout $xmls = array( 'url_xml1', 'url_xml2', 'url_xml3', 'url_xml4', 'url_xml5', 'url_xml6' ); foreach ($xmls as $xml) { $x = 0; $xmldata = simplexml_load_file($xml); foreach ($xmldata->Data as $gravar){ #mysql_query("INSERT INTO tabela (id, referencia) VALUES ('$gravar->Id', '$gravar->Referencia'"); if(mysql_affected_rows() != -1){ $x++; } echo $gravar->Id . "<br>"; } $i++; } ?> Veja se funciona pra vc. Abs. Compartilhar este post Link para o post Compartilhar em outros sites
fmda 0 Denunciar post Postado Abril 21, 2013 eu ja uso o simplexml_load_file ve o codigo acima o problema é que sempre retorna este erro 503. se eu leio um ou dois xml de boa mas se eu leio varios grandes, ele retorna isso eu pensei talvez eu fazer ele le 1, da tipo um refresh na pagina le o 2, da outro refresh le o 3 e assim vai talvez ajuda na carga. mas como fazer isso porque quando da refresh perde o que estava fazendo e comeca de novo Compartilhar este post Link para o post Compartilhar em outros sites
findrai 11 Denunciar post Postado Abril 21, 2013 Então, eu tinha visto que vc usou lá em cima. Por isso no primeiro post eu achei desnecessário mostrar como captar o XML. Eu apenas usei de novo de forma que leia mais de um XML, não achei sua mensagem falando que isso dava erro. Apenas falou que dava timeout e a solução tá nesse meu código aí na primeira linha. Bom, se vc quer dar refresh e ler o próximo, eis a solução: <?php set_time_limit(3600); //1 hora pra dar timeout $pos = 0; if (!empty($_GET['pos'])) $pos = $_GET['pos']; $xmls = array( 'url_xml1', 'url_xml2', 'url_xml3', 'url_xml4', 'url_xml5', 'url_xml6' ); $total_pos = count($xmls); $x = 0; //estou mantendo o X porque não sei onde vc usa ele $xmldata = simplexml_load_file($xmls[$pos]); foreach ($xmldata->Data as $gravar){ #mysql_query("INSERT INTO tabela (id, referencia) VALUES ('$gravar->Id', '$gravar->Referencia'"); if(mysql_affected_rows() != -1){ $x++; } echo $gravar->Id . "<br>"; sleep(2); //apenas pra dar tempo de vc ver o resultado na tela, qdo não precisar, tire isso //aqui vai o redirect $pos++; if ($pos < $total_pos) header("Location: essearquivo.php?pos=" . $pos); else echo 'Todos os XMLS foram lidos.'; $i++; } ?> Valeu. Compartilhar este post Link para o post Compartilhar em outros sites
fmda 0 Denunciar post Postado Abril 21, 2013 Entendi a logica, estou tentando fazer aqui mas num sei se modifiquei errado. ele só ta imprimindo o ultimo valor que é o segundo link. como posso fazer para ler 1 xml, escrever no arquivo, ler o segundo xml e escrever na outra linha do arquivo. olha o codigo como ficou. Desta forma ele ta lendo todos xml e imprimindo sempre o ultimo. Não ta dando refresh na pagina a cada xml e lendo o proximo <?php #set_time_limit(3600); //1 hora pra dar timeout $pos = 0; $fp = fopen("bloco.txt", "a"); if (!empty($_GET['pos'])) $pos = $_GET['pos']; $xmls = array( 'https://www.site.com/arquivo.xml?xml=1', 'https://www.site.com/arquivo..xml?xml=2' ); $total_pos = count($xmls); $xmldata = simplexml_load_file($xmls[$pos]); foreach ($xmldata->Data as $gravar){ $escreve = fwrite($fp, "$gravar->ID"); $pos++; if ($pos < $total_pos) { header("Location: teste.php?pos=" . $pos); }else{ echo 'Todos os XMLS foram lidos.'; } $i++; } fclose($fp);?> Compartilhar este post Link para o post Compartilhar em outros sites
findrai 11 Denunciar post Postado Abril 21, 2013 Certo, adaptando a realidade fica mais fácil. Eu só modifiquei o código aqui e não testei, tá? Veja se assim te resolve: <?php #set_time_limit(3600); //1 hora pra dar timeout $pos = 0; $fp = fopen("bloco.txt", "a"); if (!empty($_GET['pos'])) { $pos = $_GET['pos']; } $xmls = array( 'https://www.site.com/arquivo.xml?xml=1', 'https://www.site.com...uivo..xml?xml=2' ); $total_pos = count($xmls); $xmldata = simplexml_load_file($xmls[$pos]); foreach ($xmldata->Data as $gravar) { $escreve = fwrite($fp, "$gravar->ID"); $pos++; } fclose($fp); if ($pos < $total_pos) { header("Location: teste.php?pos=" . $pos); } else { echo 'Todos os XMLS foram lidos.'; } ?> Abs, Compartilhar este post Link para o post Compartilhar em outros sites
fmda 0 Denunciar post Postado Abril 21, 2013 eu tenho impressão que deu certo, vou deixar lendo e ver o resultado. só uma dica, sempre confundo isso como faço pra concatenar os valores no fwrite, $escreve = fwrite($fp, "$gravar->ID"); queria deixar ele com quebra e separado por ponto e virugula 1 ; 2 ; 3 ' ; 1 ; 2 ; 3 Compartilhar este post Link para o post Compartilhar em outros sites
findrai 11 Denunciar post Postado Abril 21, 2013 Pra adicionar um ";" e quebra de linha depois de cada ID, faça assim: <?php $escreve = fwrite($fp, $gravar->ID . ";\n"); ?> Deve funcionar. Pra concatenar uma variável com uma string no PHP, usamos o separador "." (ponto). O ponto e vírgula é literalmente o caractere que vc quer adicionar e o "\n" é o código para quebra de linha. Só vai funcionar o "\n" em aspas duplas, ok? Em aspas simples ele não quebra linha e escreve no arquivo literalmente o código. Responde se vc conseguiu depois, vlw. Abs. Compartilhar este post Link para o post Compartilhar em outros sites
fmda 0 Denunciar post Postado Abril 21, 2013 deixei lendo e ele parou de ler no decimo xml fui ver o xml e percebi que a estrutura dele é diferente, neste caso não vai encontrar o $gravar->ID por exemplo porque ele nao existe neste xml. como posso fazer para ele ignorar, se nao encontrar esta estutura ele pula esta linha e nao le o xml Compartilhar este post Link para o post Compartilhar em outros sites
findrai 11 Denunciar post Postado Abril 21, 2013 Parou porque deu algum erro, certo? Senão não devia parar. Tenta assim: <?php #set_time_limit(3600); //1 hora pra dar timeout $pos = 0; if (!empty($_GET['pos'])) { $pos = $_GET['pos']; } $xmls = array( 'https://www.site.com/arquivo.xml?xml=1', 'https://www.site.com...uivo..xml?xml=2' ); $total_pos = count($xmls); $xmldata = simplexml_load_file($xmls[$pos]); if (!empty($xmldata->Data->ID)) { //verifica se o valor existe foreach ($xmldata->Data as $gravar) { $fp = fopen("bloco.txt", "a"); //passei o fopen e fclose pra dentro do loop pra não abrir o arquivo se não for gravar $escreve = fwrite($fp, $gravar->ID); fclose($fp); } } else { //se não existir o ID, apenas pula o XML $pos++; } if ($pos < $total_pos) { header("Location: teste.php?pos=" . $pos); } else { echo 'Todos os XMLS foram lidos.'; } ?> Abraço. Compartilhar este post Link para o post Compartilhar em outros sites
fmda 0 Denunciar post Postado Abril 21, 2013 pulou, so que ele leu o xml 3x apareceu 3 linhas com o mesmo conteudo do xml so passei 2 xml para ler, o primeiro (nao existe o ID) o segundo ja existe @edit Ele ficou preso no laço, esta imprimindo infinitamente o contendo do xml que tem a tag Eu coloquei o $pos++ em baixo do fclose também sera que tera algumn problema, parece que funcinou assim Parece que colocando o $pos++ depois do fclose tbm nao resolveu coloquei 4 xml (2 sem e 2 com) e imprimiu 3 minhas Compartilhar este post Link para o post Compartilhar em outros sites