Pereiti prie turinio

Parsing scripto optimizavimas


Rekomenduojami pranešimai

Taigi, darau scriptą, kuris pasiima iš mysql saito adresą($url) ir informaciją($bendra) kur jame ieškoti kainos.

 

Bet problema tada, kai paleidžia ciklą jis žvėriškai užkrauna servą, RAM sunaudojimas pakyla per 200mb ir tai, kai mysql duomenų bazėje yra 30 eilučių.

Jei pavyktų šį scriptą įgyvendint man reiktų, kad jis sugebėtų kelis tūkstančius eilučių apdorot.

 

Čia vienas pirmųjų php darbų, taigi neisivaizduoju ką reiktų keisti... Gal ką patarsit?

 

function get_price($linkas,$bendra){

$html = file_get_html($linkas);
foreach($html->find($bendra) as $e)
$price = extract_numbers($e->innertext);
return $price[0];

}

 

$dbhost = 'localhost';
$dbuser = 'xxxxxx';
$dbpass = 'xxxxxxx';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
 die('Could not connect: ' . mysql_error());
}


mysql_select_db("testas");


$sql="SELECT * FROM getP_pinfo";
$result=mysql_query($sql);



while($row = mysql_fetch_assoc($result)) {
extract($row);

echo get_price($URL,$Bendra);
echo "<br><br>";

}

mysql_free_result($result);
mysql_close();

 

EDIT: Beto iš pradžių jis net neveikė, teko didint memory_limit

Redagavo Nerka
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Pabandyk išvalyti $html su clear():

 

function get_price($linkas, $bendra)
{
   $html = file_get_html($linkas);

   foreach($html->find($bendra) as $e)
   {
       $price = extract_numbers($e->innertext);
   }

   $html->clear();

   return $price[0];
}

 

O šiaip siūlyčiau tiesiog atsidaryti failą ir naudoti regex paieškai, bus greičiau ir naudos mažiau resursų.

Redagavo alter
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Pabandyk išvalyti $html su clear():

 

function get_price($linkas, $bendra)
{
   $html = file_get_html($linkas);

   foreach($html->find($bendra) as $e)
   {
       $price = extract_numbers($e->innertext);
   }

   $html->clear();

   return $price[0];
}

 

O šiaip siūlyčiau tiesiog atsidaryti failą ir naudoti regex paieškai, bus greičiau ir naudos mažiau resursų.

 

 

Ačiū, lyg ir padėjo clear() :)

Reiks išbandyt su daugiau eilučių.

 

Edit: su 300 url, be problemų veikia :)

Redagavo Nerka
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Ačiū, lyg ir padėjo clear() :)

Reiks išbandyt su daugiau eilučių.

 

Edit: su 300 url, be problemų veikia :)

Aš panašią alternatyvą tik sudėtingesnę su keliasdešimt tūkstančių linkų laisvai prasuku ir be clear, reikės išbandyti ir clear, gal greičiau eis. Tiesa, viską sukau iš localhost'o.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Aš panašią alternatyvą tik sudėtingesnę su keliasdešimt tūkstančių linkų laisvai prasuku ir be clear, reikės išbandyti ir clear, gal greičiau eis. Tiesa, viską sukau iš localhost'o.

 

Na pas mane ne iš localhost, bet buvusiai problemai manau buvo nesvarbu ar iš localhost ima ar ne.

 

 

Tokie dalykai su kiekviena naujesne PHP versija veikia vis greičiau ir ima mažiau RAM'o. Tad jeigu turi galimybių, gali tiesiog atsinaujint php.

 

Scriptas pas mane lievas, o ne php versija :D

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Vėl tos pačios problemos(Fatal error: Allowed memory size of...), bet keičiau skriptą.. file_get_contents pakeičiau į cURL ir vėl 30 saitų užkrovus baigiasi memory...

 

function get_data($url)
{
$ch = curl_init();
   $referers = array("google.com", "yahoo.com", "msn.com", "ask.com", "live.com");
   $choice = array_rand($referers);
   $referer = "http://" . $referers[$choice] . "";

   $browsers = array("Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)");
   $choice2 = array_rand($browsers);
   $browser = $browsers[$choice2];

   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_USERAGENT, $browser);
   curl_setopt($ch, CURLOPT_REFERER, $referer);
   curl_setopt($ch, CURLOPT_AUTOREFERER, true);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
   curl_setopt($ch, CURLOPT_TIMEOUT, 30);
   curl_setopt($ch, CURLOPT_MAXREDIRS, 7);
   curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
   //curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}

function get_price($linkas,$bendra){
 $htmlc = get_data($linkas);
 $html = str_get_html($htmlc);

   foreach($html->find($bendra) as $e) {
     $price = extract_numbers($e->innertext);
     return $price[0];
     $html->clear();
     $htmlc->clear();
   }
}

 

clear(); lyg ir yra... nematau daugiau kintamųjų, kuriuos reiktų išvalyti... Kas dabar negerai ? :angry:

 

turbūt teks grįžti prie buvusio skripto, bet labai idomu sužinoti kas blogai...

Redagavo Nerka
Nuoroda į pranešimą
Dalintis kituose puslapiuose

tavo ->clear() niekada nevykdomi gi... perkelk juos PRIES return..

 

 

Vėl tos pačios problemos(Fatal error: Allowed memory size of...), bet keičiau skriptą.. file_get_contents pakeičiau į cURL ir vėl 30 saitų užkrovus baigiasi memory...

 

function get_data($url)
{
$ch = curl_init();
   $referers = array("google.com", "yahoo.com", "msn.com", "ask.com", "live.com");
   $choice = array_rand($referers);
   $referer = "http://" . $referers[$choice] . "";

   $browsers = array("Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20060918 Firefox/2.0", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)");
   $choice2 = array_rand($browsers);
   $browser = $browsers[$choice2];

   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_USERAGENT, $browser);
   curl_setopt($ch, CURLOPT_REFERER, $referer);
   curl_setopt($ch, CURLOPT_AUTOREFERER, true);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
   curl_setopt($ch, CURLOPT_TIMEOUT, 30);
   curl_setopt($ch, CURLOPT_MAXREDIRS, 7);
   curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
   //curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}

function get_price($linkas,$bendra){
 $htmlc = get_data($linkas);
 $html = str_get_html($htmlc);

   foreach($html->find($bendra) as $e) {
     $price = extract_numbers($e->innertext);
     return $price[0];
     $html->clear();
     $htmlc->clear();
   }
}

 

clear(); lyg ir yra... nematau daugiau kintamųjų, kuriuos reiktų išvalyti... Kas dabar negerai ? :angry:

 

turbūt teks grįžti prie buvusio skripto, bet labai idomu sužinoti kas blogai...

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...