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/>> <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?
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? –
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
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? –