Jump to content
Umbus

CURL

Recommended Posts

Umbus

Boas alguem percebe de CURL? Eu quero fazer uma ligação a outros servidores, como posso fazer, para liga-los e obter dados entre eles para o primeiro servidor? Ando a procura disto mas nao encontro em lado nenhum :S


Eu sou eu e eu sou aquele que sou eu...

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

Olá Umbus....

O cURL consegue fazer isso, no entanto, pretendes obter os dados por HTTP ou FTP ... ou k?

Tens de dar mais detalhes...

Share this post


Link to post
Share on other sites
Umbus

quero obter dados por html/php basicamente, e feito um if para saber quantos dados existem, se for apenas 1 faz directamente dentro do proprio servidor, que executa uma função, se não, vai para vários servidores (no meu caso localhosts com varias portas diferentes), que utilizam a tal função.


Eu sou eu e eu sou aquele que sou eu...

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

quero obter dados por html/php basicamente, e feito um if para saber quantos dados existem, se for apenas 1 faz directamente dentro do proprio servidor, que executa uma função, se não, vai para vários servidores (no meu caso localhosts com varias portas diferentes), que utilizam a tal função.

Sim, eu percebi isso... Já vi que o endereço que chamas eh HTTP e não FTP... E esse é o exemplo mais básico que o php.net tem... vê aqui:

http://www.php.net/manual/en/curl.examples-basic.php

E este artigo em português (br):

http://www.imasters.com.br/artigo/4140/php/usando_a_biblioteca_curl_do_php

Abraço

Share this post


Link to post
Share on other sites
Umbus

MAs esses exemplos não fazem funcoes funcionarem noutros localhosts, apenas coloca o conteudo no teu site. Imagina o que quero:

- Tenho um servidor inicial onde faz a interligação de utilizador \ servidor;

- O utilizador envia um texto para o servidor;

- O servidor verifica se o numero de caracteres vale a pena ou nao enviar para outros servidores (o tal if);

- O servidor verifica que é preciso enviar para outros servidores, então chama x servidores para lerem uma pagina php do seu serviço, com dados transmitidos pelo primeiro servidor (numero de caracteres, o texto);

- Agora todos os caracteres tentam encontrar a palavra automaticamente;

- A palavra e encontrada por um dos servidores é enviada a resposta para o servidor inicial;

- O computador inicial desliga o funcionamento dos servidores.


Eu sou eu e eu sou aquele que sou eu...

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

MAs esses exemplos não fazem funcoes funcionarem noutros localhosts, apenas coloca o conteudo no teu site. Imagina o que quero:

- Tenho um servidor inicial onde faz a interligação de utilizador \ servidor;

- O utilizador envia um texto para o servidor;

- O servidor verifica se o numero de caracteres vale a pena ou nao enviar para outros servidores (o tal if);

- O servidor verifica que é preciso enviar para outros servidores, então chama x servidores para lerem uma pagina php do seu serviço, com dados transmitidos pelo primeiro servidor (numero de caracteres, o texto);

- Agora todos os caracteres tentam encontrar a palavra automaticamente;

- A palavra e encontrada por um dos servidores é enviada a resposta para o servidor inicial;

- O computador inicial desliga o funcionamento dos servidores.

Tu praticamente descreveste um sistema 'textual' de sharding :D

Sharding - para quem não sabe - consiste no acto de separar a informação por vários servidores de bases de dados, a fim de fazer o load balancing dos pedidos. Ou seja, com vista a que os servidores sofram muito, faz-se o sharding e cada servidor só sofre com pedidos de uma determinada coisa :)

Tu o que tens é nesse script que faz if's é uma espécie de relay que faz o redireccionamento para o servidor certo... O único mal é que na tua lógica todos os 'servidores' (ou scripts) fazem o mesmo procedimento de pesquisa :)

Ainda assim, vamos enunciar o serviço que cada servidor teu tem:

- Cada servidor terá um script, chamemos-lhe search.php que receberá uma pesquisa por parâmetro (podes optar por GET, ou POST - por agora, podemos ignorar o PUT e o DELETE )....

