【问题标题】:set cron with parameter that run after specific time and than delete that cron job once execution complete using php使用在特定时间后运行的参数设置 cron,然后在使用 php 执行完成后删除该 cron 作业
【发布时间】:2016-09-17 07:04:20
【问题描述】:

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

因此,我还有剩余的用户时间让我们说 210 秒。我必须将当前电话会议的 ConferenceSid 传递给 cron 文件一个参数。

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

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

$path = dirname(__FILE__);
$cron = $path . "/test.php ConferenceSid=".$_REQUEST['ConferenceSid'];
Crontab::addJob('*/1 * * * * php '.$cron);
Crontab::removeJob('*/1 * * * * php '.$cron);

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

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

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;
        }
     }
}

【问题讨论】:

    标签: php linux cron twilio


    【解决方案1】:

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

    sleep($numberOfSeconds)
    

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

    【讨论】:

    • 是的,我知道 sleep 功能,但如果我需要使用 sleep(50000) 或更多秒,它会影响 CPU 性能吗?如果一个文件一次运行不止一次怎么办?它独立执行?
    • 好吧,脚本已加载并运行,所以它必须使用一些 CPU 和 RAM,但据我所知,它是最小的
    【解决方案2】:

    我会使用 at 而不是 cron。它旨在执行一次命令。

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

    【讨论】:

      猜你喜欢
      • 2014-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多