开始想是用 ignore_user_abort()方法写定时器,但是总是断掉 就没用了,
ignore_user_abort();
while(true)
{
}
PHP定时器代码开始 复制执行就可以用了,原理就是调用接口的方式通过CURL调用自身(看代码)
// 120秒执行1一次,开启日志记录
timer(120, true );
/*
* @todo PHP定时器
* @explain 回调接口回调原理 注:打开直接运行 关闭页面后也会执行,停止:重启apache服务器;会消耗2-5个进程
* @txt 是否开启日志记录 true开启 false关闭 日志文件:timer_log.txt
* @interval 延迟时间 延迟时间越长进程消耗越少
* @stop 停止时间 时间戳
* @demo timer(5, true,1595983440);
**/
function timer($interval = 10, $txt = true, $stop = false)
{
// 停止时间
if ($stop && time() >= intval($stop)) return;
// 是否写入记录
if ($txt) file_put_contents('timer_log.txt', date('Y-m-d H:i:s',time()) . "\r\n", FILE_APPEND); //日志记录
// 判断是否是https
$is_https = false;
if (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') {
$is_https = true;
} elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$is_https = true;
} elseif (!empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off') {
$is_https = true;
}
// 生成当前文件url
$url = 'http' . ($is_https ? 's' : '') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] . '?' . $_SERVER['QUERY_STRING'];
// 延迟时间单位秒
sleep($interval);
// 你需要执行的代码方法
mannerOfExecution();
$ch = curl_init(); //初始化CURL句柄
curl_setopt($ch, CURLOPT_URL, $url); //设置请求的URL
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); //设置请求方式
$output = curl_exec($ch);
curl_close($ch);
}
// 你需要执行的代码
function mannerOfExecution()
{
}
这是我在自己项目中使用
/*
* @todo PHP定时器 备份
* @explain 回调接口回调原理 注:打开直接运行 关闭页面后也会执行,停止:重启apache服务器;会消耗2-5个进程
* @txt 是否开启日志记录 true开启 false关闭 日志文件:timer_log.txt
* @interval 延迟时间 延迟时间越长进程消耗越少
* @stop 停止时间 时间戳
* @demo timer(5, true,1595983440);
**/
function timer($interval = 3600, $txt = true, $stop = false)
{
// 停止时间
if ($stop && time() >= intval($stop)) return Cache::rm('Backups');
// 禁止多开控制器
if (Cache::has('Backups') && Cache::get('Backups') + $interval > time()) {
return json(['code' => 400200, 'msg' => '已开启一个']);
} else {
Cache::set('Backups', time());
}
// 是否写入记录
if ($txt) file_put_contents('timer_log.txt', date('Y-m-d H:i:s', time()) . "\r\n", FILE_APPEND); //日志记录
// 生成当前接口url
$url = 'http' . (Request()->isSsl() ? 's' : '') . '://' . $_SERVER['HTTP_HOST'] . '/' . $_SERVER['QUERY_STRING'];
// 延迟时间单位秒
sleep($interval);
// 你需要执行的代码方法
(new Baksql())->index(['tp' => 'backup', 'name' => 'self_motion']); // 备份方法
// 回调循环
$ch = curl_init(); //初始化CURL句柄
curl_setopt($ch, CURLOPT_URL, $url); //设置请求的URL
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); //设置请求方式
$output = curl_exec($ch);
curl_close($ch);
}