ugrás a tartalomhoz

Php - curl multi get content üres sztringet ad

inf · 2010. Nov. 11. (Cs), 00.44
Sziasztok!

Curl multival szedek le rss feedeket. A legtöbb feeddel nincs problémám, viszont van egy, ami kiakaszt. :D

Ezt adja:

array
  'url' => string 'http://www.origo.hu//contentpartner/rss/hircentrum/origo.xml' (length=60)
  'content_type' => string 'text/xml' (length=8)
  'http_code' => int 200
  'header_size' => int 497
  'request_size' => int 91
  'filetime' => int -1
  'ssl_verify_result' => int 0
  'redirect_count' => int 0
  'total_time' => float 0.422
  'namelookup_time' => float 0.047
  'connect_time' => float 0.063
  'pretransfer_time' => float 0.063
  'size_upload' => float 0
  'size_download' => float 22920
  'speed_download' => float 54312
  'speed_upload' => float 0
  'download_content_length' => float -1
  'upload_content_length' => float -1
  'starttransfer_time' => float 0.094
  'redirect_time' => float 0
CURLOPT_RETURNTRANSFER-el szedem, ami ugye azt eredményezi, hogy a curl_multi_exec sztringbe teszi a tartalmat ahelyett, hogy echozná. Na most ha hagyom echozni, akkor rendesen kiírja a feed tartalmát, viszont ha curl_multi_getcontent-el próbálom kinyerni a sztringet, akkor üreset kapok meg ugye a fenti infokat. Na most ugye a status 200, curl_error nincsen a size_download elég magas, a download_content_length mégis -1. Mitől lehet ez szerintetek?
 
1

Ezzel a kóddal szedem a

inf · 2010. Nov. 11. (Cs), 01.26
Ezzel a kóddal szedem a feedeket:

	public function reloadFeeds()
	{
		//(connection timeout = timeout-200) for prevent cutting the feed data
		$connectionTimeout=$this->getTimeout()>200
			?($this->getTimeout()-200)
			:1;
		$sessions=array();
		$downloader=curl_multi_init();
		foreach ($this->feeds as $feed)
		{
			if (!file_exists($feed->getFeedCacheFile()) || time()-filemtime($feed->getFeedCacheFile())>=$feed->getReloadTime()*60)
			{
				$session=curl_init();
				curl_setopt($session,CURLOPT_URL,$feed->getUrl());
				curl_setopt($session,CURLOPT_FAILONERROR,true);
				curl_setopt($session,CURLOPT_RETURNTRANSFER,true);
				curl_setopt($session,CURLOPT_FOLLOWLOCATION,true);
				curl_setopt($session,CURLOPT_CONNECTTIMEOUT_MS,$connectionTimeout);
				curl_setopt($session,CURLOPT_TIMEOUT_MS,$this->getTimeout());
				curl_multi_add_handle($downloader,$session);
				$sessions[$feed->getName()]=$session;
			}
		}
		if (count($sessions))
		{
			do
			{
				curl_multi_exec($downloader,$activeSessions);
				usleep(20000);
			}
			while($activeSessions>0);
			
			foreach ($sessions as $name => $session)
			{
				$feed=$this->getFeed($name);
				//rss integrity pattern for checking if timeout cut the response
				$content=curl_multi_getcontent($session);
				if (curl_errno($session) || !preg_match($this->rssIntegrityPattern,$content))
				{
	//you can log failures here
					if (file_exists($feed->getFeedCacheFile()))
					{
						//rewrite the file last modified time (no "touch" function prior php 5.3.0)
						$content=file_get_contents($feed->getFeedCacheFile());
					}
					else
					{
						$content=null;
					}
				}
				else
				{
					$content=iconv($feed->getEncoding(),$this->getDisplayEncoding(),$content);
					$content=preg_replace($this->xmlDeclarationPattern,$this->xmlDeclaration,$content);
				}
				if ($content!=null)
				{
					file_put_contents($feed->getFeedCacheFile(),$content);
				}
				curl_multi_remove_handle($downloader,$session);
				curl_close($session); 
			}
		}
		curl_multi_close($downloader);
	}
2

Közben kiderült, hogy az

inf · 2010. Nov. 11. (Cs), 01.43
Közben kiderült, hogy az integritást néző regex hasal el, majd rákeresek, hátha van curl-es módszer is annak az ellenőrzésére, hogy teljesen átjött e az adat, vagy megszakította a timeout.
A probléma ott van, hogy iconv előtt ellenőrzöm az integritását egy latin2-es sztringnek 'u' módosítós regexel. Pff, látszik, hogy ideje aludni.