我正在开展一个项目,其中列出了来自 Oron、filepost、depositfiles 等机构的文件共享 URL,这些文件向我的网络中已识别的内容所有者和权利持有者报告了受版权保护的 Material 的共享情况。
为了更好地改进服务,该服务目前位于从 MySQL 数据库填充的表中,并在 php 中内置了一些过滤器,我希望能够识别已停止运行的链接。
我的想法是,当从 MySQL 数据库中检索数据时,将检查下载 URL 列条目(文件或文件主机页面的 url)以查看它们是否链接到允许用户访问的实际文件共享页面开始下载过程,如果他们正在工作并提供下载文件的能力,他们应该离开,链接文本或单元格颜色变为绿色,如果文件站点显示找不到文件或类似链接文本或单元格背景颜色应该变为红色。
目前没有快速简便的事件或非事件链接的可视化表示。
我根据是否收到 404 错误对 url 进行了简单验证,但很快意识到鉴于这些网站没有 404 或重定向,它们将更改动态生成的页面以说明该文件是不可用或文件已被删除等。
我还合并了一个链接检查器脚本,该脚本使用第三方文件共享链接检查服务,但这需要手动检查和手动更新数据库。
我也检查过是否可以在页面上找到特定的字段或词,但考虑到网站的范围和网站上使用的更广泛的术语,这已被证明是准确且难以实现的在所有链接上。
如果 url 可以根据事件状态过滤掉,那也会很有帮助。我猜测颜色变化是否由链接类或单元格类样式管理,我可以根据类过滤列,例如:link-dead 或 link-active。我想我可以做到这一点,所以不一定需要帮助完成最后一点基于类的过滤。
如有任何帮助,我们将不胜感激。
最佳答案
由于您要检查的网站是由不同的人创建的,因此不太可能通过单行程序来检测大量网站的链接是否已损坏。
我建议您为每个站点创建一个简单的函数来检测该特定站点的链接是否断开。当你想检查一个链接时,你会根据域名决定在外部站点的 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
这些函数可以返回一个 bool 值(true 或 false;0 或 1)以供使用,或者在需要时自行调用另一个函数(例如向损坏的链接添加额外的 CSS 类)。
我最近做了类似的事情,虽然我是从多个站点获取图片库的元数据。我使用了一个抽象类,因为我要为每个站点运行一些函数。
作为旁注,明智的做法是将上次检查日期存储在您的数据库中,并将限制检查率限制为 24 或 48 小时(或根据您的需要进一步间隔)。
编辑以稍微阐明实现:
由于向其他网站发出 HTTP 请求可能会非常慢,因此您需要独立于页面加载来检查和更新链接状态。你可以这样实现:
active 和 last_checked 列。active 列读取,而不是每次都下载远程页面进行检查。由于人们可以很容易地点击一个链接来检查它的当前状态,所以允许他们点击一个按钮来检查您的页面是多余的(不过这并不违背这个想法)。
请注意,潜在的资源密集型更新所有脚本应该不可以通过网络执行(可访问)。
关于php - 检查链接是否有效,如果不能直观地识别它是否已损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11168570/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查