1

我将从我的程序的功能开始。控制器的index函数采用 URL 和关键字数组并将它们存储在 DB 中。现在crawlLink方法获取所有关键字和 URL。搜索所有关键字的 URL,生成所有 URL 的子链接并再次存储在数据库中,这些子链接也搜索关键字。使用搜索方法在每个链接中搜索关键字。使用extract_links函数从所有 URL 中提取子链接。searchextract_links都有一个名为get_web_page的方法,它使用 cURL 获取页面的完整内容。get_web_page 使用一次搜索功能以获取网页内容,以便从中提取关键字。它还用于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 的简单任务板正是我希望显示任务的方式。

我读到了很多在后台运行函数的方法,现在我对采用哪种方法进退两难。我阅读了有关 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 位

4

3 回答 3

1

你的问题是,Windows。

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

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

--

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

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

于 2013-02-04T06:25:14.830 回答
0

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

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

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

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

于 2013-03-23T11:24:48.807 回答
0

您可以使用 nohup 进程或使用 cron 作业运行......请通过以下链接

nohup:在后台运行 PHP 进程

Linux下运行php5后台进程

https://nsaunders.wordpress.com/2007/01/12/running-a-background-process-in-php/

于 2013-02-04T06:23:32.617 回答