1

我正在编写一个 PHP 脚本来获取网站内容并将每个网页插入到我的 MySQL 表中的单独帖子中。我选择的方法是 cURL、一些正则表达式、preg_match_all、几个 foreach 循环,最后是 MySQL 查询。代码很好,所以我不会在这里发布。

问题是脚本可以正常工作,只有不到 200 个帖子被插入到数据库中,但是当数量超过 ~200 时,浏览器永远不会停止加载。我想存储 749 个网页(每个页面的内容都是纯文本)。当我按下停止并查看数据库时,我在数据库中有大约 2 000 个帖子,每个帖子大约有 5 个重复项。

所以,我得出的结论是,有些东西(浏览器、服务器、数据库?)无法处理那么多页面,会中止进程并重新启动它。我尝试增加 PHP 中的最大执行时间,cURL 也是如此,但结果相同。

这是以前的帖子,我在此过程的早期遇到了一些问题。将大量网页内容转换成数组(PHP)

我的问题很简单:有谁知道这里出了什么问题?

编辑;好的,既然已经被请求了,下面是代码:

编辑2 ; 经过反复试验,我发现幻数是 152。脚本可以存储前 151 页,但是当我将页数更改为 152 时,我的数据库表中的帖子数突然翻倍到 304。任何想法?

EDIT3(好一个):事实证明脚本实际上在我的本地服务器上做了它应该做的事情。当我在我的网络主机服务器上运行它时,问题就来了。

<?php
header('content-type: text/html; charset=utf-8');

// Initialize cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://data.riksdagen.se/anforandelista/?anflista=true&rm=&anftyp=Nej&d=&ts=&parti=sd&iid=&sz=1000&utformat=xml');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$contents = curl_exec ($ch);

 // Some regex preg_match fun
 $regex = '/<anforande_url_xml>(.*?)<\/anforande_url_xml>/';
 $regex1 = '/<avsnittsrubrik>(.*?)<\/avsnittsrubrik>/';
 $regex2 = '/<anforande_url_xml>http:\/\/data.riksdagen.se\/anforande\/(.*?)<\/anforande_url_xml>/';
 $regex3 = '/<dok_datum>(.*?)<\/dok_datum>/';
 $regex4 = '/<talare>(.*?)<\/talare>/';
 preg_match_all($regex, $contents, $link);
 preg_match_all($regex1, $contents, $rubrik);
 preg_match_all($regex2, $contents, $id);
 preg_match_all($regex4, $contents, $talare);
 preg_match_all($regex3, $contents, $datum);

 // Display list of all posts
 $j = 0;
 echo "<pre>";
 foreach ($link[1] as $row) {
echo $j . " <a href=\"display.php?id=" . $id[1][$j] . "\">" . $rubrik[0][$j] . "</a>" . "<br />";
$j++;
 }

ini_set('max_execution_time', 300);

// Create array with all URLs
foreach ($link[1] as $row) {
$link[] = $row;
}

// Insert the core content to array
$lines = Array();
foreach ($link[1] as $row) {
$contents = file_get_contents($row);
$regex = '/<anforandetext>(.*?)<\/anforandetext>/s';
preg_match_all($regex, $contents, $output);

if (is_array($output) && isset($output[0]) && !empty($output[0])){
$lines[] = $output[1];  
}
}

// Connect. Yes, I know decprecated. Later issue.
mysql_connect("host", "user", "pass") or die("Gick inte att ansluta.");
mysql_select_db("db");

// Insert into db
$h = 0;
foreach ($lines as $row) {
$utf_title = utf8_decode($rubrik[1][$h]);
$utf_speaker = utf8_decode($talare[1][$h]);
$utf_contents = utf8_decode($row[0]);
$date = utf8_decode($datum[1][$h]);

$query = "INSERT INTO riksdag (title, speaker, contents, date) VALUES('$utf_title', '$utf_speaker', '$utf_contents', '$date')";
mysql_query($query);
$h++;
}

echo "</pre>";

curl_close ($ch);
?>
4

0 回答 0