- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们在 EC2 上有一个 nginx/php-fpm 设置,它将文件 block 接收到一个 NFS 安装的“ block ”文件夹(特别是 SoftNAS),该文件夹在多个应用程序服务器之间共享。我们遇到一个问题,应用程序在将完成的文件上传到 S3 之前检查文件是否存在,但即使文件存在,文件检查也失败。
应用在 is_file() 或 file_exists() 之前有一个 clearstatcache()(我们都试过了),但该文件在 10-20 秒内对应用不可见。
这是该测试的一些运行的输出:
app1 write timestamp 1484702190.5575
app2 read timestamp 1484702216.0643
25.5068 seconds
app1 write timestamp 1484702229.0130
app2 read timestamp 1484702246.0652
17.0522 seconds
app1 write timestamp 1484702265.6277
app2 read timestamp 1484702276.0646
10.4369 seconds
app1 write timestamp 1484702286.0136
app2 read timestamp 1484702306.0645
20.0509 seconds
app1 write timestamp 1484702314.4844
app2 read timestamp 1484702336.0648
21.5804 seconds
app1 write timestamp 1484702344.3694
app2 read timestamp 1484702366.0644
21.6950 seconds
app1 write timestamp 1484702374.0460
app2 read timestamp 1484702396.0645
22.0185 seconds
app1 write timestamp 1484702404.0346
app2 read timestamp 1484702426.0647
22.0301 seconds
app1 write timestamp 1484702434.2560
app2 read timestamp 1484702456.1092
21.8532 seconds
app1 write timestamp 1484702466.0083
app2 read timestamp 1484702486.1085
20.1002 seconds
app1 write timestamp 1484702496.5466
app2 read timestamp 1484702516.1088
19.5622 seconds
app1 write timestamp 1484702525.2703
app2 read timestamp 1484702546.1089
20.8386 seconds
app1 write timestamp 1484702558.3312
app2 read timestamp 1484702576.1092
17.7780 seconds
我们已经尝试了多种检查文件的方法:
这些事情似乎都没有任何区别。我们没有对每个选项进行广泛的测试,但在文件存在检查通过之前,每个选项似乎都花费了过长的时间。
有一件事确实奏效了。在 shell 中的 app2 上运行“ls”循环,app2 脚本可立即读取该文件。
app1 write timestamp 1484703581.3749
app2 read timestamp 1484703581.3841
0.0092 seconds
app1 write timestamp 1484703638.81 00
app2 read timestamp 1484703638.8139
0.0039 seconds
app1 write timestamp 1484703680.8548
app2 read timestamp 1484703680.8576
0.0028 seconds
因此,shell 中的某些内容正确地清除了 NFS 缓存,但 PHP 中的清除缓存命令似乎没有任何区别。
(编辑)有问题的代码:
public static function get($filepath) {
clearstatcache(TRUE, $filepath);
if (file_exists($filepath)) {
$instance = new static::$_class;
$instance->init($filepath);
return $instance;
} else {
// Sometimes a new file is not found with the first is_file() attempt.
// Clear the stat cache and try to find the file again.
clearstatcache(TRUE, $filepath);
if (file_exists($filepath)) {
$instance = new static::$_class;
$instance->init($filepath);
return $instance;
}
}
Log::error("AJRFSFILE " . $_SERVER['PATH_INFO'] . " " . $_SERVER['HTTP_DEVICE'] . " " . $filepath . " " . json_encode(stat($filepath)));
return false;
}
(Edit2) 结果表明,在代码中使用“ls”运行 exec() 可以成功清除系统级发生的任何文件级缓存,但出于显而易见的原因,每次执行 file_exists 时 exec() 都是一个次优解。
最佳答案
这是正在发生的事情。 PHP 统计缓存依赖于 atime 属性,该属性可从底层 VFS 获得。当 NFS 为 VFS 提供动力时,属性会被缓存以减少服务器往返。不幸的是,这些可能导致 PHP 对状态“撒谎”,因为实际上 NFS 服务器没有提供 VFS 当前信息。
您可以使用 noac
挂载选项强制立即保持一致性。我建议在您绝对肯定地需要在尽可能短的时间内获得最新信息的任何服务器上使用它:
Use the noac mount option to achieve attribute cache coherence among multiple clients. Almost every file system operation checks file attribute information. The client keeps this information cached for a period of time to reduce network and server load. When noac is in effect, a client’s file attribute cache is disabled, so each operation that needs to check a file’s attributes is forced to go back to the server. This permits a client to see changes to a file very quickly, at the cost of many extra network operations.
如果 noac
太慢,还有其他挂载选项可能会根据您的需要更好地调整缓存。请参阅:lookupcache
和 actimeo
。例如,减少 actimeo
将减少 NFS 本地缓存信息的时间:默认值为 30 秒(最小值)到 60 秒(最大值)。或者,作为另一个示例,lookupcache=positive
将提供有关新文件外观的更快智能,但即使在取消链接后也会长期缓存它们的存在。
但是,为什么在没有这些挂载选项的情况下,目录中的 ls
会“修复”这个问题?结果是 opendir
和 closedir
序列使 NFS 属性缓存无效,这会强制调用回服务器。
因此,在您的情况下,您使用 opendir()/closedir()
序列来使缓存无效。我不确定 system("ls")
是否有效,因为我相信每个进程对底层属性缓存都有不同的看法,但值得一试。
关于PHP file_exists 或 is_file 在 NFS 文件 (EC2) 上无法正确回答 10-20s,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41723458/
package homework4; import java.util.Scanner; public class Prog4 { static Scanner scanner = new Scann
很多信使/应用程序发送Android通知,我可以在不打开应用程序的情况下直接在通知中回复。例如,此功能在 WhatsApp 或 Telegram 中。 我现在的问题是,如何做到这一点? //更新: 这
我在一些帮助文件和 src 文档中看到了很多这样的图表 他们叫什么?是否有任何其他(出于相同目的)已知图表? 图片来源:http://www.sqlite.org/images/syntax/inse
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 1年前关闭。 Improve this qu
我有要解析的大 (>1Mb)、简单的 JSON 文件。 我使用了 Aeson,按照他们在 Haskell 学校的 fpcomplete 教程(谢谢你们,顺便说一句)。 由于某些文件(而不是全部)失败,
我最近一直在阅读有关NLP的文章,到目前为止,我已经(非常)基本了解所有工作原理,包括从句子拆分到POS标记以及知识表示。 我知道那里有各种各样的NLP库(主要是Java或Python),并且找到了.
在 destroy.js.erb 中有效 $("").appendTo("#commentlist"); 瘦身怎么做?我试过了 $("= escape_javascript(render @comme
考虑一个类 OriginalClass,它可能在运行时可用,也可能不可用。 OriginalClass 有一个方法 doSomething 如果它的类可用,应该执行该方法。 解决这个问题的一种方法是创
当我添加延迟命令时,paramiko 返回“2”作为退出状态(同时返回“0”用于带宽命令设置)。 2还好吗? (谷歌搜索对此没有帮助,我猜 2 一定是某种错误)。 我使用的命令是:- delay_cm
当我运行这个命令时: tc qdisc add dev eth0 root red limit 51200000 min 128000 max 512000 avpkt 1024 burst 200
我试图创建一个网络接口(interface)的新实例以在其上设置 DNS 服务器配置。 当我运行此命令时: ip link set enp1s0 name ens33 && ip link set e
我的页面上有一个对话框,它是使用 JQuery 对话框小部件制作的。我已经将两个按钮设置为具有单击页面上不同按钮的功能,这将触发页面的回发并执行各种操作。当对话框为modal: false时,对话框将
现在我正在使用 gnus通过从 gwene 订阅感兴趣的标签来阅读 SO 问题。 我只能看到/阅读问题而不是答案。 是否有插件可以回答/询问 SO 问题。当然,我可以使用 edit-server 来编
我正在使用 Jenkins slack 插件在我的自动构建过程中向我发送消息。我已经设置了手动门控,因此生产部署需要手动批准。这是使用 Jenkins input 完成的。步。 我该如何回应这个inp
我的技能是让你可以开始新游戏。不过,如果用户正在 session 中玩游戏或想要开始新游戏,我会在 game_in_progress 中放置一个 session 变量。它显示,“游戏正在进行中,您想继
我想知道决策算法的名称是什么,它不返回"is"或“否”,但只能为输入的真实子集决定"is",不能提供对其余部分做出最终决定。 一个合适的例子是确定矩阵可逆性的算法——我的算法对矩阵的一个子类正确回答"
1. ETH=$1 2. LATENCY=$2 3. LOSS=$3 4. JITTER=$4 5. BW=$5 6. sudo /sbin/tc qdisc del dev eth0 root 7.
我正在寻找一种方法来回答 golang 中的 shell 密码提示。 喜欢: bussiere@kus:~/Workspace/rteest$ ./passwordtest.sh Password :
我们在我们的 web 应用程序中通过 wro 提供 javascript 资源(和其他资源)。 在 PROD 环境中,浏览器获取(例如)app.js angular webapp 的内容,其中包含 f
我有一个 .xlsm 文件,我需要其中一些以非宏文件格式 (.xlsx) 保存的工作表。为此,我创建了以下代码。第一部分将事件工作表(称为“CombinedRaw”)保存为单独的文件“DATATRY.
我是一名优秀的程序员,十分优秀!