【发布时间】:2013-02-04 06:13:04
【问题描述】:
我将从我的程序的功能开始。控制器的 index 函数获取一组 URL 和关键字并将它们存储在 DB 中。现在 crawlLink 方法获取所有关键字和 URL。搜索所有关键字的 URL,生成所有 URL 的子链接并再次存储在数据库中,这些子链接也搜索关键字。使用 search 方法在每个链接中搜索关键字。使用 extract_links 函数从所有 URL 中提取子链接。 search 和 extract_links 都有一个名为 get_web_page 的方法,它使用 cURL 获取页面的完整内容。 get_web_page 在 search 函数中使用一次,用于获取网页内容,以便从中提取关键字。它还用于 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 的Simple Task Board 正是我希望显示任务的方式。
我读到了很多在后台运行函数的方法,现在我对采用哪种方法进退两难。我阅读了有关 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 | Windows 7 64 位
【问题讨论】:
标签: php codeigniter curl background-process