【问题标题】:PHP: Does file_exists($path) check sub directory of $path ? how computationally intensive it is?PHP:file_exists($path) 检查 $path 的子目录吗?它的计算密集程度如何?
【发布时间】:2013-07-26 17:55:43
【问题描述】:

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

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

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

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

编辑:更正以澄清 Jim 的观点

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

【问题讨论】:

    标签: php performance io amazon-ec2


    【解决方案1】:

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

    我认为发生了 1 种情况或以下几种情况的组合。

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

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

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

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

    【讨论】:

    • 谢谢,你的一些观点我没有考虑过,我会调查,我的估计和原始成本是基于每 5 mb 文件 1,000 个 i/O 的。但是我的问题是 I/O 操作的数量增加每小时,因为每小时处理的文件数量大致相同,I/O 操作应该大致处于同一水平,但是我看到随着时间的推移迅速增加:(
    【解决方案2】:

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

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

    【讨论】:

    • 我的意思是如果file_exists($path) 检查子目录,感谢您的澄清。
    【解决方案3】:

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

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

    您应该(可能想要)使用is_file()is_dir(),无论您是分别检查文件还是目录。


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

    【讨论】:

    • 感谢您的澄清 :),脚本并没有变慢,它们在 i/o 操作上花费了我很多,而且每小时的成本正在迅速增加 :(
    • 我认为没有成本更低的功能来检查文件是否存在。如果你想要更少的 i/o,你可以使用一个数据库来存储文件列表(就像ls -l 的结果),然后每隔一小时左右更新一次,但这不是实时检查;根据您的应用程序上下文,它可能是可行的......
    猜你喜欢
    • 2015-06-18
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 2011-11-07
    相关资源
    最近更新 更多