Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]warunki dodawania do bazy danych
Forum PHP.pl > Forum > Przedszkole
BuncolPL
Stworzyłem skrypt, który sprawdza pozycje w google i zapisuje je do bazy. Wszystko jest ok z wyjątkiem tego, że przy większej ilości fraz do sprawdzenia skrypt się wiesza, ponieważ wywoływanie go trwa zbyt długo.

Wiem mniej więcej jak warunek powinien wyglądać ale nie wiem jak go napisać :/

1. Sprawdza czy wszystkie pozycji zostały sprawdzone
Tak - to kończy działanie skryptu
Nie - przechodzi do punktu 2

2. Sprawdza, które pozycje zostały już sprawdzone
- jeśli żadna to sprawdza wszystkie
- jeśli kilka już jest sprawdzonych to sprawdza tylko te, które nie zostały jeszcze dodane

Struktura bazy danych:

Fraza
frazaid
adresid
slowo

Pozycje
adresid
frazaid
miejsce
data
EarthCitizen
A masz dostęp do CRONa? Jak ten skrypt się wywołuje, ręcznie czy jakiś automat? Bo jak skrypt się zatrzyma to trzeba go na nowo odpalić, jak to widzisz?

A rozwiązanie może być takie:

Słowa kluczowe trzymasz w bazie, do każdego słowa masz status 0, wywołujesz sobie skrypt, który pobiera powiedzmy 5 słow/fraz (chyba tyle zdąrzy wykonać?) i dla każdego sprawdzonego słowa zmienia status...
BuncolPL
Cytat
A masz dostęp do CRONa? Jak ten skrypt się wywołuje, ręcznie czy jakiś automat? Bo jak skrypt się zatrzyma to trzeba go na nowo odpalić, jak to widzisz?


Skrypt będzie odpalany Cronem, więc wszystko automatycznie

Cytat
Słowa kluczowe trzymasz w bazie, do każdego słowa masz status 0, wywołujesz sobie skrypt, który pobiera powiedzmy 5 słow/fraz (chyba tyle zdąrzy wykonać?) i dla każdego sprawdzonego słowa zmienia status...


A jak takie coś dopisać ? Możesz podać jakiś przykład

Nie krzyczcie bo php uczę się od 2 tygodni smile.gif
erix
Cytat
A jak takie coś dopisać ? Możesz podać jakiś przykład
  1. na "rozdanie" skrypt wczytuje 10 rekordów, które są oznaczone jako nie sprawdzone (SELECT ... WHERE)
  2. sprawdzanych jest te dziesięc wybranych fraz
  3. oznaczasz wybrane rekordy jako sprawdzone (UPDATE SET ... WHERE ID=...)
i tyle. winksmiley.jpg
EarthCitizen
Możesz jeszcze zrobić taki patent, że sprawdzasz ile zostało Ci czasu do zakończenia wykonywania skryptu

  1. <?php
  2. function getCurrentTime()
  3. {
  4.    list($t1, $t2) = explode(' ',microtime());
  5.    return $t2 + $t1;  
  6. }
  7.  
  8. function getCurrentExecutionTime($start)
  9. {
  10.    $now  = sprintf("%0.2f", getCurrentTime() - $start);
  11.    return $now;
  12. }
  13.  
  14. $start = getCurrentTime();
  15. $end   = ini_get('max_execution_time');
  16.  
  17. // w pętli, której sprawdzasz kolejne słowa kluczowe na końcu dajesz
  18. //while/for/forach {
  19.  
  20. // tutaj zmieniasz status
  21. // i poniżej sprawdzasz czy masz czas jeszcze na kolejne sprawdzenie (przykładowo 20 sekund)
  22. $now = getCurrentExecutionTime();
  23.  
  24. if (($end - $now) < 20) { // jeżeli zostało mniej niż 20 s
  25.    break; // lub exit(); // stop
  26. }
  27.  
  28. // }
  29. ?>
BuncolPL
Cytat
na "rozdanie" skrypt wczytuje 10 rekordów, które są oznaczone jako nie sprawdzone


Ale jak to zrobić, żeby oznaczał które już dzisiaj sprawdził a które nie ?

Cytat
Możesz jeszcze zrobić taki patent, że sprawdzasz ile zostało Ci czasu do zakończenia wykonywania skryptu


Co to ma dać, że sprawdza ile zostało ? Po uruchomieniu skryptu ma go później automatycznie wywoływać np. co 20 sekund ? Dobrze rozumie ?
erix
Cytat
Ale jak to zrobić, żeby oznaczał które już dzisiaj sprawdził a które nie ?

Przecież napisałem smile.gif

Mogłoby to np. wyglądać tak:
  1. UPDATE frazy SET checked = 1 WHERE id=1 OR id=2 OR id=3 OR id=4

celowo nie wziąłem BETWEEN/IN
EarthCitizen
Cytat
Co to ma dać, że sprawdza ile zostało ? Po uruchomieniu skryptu ma go później automatycznie wywoływać np. co 20 sekund ? Dobrze rozumie ?


Nie, możesz wtedy pobrać wszystkie słowa, nie musisz się ograniczać do 10 (może się zdarzyć, że skrypt nie sprawdzi nawet 1 bo pewnie używasz curla?)

A skrypt ustaw co 5-10 minut, bo pewnie max_execution_time masz dla procesów crona większy niż dla standardowych skryptów PHP, ale sprawdź (echo ini_get('max_execution_time') [s])
BuncolPL
Kurde męczę się już z tym tyle czasu i nic. Próbowałem wzorować się na innych skryptach ale nic nie wychodzi.

