Webサイトのコンテンツをフェッチし、各WebページをMySQLテーブルの個別の投稿に挿入するPHPスクリプトを作成しています。私が選択する方法は、cURL、いくつかの正規表現、preg_match_all、いくつかのforeachループ、そして最後にMySQLクエリです。コードは問題ないので、ここには投稿しません。
問題は、データベースに挿入される投稿が約200未満の場合でもスクリプトが正常に機能することですが、その数が200を超えると、ブラウザーの読み込みが停止することはありません。正確に749のWebページを保存したい(各ページのコンテンツはプレーンテキストです)。停止を押してデータベースを見ると、データベースには約2 000の投稿があり、各投稿の複製は約5つあります。
したがって、私が導き出した結論は、その数のページを処理できず、プロセスを中止して再起動するもの(ブラウザー、サーバー、データベース?)があるということです。PHPと同様にcURLで最大実行時間を増やしてみましたが、同じ結果になりました。
これは、プロセスの早い段階でいくつかの問題が発生した以前の投稿です。多数のWebページから配列へのコンテンツ(PHP)
私の質問は単純です:誰かがここで何が間違っているのか考えていますか?
編集; OK、リクエストされたので、コードは次のとおりです。
EDIT2 ; 試行錯誤の結果、マジックナンバーが152であることがわかりました。スクリプトは最初の151ページを保存できますが、ページ数を152に変更すると、データベーステーブルの投稿数が2倍の304になります。アイデア?
EDIT3(良いもの):スクリプトが実際にローカルサーバーで実行するはずのことを実行していることがわかりました。問題は、Webホストサーバーで実行すると発生します。
<?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);
?>