【问题标题】:Run controller methods in background Codeigniter Windows在后台 Codeigniter Windows 中运行控制器方法
【发布时间】:2013-02-04 06:13:04
【问题描述】:

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

现在 crawlLink 调用 search 函数两次。一次从域链接中提取关键字,第二次从子链接中提取关键字。因此,get_web_page 被调用了三次。获取大约 150 个链接的内容大约需要 5 分钟。它被称为三次,因此需要 15 分钟的处理时间。在此期间,什么都做不了。因此,我想在后台运行这个进程并在处理时显示它的状态。 extract_linksget_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


    【解决方案1】:

    你的问题是,Windows。

    windows 根本不适合运行后台任务和 cron 作业 - 您可以找到一些工具,但它们是有限的。

    但是,你确定你还需要这个吗?大多数服务器都是 Linux,所以你为什么不在 Windows 上测试并转移过来。

    --

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

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

    【讨论】:

    • 我必须使用 Windows,我没有任何选择。好的,即使使用 CI 提供的 CLI,我如何才能实现后台处理?使用哪种方法?我应该使用 gearman 吗?
    【解决方案2】:
    【解决方案3】:

    我试图实现的上述方法似乎无法在 Windows 中实现。问题中列出的许多方法要么被删除,要么被修改。然后我转向涉及使用AJAX 的解决方法。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      相关资源
      最近更新 更多