【问题标题】:Is PHP faster than Nginx/Apache to check file exist?PHP 是否比 Nginx/Apache 更快地检查文件是否存在?
【发布时间】: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


【解决方案1】:

虽然第一种方式可能更快,但假设在大多数情况下文件不存在,我会选择第二种方式。

第一种方式比第二种方式更快,因为它不调用 PHP 处理程序,而只是调用默认的静态文件处理程序。我没有对此进行测试,但我假设检查文件是否存在并返回某种错误 (404) 应该比调用 PHP 解释器更快,后者然后执行 PHP 文件。

但是,与第一种方式相比,第二种方式在 IMO 上更清晰,更易于理解,提供了更集中的“文件检查”逻辑,这种逻辑以第一种方式分布在服务器和客户端上。

【讨论】:

    【解决方案2】:

    第一种方法肯定更快,特别是如果服务器上有 Nginx 而不是 Apache,但您必须确保您获取的“somefile.txt”不会以任何方式缓存。

    您的浏览器和网络服务器都喜欢缓存静态文件。

    【讨论】:

      猜你喜欢
      • 2015-06-06
      • 2015-08-05
      • 2023-01-02
      • 2012-10-15
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      相关资源
      最近更新 更多