【问题标题】:Automatically delete an entry and a file after a certain amount of time一定时间后自动删除条目和文件
【发布时间】:2013-07-04 01:53:56
【问题描述】:

我想做的事:

所以我的问题是:如何以优化的方式在 24 小时后自动删除条目。

你需要知道的:

我研究了一个解决方案,该解决方案还允许我删除与此数据库条目关联的文件。

我的想法:

我最初的想法是启动一个 Perl 脚本,它会每小时检查是否最早的条目是在 24 小时前创建的,如果它删除了条目以及与该条目关联的文件,但首先,我找到了这个解决方案有点难看,我相信有比这个更好的解决方案,更优化和优雅!

表格:

UID, COUNT, VALUE_1, VALUE_2, ..., TIMESTAMP, LINK

如果你有什么灵感请告诉我!

【问题讨论】:

  • 对我来说听起来像是一项 cronjob 工作
  • 我没有完全理解这个问题。您有一个带有文件链接的 SQL 数据库吗?我的意思是你必须在你的数据库中搜寻旧的东西,删除行,删除文件。这是一个负载非常高的系统,所以它必须专门优化吗?
  • 对于创建的每个条目,也会创建一个文件,该文件的绝对链接在条目中。会有很多条目。 cron 作业似乎没有适应,因为如果在上午 00:01 创建条目,则 cron 条目将执行 23 次无用检查,如果运行一小时/检查,最糟糕的是一小时到迟到

标签: php sql perl automation


【解决方案1】:

您也可以使用 MySQL 的 event scheduler

  • 在这些记录过期时自动删除:

    CREATE EVENT delete_expired_101
    ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 24 HOUR DO
    DELETE FROM my_table WHERE id = 101;
    
  • 定期自动清除所有过期记录:

    CREATE EVENT delete_all_expired
    ON SCHEDULE EVERY HOUR DO
    DELETE FROM my_table WHERE expiry < NOW();
    

【讨论】:

  • 你知道我是否可以使用 MySQL 调度程序执行文件吗?你的解决方案似乎很完美,我只需要删除关联的文件就可以了!
【解决方案2】:

将您的 sql 查询写入 php 文件,然后在该文件上设置一个 cron 作业。

cPanel 内置此功能且易于使用

http://docs.cpanel.net/twiki/bin/view/AllDocumentation/CpanelDocs/CronJobs

要运行的命令看起来像这样

0   0   *   *   *   /usr/bin/lynx http://www.yourdomain.com/thefilexxx.php >/dev/null 2>&1

如果您没有 cPanel,请查看此

http://www.wikihow.com/Set-up-a-Crontab-File-on-Linux

另一个与cron作业相关的帖子Running cron job on linux every 6 hours

我现在才看到您对 PRPGFerret 的回复。您的 sql 条目是否有时间戳?更频繁地运行 cron 作业并让 php 检查时间戳,如果一个小时过去了,则删除该条目。

如果 cron 作业仍然不能满足您的目的,请查看此

http://php.net/manual/en/function.set-time-limit.php

【讨论】:

  • 这可能是一个很好的解决方案,但如果有例如 100000 个条目?会有 100000 个 cron 工作吗?很多!不是吗?
  • 您使用 php 文件中的条目,cron 作业只是运行该文件。因此,cron 作业提供了自动化,例如计时器,但 php 与 sql 数据交互。因此,拥有 100000 个条目可能需要一些高级 php 脚本,但我看不出还有什么其他方法可以删除您的文件,因为像 Stephen R 这样的 sql 查询不会这样做。
【解决方案3】:

你可以用一个

at 

工作

因此,当您最初加载整体以在 24 小时后触发时,您可以设置 at 作业。

xxx:~ $ echo 'ps -ef |grep atd' > x

xxx:~ $ at -f x now + 1 day
job 4 at Sun Jul  7 09:08:00 2013

xxx:~ $ at -l 4
4   Sun Jul  7 09:08:00 2013

xxx:~ $ at -c 4
#!/bin/sh
# atrun uid=501 gid=20
# mail xxxx 0
umask 22
GRAILS_HOME=/usr/share/grails; export GRAILS_HOME
<more environment>
_=/usr/bin/at; export _
cd /Users/xxx || {
 echo 'Execution directory inaccessible' >&2
 exit 1
}
OLDPWD=/Users/xxx;        export OLDPWD
ps -ef |grep atd

【讨论】:

    【解决方案4】:

    我已经考虑过了,嗯,这些条目是按时间顺序排列的:

    • 如果必须在上午 00:01 删除条目 25,则将在上午 00:01 相同或之后删除条目 26。

    • 我不想为每个条目创建一个 cron 作业,因为我知道会有很多条目。

    • 我的想法假设脚本将至少检查一次以获取条目的时间戳和它的 id。

    我知道这可能不是最优化的方式,但我想分享这个观点。

    想法:

    Get the ID and TIMESTAMP of entry e
    (TIMESTAMP+24) - TIMESTAMP -> Set a cron job to erase the file and remove the entry
    and start this script for entry e+1 (identified by id + 1)
    

    因此,每个条目将有一个 cron 作业,但我们只能有一个 cron 作业。

    【讨论】:

      猜你喜欢
      • 2020-06-05
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 2021-07-05
      • 2017-07-27
      • 2019-04-24
      • 1970-01-01
      • 2016-08-30
      相关资源
      最近更新 更多