Desta feita, no teu script que tem os if's (vou chamar-lhe relay.php) deverás ter algo do género:

<?php

if( $_POST )
{
  # Adquire a mensagem sem tags e valida o tamanho
   if( ( $message = strip_tags($_POST['message']) ) && ( strlen($message) <= 140 ) && ( strlen($message) > 3 ) )
   {
       # Defino o pedido para o servidor A
       $request = curl_init( 'http://o-meu-servidor-A/search.php' ); 
   }
   elseif( strlen($message) > 140 )
   {
       # Defino o pedido para o servidor B
       $request = curl_init( 'http://o-meu-servidor-B/search.php' ); 
   }

   # Aqui defino que o pedido será efectuado via POST
   curl_setopt( $request, CURLOPT_POST, TRUE);
   curl_setopt( $request, CURLOPT_POST_CURLOPT_POSTFIELDS,'message=' . urlencode($message) );

   # Aqui defino que quero que me retorne o resultado.
   curl_setopt( $request, CURLOPT_RETURNTRANSFER, TRUE );

   # Aqui obtenho o resultado
   if( ( $resultado = curl_exec( $request ) ) !== FALSE )
   {
       echo $resultado;
   }

   # Fim da ligação.
   curl_close();
}

No ficheiro search.php (que deverá existir em todos os servidores - A e B) deverá estar:

<?php
   if( $_POST )
   {
       if( ( $message = strip_tags($_POST['message']) ) )
       {
           # Aqui fazes a pesquisa e retornas, eis um exemplo:

           mysql_connect('localhost','user','pwd') or die("No Database Connection");
           mysql_select_db('search_db') or die ("No Database");
           $result = mysql_query("SELECT * FROM tabela WHERE message LIKE '%{$_POST['message']}%'");
           if( !is_resource( $result ) )
               die(" ERROR_NUM 1 :: Contact the technical support" );

           if( mysql_num_rows( $result ) <= 0 )
               die("");

           while( $line = mysql_fetch_object( $result ) )
               echo $line->message . "<br/>";

           die();
       }
   }
?>

Claro está, isto é um exemplo e acima de tudo NÃO testado :) .

Abraço

Share this post


Link to post
Share on other sites
Umbus

Este problema nao tem nada a ver com bases de dados, a minha questão seria mais esta:

<?
if($caracteres => 1 and $caracteres <= 4){
    palavragenerator($caracteres, $POST_['texto']);
} else {
$ch = curl_init();
$port = array("5500","8455","6745","5786"); 
$valor = $caracteres / 4;
$seq = $valor;
   for ($a=0; $a <= 3; a++){
     curl_setopt($ch, CURLOPT_URL, 'http://localhost:$port[$a]/generator.php?action=generar&caracteres=$caracteres&seq=$seq&texto=$texto');
     $seq = $seq + $valor;
   }
}

?>

Basicamente o que estou a demonstrar aqui é:

$port = portas do meu localhost;

$valor = numero de caracteres a dividir pelo numero de servidores que quero que sejam activos para generar palavras

$seq = inicialmente e o valor de $valor, que vai somando $valor a cada nova criação de ligação do localhost, para procurar as palavras sequencialmente e nunca a mesma palavra;

Agora o que não percebo é como faço com que o curl isto que quero lol, alias nem sabia que para ele fazer isto bastava encontrar os dados na pagina.


Eu sou eu e eu sou aquele que sou eu...

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

Antes demais, vou sugerir uma alteração... Onde tens:

$port = array("5500","8455","6745","5786"); 
$valor = $caracteres / 4;

Podes mudar para:

$port = array("5500","8455","6745","5786"); 
$valor = $caracteres / count($port);

Assim sempre que inserires uma porta/servidor novo irá  dividir correctamente por eles.... Além disso, não te esqueças que a divisão não dá um valor inteiro, mas sim decimal... e que eu saiba não existe 'meio caractere'.

Continuando...

Eu não percebo muito bem o teu problema, mas ok.... Imagina o cURL como um browser ok? Sempre que ele executa, faz um pedido (através do URL que especificas) ao servidor...

