在后台笨的Windows运行控制方法(Run controller methods in backg

2019-10-17 16:18发布

我会用我的程序在做什么开始。 控制器的索引函数接受DB URL和关键词和存储它们的阵列。 现在crawlLink法把所有的关键字和网址。 该网址中搜索所有的关键词和生成的所有URL的子链路,并再次存储在DB这也是搜索的关键字。 关键词进行搜索,使用搜索方法的各个环节。 该子链路的使用extract_links功能的所有URL中提取。 搜索extract_links都有一个方法叫做get_web_page这需要使用卷曲的页面的完整内容。 get_web_page搜索功能使用一次得到网页的内容等关键字,可以从中提取。 它也可以用来在extract_links函数提取与有效的页面内容的链接。

现在crawlLink调用搜索功能的两倍。 一旦从中提取域链接和第二次关键字来从子链路提取关键词。 因此,get_web_page被称为三次。 这大约需要5分钟,得到大约150链接的内容。 因此,这需要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和关键字的输入可以被看作是一个任务。 现在,这个任务可以启动,并开始在后台运行。 同时另一个任务可以被定义并可以启动。 每个任务都会有类似“要不要”,“进行中”,“待定”,“完成”等状态简单的任务,董事会由奥斯卡·迪亚斯是我要显示任务的确切方式。

我读这么多的方式在后台运行功能,现在我是左右为难关于哪种方法采用的是。 我读到关于高管,pcntl_fork,使用Gearman等,但都需要CLI,我不想使用。 我尝试使用Cygwin安装的Gearman但被困在Gearman的安装,因为它无法找到的libevent。 我已经单独安装了libevent但它仍然无法正常工作。 和Gearman的需要CLI所以放弃了它。 我不想使用cron也。 我只是想知道哪种方法将是最好的我的情况。

我使用PHP 5.3.8 | 笨2.1.3 | 阿帕奇2.2.21 | MySQL的5.5.16 | Windows 7的64位

Answer 1:

你的问题是,Windows操作系统。

窗户根本就没有运行后台任务和cron作业非常好 - 有你能找到的工具,但它们是有限的。

但是,你确定你甚至需要这个? 大多数服务器是Linux的,为什么你不只是测试在Windows和动过。

-

第二部分是命令行 - 你需要它,如果你想开始一个新的进程(你这样做)。 但TI是不是真的很吓人。 笨很简单:

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



Answer 2:

您可以运行使用nohup的过程或使用cron作业.............请在下面链接时经过

nohup的:在后台运行PHP程序

运行在Linux下PHP5的后台进程

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



Answer 3:

看来,我是想实现上述方法并不能在Windows中实现。 在问题中列出的许多方法要么删除或修改。 然后我转移到涉及使用的解决办法AJAX

我执行控制器方法作为Ajax请求并给计数到它与每个新的AJAX请求递增。 每个请求可以被中止虽然处理将继续,但最终在我的项目无论结果,即使他们采取不完整的。 如果浏览器打开则该请求可能完成,稍后用户可以看到完整的结果。

上停止示出了取消图标任务和指向导致页面的链接的处理被示出,其显示任务被取消之前生成的结果。 AJAX的失败或成功的AJAX我发回从服务器到客户端的任务,这是由客户端发送到服务器的数量。 因此,结果将显示一个独特的任务,不要搞的一团糟。

但没有一个特定的任务已经多少进展跟踪。 采取执行的时间无法确定。 因此,这个方法对我的作品,但也有一些缺点。 主要目的是在用户不应该等待,而一些任务正在进行中,以某种方式通过上述解决办法实现。



文章来源: Run controller methods in background Codeigniter Windows