在php中清理存储的临时文件的正确方法是什么?

在php中清理存储的临时文件的正确方法是什么?,php,Php,我正试图找到一种使用php清理临时存储空间的方法。我知道我可以设置cron作业,但是,有没有一种方法可以从php本身实现呢 我使用一个临时存储文件夹来存储生成的pdf文件,供用户下载。我已设法强制该文件过期,因此3分钟后将不再公开访问该文件。现在是问题。虽然该文件不能公开访问,但它仍然存储在我的服务器中。我写了这样的代码来清理仓库 /**从主线*/ 如果Rand1100静态::$expires{ 取消$file的链接; } } closedir$dir_句柄; } } 因此,这将随机清理存储。基

我正试图找到一种使用php清理临时存储空间的方法。我知道我可以设置cron作业,但是,有没有一种方法可以从php本身实现呢

我使用一个临时存储文件夹来存储生成的pdf文件,供用户下载。我已设法强制该文件过期,因此3分钟后将不再公开访问该文件。现在是问题。虽然该文件不能公开访问,但它仍然存储在我的服务器中。我写了这样的代码来清理仓库

/**从主线*/ 如果Rand1100静态::$expires{ 取消$file的链接; } } closedir$dir_句柄; } } 因此,这将随机清理存储。基本上这是好的。但问题是,当存储清理开始时,请求会像海龟一样变慢

所以我想创造一份工作。但是,有没有一种正确的方法可以从php本身做到这一点

注: 我使用的是slim-4,在设置cronjobs方面也没有太多专业知识。因此,任何资源都会有帮助

简短回答:不

PHP无法自触发任何操作

如果是框架,创建脚本或命令,并用cronjob触发它。

简短回答:否

PHP无法自触发任何操作


如果是框架,则创建一个脚本或命令,并使用cronjob触发它。

在您的实现中,每当清理例程到达主线程时,根据PDF目录中的文件量,它可能会在响应中造成明显的延迟

正如其他评论/回答中所指出的,cron作业确实是处理此问题的标准方法。然而,如果您不能访问cron作业,或者只是喜欢纯PHP解决方案,那么除了您已经在做的事情之外,还有一些可能的方法

保留已创建文件的日志以及创建时间戳。调用clean例程时,不要使用修改过的时间检查进行完整的目录扫描,而是根据记录进行删除,并从记录中清除已删除的条目。将记录存储为JSON文件或CSV/TSV格式。考虑到文件系统访问的减少,在文件量很大的情况下,这将提供显著的加速

如果您不想因清理延迟而打扰用户,请将例程从面向用户的文件移动到仅管理的文件,或者执行管理员用户检查,并将OP中的清理频率触发器调整为1:20以匹配管理员使用频率。如果管理员不在,这当然会减少清理频率,但会减轻公众的负担

最后,很明显,成为Cron先生,每隔一段时间手动触发一次清理,每天或在您的服务器空间用完之前。一般来说,除非你的空间很紧,否则似乎没有必要每隔20页左右清理一次。我不知道生成的PDF的数量、发生的流量或服务器资源,因此很难给出关于清理频率的建议数字


在您的实现中,每当清理例程点击主线程时,根据PDF目录中的文件量,它可能会在响应中造成明显的延迟

正如其他评论/回答中所指出的,cron作业确实是处理此问题的标准方法。然而,如果您不能访问cron作业,或者只是喜欢纯PHP解决方案,那么除了您已经在做的事情之外,还有一些可能的方法

保留已创建文件的日志以及创建时间戳。调用clean例程时,不要使用修改过的时间检查进行完整的目录扫描,而是根据记录进行删除,并从记录中清除已删除的条目。将记录存储为JSON文件或CSV/TSV格式。考虑到文件系统访问的减少,在文件量很大的情况下,这将提供显著的加速

如果您不想因清理延迟而打扰用户,请将例程从面向用户的文件移动到仅管理的文件,或者执行管理员用户检查,并将OP中的清理频率触发器调整为1:20以匹配管理员使用频率。如果管理员不在,这当然会减少清理频率,但会减轻公众的负担

最后,很明显,成为Cron先生,每隔一段时间手动触发一次清理,每天或在您的服务器空间用完之前。一般来说,除非你的空间很紧,否则似乎没有必要每隔20页左右清理一次。我不知道生成的PDF的数量、发生的流量或服务器资源,因此很难给出关于清理频率的建议数字


这是一个糟糕的概念,请为此作业使用cronjob调度程序。下面是bash oneliner,用于删除文件夹/tmp/some\u路径中的所有文件,如果文件夹内容 超过10MB请根据您的需要进行相应修改:

SIZE=$(du -bs --block-size=1M /tmp/some_path | cut -f1); if [[ $SIZE -gt 10 ]];then echo "Folder '/tmp/some_path' has size ($SIZE MB)."; rm -r /tmp/some_path/*; fi
您可以将此代码转换为script.sh include,例如for bash/bin/bash,并使文件可执行,即.chmod+x script.sh,然后将新行附加到cronjob调度程序,例如crontab-e,以每小时检查文件夹大小:


您可以在此处找到有关cronjobs的更多信息:

这是一个糟糕的概念,请为此作业使用cronjob调度程序。下面是bash oneliner,用于删除文件夹/tmp/some_路径中的所有文件。如果文件夹内容超过10MB,请根据需要进行相应修改:

SIZE=$(du -bs --block-size=1M /tmp/some_path | cut -f1); if [[ $SIZE -gt 10 ]];then echo "Folder '/tmp/some_path' has size ($SIZE MB)."; rm -r /tmp/some_path/*; fi
您可以将此代码转换为script.sh include,例如for bash/bin/bash,并使文件可执行,即.chmod+x script.sh,然后将新行附加到cronjob调度程序,例如crontab-e,以每小时检查文件夹大小:



您可以在此处找到有关cronjobs的更多信息:

是的,cron job将是实现这一点的完美工具。是的,将其作为PHP请求的一部分会减慢PHP请求的速度。@deceze哦,我明白了。我有一个问题-我们可以从php中实现吗?我对这门学科只有基本的知识。但是在magento这样的框架中看到了这样做的能力。如果是这样的话,我将如何实现这一点?有很多想法可能会有所帮助。从PHP内部设置cron作业?不,那不是它的工作。这是一个一次性设置,而不是对每个PHP请求执行的操作。具体如何做取决于您的系统;即使使用裸UNIX配置文件,也不难,如果您使用一些托管服务,它们甚至可能有一个GUI。当然,你可以用任何你想要的语言编写cron脚本,包括PHP。感谢我选择cron,是的,cron作业将是实现这一点的完美工具。是的,将其作为PHP请求的一部分会减慢PHP请求的速度。@deceze哦,我明白了。我有一个问题-我们可以从php中实现吗?我对这门学科只有基本的知识。但是在magento这样的框架中看到了这样做的能力。如果是这样的话,我将如何实现这一点?有很多想法可能会有所帮助。从PHP内部设置cron作业?不,那不是它的工作。这是一个一次性设置,而不是对每个PHP请求执行的操作。具体如何做取决于您的系统;即使使用裸UNIX配置文件,也不难,如果您使用一些托管服务,它们甚至可能有一个GUI。当然,你可以用任何你想要的语言编写cron脚本,包括PHP。谢谢,我会使用cron,那么我该怎么做呢?我使用的是php微框架slim-4。你知道吗?通过自触发,我想你指的是外部脚本调用?Slim本身无法处理CLI,你必须集成新的库。只需创建新脚本并通过cronjob运行即可。@MarkusAO yes-我的意思是PHP不能自行启动,必须由其他http调用、cli命令、cron。。。我该怎么做?我使用的是php微框架slim-4。你知道吗?通过自触发,我想你指的是外部脚本调用?Slim本身无法处理CLI,你必须集成新的库。只需创建新脚本并通过cronjob运行即可。@MarkusAO yes-我的意思是PHP不能自行启动,必须由其他http调用、cli命令、cron。。。生成的文件将有几个Kbs的最大。我还没有完成文件生成过程,所以不能给你确切的测量。流量也会很低,大约每天生成15-25页。如果是这样的话,你的清理程序会像乌龟一样减慢请求的速度,这是令人费解的。如果您的文件夹中只有几十个文件,那么您的例程应该只增加总处理时间的一小部分。现在,假设生成的PDF平均为10KB,并且每天生成100个PDF。这将在一天内占用1MB。即使您每月或每年触发一次手动清理!!,就真正的服务器问题而言,您似乎还可以。实际上是这样。不过,这是一个很好的家务活!知道这一点让我松了一口气。那么可能只是我的系统太慢了。该项目仍在开发中,因此它没有部署到实际的服务器以了解实际速度。我已经在本地服务器和开发阶段对此进行了测试,所以还有很多性能优化的空间。让我们使用clean函数查看代表性的测试用例。在我的笔记本电脑i5-8250上,我生成了200个虚拟文件,在到期范围的两侧都有触摸时间戳。然后我运行你的清理程序。完成大约需要0.05秒,平均删除50%的文件。我对这些书不会太担心。只需说一句,将清理频率降低到1:1000是安全的。其中,即使50%的页面调用生成了PDF,您仍然只有500 x ~10KB的文件要擦除。生成的文件最多只有几Kbs。我还没有完成文件生成过程,因此无法给您精确的测量。流量也会很低,大约每天生成15-25页。如果是这样的话,那么你的清理程序是否会减慢dow的速度就令人费解了
像乌龟一样接受请求。如果您的文件夹中只有几十个文件,那么您的例程应该只增加总处理时间的一小部分。现在,假设生成的PDF平均为10KB,并且每天生成100个PDF。这将在一天内占用1MB。即使您每月或每年触发一次手动清理!!,就真正的服务器问题而言,您似乎还可以。实际上是这样。不过,这是一个很好的家务活!知道这一点让我松了一口气。那么可能只是我的系统太慢了。该项目仍在开发中,因此它没有部署到实际的服务器以了解实际速度。我已经在本地服务器和开发阶段对此进行了测试,所以还有很多性能优化的空间。让我们使用clean函数查看代表性的测试用例。在我的笔记本电脑i5-8250上,我生成了200个虚拟文件,在到期范围的两侧都有触摸时间戳。然后我运行你的清理程序。完成大约需要0.05秒,平均删除50%的文件。我对这些书不会太担心。只需说一句,将清理频率降低到1:1000是安全的。其中,即使50%的页面调用生成了PDF,您仍然只有500 x~10KB的文件需要擦除。