通过用户操作在服务器上执行脚本

Ofi*_*irH 10 php mysql

我真的不知道如何在标题上描述我的问题所以我尽我所能.

我有一个重置我的网站的功能.我还有一个时间戳,其中该函数应该执行.时间戳正在改变每次重置,所以我需要找到一种在que上激活该功能的方法.

到目前为止,我最好的灵魂是写time_to_reset()函数,如果它是真的运行脚本,但脚本很重,我担心它不可能在一些随机用户(重置只发生一次)计算机上运行它.在完成脚本执行之前,他可以退出网站.此外,我担心在某些情况下,由于少数用户登录togather,脚本将执行两次或更多次.这是另一个问题,我很乐意帮忙解决.

我很抱歉我的英语不好,而且对于无代码问题:)我也讨厌它...

如果你不理解我,我会很高兴再解释一下.谢谢!

EDIT: 我没有必要使用用户,这只是我的想法.我有一个用PHP代码编写的管理面板,您可以在其中编辑重置时间.有一种方法可以用PHP代码更改CJ日期吗?或任何其他方式在不使用用户的情况下进行重置?

小智 10

使用页面加载运行的排队操作非常简单.只需创建一个包含操作(脚本/函数)的表以及何时需要运行它.然后你可以抓住下一个动作,如果是时候执行,只需删除行,这样你的脚本就可以运行了,没有其他人会触发动作.如果你只有一个动作,你可以只让表存储它的时间.

为了回应您对脚本繁重的担忧,以固定间隔运行的脚本实际上是cron的发明,而对于PHP站点上较重的操作,它确实是最佳选择.如果您使用的是VPS,那么您已经拥有了cron,只需通过SSH连接到您的服务器并运行crontab -e以编辑您的crontab文件并输入如下内容:

*/5 * * * * php /path/to/script.php
Run Code Online (Sandbox Code Playgroud)

每5分钟运行一次脚本.(这里有更多的cron示例:http://www.thegeekstuff.com/2011/07/cron-every-5-minutes/)

或者,如果您无法在服务器上设置cron作业,则可以在其自己的页面上运行重置操作,并使用像http://www.mywebcron.com/这样的webcron服务以设置的间隔调用该页面.


Jig*_*gar 9

你已经知道问题所在.

在脚本完全执行之前,他可以退出网站

解决这个问题的两种方法.基本上你不想依赖浏览器来执行.

此外,我担心在某些情况下,由于少数用户登录togather,脚本将执行两次或更多次

放一些锁定系统,即如果脚本已经运行,那么不要执行脚本,这样就可以在启动脚本后创建数据库条目或只创建一个文件.因此,下次执行函数时,您可以检查它status是否已经运行.


根据评论中的对话更新

您可以在第一次执行脚本时触摸该文件script.lock.并且在执行脚本之前检查file_exists是否使用stat检查修改时间

$stat = stat('script.lock'); 
$mtime = $stat['mtime'];
Run Code Online (Sandbox Code Playgroud)

仅当文件不存在且已经过了一定时间时才允许脚本执行.

执行完成后删除文件.


A S*_*ith 5

如果您决定通过用户访问执行此操作,则设置一个数据库表,允许PHP代码尝试锁定重置特定行.您可以将其设置为只有一个进程可以锁定该行,并且仅当当前时间超过下一个重置截止日期时才可以.

锁定在生成整个用户页面并设置PHP代码后完成,以便在用户离开页面时不会终止.

这将让你做一些事情:

  1. 检查所有页面加载以查看是否已声明一行重置记录.如果是这样,请通知该站点将重置,但是剩余的时间很长(锁定PHP应该管理此延迟期).
  2. 断开锁定PHP以便它可以继续运行.确保将其执行时间设置得足够高,以便完成整个任务.
  3. 作为重置或重启的一部分,或者必须发生的任何事情,取消设置重置锁定并在适当的时候设置下一个重置截止日期.

这不是我真正推荐的东西,但我愿意假设有些理由让我不明白会使这种方法成为重置服务器某些方面的合适方法.


小智 1

所以我认为你的主要答案已经完成了。您只是说您的代码很重并且您担心时间戳的不必要的重置,对吗?正确的。所以,如果这是你的问题,你可以简单地通过登录 Cookie 的用户来解决他,其中包含加密的时间戳和用户 ID(我通常加密密码并将加密的密码添加到 Cookie 上,所以不可能用户更改 cookie Id 并知道其他用户的加密密码)但事实并非如此。

真正的解决方法:您只需要在数据库上有一个表,然后添加该用户的用户 ID 和时间戳,那么当他登录时,您可以检查时间戳,如果您想在用户操作上执行脚本(如果您就是这样的话)确实需要,您需要创建 1 个 php 文件,其中包含 GET 示例上的操作和令牌:

actions.php?token=231sfa231dasdasd&action=用户名

因此,页面将显示一个空白页面,其中仅包含当前用户的用户名。您可以通过添加一些 Javascript 代码来使其具有交互性,并在更改时使其自行刷新。

不确定我是否帮助了你,但如果我帮助了请告诉我。谢谢