我真的不知道如何在标题上描述我的问题,所以我尽了最大努力。
我有一个重置我的网站的功能。我还有一个时间戳,其中该函数应该执行。时间戳正在改变每次重置,所以我需要找到一种在que上激活该功能的方法。
到目前为止,我最好的灵魂是写time_to_reset()
函数,如果它是真的运行脚本,但脚本很重,我担心无法在一些随机用户上运行它(重置只发生一次)电脑。
在完成脚本执行之前,他可以退出网站。
此外,我担心在某些情况下,由于少数用户登录togather,脚本将执行两次或更多次。这是另一个问题,我很乐意帮忙解决。
我很抱歉我的英语不好,而且对于无代码问题:)我也讨厌它......
如果你不理解我,我会很高兴再解释一下。谢谢!
EDIT:
我没有必要使用用户,这只是我的想法。
我有一个用PHP代码编写的管理面板,您可以在其中编辑重置时间。有一种方法可以用PHP代码更改CJ日期吗?或者在不使用用户的情况下以任何其他方式进行重置?
答案 0 :(得分:10)
使用页面加载运行的排队操作非常简单。只需创建一个包含操作(脚本/函数)的表以及何时需要运行它。然后你可以抓住下一个动作,如果是时候执行,只需删除行,这样你的脚本就可以运行了,没有其他人会触发动作。如果你只有一个动作,你可以只让表存储时间来运行它。
为了回应您对脚本繁重的担忧,以固定间隔运行的脚本实际上是cron的发明,而对于PHP站点上的较重动作,它确实是最佳选择。如果您使用的是VPS,那么您已经拥有了cron,只需通过SSH连接到您的服务器并运行crontab -e
来编辑您的crontab文件并输入如下内容:
*/5 * * * * php /path/to/script.php
每5分钟运行一次脚本。 (这里有更多的cron示例:http://www.thegeekstuff.com/2011/07/cron-every-5-minutes/)
或者,如果您无法在服务器上设置cron作业,则可以在自己的页面上运行重置操作,并使用像http://www.mywebcron.com/这样的webcron服务按设定的时间间隔调用该页面。
答案 1 :(得分:9)
你已经知道问题所在。
他可以在脚本完全执行之前退出网站
针对此问题的两种解决方案。基本上你不想依赖浏览器来执行。
ignore_user_abort(true);
http://php.net/manual/en/function.ignore-user-abort.php。它非常常用于进行大量备份。另外,我担心在某些情况下脚本会执行两次或 更多是由于少数用户登录togather
设置一些锁定系统,即如果脚本已经运行,那么不要执行脚本,这样就可以在启动脚本后创建数据库条目或仅创建一个文件。因此,下次执行函数时,您可以检查status
是否已经运行。
更新
第一次执行脚本时,您可以touch文件说script.lock
。在执行脚本之前,请检查file_exists是否使用stat检查修改时间
$stat = stat('script.lock');
$mtime = $stat['mtime'];
仅当文件不存在且已经过了一段时间时才允许脚本执行。
执行完成后删除文件。
答案 2 :(得分:5)
如果您决定通过用户访问执行此操作,则设置一个数据库表,该表允许PHP代码尝试锁定重置特定行。您可以将其设置为只有一个进程可以锁定该行,并且仅当当前时间超过下一个重置截止日期时才会设置。
锁定在生成整个用户页面并设置PHP代码后完成,以便在用户离开页面时不会终止。
这可以让你做一些事情:
这不是我推荐的东西,但我愿意假设有些理由我不明白会使这种方式成为重置服务器某些方面的合适方式。
答案 3 :(得分:1)
所以我觉得你的主要答案已经完成了。你只是说你的代码很重,你害怕不需要重置TimeStamp吗? 对。如果这是你的问题你可以简单地通过对登录Cookie的用户进行攻击来修复他的时间戳和用户的Id加密(我正常加密密码并在cookie上添加加密密码,这样就不可能了用户更改cookie ID并知道其他用户加密密码)但不是这样。
真正的解决方法: 你只需要在数据库上有一个表,并在他登录时添加该用户的用户ID和时间戳,你可以检查时间戳,如果你想在用户操作上执行脚本,如果那是你真正需要的,那么你需要在GET示例中使用动作和令牌制作1个php文件:
?actions.php标记= 231sfa231dasdasd&安培;行动=用户名
因此页面将获得一个空白页面,其中只包含当前用户的用户名。 您可以通过添加一些Javascript代码进行交互,并在其发生变化时自行刷新。
不确定我是否帮助了你但是如果我告诉我的话。感谢
答案 4 :(得分:1)
似乎使用CronJob是您最好的解决方案
新的PHP页面配置如何运行" reset"事情和触发它的东西你也可以使用Mysql来保存下一个运行队列,你可以处理每个队列的重置。
此致
答案 5 :(得分:1)
我建议您在脚本中使用ignore_user_abort
。
设置客户端断开连接是否会导致脚本中止。
当运行PHP作为命令行脚本,并且脚本的tty消失而脚本没有被终止时,脚本将在下次尝试写入任何内容时死亡,除非将值设置为TRUE
有关此功能的完整说明,我想参考PHP Manual