首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用在特定时间之后运行参数设置cron,然后在执行完成后使用php删除cron作业

问使用在特定时间之后运行参数设置cron,然后在执行完成后使用php删除cron作业
EN

Stack Overflow用户
提问于 2016-09-17 15:04:21
回答 2查看 505关注 0票数 1

我正在开发twilio api。其中我想执行一个文件,它说您的呼叫订阅在电话会议期间还有最后2分钟。

所以我有用户的剩余时间,比如说210秒。我必须将当前电话会议的ConferenceSid作为一个参数传递到cron文件中。

此文件将仅在特定时间之后执行(例如在会议呼叫开始的88秒之后。因此,我必须将cron设置为在电话会议开始88秒后运行,并在执行完成后删除动态创建的作业。

对于cron作业集,我使用以下crontab类。这是我正在尝试的代码。

代码语言:javascript
复制
$path = dirname(__FILE__);
$cron = $path . "/test.php ConferenceSid=".$_REQUEST['ConferenceSid'];
Crontab::addJob('*/1 * * * * php '.$cron);
Crontab::removeJob('*/1 * * * * php '.$cron);

我不知道如何传递参数,所以文件会在88秒后执行。

这是我的Crontab类,它是从另一个堆栈溢出答案中找到的。

代码语言:javascript
复制
class Crontab {

    static private function stringToArray($jobs = '') {
        $array = explode("\r\n", trim($jobs)); // trim() gets rid of the last \r\n
        foreach ($array as $key => $item) {
            if ($item == '') {
                unset($array[$key]);
            }
        }
        return $array;
    }

    static private function arrayToString($jobs = array()) {
        $string = implode("\r\n", $jobs);
        return $string;
    }

    static public function getJobs() {
        $output = shell_exec('crontab -l');
        return self::stringToArray($output);
    }

    static public function saveJobs($jobs = array()) {
        $output = shell_exec('echo "' . self::arrayToString($jobs) . '" | crontab -');
        return $output;
    }

    static public function doesJobExist($job = '') {
        $jobs = self::getJobs();
        if (in_array($job, $jobs)) {
            return true;
        } else {
            return false;
        }
    }

    static public function addJob($job = '') {
        if (self::doesJobExist($job)) {
            return false;
        } else {
            $jobs = self::getJobs();
            $jobs[] = $job;
            return self::saveJobs($jobs);
        }
    }

    static public function removeJob($job = '') {
        if (self::doesJobExist($job)) {
            $jobs = self::getJobs();
            unset($jobs[array_search($job, $jobs)]);
            return self::saveJobs($jobs);
        } else {
            return false;
        }
     }
}
EN

回答 2

Stack Overflow用户

发布于 2016-09-17 15:36:35

您可以放弃cron方法,让您的脚本像这样启动:

代码语言:javascript
复制
sleep($numberOfSeconds)

你只需要以一种不会阻塞你的主程序的方式调用脚本。请参阅How can I run a program in the background (non blocking) with php?

票数 0
EN

Stack Overflow用户

发布于 2016-09-17 19:42:01

我会使用at而不是cron。它被设计为只执行一次命令。

如果您需要秒精度,您可以将其与sleep一起使用,因此您可以运行at now + 833 min和sleep(20)而不是sleep(50000)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39543873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档