0

一个非常菜鸟的问题:php 是否file_exists($path)检查 ?? 的子目录$path

它是磁盘读取密集型进程吗?这意味着它是否会根据要检查的目录中的文件夹/文件的数量线性增加(多项式/指数)?

背景信息:我在 EC2 上运行一些文件操作脚本,自从我启动脚本以来,我的读取操作数一直呈指数增长。AWS 对每百万个 I/O 请求收取 0.11 美元的费用,而且成本正在迅速增加 :(。

我分析了代码,我认为唯一可能导致这种不断增加的性能损失问题的部分是脚本检查文件是否存在或从 S3 存储桶下载它的部分,因为几乎所有其他内容都是计算/写入或一个小的读取操作。如果有任何相关性,我有成千上万个 3-5 MB 的文件。在每个循环之后,脚本会生成更多类似大小的文件等。

编辑:更正以澄清吉姆的观点

编辑 2:我要询问的性能不是脚本运行的时间,而是磁盘读取次数,因为这由 AWS 单独收费。

4

3 回答 3

1

file_exists($path)检查子目录;为此,您必须编写自己的函数来导航目录。

它会检查当前目录(.php 文件所在的位置),除非您提供绝对或相对路径。

您应该(可能想要)使用is_file()is_dir()是否分别检查文件或目录。


对于file_exists()(or is_file()or is_dir()) 的性能方面,它们绝对不是密集型函数,我不认为它们是任何 php 脚本的瓶颈。

于 2013-07-26T13:28:43.230 回答
1

我不确定您的意思是file_exists($path)检查路径的子目录还是检查当前工作目录的子目录中的路径。

无论哪种情况,答案是否定的。$path被简单地视为路径,并且该方法确认该文件/目录是否存在。

于 2013-07-26T12:55:43.037 回答
1

1 I/O 是指将 1 个块读取或写入磁盘。块大小通常非常小,通常约为 4KB。对于频繁访问的文件,通常会涉及缓存,可以减少执行操作所需的整体 I/O。

我认为 1 或以下情况的组合正在发生。

  1. 您低估了来回复制的文件数量。一个 3 MB 的文件全部读取或写入一次可能会花费大约 750 个 I/O

  2. 您超出了可用内存,迫使您的系统转向交换,这很可能被配置为写入 EBS 卷。用free来看这个。

  3. 如果您还没有这样做,您可能需要考虑使用 APC 或其他操作码缓存。

  4. 您还可以挂载您的卷禁用功能,如 mtime 和 atime(更新修改时间和访问时间)

于 2013-07-26T13:50:04.353 回答