首页编程PHP典型模块内容自动采集器模块文章详细

采集异常及处理

原创 2023-10-03 23:54:06 142

前几节介绍了内容自动采集器模块的基本原理,并完成了采集器的编码。现在采集器程序已经可以从目标站点抓取需要的内容了,不过当被抓取站点的内容过多时,就会引发一系列的问题导致程序崩溃,内容抓取失败。本节将介绍采集过程中常见的异常状况,并说明这些状况产生的原因和处理方法。

1. 抓取超时解决方法

众所周知,PHP通过浏览器执行的时间限制是30秒,超过这个时间限制程序会被判定异常,系统会报出一个“致命级”的错误终止程序运行。但是要想全面理解这个问题并找到解决办法,需要理解PHP的“连接处理”机制。在PHP内部系统维护着连接状态,其状态有3种可能的情况:

0-NORMAL(正常);

1-ABORTED(异常退出);

2-TIMEOUT(超时);

当连接时间超过PHP的时限(请参阅set_time_limit()函数)时,TIMEOUT状态的标记将被打开。该标记决定脚本是否需要在客户端中断连接时退出。有时让脚本完整地运行会带来很多方便,即使没有远程浏览器接受脚本的输出。

默认的情况是,当远程客户端连接中断时脚本将会退出。该处理过程可由php.iniignore_user_abort 或由 Apache .conf 设置中对应的php_value ignore_user_abort,以及ignore_user_abort()函数来控制。如果没有“告诉”PHP忽略用户的中断,脚本将会被中断,除非通过register_shutdown_function()设置了关闭触发函数。通过该关闭触发函数,当远程用户单击STOP按钮后,脚本再次尝试输出数据时,PHP将会检测到连接已被中断,并调用关闭触发函数,但是脚本也有可能被内置的脚本计时器中断。

注意:默认的超时限制为30秒。这个值可以通过设置php.inimax_execution_timeApache.conf设置中对应的php_value max_execution_time 参数或者 set _time_limit函数来更改。

通过上面的分析,可以了解采集程序抓取内容超时的原因。下面为读者介绍两种常用的解决方法:

第一种思路是通过延时函数,代码如下:

$ch = curl_init();
$timeout= 10; //设置延时时间
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,$timeout);
$buffer2 = curl_exec($ch); //执行句柄
curl_close ($ch); //关闭连接

将上面的代码加入到脚本代码中,就可以解决执行超时的问题了。

第二种思路是通过命令行的方式执行PHP程序,这样就可以有效的避免30秒限制所产生的问题了。

2. 任务接力模式

任务接力模式的本质是对一个任务做拆分,将一个任务拆分成多个子任务来实现。如执行完付费任务时,使用PHPHeader()函数重定向到发送Email的页面,完成后再定向到其他页面,采用redirect页面的方式来接力地完成任务。

设计3个PHP文件,文件名分别是s1.php、s2.php、s3.php,让这3个文件进行程序接力。

S1.php文件的内容如下:

<?php
ob_start();
sleep(3);//代表做某些任务所用的时间
echo "在做第一件事。";
header ("Location: http://127.0.0.1/s3.php?i=$i");
ob_end_flush();
?>

S2.php文件的内容如下:

<?php
ob_start();
$i=$_GET['i']+1;
echo "在做第二件事";
sleep(3);//代表做某些任务所用的时间
header ("Location: http://127.0.0.1/s4.php?i=$i");
ob_end_flush();
?>

S3.php文件的内容如下:

<?php
ob_start();
$i=$_GET['i']+1;
sleep(3);
echo "在做第三件事";
ob_end_flush();
?>

【代码解读】

上述3个文件是将一个任务拆分成3个子任务来接力执行,具体是使用PHPHeader()函数重定向到当前的执行程序,完成后再定向到程序继续执行。当其他程序执行时,当前程序通过sleep()函数暂停执行,这样各个程序就可以通过接力的方式完成任务。

3. 小 结

本章的重点内容是介绍内容采集的基本原理和实现方法,使读者可以直观地了解正则表达式在内容采集过程中的核心作用。本章首先介绍内容采集模块的技术原理,在之前介绍了内容自动采集器功能及采集原理。在结合具体的需求设计了两个存储表(规则存储表和采集内容表)。接下来介绍了采集器模块界面设计,本节包含采集器管理界面和采集内容列表界面。第4节是具体的采集器爬虫程序实现,本节包含两个组成部分,即采集规则管理程序、爬虫程序。最后将上述两个程序整合到获得需采集内容列表页面中,然后介绍了内容编辑器的设置及使用。在第5节介绍了采集过程中的异常及处理办法。

在学习本章时读者需要掌握程序流程控制、PHP中的正则表达式实现、FCKeditor内容编辑器、抓取程序异常分析及处理、任务接力模式,以上内容是采集器程序的核心技术要点。


推荐