2015-01-16 27 views
1

我在我的MySQL數據庫中有100多萬個域名,我想檢查每個域名是否有效。我做了使用PHP CURL,我執行腳本,如果響應返回我標記該域作爲活動,如果它不返回響應我標記它不活動。測試100多萬個域名的最快方法

這裏是代碼:

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調用,使其不斷更新的用戶界面,以確保腳本運行,目前它是在哪個記錄:

這裏是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循環,上網址的每個請求返回50個域,並且當數據返回另一個AJA X呼叫發送請求到我上面發佈的腳本,其中測試域併成功或失敗返回響應,然後腳本更新UI以顯示它已完成檢查,這裏是測試域的網頁的屏幕截圖

enter image description here

這個腳本的問題是運行速度很慢,因爲它僅僅測試了4000的最後10小時 域我需要測試爲此所需的域 PHP心不是一個最快的方法。 如果有任何可用於Python的解決方案請分享

+1

線程可能是一個爲你尋找到。如果您使用10個線程,10個小時內的4000個可能會在10個小時內變爲4000 * 10個。 – TehTris

+0

是啊這就是我打算做...你認爲代碼可以以任何方式進行優化,或者它只是很好嗎? –

+1

使用python,你可以使用[grequests](https://github.com/kennethreitz/grequests)。這個問題的例子。 http://stackoverflow.com/questions/9110593/asynchronous-requests-with-python-requests –

回答

0

爲什麼選擇JavaScript和AJAX?用PHP做這一切。

代替if (!$response)使用

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

我使用JavaScript只是爲了讓用戶界面更新,測試正在運行並查看它目前正在測試哪些域 –

+0

您可以通過使用ob_start和ob_flush來實現。您可以將結果狀態寫入文本文件,然後定期查看文本文件。 – Misunderstood

相關問題