SanchoZs Posted April 20, 2008 Report Share Posted April 20, 2008 Sveiki! Vēlējos lūgt palīdzību. Man ir mysql kvērijs pēc kura notiek lapu satura savākšana ar file_get_contents. Problēma slēpjas faktā, ka nets ir lēns un visas lapas netiek nolasītas. (Izmet - Fatal error: Maximum execution time of 200 seconds exceeded) Laiku varētu dot vēl lielāku, bet tas nav risinājums. Ja lapu būs ļoti daudz, tad tas tāpat neies. Galvā stāv risinājumu varianti, bet nespēju tos ielikt kodā. v1 - Sadalīt lapu lasīšanu pa porcijām. (Ciks ciklā) v2 - Čekot, ja 5s laikā nenotiek konekcija ar serveri, tad izlaist lapu. Te ir daļa koda. $q = mysql_query(kveerijs) or die(mysql_error()); while ($row = mysql_fetch_array($q, MYSQL_ASSOC)) { if (file_get_contents($row["www"])!=false) { te notiek shis un tas } } Vai kāds varētu man pamest kādu ideju? Būtu ļoti pateicīgs. Paldiesjau iepriekš. Link to comment Share on other sites More sharing options...
NiTrino Posted April 20, 2008 Report Share Posted April 20, 2008 un ko satur $row['www'] ? Link to comment Share on other sites More sharing options...
SanchoZs Posted April 20, 2008 Author Report Share Posted April 20, 2008 linku, piem, http://www.php.lv Link to comment Share on other sites More sharing options...
NiTrino Posted April 20, 2008 Report Share Posted April 20, 2008 (edited) Man arī reiz vajadzēja ko līdzīgu. Es gan darīju savadāk - to web lapu nokačāju kaut kur tmp folderī un tad laidu virsū file_get_contents(). function downloadFile ($file_source, $file_target) { $rh = fopen($file_source, 'rb'); $wh = fopen($file_target, 'wb+'); if ($rh === false || $wh === false) return false; while (!feof($rh)) if (fwrite($wh, fread($rh, 1024)) === false) return false; fclose($rh); fclose($wh); return true; } $tmp = '/www/host/tmp/google.tmp'; downloadFile ('http://www.google.lv',$tmp); $contents = file_get_contents ($tmp); unlink($tmp); un par ideju lasīt pa daļām moš šis palīdzēs: Now you may use this code,to fetch the partial content like this: <?php $context=array('http' => array ('header'=> 'Range: bytes=1024-', ),); $xcontext = stream_context_create($context); $str=file_get_contents("http://www.fcicq.net/wp/",FALSE,$xcontext); ?> http://lv.php.net/file_get_contents Edited April 20, 2008 by NiTrino Link to comment Share on other sites More sharing options...
SanchoZs Posted April 20, 2008 Author Report Share Posted April 20, 2008 Par to 1. variantu jautājums. Vai saglabāšana uz servera un nolasīšana pēc tam būs ātrāka par vnk file_get_contents() un satura noglabāšanu db? Jo lapu ir ļoti daudz un tur ir tas āķis. 2. Tas, manuprāt, nav tas, ko es vēlējos. Es gribētu teiksim paporcijāmdalīt tādā veidā, ka pirmās, piem, 10s tiek paņemtas 5 lapas un nākamajās 10 s nākamās 5 lapas. T.i. execution time ir 10s, kuru laikā jāpaņem 5 lapu porcija un jānočeko. Ja 10s laikā tas nenotiek, tad scripts ņem nākamās 5 lapas un čeko tālāk. Jeb īsumā - kā būt pārliecinātam, ka tiek pieļauts minimāls zudums lapu pārbaudē, nevis no 100 lapām paspēj pārbaudīt pirmās 50 un uzmet fatālo erroru, bet ņem pa 5x20 porcijām un sliktākajā gadījumā 10 porcijās nepārbauda pēdējo lapu un zudums ir 10 nepārbaudītas lapas. Ceru mans domu gājiens skaidrs. Link to comment Share on other sites More sharing options...
NiTrino Posted April 20, 2008 Report Share Posted April 20, 2008 tu to skriptu nevari iemest kronā vai no konsoles laist? ja jau tik liels datu apjoms. Link to comment Share on other sites More sharing options...
SanchoZs Posted April 20, 2008 Author Report Share Posted April 20, 2008 Viņš pēc idejas arī ir domāts cronosā laist, bet problēma jau paliek tāpat. Vai tad ne tā? Link to comment Share on other sites More sharing options...
NiTrino Posted April 20, 2008 Report Share Posted April 20, 2008 nekad neesmu pieredzējis ka skriptiem cronā traucētu max_execution_time. varbūt kāds cits par tādiem ierobežojumiem zin? Link to comment Share on other sites More sharing options...
SanchoZs Posted April 20, 2008 Author Report Share Posted April 20, 2008 Nu es ar cronosu neesmu darbojies. Vnk es taisu scriptu, kas būs uz cronos. Bet pēc idejas - ja lapas kontentu nevar savākt, tad cikls apstājas. Uz cronos vai tad tas būtu savādāk? Link to comment Share on other sites More sharing options...
NiTrino Posted April 20, 2008 Report Share Posted April 20, 2008 crons vienk ir tā kā windowsā task scheduler, kas noteiktā laikā izpildā kādu komandu. un php skriptiem, kas tiek laisti no konsoles, daudzi ierobežojumi nedarbojas. Link to comment Share on other sites More sharing options...
SanchoZs Posted April 20, 2008 Author Report Share Posted April 20, 2008 Nu ok, to saprotu. Bet jautājums aktuāls - vai tad skripts izpildīsies līdz galam, ja kādu lapu nevarēs atvērt? Link to comment Share on other sites More sharing options...
NiTrino Posted April 20, 2008 Report Share Posted April 20, 2008 var iesetot timeout, un ja tas tiks pārsniegts, file_get_contents atgriezīs false un pāries uz nākamo lapu. es gan neesmu mēģinājis, bet nu izskatās ka tā jābūt :) http://overooped.com/post/31812358 Link to comment Share on other sites More sharing options...
SanchoZs Posted April 20, 2008 Author Report Share Posted April 20, 2008 Paldies. Ar timeout izdevās panākt to, ko vēlējos. Link to comment Share on other sites More sharing options...
Recommended Posts