Php MySQL搜索不存在的URL并从数据库中删除

Php MySQL搜索不存在的URL并从数据库中删除,php,mysql,url,Php,Mysql,Url,我有mysql表hravaj00\u dily,有列part\u id,img150,imgfull。在img150和imgfull中,存储了指向图像的URL。 顺便说一句,此表是从xml提要更新的 是否有任何PHP解决方案可以通过img150列(或imgfull),检查url是否存在(404错误),并从数据库中删除所有这些不存在url的行 我已经阅读了下面这个函数,它检查url的http头。这有用吗?我不知道如何准确地使用它 function file_external_exists($url

我有mysql表hravaj00\u dily,有列part\u idimg150imgfull。在img150和imgfull中,存储了指向图像的URL。 顺便说一句,此表是从xml提要更新的

是否有任何PHP解决方案可以通过img150列(或imgfull),检查url是否存在(404错误),并从数据库中删除所有这些不存在url的行

我已经阅读了下面这个函数,它检查url的http头。这有用吗?我不知道如何准确地使用它

function file_external_exists($url) 
{ 
    $headers = @get_headers($url); 
    if(preg_match("|200|",$headers[0])) 
    return(true); 
    else return(false); 
}
  • 获取所有记录
  • 对它们进行迭代
  • 对于每个记录,调用此函数以检查它是否存在
  • 如果是,则按该ID删除记录
    • 我正在读取所有的行并发出curl请求以检查它是否存在。一旦所有的URL都检查完毕,我会立即更新它
    • 最好运行少量的数据库查询,最好不要在循环中运行查询。可以考虑在循环内的批处理100或1000中运行查询。
    • 您可能希望使用sleep()函数在这两者之间休眠一段时间,否则,若映像服务器过载,它可能会阻止您的请求
    • 您可能不想一次检查所有行,最好根据服务器的性能获得一些行,比如100或1000
    • 您可能需要检查此php的运行时是否超过30秒(这是默认值n php.ini)
    • 您可能必须增加为在php.ini中执行php脚本而分配的最大内存

    可能重复的curl是您的瓶颈,您需要在这里并行请求…看看或类似的东西我不会这样做,我会一次更新所有的curl,或以10、50或100批的方式更新。为了确保数据库中没有加载太多的请求。因此,收集ID并在最后执行请求。
    $con=mysqli_connect("example.com","peter","abc123","my_db");
    $result = mysqli_query($con,"SELECT * FROM hravaj00_dily");
    
    while($row = mysqli_fetch_array($result)) {
      $url = $row['img150'];
      if(!urlExists($url)) {
        $nonExistent[] = $row['id']; // Assuming you have primary key
      }
    }
    
    if($nonExistent) {
      $nonExistentCSV = implode(",", $nonExistent);
      $delQuery = "DELETE FROM hravaj00_dily WHERE id IN " . $nonExistentCSV;
      mysqli_query($con, $delQuery);
    }
    
    
    mysqli_close($con);
    
    // Ref: http://stackoverflow.com/questions/408405/easy-way-to-test-a-url-for-404-in-php
    function urlExists($url) {
      $handle = curl_init($url);
      curl_setopt($handle,  CURLOPT_RETURNTRANSFER, TRUE);
    
      $response = curl_exec($handle);
    
      $httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
      if($httpCode == 200) {
        curl_close($handle);
        return true;
      }
      curl_close($handle);
      return false;
    }