2014-01-29 7 views
10

Mein PHP-Code sendet Abfragen auf Amazon.com, um Informationen über Bücher abzurufen. Wenn es die Information empfängt, gibt es zwei Möglichkeiten für die Ausführung des folgenden Programms. Möglichkeit zu definieren, was verwendet werden soll, muss die Gesamtzahl der Buchgewinn für die Forschung betrachten.Stoppen Sie die Ausführung von PHP-Code und senden Sie das Signal an JavaScript

Was ich im Moment mache, sende ich eine erste Anfrage und erhalte die Gesamtzahl der Ergebnisse. Entsprechend der Anzahl der Ergebnisse weise ich der Variablen $queryUrl einen neuen Wert zu. Wenn die Anzahl der Ergebnisse größer als 1200 ist, werden die Programme so ausgeführt, wie es sollte.

Wenn die Anzahl der Ergebnisse weniger als 1200 ist, sollte das Programm die Schleife ausführen, um die gesamten Seiten der Ergebnisse und den Rest des PHP-Codes zu durchlaufen, aber nur ein einziges Mal.

Im Moment, wenn es weniger als 1200 Ergebnisse gibt. Das Programm durchläuft alle Seiten der Ergebnisse, aber Orte, an denen am Ende des PHP-Codes zu stoppen. Es führt den gesamten Code mehrere Male je nach dem Parameter der Abfragen $searchMonthUrlParam erben die Variable recupMonth JavaScript.

Vorerst habe ich, dass

PHP:

//Retrieve variable value passed in POST from JavaScript 
$pageNum = (isset($_POST["pageNum"]) && $_POST["pageNum"]) ? intval($_POST["pageNum"]) : 1; 
     $writeMode = (isset($_POST["writeMode"]) && $_POST["writeMode"]) ? $_POST["writeMode"] : "w"; 
     $searchType = (isset($_POST["searchType"]) && $_POST["searchType"]) ? intval($_POST["searchType"]) : 0; 
     $month = (isset($_POST["month"]) && $_POST["month"]) ? intval($_POST["month"]) : date("n"); 
     $year = (isset($_POST["year"]) && $_POST["year"]) ? intval($_POST["year"]) : date("Y") ; 
     $keyword = (isset($_POST["keyword"]) && strlen($_POST["keyword"])) ? $_POST["keyword"] : ""; 
     $startMonth = (isset($_POST["startMonth"]) && strlen($_POST["startMonth"])) ? $_POST["startMonth"] : NULL; 
     $startYear = (isset($_POST["startYear"]) && strlen($_POST["startYear"])) ? $_POST["startYear"] : NULL; 
     $endMonth = (isset($_POST["endMonth"]) && strlen($_POST["endMonth"])) ? $_POST["endMonth"] : NULL; 
     $endYear = (isset($_POST["endYear"]) && strlen($_POST["endYear"])) ? $_POST["endYear"] : NULL; 
     if($keyword) { 
      if($writeMode === "w") { 
       file_put_contents(CSV_FILE, ""); 
      } 

      $searchMonthUrlParam = "&field-datemod=".$month; 
      $searchYearUrlParam = "&field-dateyear=".$year; 

      $searchTypeUrlParam = ""; 
      switch($searchType) { 
       case SEARCH_TYPE_TITLE: 
        $searchTypeUrlParam = "&field-title="; 
        break; 
       case SEARCH_TYPE_KEYWORDS: 
        $searchTypeUrlParam = "&field-keywords="; 
        break; 
       case SEARCH_TYPE_AUTHOR: 
        $searchTypeUrlParam = "&field-author="; 
        $searchTypeUrlParam = "&field-publisher="; 
        break; 
       case SEARCH_TYPE_PUBLISHER: 
        break; 
      } 
    //send request to Amazon  
    $queryUrl = AMAZON_TOTAL_BOOKS_COUNT . $searchMonthUrlParam . $searchYearUrlParam . $searchTypeUrlParam . urlencode($keyword) . '&page=' . $pageNum; 
        $queryResult = file_get_contents($queryUrl); 
        //Search number total results 
        if (preg_match('/of\s+([0-9,]+)\s+Results/', $queryResult, $matches)) { 
         $totalResults = (int) str_replace(',', '', $matches[1]); 
        } else { 
         throw new \RuntimeException('Total number of results not found'); 
        } 
        //this condition work 
        if ($totalResults > MAX_RESULT_ALL_PAGES) { 
         $queryUrl = AMAZON_SEARCH_URL . $searchMonthUrlParam . $searchYearUrlParam . $searchTypeUrlParam . urlencode($keyword) . '&page=' . $pageNum; 
        } 

        //with this condition I don't know how to proceed 
        else { 

         $queryUrl = AMAZON_TOTAL_BOOKS_COUNT.$searchMonthUrlParam.$searchYearUrlParam.$searchTypeUrlParam.urlencode($keyword)."&page=".$pageNum; 

       } 
$htmlResultPage = file_get_html($queryUrl); 
$htmlQueryResult = $htmlResultPage->find("div[class=result]"); 
exit; 

JavaScript:

if(processedResultCount === 0) { 
         pageNum = 1; 
         recupMonth--; 
         if(recupMonth === 0 && recupYear > endYear) { 
          recupMonth = 12; 
          recupYear--; 
         } 
         else if(parseInt(recupMonth, 10) === parseInt(endMonth, 10) && parseInt(recupYear, 10) === parseInt(endYear, 10)) { 
          alert("Processing finished"); 
          if(totalResultCount != 0) { 
           contentElt.innerHTML = "Total processed results: " + totalResultCount + '<br/><br/>&gt; <a href="amazon_keyword_stats.csv" title="Download CSV result file">Download CSV result file</a>'; 
          } 
          return; 
         } 
        } 
       getAmazonResult(pageNum, writeMode); 
       return; 
      } 
     } 
    } 
