私は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;
?>
そして、この文字列を取得するために、私はJavaScriptを使用してHTMLページを持っていますXMLHttpRequestを使用して結果を取得します。
<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>
私は私のPHPスクリプトの結果を得るために、このスクリプトを使用すると、asynchronusモード(真)で、私は、ステータス== 0を取得し、synchronusモード(偽)に私が手にしながら、私は空の応答を取得status == 200とし、結果を表示することができます。
いくつかのテストの後、私は、パーサーを使用して非同期リクエストが機能しなくなったことに気付きました。 PHPスクリプトがrunParserの前に停止している場合(たとえば存在しない変数の場合)、私は答えを得ることができます(この場合はREQ ERROR)。
私の問題はDOMDocument :: loadHTMLFileの使用に関連しているのですか、他の場所で問題がありますか?