ページのニュース項目をダウンロードして解析する長時間実行スクリプトを実行しようとしています。私のスクリプトがダウンロードする約 260 以上の html ページがあり、各ページからニュース項目を解析します。
これは長時間実行されるスクリプトです。
解析する必要があるページの量を低く設定すると (つまり、実行にかかる時間が少なくなります)、スクリプトは正常に実行されます。
// Since the University blog page has 262 pages, we'll iterate through that.
// Only 21 pages.
for ($i = 2; $i <= 21; $i++) {
$url = "http://www.uvm.cl/noticias_mas.shtml?AA_SL_Session=34499aef1fc7a296fb666dcc7b9d8d05&scrl=1&scr_scr_Go=" . $i;
$page = file_get_html($url);
parse_page_for_news($page, $parsedNews);
}
そのページ数を 40 以上に増やすと、スクリプトは何も返さなくなります。Google Chrome では、次のエラー メッセージが表示されます。
// Since the University blog page has 262 pages, we'll iterate through that.
// 41 pages this time. Longer running time!
for ($i = 2; $i <= 41; $i++) {
$url = "http://www.uvm.cl/noticias_mas.shtml?AA_SL_Session=34499aef1fc7a296fb666dcc7b9d8d05&scrl=1&scr_scr_Go=" . $i;
$page = file_get_html($url);
parse_page_for_news($page, $parsedNews);
}
データが受信されません
サーバーからデータが送信されなかったため、Web ページを読み込めません。
いくつかの提案があります: この Web ページを後でリロードします。
エラー 324 (net::ERR_EMPTY_RESPONSE): サーバーはデータを送信せずに接続を閉じました。
php.ini
いくつかの検索に基づいて行った変更を次に示しますが、まだ機能する修正はありません。
;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;
max_execution_time = 0 ; Maximum execution time of each script, in seconds
max_input_time = 60 ; Maximum amount of time each script may spend parsing request data
memory_limit = -1 ; Maximum amount of memory a script may consume (8MB)
もう 1 つの奇妙な点は、スクリプトを高速に実行するように設定すると (反復回数が少ない)、access_log
ファイル内の要求を実際に確認できることです。
127.0.0.1 - - [27/Jul/2012:15:50:19 -0400] "GET /scrapernoticias/scraper.php HTTP/1.1" 200 509
127.0.0.1 - - [27/Jul/2012:15:50:23 -0400] "GET /scrapernoticias/scraper.php HTTP/1.1" 200 509
127.0.0.1 - - [27/Jul/2012:15:58:02 -0400] "GET /scrapernoticias/scraper.php HTTP/1.1" 200 500
物事を高 (実行時間の長い反復) に設定すると、この新しい要求がサーバーに到達していないかのように見えなくなります。
スクリプト全体は次のとおりです。
<h1>Scraper Noticias</h1>
<?php
include('simple_html_dom.php');
include('rb.php');
// Setup RedBean to work with a database.
R::setup('mysql:host=localhost;dbname=noticias','root','');
set_time_limit(0);
class News {
var $image;
var $fechanoticia;
var $title;
var $description;
var $sourceurl;
function get_image( ) {
return $this->image;
}
function set_image ($new_image) {
$this->image = $new_image;
}
function get_fechanoticia( ) {
return $this->fechanoticia;
}
function set_fechanoticia ($new_fechanoticia) {
$this->fechanoticia = $new_fechanoticia;
}
function get_title( ) {
return $this->title;
}
function set_title ($new_title) {
$this->title = $new_title;
}
function get_description( ) {
return $this->description;
}
function set_description ($new_description) {
$this->description = $new_description;
}
function get_sourceurl( ) {
return $this->sourceurl;
}
function set_sourceurl ($new_sourceurl) {
$this->sourceurl = $new_sourceurl;
}
}
// Declare variable to hold all parsed news items.
$parsedNews = array();
// Grab page number 1, and parse that first.
$initialPage = file_get_html('http://www.uvm.cl/noticias_mas.shtml');
parse_page_for_news($initialPage, $parsedNews);
// Since the University blog page has 262 pages, we'll iterate through that.
for ($i = 2; $i <= 3; $i++) {
$url = "http://www.uvm.cl/noticias_mas.shtml?AA_SL_Session=34499aef1fc7a296fb666dcc7b9d8d05&scrl=1&scr_scr_Go=" . $i;
$page = file_get_html($url);
parse_page_for_news($page, $parsedNews);
}
echo "<h1>Noticias encontradas:" . count($parsedNews) . "</h1>";
//echo print_r($parsedNews[count($parsedNews) - 1]);
// Save each parsed news to the database.
foreach($parsedNews as &$tmpNews) {
$noticia = R::dispense('noticia');
$noticia->imagen = $tmpNews->get_image();
$noticia->fecha = $tmpNews->get_fechanoticia();
$noticia->titulo = $tmpNews->get_title();
$noticia->url = $tmpNews->get_sourceurl();
$noticia->descripcion = $tmpNews->get_description();
$id = R::store($noticia);
}
// Disconnect from the database.
R::close();
// Function receives an HTML Dom object, and the library works against that single HTML object.
function parse_page_for_news ($page, &$parsedNews) {
foreach($page->find('#cont2 p') as $element) {
$newItem = new News;
// Parse the news item's thumbnail image.
foreach ($element->find('img') as $image) {
$newItem->set_image($image->src);
//echo $newItem->get_image() . "<br />";
}
// Parse the news item's post date.
foreach ($element->find('span.fechanoticia') as $fecha) {
$newItem->set_fechanoticia($fecha->innertext);
//echo $newItem->get_fechanoticia() . "<br />";
}
// Parse the news item's title.
foreach ($element->find('a') as $title) {
$newItem->set_title($title->innertext);
//echo $newItem->get_title() . "<br />";
}
// Parse the news item's source URL link.
foreach ($element->find('a') as $sourceurl) {
$newItem->set_sourceurl("http://www.uvm.cl/" . $sourceurl->href);
}
// Parse the news items' description text.
foreach ($element->find('a') as $link) {
$link->outertext = '';
}
foreach ($element->find('span') as $link) {
$link->outertext = '';
}
foreach ($element->find('img') as $link) {
$link->outertext = '';
}
$newItem->set_description($element->innertext);
// Add the newly formed NewsItem to the $parsedNews object.
$parsedNews[] = $newItem;
// For debugging purposes, it'll print each parsed News Item.
//print_r($newItem);
//echo "<br /><br /><br />";
}
}
?>