E o retorno é TRUE ou FALSE por defeito. Caso pretendas que o valor de retorno seja IGUAL ao output da página, tens que fazer, onde tens:

   for ($a=0; $a <= 3; a++){
     curl_setopt($ch, CURLOPT_URL, 'http://localhost:$port[$a]/generator.php?action=generar&caracteres=$caracteres&seq=$seq&texto=$texto');
     $seq = $seq + $valor;
   }

Assim:

   for ($a=0; $a <= 3; a++){
     curl_setopt($ch, CURLOPT_URL, 'http://localhost:$port[$a]/generator.php?action=generar&caracteres=$caracteres&seq=$seq&texto=$texto');
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); # ISTO FAZ COM QUE O VALOR DE OUTPUT DA PAGINA SEJA RETORNADO.
     $seq = $seq + $valor;
   }

Logicamente que só este pedaço de código não executa os pedidos... para isso tens que alterar o código para:

   $retorno = array();
   for ($a=0; $a <= 3; a++){
     curl_setopt($ch, CURLOPT_URL, 'http://localhost:$port[$a]/generator.php?action=generar&caracteres=$caracteres&seq=$seq&texto=$texto');

     curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); # ISTO FAZ COM QUE O VALOR DE OUTPUT DA PAGINA SEJA RETORNADO.

    $retorno[] = curl_exec( $ch ); # Guarda-se o retorno no array

     $seq = $seq + $valor;
   }
    curl_close( $ch );

    # Para veres todos os retornos, está em:
    print_r($retorno);

Além disto, não estou a ver o teu problema.

Abraço

Share this post


Link to post
Share on other sites
Umbus

Sim isso ja vai parecendo com o que quero, so uma questao hoje perguntei ao meu professor que me disse que nao valia a pena usar o cURL, que se usasse o codigo file_get_content que servia e seria mais simples, o que acham?


Eu sou eu e eu sou aquele que sou eu...

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

Sim, se pretenderes passar os dados por endereço (como estás a fazer) sim, não há problema.

Agora se quiseres 'simular' posts ... aí precisas do cURL.

Share this post


Link to post
Share on other sites
pedrosorio

Sim isso ja vai parecendo com o que quero, so uma questao hoje perguntei ao meu professor que me disse que nao valia a pena usar o cURL, que se usasse o codigo file_get_content que servia e seria mais simples, o que acham?

Mesmo que queiras apenas fazer GET's, deves ter em conta que cURL parece ser mais eficiente do que file_get_contents:

http://stackoverflow.com/questions/555523/file-get-contents-vs-curl-what-has-better-performance


Não respondo a dúvidas por mensagem.

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

Mesmo que queiras apenas fazer GET's, deves ter em conta que cURL parece ser mais eficiente do que file_get_contents:

http://stackoverflow.com/questions/555523/file-get-contents-vs-curl-what-has-better-performance

Concordo, mas... isso é um benchmark que nem é muito bem explicado.

Tendo em conta que, tal como dizem numas respostas mais abaixo, o cURL não tem que alocar memória (para fazer buffering de resultados) a não ser que tenha o CURLOPT_RETURNTRANSFER a TRUE, senão apenas retorna TRUE ou FALSE.

O file_get_contents() é mais lento porque por defeito retorna o conteúdo...

Além disso, não sabemos quais as variáveis/options colocadas no cURL.

... de qualquer forma, eu considero o cURL mais completo e mais failsafe.

Share this post


Link to post
Share on other sites
Umbus

Eu quero a melhor forma de imitar um sistema de computação distribuida. Ja que parece que o php não tem nada do genero, pensei neste processo. Que tambem usa varios servidores, e transmito depois tudo por javascript ao browser inicial


Eu sou eu e eu sou aquele que sou eu...

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

Desculpa, mas isso não é computação distribuída....

... cada pedido cURL é executado sequencialmente... Portanto eles não correm em paralelo.

Ou seja, a lógica é:

