如何在不修改脚本的情况下计算 PHP 脚本的文件读取和写入?

Posted

技术标签:

【中文标题】如何在不修改脚本的情况下计算 PHP 脚本的文件读取和写入?【英文标题】:How to count file reads & writes of a PHP script w/o modifying the script? 【发布时间】:2011-08-01 10:08:13 【问题描述】:

我想针对文件 i/o 分析和优化我的 php 脚本。因此,首先有必要计算一个脚本及其所有包含的 i/o 发生了多少。在不修改脚本的情况下,我该怎么做?是否有可能以某种方式重载与文件相关的函数并为它们添加计数?或者至少是一个扩展?

【问题讨论】:

使用vmstatiostat 来确定你是cpu、mem还是i/o绑定。使用 XDebug 分析您的 PHP 应用程序。 XDebug 不都是关于 CPU 的吗?我不记得任何与 i/o 相关的设置或输出... 不,不是。它是一个应用程序分析器和调试工具,它可以收集本机函数调用。除此之外,您还可以查看strace,虽然那是相当低的水平。 【参考方案1】:

我认为你会得到的最好的结果是找出包含了多少(以及哪些)文件(这也是某种文件 I/O)。

http://php.net/manual/en/function.get-included-files.php

我认为没有内置的“fread/fwrite 做了多少文件 I/O”功能可以让您在不修改脚本或服务器的情况下弄清楚所有这些。

【讨论】:

谢谢,我知道这个功能。是的,它很方便。但我想计算所有的 file_exists、fstat、filemtime、fread、fwrite、file_get/put_contents 等。【参考方案2】:

使用vmstatiostat 查找您是否受cpu、mem 或i/o 限制。您还可以使用strace 记录系统调用。使用XDebug 或xhprof 来分析您的PHP 应用程序。

【讨论】:

嗯,我想知道如何在 Apache 的 strace 中运行 PHP 以响应 HTTP 请求...【参考方案3】:

所以首先有必要计算在一个进程中发生了多少 i/o 脚本及其所有内容。

不必计算脚本及其包含的 I/O 发生的次数。

只需要随机暂停几次,每次检查调用堆栈。如果一个 I/O 花费的时间是另一个 I/O 的两倍,那么您在每次暂停时看到它的可能性就会增加一倍。它是在您的脚本中还是在包含中都没有关系。任何需要足够时间才值得优化的东西都会出现不止一次。

【讨论】:

以上是关于如何在不修改脚本的情况下计算 PHP 脚本的文件读取和写入?的主要内容,如果未能解决你的问题,请参考以下文章

在不更改 url 的情况下访问脚本

在不使用 CRON 的情况下安排脚本

bash 脚本如何在不使用 uudecode 的情况下写出二进制文件?

在不提交表单的情况下触发 Google 脚本

如何在不使用命令行的情况下运行 Perl 脚本?

如何在不使用或隐藏的情况下上传图片?