xmlHttp.open("POST", "ctrl/getAmazonResult.php", true); 
    xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); 
    xmlHttp.send("pageNum=" + pageNum + "&writeMode=" + writeMode + "&searchType=" + searchType + "&month=" + recupMonth + "&year=" + recupYear + "&keyword=" + keyword + "&startMonth=" + startMonth + "&startYear=" + startYear + "&endMonth=" + endMonth + "&endYear=" + endYear); 

Jemand würde eine Lösung hat, wie stoper PHP Code-Ausführung mit Strom zu versorgen, wenn es in der geht sonst aber ist er fertig, um einmal vollständig auszuführen?

+0

Es ist ein Denker in Ordnung. Haben Sie darüber nachgedacht, nodejs oder etwas zu verwenden, das zurückkehrt, bevor Sie das Skript für die anfängliche Verarbeitung aufrufen, bevor Sie es an den php übergeben? –

+0

Nein Ich benutze nicht nodejs, aber wenn die Ausführung von mehr als 1200 dort bereits von Controllern resultieren, die vor dem Ende des Skripts zurückgegeben werden. Aber das Problem ist, dass ich nicht sehe, wie das derzeit – mortiped

+2

verstehe ich nicht Ihren Bedarf richtig? Was möchten Sie tun, wenn die Ergebniszahl unter 1200 liegt? musst du die amazone noch einmal abfragen oder etwas anderes machen? –

Antwort

2

Um von der Schleife und Ende PHP Ausführung zu entkommen, einfach ein Ergebnis zurück:

//this is the condition you indicated works 
if ($totalResults > MAX_RESULT_ALL_PAGES) { 
    $queryUrl = AMAZON_SEARCH_URL . $searchMonthUrlParam . $searchYearUrlParam . $searchTypeUrlParam . urlencode($keyword) . '&page=' . $pageNum; 
    } 
//this is the condition you indicated does not work 
else { 
    return someSortOfResultProcessing($queryResult); 
} 
+0

mit zurück, die Abfragen werden ein einziges Mal gesendet werden? – mortiped

+0

Es hängt vom Rest Ihrer Funktion oder Methode ab. Ich weiß nicht, ob das Code-Snippet, das Sie angelegt haben, in einer Schleife ist oder was.Wenn ja, dann sollte es die Schleife beenden, ein Ergebnis zurückgeben (vermutlich via AJAX zu Ihrem Javascript?) Und die Ausführung dieser Funktion oder Methode stoppen. Weitere Informationen wären hilfreich bei der Beantwortung Ihrer Frage. – clarkatron

Verwandte Themen