[CICLO :: PARA CADA SERVIDOR]

    - Executa o cURL para o servidor;

    - Aguarda resposta do servidor (não sai daqui enquanto não recebe a resposta)

    - Guarda o retorno

[NEXT]

A minha proposta, para ser um sistema distribuido, seria:

1 - O script de envio de pedidos para os servidores deve fazer as chamadas cURL sem a linha:

curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); # ISTO FAZ COM QUE O VALOR DE OUTPUT DA PAGINA SEJA RETORNADO.

Assim, o cURL so envia o pedido e retorna logo um TRUE ou FALSE a dizer se conseguiu executar o pedido (e nao espera o retorno que pode demorar muito tempo)...

2 - O script de processamento (que vai estar no servidor que recebe o pedido), no final do processamento chama um script - chamemos-lhe save_result.php - que vai estar no servidor do script que efectua os pedidos, de modo a guardar o resultado na base de dados...

3 - Sabendo que cada servidor, no final do processamento chama o save_result.php e que esse processo grava o resultado na base de dados do servidor que faz pedidos... tens um processamento paralelo apenas com gravação sequencial ;)

O único senão é saber quando consultar o resultado.

Share this post


Link to post
Share on other sites
Umbus

Entao como fazer um sistema de computaçao distribuida em php?


Eu sou eu e eu sou aquele que sou eu...

Share this post


Link to post
Share on other sites
Umbus

A questão é que preciso mesmo disso lol, isto e para a univ. Quanto ao que quero ja expliquei antes ;)


Eu sou eu e eu sou aquele que sou eu...

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

Entao como fazer um sistema de computaçao distribuida em php?

Acho que respondi aqui: http://www.portugal-a-programar.pt/forums/topic/0-find-topic/?do=findComment&comment=390463

A minha proposta, para ser um sistema distribuido, seria:

1 - O script de envio de pedidos para os servidores deve fazer as chamadas cURL sem a linha:

curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); # ISTO FAZ COM QUE O VALOR DE OUTPUT DA PAGINA SEJA RETORNADO.

Assim, o cURL so envia o pedido e retorna logo um TRUE ou FALSE a dizer se conseguiu executar o pedido (e nao espera o retorno que pode demorar muito tempo)...

2 - O script de processamento (que vai estar no servidor que recebe o pedido), no final do processamento chama um script - chamemos-lhe save_result.php - que vai estar no servidor do script que efectua os pedidos, de modo a guardar o resultado na base de dados...

3 - Sabendo que cada servidor, no final do processamento chama o save_result.php e que esse processo grava o resultado na base de dados do servidor que faz pedidos... tens um processamento paralelo apenas com gravação sequencial ;)

Share this post


Link to post
Share on other sites
Umbus

Desculpa acabei por nao ver isso, obrigado ;)


Eu sou eu e eu sou aquele que sou eu...

Share this post


Link to post
Share on other sites
Umbus

Boas tenho andado a testar isto mas não funciona hora bem o que tenho e:

					$retorno = array();
				$ch = curl_init();				
				curl_setopt($ch, CURLOPT_URL, 'http://localhost:6518/generator.php?action=generar&palavra=aaz&posicao=0&caracteres=3');
				curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
				$retorno[] = curl_exec( $ch );
			curl_close( $ch );

		print_r ($retorno);

O meu generar tem:

function generar($palavra, $char, $position, $max) 
{

        for ($i = 97; $i < 123; $i++) {
	$palavraf = "";
                $char[$position] = chr($i);

			for ($j = 0; $j <= $position; $j++) {
				$palavraf .= $char[$j];
			}

			if ( $palavraf == $palavra)
			{
				echo "o texto é ".$palavraf;
				break;
			}

                if (!($position == $max))
                        generar($palavra, $char, $position + 1, $max);
        }
}               

switch($_GET['action'])
	{
		case 'generar':
        	generar($_GET['palavra'], $char ="", $_GET['posicao'], $_GET['caracteres']-1);
        	break;
                
	}

No final o que me da e isto :S

Array ( [0] => ) 

I need help


Eu sou eu e eu sou aquele que sou eu...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.