Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> wieszanie się file() i fsockopen(), jak z tym walczyć lub obejść?
Alek
post
Post #1





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 25.06.2003
Skąd: Gdynia

Ostrzeżenie: (0%)
-----


Mam skrypt ściągający kilka tysięcy plików z netu (na razie tylko http - strony).
Cały proces trwa trochę, więc chciałbym puścić go "w samopas" na jakimś kompie i pójść np. na kawe. Problem w tym, że co którąś lokację zawiesza się na funkcjach file() (ew. fsockopen(), używany jako zamiennik). Próbowałem różnych sztuczek, aby strona się co jakiś czas sama odświeżyła i nic:(.
Adresy lokacji do pobrania brane są z MySQL, każdy ściągnięty jest oznaczany (żeby 2 razy nie ściągać).

fsockopen() używałem ze względu na parametr timeout, niestety też nie działa.

Oto metody, które zdążyły się już nie sprawdzić:
- wstawienie w nagłówku
  1. <META HTTP-EQUIV="Refresh" CONTENT="5">

- zastąpienie file() przez fsockopen()
- java script: setTimeout('location.reload(true)',15000);

Tnę się z tym już trzeci dzień, pomóżcie...
Go to the top of the page
+Quote Post
hwao
post
Post #2


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




nie rozumie co piszesz biggrin.gif

file_get_contents()

na fsockopen nie powinno sie nic zawieszac winksmiley.jpg

Nastawiles "bez limitu czasu"?

jak objawia sie te "zawiesznie" co sie dzieje? moze masz zle napisane poprostu
Go to the top of the page
+Quote Post
darekpe
post
Post #3





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 28.11.2005
Skąd: Belfast, Northern Ireland

Ostrzeżenie: (0%)
-----


A ustawiles dla tego skryptu

Kod
set_time_limit(0)


Nie wiem czy to rozwiaze Twoj problem, ale jest to pewna poszlaka smile.gif

pozdrawiam,
darek


--------------------
--
Darek Pelka
BlueCube Interactive
Belfast, Northern Ireland
Go to the top of the page
+Quote Post
Alek
post
Post #4





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 25.06.2003
Skąd: Gdynia

Ostrzeżenie: (0%)
-----


Oto mój kłopot:

  1. <?
  2. class HTTPRequest
  3. {
  4.  var $_fp; // HTTP socket
  5.  var $_url; // full URL
  6.  var $_host; // HTTP host
  7.  var $_protocol; // protocol (HTTP/HTTPS)
  8.  var $_uri; // request URI
  9.  var $_port; // port
  10.  
  11.  // scan url
  12.  function _scan_url()
  13.  {
  14.  $req = $this->_url;
  15.  
  16.  $pos = strpos($req, '://');
  17.  $this->_protocol = strtolower(substr($req, 0, $pos));
  18.  
  19.  $req = substr($req, $pos+3);
  20.  $pos = strpos($req, '/');
  21.  if($pos === false)
  22.  $pos = strlen($req);
  23.  $host = substr($req, 0, $pos);
  24.  
  25.  if(strpos($host, ':') !== false)
  26.  {
  27.  list($this->_host, $this->_port) = explode(':', $host);
  28.  }
  29.  else
  30.  {
  31.  $this->_host = $host;
  32.  $this->_port = ($this->_protocol == 'https') ? 443 : 80;
  33.  }
  34.  
  35.  $this->_uri = substr($req, $pos);
  36.  if($this->_uri == '')
  37.  $this->_uri = '/';
  38.  }
  39.  
  40.  // constructor
  41.  function HTTPRequest($url)
  42.  {
  43.  $this->_url = $url;
  44.  $this->_scan_url();
  45.  }
  46.  
  47.  // download URL to string
  48.  function DownloadToString()
  49.  {
  50.  $crlf = "\r\n";
  51.  $response='';
  52.  
  53.  // generate request
  54.  $req = 'GET ' . $this->_uri . ' HTTP/1.0' . $crlf
  55.  . 'Host: ' . $this->_host . $crlf
  56.  . $crlf;
  57.  
  58.  // fetch
  59.  $this->_fp = fsockopen(($this->_protocol == 'https' ? 'ssl://' : '') . $this->_host, $this->_port, $errno, $errstr, 4);
  60.  fwrite($this->_fp, $req);
  61.  while(is_resource($this->_fp) && $this->_fp && !feof($this->_fp))
  62.  $response .= fread($this->_fp, 1024);
  63.  fclose($this->_fp);
  64.  
  65.  // split header and body
  66.  $pos = strpos($response, $crlf . $crlf);
  67.  if($pos === false)
  68.  return($response);
  69.  $header = substr($response, 0, $pos);
  70.  $body = substr($response, $pos + 2 * strlen($crlf));
  71.  
  72.  // parse headers
  73.  $headers = array();
  74.  $lines = explode($crlf, $header);
  75.  foreach($lines as $line)
  76.  if(($pos = strpos($line, ':')) !== false)
  77.  $headers[strtolower(trim(substr($line, 0, $pos)))] = trim(substr($line, $pos+1));
  78.  
  79.  // redirection?
  80.  if(isset($headers['location']))
  81.  {
  82.  $http = new HTTPRequest($headers['location']);
  83.  return($http->DownloadToString($http));
  84.  }
  85.  else
  86.  {
  87.  return($body);
  88.  }
  89.  }
  90. }
  91. // class END ================================
  92.  
  93. ob_start(); // wlaczamy buforowanie wyjscia
  94. ?>
  95.  
  96. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  97. <HTML>
  98. <HEAD>
  99. <META HTTP-EQUIV="content-type" CONTENT="text/html; charset=iso-8859-2">
  100. <META NAME="Language" CONTENT="pl">
  101. <META NAME="robots" CONTENT="none">
  102. <META HTTP-EQUIV="Refresh" CONTENT="10">
  103. <!-- poniższy skrypt był użyty jako jeden ze sposobów odswiezenia -->
  104. <script language="Javascript">
  105. var time=15;
  106. function timer(name){
  107. time--;
  108. document.formularz.zegar.value=time;
  109. if(time>0){
  110. timeout=setTimeout("timer('next')",1000);
  111. }
  112. else{
  113. setTimeout('location.reload(true)',3000);
  114. document.execCommand('Stop');
  115. window.stop();
  116. }
  117. }
  118. </script>
  119. </HEAD>
  120. <BODY>
  121. <!--
  122. <img src="gfx/fwd.gif" onLoad="timer('next')">
  123. Do odświeżenia pozostało: <form name="formularz"><INPUT TYPE="TEXT" NAME="zegar" size="3" READONLY></FORM>
  124. -->
  125.  
  126. <?
  127. $katalog_nowe_tresci = '_nowe_tresci';
  128. $error_log='error_logs/'.date('Y-m-d').'.htm';
  129. // ==========================================================================
  130.  
  131. $sql="SELECT id,url FROM urls AND czy_skanowano=0 ORDER BY id LIMIT 100 ";
  132. $result=mysql_query($sql);
  133.  
  134. if(mysql_num_rows($result)==0){
  135. exit('Brak adresów do przetworzenia - koniec skanowania.');
  136. };
  137.  
  138. // przechodzimy przez wynik zapytania
  139. while($bip=mysql_fetch_array($result)){
  140. $plik_zawartosc = $katalog_nowe_tresci.'/'.$bip['id'].'.htm';
  141. $adres=str_replace('$',"%24",trim($bip['url']));
  142. echo 'Przetwarzam: ('.$bip['id'].') <a href="'.$adres.'" target="_blank">'.htmlspecialchars($adres).'</a><br>';
  143. ob_flush(); flush();
  144.  
  145. $r= new HTTPRequest($adres);
  146. $s= $r->DownloadToString();
  147. $z=explode("\n",$s);
  148. if(count($z)==|| $z==FALSE){
  149. echo '<b>Problem z ściągnięciem:</b> <a href="'.$adres.'" target="_blank">'.htmlspecialchars($adres).'</a><br>';
  150. ob_flush(); flush();
  151. continue;
  152. }
  153.  
  154. // zapis strony do pliku
  155. if(($fp=fopen($plik_zawartosc,'w'))===FALSE){
  156. echo '<b>Błąd otwarcia pliku strony:</b> <a href="'.$adres.'" target="_blank">'.htmlspecialchars($adres).'</a><br>';
  157. ob_flush(); flush();
  158. exit('Błąd otwarcia pliku strony');
  159. }
  160. foreach($z as $l){
  161. // usunac wszystkie PHPSESSID itp
  162. $l=trim($l);
  163. $l = eregi_replace("sessid=[[:alnum:]]*",'',$l);
  164. $l = eregi_replace("sid=[[:alnum:]]*",'',$l);
  165. $l = eregi_replace("sessionid=[[:alnum:]]*",'',$l);
  166. if(fwrite($fp,"$l\n")===FALSE){ //zapisywanie linia po linii
  167. echo '<b>Błąd zapisu pliku strony:</b> <a href="'.$adres.'" target="_blank">'.htmlspecialchars($adres).'</a><br>';
  168. ob_flush(); flush();
  169. exit('Błąd zapisu pliku strony');
  170. }
  171. }
  172. if(fclose($fp)===FALSE){
  173. echo '<b>Błąd zamknięcia pliku strony:</b> <a href="'.$adres.'" target="_blank">'.htmlspecialchars($adres).'</a><br>';
  174. ob_flush(); flush();
  175. exit('Błąd zamknięcia pliku strony');
  176. }
  177. unset($fp,$z,$l);
  178.  
  179. if(!file_exists($plik_zawartosc) || filesize($plik_zawartosc)==0){
  180. echo '<b>Problem z zapisem:</b> <a href="'.$adres.'" target="_blank">'.htmlspecialchars($adres).'</a><br>';
  181. ob_flush(); flush();
  182. continue;
  183. }
  184. ob_flush(); flush();
  185. } // END OF while($bip=mysql_fetch_array($result_bipy))
  186.  
  187. ?>
  188.  
  189. </BODY>
  190. </HTML>


poprawiam
---
nospor


@darekpe: wyglada na to że set_time_limit() jest zablokowane na serwerze na którym biega ten skrypt

@hwao:
ustawiłem:
  1. <?php
  2. fsockopen(($this->_protocol == 'https' ? 'ssl://' : '') . $this->_host, $this->_port, $errno, $errstr, 4);
  3. ?>


"zawiecha" polega na tym że:
albo strona się pozornie dalej wczytuje (Trwa wczytywanie... w belce)
albo jest status "Zakończono", ale pasek postępu ładowania ciągle jest widoczny (jak i klepsydra)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 05:39