检查链接是不是有效,如果没有在视觉上将其识别为已损坏
Posted
技术标签:
【中文标题】检查链接是不是有效,如果没有在视觉上将其识别为已损坏【英文标题】:Check link works and if not visually identify it as broken检查链接是否有效,如果没有在视觉上将其识别为已损坏 【发布时间】:2012-06-25 11:35:15 【问题描述】:我正在开展一个项目,该项目列出了来自 Oron、filespost、depositfiles 等公司的文件共享 URL,该项目向我的网络中已确定的内容所有者和权利所有者报告了受版权保护的材料的共享。
为了更好地改进服务,该服务目前位于从 mysql 数据库填充的表中,并在 php 中内置了一些过滤器,我希望能够识别已停止运行的链接。
我的想法是,当从 MySQL 数据库中检索数据时,将检查下载 URL 列条目(文件或文件主机页面的 url),以查看它们是否链接到允许用户使用的实际文件共享页面开始下载过程,如果他们正在工作并提供下载文件的能力,他们应该离开,链接文本或单元格颜色变为绿色,如果文件站点显示文件未找到或类似链接文本或单元格背景颜色应变为红色。
目前没有活动或非活动链接的快速简单的可视化表示。
我根据是否收到 404 错误对 url 进行了简单验证,但很快意识到,鉴于这些网站甚至没有 404 或重定向,这将不起作用,他们将动态生成的页面更改为说文件是不可用或文件已被删除等。
我还合并了一个链接检查器脚本,该脚本使用第三方文件共享链接检查服务,但这需要手动检查和手动更新数据库。
我还检查了是否可以在页面上找到特定的字段或字词,但鉴于网站的范围和网站上使用的更广泛的术语范围,这已被证明是准确且难以实施的在所有链接上。
如果可以根据活动状态过滤掉 url,也会很有帮助。我猜如果颜色变化是由链接类或单元类样式管理的,我可以根据类过滤列,例如:链接死或链接活动。我想我可以做到这一点,因此不一定需要对基于类进行过滤的最后一点帮助。
任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:由于您要检查的网站是由不同的人创建的,因此不太可能在大量网站上检测链接是否损坏。
我建议您为每个站点创建一个简单的函数,以检测该特定站点的链接是否损坏。当您要检查链接时,您将根据域名决定在外部站点的 html 上运行哪个函数。
您可以使用parse_url() 从文件链接中提取域/主机:
// Get your url from the database. Here I'll just set it:
$file_url_from_database = 'http://example.com/link/to/file?var=1&hello=world#file'
$parsed_link = parse_url($file_url_from_database);
$domain = $parsed_link['host']; // $domain now equals 'example.com'
您可以将函数名称存储在关联数组中并以这种方式调用它们:
function check_domain_com() ...
function check_example_com() ...
$link_checkers = array();
$link_checkers['domain.com'] = 'check_domain_com';
$link_checkers['example.com'] = 'check_example_com';
或将函数存储在数组中 (PHP >=5.3)。
$link_checkers = array();
$link_checkers['domain.com'] = function() ... ;
$link_checkers['example.com'] = function() ... ;
并调用这些
if(isset($link_checkers[$domain]))
// call the function stored under the index 'example.com'
call_user_func($link_checkers[$domain]);
else
throw( new Exception("I don't know how to check the domain $domain") );
或者你可以只使用一堆 if 语句
if($domain == 'domain.com')
check_domain_com();
else if($domain == 'example.com')
check_example_com(); // this function is called
函数可以返回一个布尔值(true 或 false;0 或 1)以供使用,或在需要时自行调用另一个函数(例如,向断开的链接添加额外的 CSS 类)。
我最近做了类似的事情,虽然我从多个网站获取股票摄影的元数据。我使用了一个抽象类,因为我要为每个站点运行一些函数。
附带说明一下,最好将上次检查的日期存储在您的数据库中,然后将检查率限制为 24 或 48 小时(或根据您的需要更远)。
编辑以澄清实现:
由于向其他网站发出 HTTP 请求可能非常慢,因此您需要独立于页面加载来检查和更新链接状态。你可以这样实现:
脚本可以每 12 小时运行一次,并检查数据库中上次检查时间超过 24 小时的所有链接。对于每个“旧”链接,它会相应地更新数据库中的active
和 last_checked
列。
当有人请求页面时,您的脚本会从数据库中的active
列读取,而不是每次都下载远程页面进行检查。
(额外的想法)当一个新的链接被提交时,它会立即在脚本中被检查,或者被添加到队列中等待服务器尽快检查。
由于人们可以轻松地单击链接来检查其当前状态,因此允许他们单击按钮以从您的页面进行检查是多余的(不过这并不违背这个想法)。
请注意,可能需要大量资源的 update-all 脚本应该不可以通过网络执行(可访问)。
【讨论】:
感谢您的回复 Stecman。我会将来自 MySQL 的 URL 调用到 Parse URL 函数的 ('') 中吗?因此,我可以返回一个值,例如 0 表示不活动,1 表示活动,然后取决于状态列是 0 还是 1?我该怎么做?这会自动在每个查询的页面上运行,还是需要从用户输入(例如按钮单击等)运行?再次感谢:) @Ben 我已经更新了回答这些问题的答案。如果您对我的回答有任何其他疑问,请告诉我 谢谢 :) 没有时间完全解决它,但它看起来好像可以解决我的问题。所以,再次感谢。以上是关于检查链接是不是有效,如果没有在视觉上将其识别为已损坏的主要内容,如果未能解决你的问题,请参考以下文章