站点如果做的多了,难免要发些伪原创的文章,文章的来源必然来源于网络采集,对于采集这里不详述,我自己用的是”Simple HTML DOM”,见我另一篇关于他的介绍:
数据采集利器-PHP用DOM方式处理HTML之《Simple HTML DOM》
数据采集的话,当然可以人工触发,就是每天运行一下脚本,可是这显然不是很完美,如果抓取可以自动定时获取,那么人工运行可执行页面也就省下来了。
其实php有个概念叫计划任务,可以定时运行某程序,比如数据库备份,更新缓存,生成静态页面,生成网站地图等。在采集里面的运用,就是自动采集数据,然后保存到数据库,比如每天凌晨3点运行一次。
以下是PHP用计划任务实现无人自动采集的介绍。
用到了3个函数:
1、ignore_user_abort(setting);
说明:ignore_user_abort() 函数设置与客户机断开是否会终止脚本的执行。本函数返回 user-abort 设置的之前的值(一个布尔值)。
参数:setting 可选。如果设置为 true,则忽略与用户的断开,如果设置为 false,会导致脚本停止运行。如果未设置该参数,会返回当前的设置。
2、void set_time_limit ( int $seconds
)
说明:设置脚本的最大运行时间,如果时间到了,本函数会返回错误,单位是秒,默认时间是30秒。
参数:用秒计算的最大运行时间,如果为0,则代表无限时间。
注:采集的话,我们就用无限时间set_time_limit(0);
3、sleep(seconds)
说明:sleep() 函数延迟代码执行若干秒。
参数:必需。以秒计的暂停时间。
先给一个基本的测试程序:
首先运行该程序,然后关闭该页面,程序仍然运行中,test会每隔30秒的填补到text3.txt文件。
最后根据php手册简单介绍一些相关的知识:
1、连接处理
在 PHP 内部,系统维护着连接状态,其状态有三种可能的情况:
0 – NORMAL(正常)
1 – ABORTED(异常退出)
2 – TIMEOUT(超时)
当 PHP 脚本正常地运行 NORMAL 状态时,连接为有效。当远程客户端中断连接时,ABORTED 状态的标记将会被打开。远程客户端连接的中断通常是由用户点击 STOP 按钮导致的。当连接时间超过 PHP 的时限时,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() 函数来更改。当计数器超时的时候,脚本将会类似于以上连接中断的情况退出,先前被注册过的关闭触发函数也将在这时被执行。在该关闭触发函数中,可以通过调用 connection_status() 函数来检查超时是否导致关闭触发函数被调用。如果超时导致了关闭触发函数的调用,该函数将返回 2。
需要注意的一点是 ABORTED 和 TIMEOUT 状态可以同时有效。这在告诉 PHP 忽略用户的退出操作时是可能的。PHP 将仍然注意用户已经中断了连接但脚本仍然在运行的情况。如果到了运行的时间限制,脚本将被退出,设置过的关闭触发函数也将被执行。在这时会发现函数 connection_status() 返回 3。
2、相关函数:
- int ignore_user_abort ( [bool setting] )
Set whether a client disconnect should abort script execution。
Sets whether a client disconnect should cause a script to be aborted.
When running PHP as a command line script, and the script’s tty goes away without the script being terminated then the script will die the next time it tries to write anything, unless value
is set to TRUE
- int connection_aborted ( void )
Check whether client disconnected
- int connection_status ( void )
Returns connection status bitfield