0 Comments

抓取超时解决方法

发布于:2012-11-21  |   作者:广州网站建设  |   已聚集:人围观
采集异常及处理

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

1  抓取超时解决方法

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

0 - NORMAL(正常);

1 - ABORTED(异常退出);

2 - TIMEOUT(超时);

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

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

注意:默认的超时限制为30秒。这个值可以通过设置php.ini的max_execution_time 或Apache .conf设置中对应的php_value max_execution_time参数或者set_time_limit()函数来更改。广州网站设计

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

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


  1. $ch = curl_init();  
  2. $timeout = 10;   
  3. curl_setopt ($ch, CURLOPT_URL, $url);  
  4. curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);  
  5. curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);  
  6. $handles = curl_exec($ch);  
  7. curl_close($ch);  

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

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

标签:
飞机