【发布时间】:2020-02-09 21:08:32
【问题描述】:
我需要检查服务器上文件的可用性,然后做一些与文件相关的反应。我在每个客户端和服务器端都有文件名和路径,然后我有两种方法来检查可用性。一个来自客户端,另一个来自服务器端。
第一种方式:
客户端:
function check_file()
{
$.ajax({
url:'http://www.example.com/somefile.txt',
type:'HEAD',
error: function()
{
//file not exists
//check again after 5 seconds
setTimeout(function(){
check_file();
}, 5000);
},
success: function()
{
//file exists
//start doing other actions related to the file
action_1();
}
});
}
function action_1()
{
$.ajax({
url:'http://www.example.com/action_1.php',
success: function(data)
{
var result = $.parseJSON(data);
if (result.success)
{
//Changes were applied successfully.
//doing some DOM stuff and notifying the client
//check again after 5 seconds
setTimeout(function(){
check_file();
}, 5000);
}
}
});
}
服务器端(action_1.php):
//update database
echo '{success: true}';
第二种方式:
客户端:
function action_2()
{
$.ajax({
url:'http://www.example.com/action_2.php',
success: function(data)
{
var result = $.parseJSON(data);
if (result.success)
{
//Changes were applied successfully
//doing some DOM stuff and notifying the client
}
setTimeout(function(){
action_2();
}, 5000);
}
});
}
服务器端(action_2.php):
if (file_exists('somefile.txt'))
{
//update database
echo '{success: true}';
}
else
{
echo '{success: false}';
}
在第一种方式中,我调用了两次服务器(Request/Response/Request,请注意第一次请求只是请求HEAD),它使用Apache's 默认场景来检查文件的可用性(我不知道它是如何工作的)。
但是第二种方式,我调用了一次服务器,它使用了PHP file_exists(),这意味着它需要先加载PHP environment,然后执行action_2.php。
因为该文件大部分都不存在,并且因为它可能需要处理数百万个请求,所以请您指导我哪种方式更好,为什么?
【问题讨论】:
-
我有点困惑:为什么不直接调用你想调用的 URL,把需要去的数据,然后如果你得到一个没有状态码的 HTTP 响应200,由于该 URL 不存在 (404) 或用户无权访问 (403) 或文件已移动 (304/307) 或请求本身有错误 (400) 等,请执行您需要做的任何事情?客户端不必询问服务器 files 是否存在,它应该只调用 URL,服务器应该能够告诉客户端这是否有效,或者为什么没有。然后客户应该明智地处理这些信息。
-
你对成功做什么?您是否正在发送另一个 HTTP 请求?如果是这样,请使用 PHP 方式,而不是返回
{success: true}然后发送另一个请求,而是在同一个请求中执行操作。如果这只是您根据该文件是否存在而执行的客户端操作,那么理论上第一种方式会更快(但不是很明显)。您可以随时为自己测试。还有一点需要注意:如果您采用第一种方式,请不要忘记禁用该文件的缓存。 -
我无法理解您的评论@Mike'Pomax'Kamermans。为什么客户端不必询问服务器文件是否存在?
-
@HTMHell 成功了,我会做一些 DOM 的东西,然后再次请求。我也更新了。
-
因为客户端不应该知道任何关于你服务器上文件系统的信息。它应该关心的只是 API 端点。 “使用内容 Y 更新文件 X”应该是您的客户端可以调用的内容,前提是从服务器加载的页面具有指示文件存在的状态,或者先前的客户端操作(例如上传)带有文件的响应现在存在。由于没有详细说明为什么这是您的客户端/服务器交互的方式,这是一种反模式。
标签: javascript php apache