首页 > 解决方案 > 单击停止按钮时完全停止正在运行的功能

问题描述

我有要抓取的 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);
    });

任何帮助对我来说都很重要。谢谢

标签: phpjquerycodeigniter

解决方案


无法使用 javascript 终止 php 脚本。PHP 脚本将继续运行其循环,直到完成。PHP 在服务器端执行,而 javascript 在浏览器上执行。可能有一种方法可以用套接字做这样的事情,但我对它们的了解还不够,无法就如何去做给你任何建议。

您可以做的是在 javascript 端运行循环,并为每次迭代单独调用 php 函数。这将允许您随时使用 javascript 停止该过程。


推荐阅读