我将从我的程序开始。控制器的索引功能采用一系列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位
答案 0 :(得分:1)
你的问题是,Windows。
windows对于运行后台任务并不是很好。 cron jobs - 你可以找到工具,但它们是有限的。
但是,你确定你甚至需要这个吗?大多数服务器都是Linux,所以为什么不在Windows&搬过来。
-
第二部分是命令行 - 如果你想启动一个新进程(你这样做),你需要它。但是,我并不是非常可怕。 CodeIgniter非常简单:
答案 1 :(得分:0)
您可以使用nohup流程或使用cron作业运行.............请通过以下链接
nohup: run PHP process in background
Running a php5 background process under Linux
https://nsaunders.wordpress.com/2007/01/12/running-a-background-process-in-php/
答案 2 :(得分:0)
我试图实现的上述方法似乎无法在Windows中实现。问题中列出的许多方法都被删除或修改。然后我转向使用AJAX
。
我将控制器方法作为ajax请求执行并给它一个计数,它随每个新的AJAX请求递增。虽然处理将继续,但每个请求都可以中止,但最终结果在我的项目中很重要,即使它们不完整。如果浏览器处于打开状态,则该请求可能会完成,稍后用户可以看到完整的结果。
在停止处理任务时,会显示CANCELED图标,并显示指向结果页面的链接,该链接显示在取消任务之前生成的结果。在AJAX失败或AJAX成功时,我将服务器的任务计数发送回客户端发送到服务器的客户端。因此,结果显示为一项独特的任务,并且不会搞砸。
但是没有追踪某项任务进展的程度。无法确定执行所需的时间。因此,这种方法对我有用,但有一些缺点。主要目标是用户不应该等待某项任务正在进行中,并且通过上述解决方法以某种方式实现。