Czy mógłby mi ktoś za piwo wytłumaczyć na priv jak to zrobić ?
erix
Cytat
Próbowałem wzorować się na innych skryptach ale nic nie wychodzi.

A może coś konkretniej? Samo, nie wychodzi, to niewiele informacji.
BuncolPL
Próbowałem z tym:
http://forum.php.pl/index.php?s=&showt...st&p=561159
http://forum.php.pl/index.php?s=&showt...st&p=561186

Ale moja wiedza z PHP jest jeszcze zbyt mała i nie potrafię sobie z tym poradzić :/
erix
Cytat
nie wychodzi

Siedzi w samochodzie? Pluje błędami? Nie robi nic? Zaraża prokrastynacją?

Człowieku, sam kod nie wystarczy, opisz, co się dzieje z tymi skryptami...
BuncolPL
Mam taki kod:

  1. <?php
  2. include('config.php');
  3. $_POST['data'] = date('Y-m-d');
  4.  
  5.   try
  6.   {
  7.      $dbh = $pdo = new PDO('mysql:host='.$host.';dbname='.$dbname.'', "$user", "$pass"); // polaczenie z baza danych
  8.      $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);                    // polaczenie z baza danych
  9.      $dbh -> query('SET NAMES utf8');                                                    // zmiana kodowania
  10.      $stmt = $pdo -> query('SELECT * FROM fraza LEFT JOIN strona USING (adresid) ');     // wybieranie danych z tabeli
  11.   }
  12.   catch(PDOException $e)
  13.   {
  14.      echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  15.   }
  16.  
  17.  $results = array();
  18.    foreach($stmt as $row){
  19.      if(!isset($results[$row['frazaid']])){
  20.  $results[$row['frazaid']] = array();
  21. }
  22. $adres = $row['adres']; // zamienianie
  23. $slowo = $row['slowo']; // zamienianie
  24.  
  25. // Monitoring pozycji
  26. $sSite       = "$adres";  
  27. $sQ          = "$slowo";
  28.  
  29. $sPackCnt    = 10;   // ilość podstron
  30. $sPackSize   = 10;   // ilość wyników na stronie
  31. $sStartPos   = 0;    // pozycja startowa
  32. $sFinishPos  = '-';  // pozycja końcowa
  33.  
  34. $sLinkRegExp = '/<h3 class=r><a href="([^"]+)" class=l>/';  
  35. $sURLTpl     = 'http://www.google.pl/search?hl=pl&q=%s';  
  36.  
  37. for($sPack = 0; $sPack < $sPackCnt; $sPack++)
  38. {
  39.     $sStartPos = $sPackSize * $sPack;
  40.     $rC = curl_init();
  41.     curl_setopt($rC, CURLOPT_HEADER, 0);
  42.     curl_setopt($rC, CURLOPT_RETURNTRANSFER, 1);
  43.     curl_setopt($rC, CURLOPT_VERBOSE, 1);
  44.     curl_setopt($rC, CURLOPT_REFERER, 'www.google.pl');
  45.     curl_setopt($rC, CURLOPT_URL, sprintf($sURLTpl, urlencode($sQ)) . '&start=' . $sStartPos );
  46.     $sData = curl_exec($rC);
  47.     curl_close($rC);
  48.  
  49.     preg_match_all($sLinkRegExp, $sData, $aResults);
  50.     $aResults = array_pop($aResults);
  51.  
  52.     foreach($aResults as $iKey => $sRow) {
  53.         if(strpos(strip_tags($sRow), 'http://' . $sSite) !== false) {
  54.             $sFinishPos = $sStartPos + $iKey + 1;
  55.             $sPack = $sPackCnt;
  56.         }
  57.     }
  58. }
  59. {
  60. $_POST['miejsce'] = $sFinishPos;
  61. $_POST['adresid'] = $row['adresid'];
  62. $_POST['frazaid'] = $row['frazaid'];
  63.  
  64.  
  65. $pdo -> exec('INSERT IGNORE INTO `pozycja` (`adresid`, `frazaid`, `miejsce`, `data`)VALUES(
  66.                ''.$_POST['adresid'].'',
  67.                ''.$_POST['frazaid'].'',
  68.                ''.$_POST['miejsce'].'',
  69.                ''.$_POST['data'].'')');
  70.    
  71. }
  72. //koniec monitoringu pozycji
  73.  
  74. $results[$row['frazaid']][] = $row;
  75. }
  76.  
  77.    foreach($results as $frazaid => $r){
  78.      echo sprintf('<dt>%s</dt>', $frazaid);
  79.      foreach($r as $row){
  80.  echo sprintf('%s - %s ', $row['adres'], $row['slowo']);
  81. }
  82. }
  83. ?>


Działa mi to jako CRON. Przy małej liczbie sprawdzanych fraz jest wszystko ok. Przy dużej jest problem.

Wydaje mi się, że to powinno być funkcją, a skrypt powinien zawierać opcje sprawdzającą, które frazy były sprawdzone a które nie. Później bierze sprawdza i zapisuje przez tą funkcję. Dlatego wolałbym z kimś o tym porozmawiać jak to zrobić bo sam nie daje z tym rady (nie znam na tyle PHP a rzuciłem się z tym na głęboką wodę).
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.