Jump to content

file_get_contents($url)


taviroquai
 Share

Recommended Posts

Viva pessoal,

Estava aqui a brincar com isto:

$opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n"));
$context = stream_context_create($opts);
$file = file_get_contents($url, false, $context);

e acontece que o php/apache não devolve nada para o browser e parece que entra em loop...

No entanto se não colocar o conteudo do cookie como var:

$opts = array('http' => array('header'=> 'Cookie: foo=bar' ."\r\n"));

funciona perfeitamente...

Porque raio se tentar colocar a var  $_SERVER['HTTP_COOKIE'] ele entra em loop?

Obrigado.

Link to comment
Share on other sites

Se isso for para criar um bot, é melhor usares o cURL : http://php.net/manual/en/book.curl.php

De qualquer forma, estavas a concatenar mal o cookie, provavelmente por isso é que não funcionava (e por esta razão é que é preferível escolher uma prática de programação ao invés de fazer as coisas em cima do joelho)

$opts = array("http" => array("header"=> "Cookie: " . $_SERVER['HTTP_COOKIE']."\r\n"));
Link to comment
Share on other sites

Hmm... devo ter os olhos trocados...

Qual é a diferença entre a tua concatenação:

$opts = array("http" => array("header"=> "Cookie: " . $_SERVER['HTTP_COOKIE']."\r\n"));

e a minha:

$opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n"));

Os double quotes?  ?

Devo estar a ver mal...

Repara que eu adotei uma pratica de programação... para não dizeres que é em cima do joelho... para todas as strings que uso sem variáveis, uso single quotes, bem mais rápido... mas isso já é outra discussão.

Link to comment
Share on other sites

Aquilo que puseste aqui começava a string com single quotes e acabava com double quotes. Não me recordo de momento, mas acho que isso dava problemas.

Não disse que fazias as coisas em cima do joelho, disse que era preferível usar uma prática comum para evitar certo tipo de incongruências, foi para exemplificar.

Link to comment
Share on other sites

@yoda

sem stress...  😉

Double ou single...

De certeza que não é esse o problema.

Hmm... também verifiquei se $_SERVER['HTTP_COOKIE'] estava vazio mas não está... contem "PHPSESSID=xxxx" por isso parece ok.

Isto é muito estranho mesmo... tenho que experimentar colocar o cookie igual ao $_SERVER['HTTP_COOKIE'] sem colocar a variavel... a ver se passa...

Obrigado... volto mais tarde com notícias 😄

Link to comment
Share on other sites

tb tive uma vez este problema.

no caso de teres o php compilado com --with-curlwrappers (podes ver no phpinfo() )

precisas de colocar os headers do context como arrray e SEM CRLF

http://www.php.net/manual/en/function.stream-context-create.php#99353

Hmm... interessante... quando chegar a casa vejo se é esse o caso... se for isso  :wallbash:  😉

Link to comment
Share on other sites

Ok... isolei o código acima e afinal o problema não é disso  😛

É muito facil por isto em loop... basta correr o mesmo código no URL que se está a chamar  😁

Mas pronto... neste caso tenho uma coisa assim no http://localhost/?c=Public

$m = new Mustache;
$template      = FF_Template::factory('index');
$view          = FF_View::factory('Index', $this);
$session       = FF_View::load('Session');
$view->session = $session;
return $m->render($template, $view);

O FF_View::load()

// TODO: better error handling
public static function load( $controllerName, $methodName = NULL) {
$url = 'http://' . $_SERVER['SERVER_NAME'] . '/' . URL;
$url = $url . '?c=' . $controllerName;
if ($methodName !== NULL) $url = $url . '&m=' . $methodName;
$opts = array('http' => array('header'=> array('Cookie: ' . $_SERVER['HTTP_COOKIE'])));
$context = stream_context_create($opts);
return file_get_contents($url, false, $context);
}

Agora, isto é o ?c=PublicHome e o Session está em ?c=Session

Por algum motivo, que ainda nao descobri, embora URL diferentes,isto deve estar em loop  😛

Mas obrigado na mesma pela ajuda...

Link to comment
Share on other sites

Bom... ando aqui ás voltas com isso já estou quase a partir tudo aqui em casa  :angry1:

Parece que não há loop nenhum... simplesmente não posso mandar o mesmo cookie duas vezes para o apache...

Ou seja, antes de haver o cookie (foo=bar) no cliente, o FF_View::load() funciona bem.

Mas quando faço o pedido, nos cabeçalhos do browser já la vai o cookie (foo=bar) e depois no código, mando outra vez o cookie (foo=bar) e aqui o apache deixa de responder  😛

Se mandar um valor de cookie diferente, daquele que é enviado no pedido do browser, tudo funciona  :wallbash:

Já se depararam com algo semelhante? Ora experimentem la aí...

Link to comment
Share on other sites

Os cookies existem, não são "passados".

Podes passar...

$opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n"));

Por exemplo, se não passar, no código que mostra a sessão do user, devolve o form do login, em vez de me devolver o form do logout (estando o user logado, e usando as sessions do php).

Link to comment
Share on other sites

Ahh... ainda não expliquei a forma principal  😛

Este FF_View::load() será apenas uma mais valia... que pensando bem vou chamar de FF_Request::factory() porque será um novo request ao server que devolve uma resposta (string, que não é uma view).

A forma normal (e mais poderosa) de usar é:

$sessionCtrl = FF_Controller::factory('Session');

Mas pronto, vou ver o código do kohana...

Link to comment
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
 Share

×
×
  • 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.