我正在尝试创建一个网络应用程序,用于确定用户输入的网址中是否有一个或多个电子商务商品缺货。这些网址可以用逗号分隔。目前,我在javascript循环中用逗号分隔后,为每个url调用我的一个PHP脚本调用。以下是代码:
function sendRequest(urls) {
if (urls.length == 0) {
return;
} else {
var A = urls.split(',');
for (var i = 0; i < A.length; i++) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
var result_set = JSON.parse(this.responseText);
if (result_set.flag == 1) {
insertRow('stock-table', result_set.url, result_set.title); // It populates a table and insert row in it.
}
}
};
xmlhttp.open("GET", "scrapper.php?url=" + A[i], true);
xmlhttp.send();
}
}
}
scrapper.php如下:
<?php
function get_title($data)
{
$title = preg_match('/<title[^>]*>(.*?)<\/title>/ims', $data, $matches) ? $matches[1] : null;
return $title;
}
if (!isset($_SESSION['username'])) {
header("Location: index.php");
}
else if (isset($_GET["url"])) {
$url = $_GET["url"];
$title = null;
$result_set = null;
$flag = 0;
$file = fopen($url,"r");
if (!$file) {
echo "<p>Unable to open remote file.\n";
exit;
}
while (!feof($file)) {
$line = fgets($file, 1024);
if ($title == null){
$title = get_title($line);
}
if (preg_match('/<span[^>]*>Add to Cart/i',
$line, $matches, PREG_OFFSET_CAPTURE)) {
break;
}
if (preg_match('/Sold Out|Out of Stock/i',
$line, $matches, PREG_OFFSET_CAPTURE)) {
$flag = 1;
break;
}
}
fclose($file);
$result_set = array("flag" => $flag,
"url" => $url,
"title" => $title
);
echo json_encode($result_set);
}
?>
现在的问题是:即使对于两个网址,此程序也需要太多时间。虽然,我从file_get_contents()(甚至更慢)移到了这里(ftp解决方案)。我心里很少有困惑:
请帮助
答案 0 :(得分:0)
其他一些说明:
fopen
之前对其进行验证,特别是考虑到用户可以通过简单传递相对路径并开始阅读“私有”文件。file_get_contents
。它几乎相当于fopen
,但为你做了很多工作。const
关键字而不是var
来获取XMLHttpRequest变量。目前,var
被提升到函数范围的顶部,您只需在循环的每次迭代时覆盖它。如果你想为XMLHttpRequest添加更多逻辑,你可能会发现自己容易出现一些无意的行为。