Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: wieszanie się file() i fsockopen()
Forum PHP.pl > Forum > PHP
Alek
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...
hwao
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
darekpe
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
Alek
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)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.