php - 单击停止按钮时完全停止正在运行的功能
问题描述
我有要抓取的 URL 列表。我从 html 表中获取这些 URL,并在控制器函数中将它们放入 foreach 循环中。我有两个按钮开始刮和停止刮。
我正在运行一个在控制器中编写的抓取功能,并在单击开始抓取按钮的按钮上由 ajax 函数调用。
现在我的要求是当我点击停止抓取按钮时停止当前正在进行的进程。
我用谷歌搜索了很多,并尝试使用 Gloabal 变量、会话等,但所有这些只有在完成处于挂起状态 un network 的第一个进程之后才有效。
请帮助我,当我单击停止抓取按钮时,如何停止当前的 php 进程。
下面是开始抓取的ajax调用函数
$("#get_data").click(function()
{
var values = new Array();
$.each($("input[name='case[]']:checked"), function()
{
var data = $(this).parents('tr:eq(0)');
values.push({
'weburl':$(data).find('td:eq(3)').text() ,
'id' : $(data).find('td:eq(2)').text() ,
'state':$(data).find('td:eq(6)').text()
});
});
sendmyarray(values);
});
function sendmyarray(values)
{
var location = '<?php echo base_url()?>';
var x = $.ajax({
type: "POST",
url: location+'admin/AdminController/getArrayAndScrap',
data: {myData:JSON.stringify(values)},
beforeSend: function() {
$("#stop_get_data").css("display", "block");
$("#get_data").prop('disabled', true); // disable button
},
success: function (response) {
$("#get_data").prop('disabled', false);
$("#stop_get_data").css("display", "none");
console.log(response);
if(response == 'stop')
{
alert("Process Stopped");
}
if(response == " ends")
{
alert("Process completed. Please check the status of the URLs processed!");
}
}
});
}
// 下面是控制器函数 // //-- 获取所选行的 url 和 state 数组的函数;并相应地刮掉它们
public function getArrayAndScrape()
{
if(isset($_POST['myData']))
{
$json = $_POST['myData'];
$myDataArray = json_decode($json,true);
foreach ($myDataArray as $url)
{
$status = $this->CommonModel->getSingleData('dtl_scrap_status','ws_detail',array('dtl_scrap_id' => $url['id']));
if( $status['dtl_scrap_status'] != 'Scrapped')
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 12); // 12 seconds
curl_setopt($ch, CURLOPT_URL, $url['weburl']);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$html = curl_exec($ch);
if($html === false)
{
$this->CommonModel->addData('ws_detail' , array('dtl_scrap_status' => curl_error($ch) , 'dtl_scrap_id' => $url['id'] , 'dtl_state' => $url['state'] , 'dtl_website' => $url['weburl']));
$this->CommonModel->updateData('ws_site_scrap_detail' , array('site_last_scrap_date' => date('Y-m-d')) , array('site_id' => $url['id']));
}
else
{
$doc = new DOMDocument();
@$doc->loadHTML($html);
$nodes = $doc->getElementsByTagName('title'); // TITLE
$metas = $doc->getElementsByTagName('meta'); // Meta
$head = $doc->getElementsByTagName('h1'); // H1
if(isset($nodes->item(0)->nodeValue))
{
$title = $nodes->item(0)->nodeValue;
}
if(isset($head->item(0)->nodeValue))
{
$heading = $head->item(0)->nodeValue;
}
if(isset($metas))
{
for ($i = 0; $i < $metas->length; $i++)
{
$meta = $metas->item($i);
if($meta->getAttribute('name') == 'keywords') // Keyword
$keywords = $meta->getAttribute('content');
if($meta->getAttribute('name') != '')
{
if($meta->getAttribute('name') == 'description') // meta description
{
$description = $meta->getAttribute('content');
}
}elseif($meta->getAttribute('property') != '')
{
if($meta->getAttribute('property') == 'og:description') // meta Og:description
{
$OgDescription = $meta->getAttribute('content');
}
}
}
}
curl_close($ch);
if(isset($url['state']))
{
$addDtl['dtl_state'] = $url['state'];
}
if(isset($heading))
{
$addDtl['dtl_program_name'] = $heading;
}
if(isset($title))
{
$addDtl['dtl_program_provider'] = $title;
}
if(isset($description))
{
$addDtl['dtl_program_description'] = $description;
}elseif(isset($OgDescription))
{
$addDtl['dtl_program_description'] = $OgDescription;
}
if(isset($keywords))
{
$addDtl['dtl_program_keywords'] = $keywords;
}
if(isset($url['weburl']))
{
$addDtl['dtl_website'] = $url['weburl'];
}
if(isset($url['id']))
{
$addDtl['dtl_scrap_id'] = $url['id'];
}
$addDtl['dtl_scrap_status'] = 'Scrapped';
if($this->CommonModel->addData('ws_detail' , $addDtl))
{
$this->CommonModel->updateData('ws_site_scrap_detail' , array('site_last_scrap_date' => date('Y-m-d')) , array('site_id' => $url['id']));
}else
{
// echo "Error";exit();
}
} // End of else
} // End of status check
else
{
$this->CommonModel->updateData('ws_site_scrap_detail' , array('site_last_scrap_date' => date('Y-m-d')) , array('site_id' => $url['id']));
// echo "alscrapped";exit();
}
} // End of foreach
echo "ends";
} // End of if(isset)
}
// 在场景下我想要的东西(AJAX CALL)//
$('#stop_get_data').click(function()
{
return false (from the function which is in running state after click event of start scraping);
});
任何帮助对我来说都很重要。谢谢
解决方案
无法使用 javascript 终止 php 脚本。PHP 脚本将继续运行其循环,直到完成。PHP 在服务器端执行,而 javascript 在浏览器上执行。可能有一种方法可以用套接字做这样的事情,但我对它们的了解还不够,无法就如何去做给你任何建议。
您可以做的是在 javascript 端运行循环,并为每次迭代单独调用 php 函数。这将允许您随时使用 javascript 停止该过程。
推荐阅读
- ios - PHAsset's modificationDate changes every time on fetching from iOS Photos app
- perl - How can I pass one more argument to a Perl script?
- python - Web Scraping in a script tag in Python
- python - Multiple Choice Reaction python (discord.py)
- python - 导入 cv2 时出错:“libSM.so.6:无法打开共享对象文件:没有这样的文件或目录”
- android - Android Material Button - @drawable specs not recognized
- salesforce - 可调用方法的 Apex 测试类
- javascript - 在 JavaScript 中对数组进行过滤后构造对象数组
- c - Why would the read system call stop working halfway through a program?
- reactjs - Reactjs max-width of an Input from props (using Styled components)