【问题标题】:Programmatically identify PHP and ASP include dependencies [closed]以编程方式识别 PHP 和 ASP 包含依赖项 [关闭]
【发布时间】:2017-01-05 10:50:51
【问题描述】:

我正在尝试自动清理遗留/遗留代码,我可以从 IIS 日志中识别当前正在使用的资源,但是像 .ASP 和 .PHP 这样的服务器端页面包含我希望能够通过代码识别的链(C#)

为了缩小问题范围,因为它太宽泛了......

  • 操作系统 - Windows 10
  • Web 服务器 - IIS
  • 首选语言 - C#
  • 示例 - 任何 IIS 服务的网站

我有读取 IIS 日志文件的代码,我在其中识别了所有静态服务资源,包括初始 .ASP 或 .PHP 页面。

我还需要一些附带的 C# 代码来详细说明在服务器上处理的任何 .ASP 或 .PHP 包含的文件,因此不会出现在 IIS 日志中。

碰巧我找到了解决方案并在下面提供了答案。

我希望这是足够的细节来取消“等待”

【问题讨论】:

  • Php 允许用户通过 spl_autoload_register 以任何方式将类名映射到文件路径(自动加载)。否则我会说寻找 include/require(_once) 行。
  • 不会涵盖所有内容,但最近的最后访问文件时间?
  • 为了让这个问题更符合主题,请举例说明您迄今为止尝试过的代码/流程、预期结果以及哪些对您有效,哪些对您无效。

标签: c# php asp.net iis


【解决方案1】:

非常感谢@Progrock 指点我检查目标文件夹中文件的上次访问时间。这是我必须做的。

确保捕获上次访问时间是由 Windows 设置的(请参阅Directory.GetFiles keeping the last access time

Process.Start("fsutil", "behavior set disablelastaccess 0").WaitForExit();

还需要重新启动 IIS 以停止任何缓存在内存中的文件

Process.Start("IISRESET").WaitForExit();

需要刷新 FileInfo 以确保您获得正确的上次访问时间(请参阅How can System.IO.FileSystemInfo.Refresh be used)。

这导致了以下代码...

var start = DateTime.UtcNow;
Process.Start("fsutil", "behavior set disablelastaccess 0").WaitForExit();
Process.Start("IISRESET").WaitForExit();
//do work that will access folder. i.e. access IIS web pages
var files = Directory.GetFiles(iisPath, "*.*", SearchOption.AllDirectories).ToList();
files = files.Where(x =>
{
  var fileInfo = new FileInfo(x);
  fileInfo.Refresh();
  return fileInfo.LastAccessTimeUtc >= start;
}).ToList();   

我可以使用此文件列表来识别所有 .ASP 和 .PHP 以及通过 IIS 服务器在页面请求中访问的任何其他文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    相关资源
    最近更新 更多