在后台Codeigniter Windows中运行控制器方法

时间:2013-02-04 06:13:05

标签: php codeigniter curl background-process

我将从我的程序开始。控制器的索引功能采用一系列URL和关键字并将它们存储在DB中。现在使用 crawlLink 方法获取所有关键字和网址。搜索所有关键字的URL,并生成所有URL的子链接,并再次存储在DB中,这些URL也搜索关键字。使用搜索方法在每个链接中搜索关键字。使用 extract_links 功能从所有网址中提取子链接。 搜索 extract_links 都有一个名为 get_web_page 的方法,该方法使用cURL获取页面的完整内容。 get_web_page 搜索功能中使用一次,以获取网页内容,以便从中提取关键字。它还用于 extract_links 功能,以提取具有有效页面内容的链接。

现在 crawlLink 两次调用搜索功能。一次从域链接中提取关键字,第二次从子链接中提取关键字。因此, get_web_page 被称为三次。大约需要5分钟才能获得大约150个链接的内容。它被称为三次,因此需要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和关键字视为一项任务。现在可以启动此任务,它将在后台开始运行。同时可以定义另一个任务并可以启动。每个任务都有“待办事项”,“进行中”,“等待”,“完成”等状态。奥斯卡迪亚斯的Simple Task Board是我希望显示任务的确切方式。

我读到了很多关于在后台运行功能的方法,现在我对采用哪种方法处于两难境地。我读过关于exec,pcntl_fork,Gearman等的所有内容,但都需要我不想使用的CLI。我尝试用Cygwin安装Gearman,但因为找不到libevent而陷入了Gearman的安装。我已经单独安装了libevent,但它仍然不起作用。而Gearman需要CLI,所以放弃它。我也不想使用CRON。我只是想知道在我的场景中哪种方法最好。

我正在使用PHP 5.3.8 | Codeigniter 2.1.3 | Apache 2.2.21 | MySQL 5.5.16 | Windows 7 64位

3 个答案:

答案 0 :(得分:1)

你的问题是,Windows。

windows对于运行后台任务并不是很好。 cron jobs - 你可以找到工具,但它们是有限的。

但是,你确定你甚至需要这个吗?大多数服务器都是Linux,所以为什么不在Windows&搬过来。

-

第二部分是命令行 - 如果你想启动一个新进程(你这样做),你需要它。但是,我并不是非常可怕。 CodeIgniter非常简单:

http://ellislab.com/codeigniter/user-guide/general/cli.html

答案 1 :(得分:0)

答案 2 :(得分:0)

我试图实现的上述方法似乎无法在Windows中实现。问题中列出的许多方法都被删除或修改。然后我转向使用AJAX

的变通方法

我将控制器方法作为ajax请求执行并给它一个计数,它随每个新的AJAX请求递增。虽然处理将继续,但每个请求都可以中止,但最终结果在我的项目中很重要,即使它们不完整。如果浏览器处于打开状态,则该请求可能会完成,稍后用户可以看到完整的结果。

在停止处理任务时,会显示CANCELED图标,并显示指向结果页面的链接,该链接显示在取消任务之前生成的结果。在AJAX失败或AJAX成功时,我将服务器的任务计数发送回客户端发送到服务器的客户端。因此,结果显示为一项独特的任务,并且不会搞砸。

但是没有追踪某项任务进展的程度。无法确定执行所需的时间。因此,这种方法对我有用,但有一些缺点。主要目标是用户不应该等待某项任务正在进行中,并且通过上述解决方法以某种方式实现。