Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL/PHP清理/验证数据库中存储的URL的最佳方法_Php_Mysql - Fatal编程技术网

MySQL/PHP清理/验证数据库中存储的URL的最佳方法

MySQL/PHP清理/验证数据库中存储的URL的最佳方法,php,mysql,Php,Mysql,我有一个数据库,上面有过去几年收集的制造商的URL,我需要做一些春季清理: 有些URL类似于http://brandname.com/aboutus/ 因此,我需要删除除主域之外的任何路径,因为这些路径/子目录中的许多可能已过期 我很想能够检查这些域名是否真的存在了,或者是否被域名鲨鱼占据了 我目前正在使用PHP+MySQL,下面是一个函数,用于做你想做的事情,它引用了堆栈溢出答案,给出了你需要的细节 第一: 使用PHP标准的filter\u var(and)函数解析URL。您可能还需要确保正确

我有一个数据库,上面有过去几年收集的制造商的URL,我需要做一些春季清理:

  • 有些URL类似于
    http://brandname.com/aboutus/
    因此,我需要删除除主域之外的任何路径,因为这些路径/子目录中的许多可能已过期

  • 我很想能够检查这些域名是否真的存在了,或者是否被域名鲨鱼占据了


  • 我目前正在使用PHP+MySQL,下面是一个函数,用于做你想做的事情,它引用了堆栈溢出答案,给出了你需要的细节

    第一:
    使用PHP标准的
    filter\u var
    (and)函数解析URL。您可能还需要确保正确定义了方案

    秒,
    运行PHP cURL请求以获取完整URL的HTTP头,然后获取站点URL的HTTP头

    第三
    如果
    $httpcode
    返回一个200,那么它是一个良好的工作链接,否则我们需要将链接减少到站点,并重新检查站点(仍然)是否存在。你可以使用

    请注意,
    schema
    部分很重要,而不仅仅是
    host
    部分

    第四
    就是这样,用新的工作URL更新数据库行

    总而言之: 并将其作为:

    /***
     returns either false or the URL of a working domain from the Db.
     ***/
    $updateValueUrl = clean_url($databaseRow['url']);
    

    这可能不太适合你,但应该给你一个良好的基础,从中做出你想要的行为。一旦这一切就绪,您就可以运行一个PHP MySQL循环,一次抓取每个URL(在
    限制
    批次中,可能有500或1000个),然后使用
    foreach
    循环每个URL,并使用这些函数的输出更新每个URL

    下面是一个函数,用于执行您的请求,其中引用了堆栈溢出答案,提供了您需要的详细信息

    第一:
    使用PHP标准的
    filter\u var
    (and)函数解析URL。您可能还需要确保正确定义了方案

    秒,
    运行PHP cURL请求以获取完整URL的HTTP头,然后获取站点URL的HTTP头

    第三
    如果
    $httpcode
    返回一个200,那么它是一个良好的工作链接,否则我们需要将链接减少到站点,并重新检查站点(仍然)是否存在。你可以使用

    请注意,
    schema
    部分很重要,而不仅仅是
    host
    部分

    第四
    就是这样,用新的工作URL更新数据库行

    总而言之: 并将其作为:

    /***
     returns either false or the URL of a working domain from the Db.
     ***/
    $updateValueUrl = clean_url($databaseRow['url']);
    

    这可能不太适合你,但应该给你一个良好的基础,从中做出你想要的行为。一旦这一切就绪,您就可以运行一个PHP MySQL循环,一次抓取每个URL(在
    限制
    批次中,可能有500或1000个),然后使用
    foreach
    循环每个URL,并使用这些函数的输出更新每个URL

    你的问题是什么?显然,您需要一个接一个地获取url,使用
    parse_url()
    来选择您需要的令牌,因此在这里使用scheme和hostname,然后发出测试请求。我甚至想说,你对域名一点也不感兴趣,而是对主机名感兴趣,因为一个没有web服务的域名很可能对你没有价值……使用正则表达式@arkascha感谢你指点我解析url@如果没有更好的匹配函数存在,Suraj正则表达式只是最后一种手段……那么,您的问题是什么?显然,您需要一个接一个地获取url,使用
    parse_url()
    来选择您需要的令牌,因此在这里使用scheme和hostname,然后发出测试请求。我甚至想说,你对域名一点也不感兴趣,而是对主机名感兴趣,因为一个没有web服务的域名很可能对你没有价值……使用正则表达式@arkascha感谢你指点我解析url@如果没有更好的匹配函数存在,Suraj正则表达式只是最后一种手段。。。
    function get_header_code($url){
        /*** 
         cURL
         ***/
        $ch = curl_init($link);
        curl_setopt($ch, CURLOPT_HEADER, true);    // we want headers
        curl_setopt($ch, CURLOPT_NOBODY, true);    // we don't need body
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
        curl_setopt($ch, CURLOPT_TIMEOUT,10);
        $output = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        return $httpCode;
    }
    
    function clean_url($link){
        $link = strtolower($link);
        $link = filter_var($link, FILTER_SANITIZE_URL);
    
        if(substr($link,0,8) !== "https://" && substr($link,0,7) !== "http://"){
            $link = "http://".$link;
        }
    
        if(filter_var($link, FILTER_VALIDATE_URL) === FALSE){
        /***
         Invalid URL so clean and remove.
         ***/
        return false;
        }
        $httpCode = get_header_code($link);
    
        if($httpCode == 200){
          /***
           works, so return full URL
           ***/
          return $link;
        }
        if($httpcode >= 400 ){
         /*** errors 400+ ***/
            $siteUrlParts = parse_url($link);
            $siteUrl = $siteUrlParts['scheme']."://".$siteUrlParts['host'];
            if(get_header_code($siteUrl) == 200){
                 /***
                  Obviously you can add conditionals to accept if it is a
                  redirection but this is a basic example
                  ***/  
                 return $siteUrl;
            }
            return false;
        }
        else {
           /***
            some other header, up to you how you want to handle this.
            could be a redirect 301, 302 or something... 
            ***/
           return false; 
        }
    
    }
    
    /***
     returns either false or the URL of a working domain from the Db.
     ***/
    $updateValueUrl = clean_url($databaseRow['url']);