我正在做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;
}
}
}
您可以放弃cron方法,让脚本像这样开始:
sleep($numberOfSeconds)
你只需要以一种不会阻塞主程序的方式调用脚本。请参阅如何使用php在后台(非阻塞)运行程序?
我会用at代替cron。它被设计为执行一次命令。
如果你需要秒精度,你可以使用它与sleep
,所以代替sleep(50000)
你运行at now + 833 min
和sleep(20)
。