【问题标题】:fastest way to Test 100+ Million Domains测试 100+ 百万个域的最快方法
【发布时间】:2015-01-16 05:29:02
【问题描述】:

我的 MySQL 数据库中有 100+ 百万个域,我想检查每个域是否处于活动状态。我使用 PHP CURL 完成了它,我执行了脚本,如果响应返回,我将域标记为活动,如果它没有返回响应,我将其标记为非活动。

代码如下:

function isDomainAvailable(){
    $domain = "http://www.".$this->input->post('url');
    $id = $this->input->post('id');

    $this->load->model('urls');
    if(!filter_var($domain, FILTER_VALIDATE_URL)){
           $this->urls->setActive($id,0);
           errorMessage('Invalid url');
    }

    $curlInit = curl_init($domain);
    curl_setopt($curlInit,CURLOPT_CONNECTTIMEOUT,10);
    curl_setopt($curlInit,CURLOPT_HEADER,true);
    curl_setopt($curlInit,CURLOPT_NOBODY,true);
    curl_setopt($curlInit,CURLOPT_RETURNTRANSFER,true);

    $response = curl_exec($curlInit);
    curl_close($curlInit);
    if ($response){
        $this->urls->setActive($id,1);
        successMessage('url is active');
    }
    $this->urls->setActive($id,0);
    errorMessage('url is not active');
}

我正在使用同步 AJAX 调用运行此脚本,以便它不断更新 UI 以确保脚本正在运行以及它当前所在的记录:

这里是 JQuery 代码:

$(document).ready(function(){
$("#startCheck").click(function(){
    pages = 2313744;
    for(i=1;i<=pages;i++){
        url = "<?php echo base_url() ?>main/getDomains/"+i+"/1";

        $.ajax({
            type: "POST",
            url:url,
            data: $("#form").serialize(),
            dataType: 'json',
            timeout:30000,
            async: false,
            success: function (data) {
                if(data.data){
                    $(".recordstable").find("tr:gt(0)").remove();
                    $.each(data.data, function(i,v) {
                        row = '<tr>';
                        row += '<td>'+v.id+'</td>';
                        row += '<td>'+v.url+'</td>';
                        row += '<td class="active'+v.id+'">';
                        row += '<img src="<?php echo base_url(); ?>images/loading.gif" width="16" height="16" alt="Loading"></td>';
                        row += '</tr>';
                        $('.recordstable tr:last').after(row);


                                $.ajax({
                                    type: "POST",
                                    url:'<?php echo base_url() ?>main/isDomainAvailable',
                                    data: {url:v.url,id:v.id},
                                    dataType: 'json',
                                    timeout:10000,
                                    async: false,
                                    success: function (data) {
                                        if(data.success){
                                            $('.active'+v.id).html('<span class="label label-success">Yes</span>');
                                        }else{
                                            $('.active'+v.id).html('<span class="label label-danger">No</span>');
                                        }
                                    },
                                    error:function(data){
                                        $('.active'+v.id).html('<span class="label label-warning">Failed</span>');
                                        //alert("something went wrong, please try again.");
                                        $(".loader").hide();
                                    }
                                });





                    });
                }
            },
            error:function(data){
                alert("something went wrong, please try again.");
                $(".loader").hide();
            }
        });
        //break;
    }
    return false;
});

});

首先脚本在 url 上运行一个 for 循环,url 上的每个请求返回 50 个域,当数据返回另一个 AJAX 调用时,向我在上面发布的脚本发送请求,该脚本测试域并返回成功或失败的响应,然后脚本更新 UI 以显示它已完成检查,这是测试域的网页的屏幕截图

这个脚本的问题是运行速度非常慢,因为它在过去 10 小时内只测试了 4000 个域 我需要一种最快的方法来测试域 不需要 PHP。 如果有任何适用于 Python 的解决方案,请分享

【问题讨论】:

  • 线程可能是你需要研究的东西。如果您使用 10 个线程,10 小时内 4000 可能会在 10 小时内变成 4000 * 10。
  • 是的,这就是我打算做的......你认为代码可以以任何方式优化还是就可以了?
  • 使用python,您可以使用grequests。这个问题的例子。 stackoverflow.com/questions/9110593/…
  • 你能举个线程的例子吗?
  • 链接的 Python 答案很棒。

标签: php jquery python mysql ajax


【解决方案1】:

为什么选择 JavaScript 和 AJAX?全部用 PHP 完成。

if (!$response)代替

if (curl_errno($curlInit)){
  errorMessage(curl_error($curlInit));
}

【讨论】:

  • 我使用 javascript 只是为了让 UI 更新测试正在运行并查看它当前正在测试哪些域
  • 您可以通过使用 ob_start 和 ob_flush 来做到这一点。您可以将结果状态写入文本文件,然后定期查看该文本文件。
猜你喜欢
  • 2023-03-22
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多