我需要创建一个循环,当它超过20秒时结束.我尝试了以下代码,但它无法运行,永远运行.
编辑:对于简单的代码,它将停止正常,但使用include_once并包括外部文件即使在20秒到期后仍保持运行
bot.php
$starttime = time();
while (time() - $starttime < 20) {
include_once 'onefile.php';
include 'somefile.php';
include 'somefile2.php';
}
Run Code Online (Sandbox Code Playgroud)
编辑2:
有了Josh Trii Johnston的回答,如果没有在X秒内完成,那么过程就会被停止.现在的问题是我的案子还有另一个问题.上面提供的样本并不是单独运行的.它也包含在另一个循环文件中,如下所示:
master.php
<?php
while (1) {
include 'bot.php';
sleep(60);
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到它在无限循环上运行而我想要的并不是停止整个循环而只是"破坏"bot.php循环,保持主while(1)循环活动.使用提供的解决方案,它退出所有循环并终止进程.
我有一个连接到第三方API的脚本.它应该是24/7不间断循环运行(我在重新启动循环之前使用了一个睡眠).
问题是,有时第三方API会被ddosed或连接只是因为这个错误而丢失:
致命错误:未捕获异常'GuzzleHttp\Ring\Exception\ConnectException',消息'cURL错误7:无法连接到xxx.com端口443
有没有办法"破坏"这个致命的错误,以确保代码重新启动并继续,如果可以进行操作或必须我每次出现此错误时手动重新启动?
我很难弄清楚我的模型表现如此的原因.
它有2个动作,取消和功能,当属性已被取消时,它不应该被提供.
为确保未对已取消的属性执行某项功能,我使用Redis-Mutex锁定该属性以获取排他性,并在该块内进行正确的验证.这应该确保一方制定的记录不会同时在另一方处理:
特色动作:
mutex = RedisMutex.new(record_to_feature, block: 30, sleep: 0.1)
if mutex.lock
record_to_feature = record_to_feature.reload
if record_to_feature.reload.active?
record_to_feature.reload.update_attributes(featured: true)
end
mutex.unlock
end
Run Code Online (Sandbox Code Playgroud)
取消操作:
mutex = RedisMutex.new(record_to_cancel, block: 30, sleep: 0.1)
if mutex.lock
record_to_cancel = record_to_cancel.reload
if !record_to_cancel.reload.featured?
record_to_cancel.reload.update_attributes(active: false)
end
mutex.unlock
end
Run Code Online (Sandbox Code Playgroud)
我想了解有时(罕见)属性首先被取消然后被特征的可能性 - 另一种方式:功能然后取消也可能发生,只是我没有检测到它.
如果这是一个糟糕的方法,请告诉我,如果是,那么解决这个问题的好方法.