PHP fsockopen () / fread () döner verileri berbat

3 Cevap php

I) fsockopen () ve fread (bazı URL okumak, ve ben bu tarz verilere olsun:

      <li
10 
></li>
      <li
9f 
>asd</li>

d  
          <li
92

Tamamen O_o berbat Hangi

-

Dosyayı kullanırken _ i verilerin bu tür almak _ içeriği () fonksiyonu olsun:

<li></li>
      <li>asd</li>

Hangisi doğru! Yani, CEHENNEM yanlış nedir? i aynı şekilde davranır, hem de benim windows sunucu ve Linux sunucu üzerinde çalıştı. Ve hatta aynı PHP sürümü yok.

-

Benim PHP kodu:

$fp = @fsockopen($hostname, 80, $errno, $errstr, 30);
if(!$fp){
	return false;
}else{
	$out = "GET /$path HTTP/1.1\r\n";
	$out .= "Host: $hostname\r\n";
	$out .= "Accept-language: en\r\n";
	$out .= "Connection: Close\r\n\r\n";
	fwrite($fp, $out);

	$data = "";
	while(!feof($fp)){
		$data .= fread($fp, 1024);
	}
	fclose($fp);

Herhangi bir yardım / ipuçları şimdi bu bütün gün merak, takdir :/

Benim komut dosyası çalıştırıldığında, sunucu fopen sarmalayıcıları etkin olmadığından Oh, ve i) (fopen () veya _ olsun _ dosya içeriklerini olamaz> __ <

I really want to know how to fix this, just for curiousity. and i dont think i can use any extra libraries on this server anyways.

3 Cevap

Eğer veri isteğinde sunucu yığın halinde modda transfer edilir çünkü "garip veri" sorunu hakkında, bu olabilir.

Tarayıcınızda aynı URL ararken, HTTP başlıklarını bir göz atabilirsiniz; bu başlıklardan biri şöyle olabilir:

Transfer-encoding: chunked


Quoting wikipedia's article on that matter :

Each non-empty chunk starts with the number of octets of the data it embeds (size written in hexadecimal) followed by a CRLF (carriage return and line feed), and the data itself. The chunk is then closed with a CRLF. In some implementations, white space characters (0x20) are padded between chunk-size and the CRLF.

The last chunk is a single line, simply made of the chunk-size (0), some optional padding white spaces and the terminating CRLF. It is not followed by any data, but optional trailers can be sent using the same syntax as the message headers.

The message is finally closed by a final CRLF combination.

Bu ne alıyorsanız yakın görünüyor ... Yani bu sorunun olduğunu tahmin ediyorum.


As far as I remember, curl knows how to deal with that -- so, the easy way would be to use curl instead of fsockopen and the like

Ve Kıvrılmaları kullanarak genellikle yuvalarını kullanarak bu daha iyi bir fikir şudur: Eğer karşılaşabileceğiniz pek çok sorunları ile ilgileneceğiz; Bu gibi ;-)


Anoter idea, if you don't have curl enabled on your server, would be to use some already existing library based on fsockopen -- hoping it would take care of those kind of things for you already.

For instance, I've worked with Snoopy a couple of times ; maybe it ealready knows how to deal with that ?
(Not sure : you'll have to test by yourself -- or take a look at the documentation to know if this is OK)
Still, if you want to deal with the mysteries of the HTTP protocol by yourself... Well, I wish you luck !

Muhtemelen kullanmak istiyorum cURL.

<?php
// create a new cURL resource
$ch = curl_init();

// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// grab URL and pass it to the browser
$output = curl_exec($ch);

// close cURL resource, and free up system resources
curl_close($ch);
?>

Fsockopen () ile, sen ham TCP veri değil HTTP içeriği olsun. Ben de HTTP başlıklarını görmek varsayıyorum, değil mi? Bu chunked kodlaması ise, tüm öbek başlıklarını alacak.

Bu bilinen bir sorundur. Birisi here öbek başlıklarını kaldırmak için nasıl bir çözüm yayınlanmıştır.