2017-11-30 26 views
0

HTML 파일에서 DOM을 구문 분석 한 후 문자열을 반환하는 PHP 스크립트가 있습니다.내 PHP 코드가 DOMDocument :: loadHTMLFile을 사용할 때 XMLHttpRequest가 비동기 모드에서 작동하지 않습니다.

parserFunctions.php (난 그냥 표시 한 유용한 기능) :

<?php 
function initPagesToParse($Path){ 
    define('MESSAGES_BY_PAGE', 20); 
    $Docs[0] = new DOMDocument(); 
    $Docs[0]->loadHTMLFile($Path); 
    $numberOfPages = getMessageNumber($Docs[0])/MESSAGES_BY_PAGE; 
    if($numberOfPages > 1){ 
     for($i = 1; $i < $numberOfPages; $i++){ 
      $startPost = $i * MESSAGES_BY_PAGE; 
      $Docs[$startPost] = new DOMDocument(); 
      $Docs[$startPost]->loadHTMLFile($Path . '&start=' . $i); 
     } 
    } 
    return $Docs; 
} 

function runParser($Path){ 
    $Result = ''; 
    foreach(initPagesToParse($Path) as $Doc) { 
     $Result = $Result . getVoteIDsFromDocument($Doc); 
    } 
    if($Result == ''){ 
     return FALSE; 
    } 
    $FileID = uniqid('Vote_IDs_', TRUE); 
    if(file_put_contents ('VoteIDs_files/' . $FileID . '.txt', $Result, LOCK_EX) === FALSE){ 
     return FALSE; 
    } 
    return $FileID; 
} 
?> 

parserMain.php :

<?php 
include 'parserFunctions.php'; 

error_log("Parsing \n"); 

if(!isset($_POST["URL"]) || $_POST["URL"] == null) { 
    echo 'REQ ERROR'; 
    exit(); 
} 

$url = $_POST["URL"]; 

if(($FileID = runParser($url)) === FALSE){ 
    echo 'PARSING ERROR'; 
    exit(); 
} 

error_log($url); 
error_log($FileID); 
echo $FileID; 
?> 

그리고 나는를 사용하는 자바 스크립트와 HTML 페이지가이 문자열을 얻을 수 XMLHttpRequest를 사용하여 결과를 얻습니다. 내가 asynchronus 모드에서, 내 PHP 스크립트의 결과를 얻기 위해이 스크립트를 사용하는 경우

<script type="text/javascript"> 
"use strict"; 
function sendUrlToParser() { 
    var handleResponse = function (status, response) { 
     alert(response); 
    } 

    var handleStateChange = function() { 
     switch (xmlhttp.readyState) { 
      case 0 : // UNINITIALIZED 
      case 1 : // LOADING 
      case 2 : // LOADED 
      case 3 : // INTERACTIVE 
       break; 
      case 4 : // COMPLETED 
       handleResponse(xmlhttp.status, xmlhttp.responseText); 
       break; 
      default: alert("error"); 
     } 
    } 

    var xmlhttp=new XMLHttpRequest(); 
    xmlhttp.onreadystatechange = handleStateChange; 
    xmlhttp.open("POST", "parserMain.php", true); 
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    xmlhttp.send("URL=" + document.getElementById("URL").value); 
} 
</script> 

이 (사실이) 나는 상태 == 0을 얻고 나는 동안 SYNCHRONUS 모드에서 빈 응답을 얻을 (false)를 내가 얻을 status == 200이고 결과를 표시 할 수 있습니다.

필자가 여러 번 테스트 한 결과 파서를 사용하여 비동기 요청이 작동을 멈췄을 때만 나타났습니다. PHP 스크립트가 runParser (예 : 존재하지 않는 변수의 경우) 이전에 중지되면 대답을 얻을 수 있습니다 (이 경우 REQ ERROR).

내 문제는 DOMDocument :: loadHTMLFile 사용과 관련되어 있습니까? 아니면 다른 곳에서 문제가 있습니까?

답변

0

요청 후 페이지 새로 고침을 사용하지 못하게 설정하여 문제가 해결되었습니다. "return false;"를 추가합니다. "onsubmit"속성에.

<form method="POST" onsubmit="sendUrlToParser(); return false;">