我将从我的程序的功能开始。控制器的index函数采用 URL 和关键字数组并将它们存储在 DB 中。现在crawlLink方法获取所有关键字和 URL。搜索所有关键字的 URL,生成所有 URL 的子链接并再次存储在数据库中,这些子链接也搜索关键字。使用搜索方法在每个链接中搜索关键字。使用extract_links函数从所有 URL 中提取子链接。search和extract_links都有一个名为get_web_page的方法,它使用 cURL 获取页面的完整内容。get_web_page 使用一次搜索功能以获取网页内容,以便从中提取关键字。它还用于extract_links函数以提取具有有效页面内容的链接。
现在crawlLink调用了search函数两次。一次是从域链接中提取关键字,第二次是从子链接中提取关键字。因此,get_web_page被调用了三次。获取大约 150 个链接的内容大约需要 5 分钟。它被称为三次,因此需要 15 分钟的处理时间。在此期间,什么都做不了。因此,我想在后台运行这个进程并在处理时显示它的状态。extract_links和get_web_page使用 include_once 包含在控制器中。
get_web_page 函数如下:
function get_web_page( $url )
{
$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle compressed
CURLOPT_USERAGENT => "spider", // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
);
$ch = curl_init( $url );
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
curl_close( $ch );
$header['errno'] = $err;
$header['errmsg'] = $errmsg;
$header['content'] = $content;
return $header;
}
一次来自用户的 URL 和关键字的输入可以被视为一项任务。现在可以启动此任务,它将开始在后台运行。同时可以定义并启动另一个任务。每个任务都有“待办事项”、“进行中”、“待处理”、“完成”等状态。Oscar Dias 的简单任务板正是我希望显示任务的方式。
我读到了很多在后台运行函数的方法,现在我对采用哪种方法进退两难。我阅读了有关 exec、pcntl_fork、Gearman 等的信息,但都需要我不想使用的 CLI。我尝试使用 Cygwin 安装 Gearman,但由于找不到 libevent,因此卡在了 Gearman 安装中。我已经单独安装了 libevent,但仍然无法正常工作。Gearman 需要 CLI,所以放弃了它。我也不想使用 CRON。我只想知道哪种方法最适合我的方案。
我正在使用 PHP 5.3.8 | 代码点火器 2.1.3 | 阿帕奇 2.2.21 | MySQL 5.5.16 | 视窗 7 64 位