Jump to content
taviroquai

file_get_contents($url)

Recommended Posts

taviroquai

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.

Share this post


Link to post
Share on other sites
taviroquai

Ninguém???  ;)

Preciso mesmo de passar o cookie no pedido senão isto não faz o que quero...

Share this post


Link to post
Share on other sites
yoda

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"));

Share this post


Link to post
Share on other sites
taviroquai

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.

Share this post


Link to post
Share on other sites
yoda

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.

Share this post


Link to post
Share on other sites
Emphasis

Mesmo sendo "incongruente" eu costumo usar singlequotes quando não quero processar metacaracteres nem $variaveis, além de que é mais rápido.

Exemplo: "\r\n" escreve CRLF, enquanto que '\r\n' escreve literalmente os quatro caracteres.

De certeza que não é esse o problema.

Share this post


Link to post
Share on other sites
Emphasis

outra coisa:

Verificaste se o $_SERVER['HTTP_COOKIE'] está declarado?

quem responde pode não "gostar" de headers mal-formados.

Experimenta:

$opts = array('http' => array());

if(!empty($_SERVER['HTTP_COOKIE'])){

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

}

Share this post


Link to post
Share on other sites
taviroquai

@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 :D

Share this post


Link to post
Share on other sites
taviroquai

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

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

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  :P

Mas obrigado na mesma pela ajuda...

Share this post


Link to post
Share on other sites
taviroquai

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  :P

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í...

Share this post


Link to post
Share on other sites
taviroquai

Quero fazer uma coisa muito simples... carregar o html de uma URL (da mesma aplicação), passando o mesmo cookie da sessão...

Share this post


Link to post
Share on other sites
taviroquai

Sim... o FF_View::load() foi inspirado nisto do Kohana:

Request::factory('user/login')->execute() 

Vi a super utilidade disto e estou a fazer uma coisa semelhante... mas não pus os olhos no código... vou ver então se ele faz mesmo um novo request e se passa informação dos cookies...

Share this post


Link to post
Share on other sites
taviroquai

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).

Share this post


Link to post
Share on other sites
taviroquai

Ahh... ainda não expliquei a forma principal  :P

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

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.