【问题标题】:Stop the execution of php code and send the signal to JavaScript停止执行 php 代码并将信号发送到 JavaScript
【发布时间】:2014-02-20 22:56:43
【问题描述】:

我的 PHP 代码在 Amazon.com 上发送查询以检索有关书籍的信息。 当它接收到信息时,有两种可能执行下面的程序。要确定应该使用什么的可能性,就必须看书本利润的总数进行研究。

我现在所做的是发送第一个请求并检索结果总数。根据结果​​的数量,我给变量$queryUrl赋了一个新值。如果结果数大于 1200,则按应有的方式执行程序。

如果结果数少于 1200,程序应该完成循环以遍历整个结果页面和其余的 php 代码,但只执行一次。

目前,如果结果少于 1200。该程序遍历所有结果页面,但在 PHP 代码末尾处停止。它根据查询的参数是$searchMonthUrlParam 继承变量recupMonth JavaScript,多次执行所有代码。

现在,我有这个

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);

如果它进入else但他完成了一次完整的执行,有人会有一个关于如何为stoper php代码执行提供动力的解决方案?

【问题讨论】:

  • 这是一个思想家好吧。您是否考虑过在将脚本传递给 php 之前使用 nodejs 或在到达脚本末尾进行初始处理之前返回的东西?
  • 不,我不使用 nodejs,但如果执行超过 1200 个结果,那么在脚本结束之前已经返回了控制器。但问题是我目前不知道该怎么做
  • 我没有正确理解您的需求?如果结果计数低于 1200,你想做什么?您需要再次查询亚马逊还是做其他事情?
  • 伙计,您的问题有点难以理解。您可以编辑以使其更易于理解吗?请一所大学阅读它,然后向您解释,如果他解释的内容与您需要的完全一样,那么您就可以走了,否则请尝试重新措辞。
  • 这似乎是一个非常简单的问题。这里唯一的麻烦是没有人明白你到底在问什么。保持简单,粘贴更多代码。我没有看到循环。我看不到 PHP 和 JS 之间的通信。我所看到的只是一个 IF 分支,您可以在其中为 $queryUrl 分配不同的值。我已经阅读了您的问题 4 次,但仍然不明白什么循环、什么“php 代码的其余部分”、您要退出的位置以及与 JavaScript 有什么关系。

标签: javascript php web-applications conditional-statements


【解决方案1】:

要退出循环并结束 PHP 执行,只需返回一个结果:

//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);
}

【讨论】:

  • 如果有返回,查询将被发送一次?
  • 这取决于你的函数或方法的其余部分。我不知道您布置的代码 sn-p 是循环还是什么。如果是,那么是的,它应该结束循环,返回一个结果(大概是通过 AJAX 到您的 javascript?)并停止执行该函数或方法。更多信息将有助于解决您的问题。
猜你喜欢
  • 1970-01-01
  • 2014-02-22
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
相关资源
最近更新 更多