需要在php中运行长时间的任务

时间:2015-01-04 11:45:25

标签: php jquery ajax onbeforeunload

在商业项目中,我需要定期监控SMTP和Accounting服务器,看它是否正常运行。 如果它死了更新mysql中的表。 我无法在服务器托管php脚本上安装任何第三方应用程序或使用exec或通过php_ini_set修改php设置 每项任务大约需要10至30秒 我试图通过Jquery ajax调用来运行任务 它工作,但问题是当jquery请求运行时你无法导航到任何其他页面和xhr.abort();没有工作,并且在jquery任务完成之前就停止加载。

这是我在js文件中尝试的内容

var monitor_running = false;
var xhr;
function monitor() {
    if (document.readyState === "complete") {
        if (monitor_running === false) {
            monitor_call();
        }
        else {
            console.log("jobs Already running ===>");
        }
    }
}
window.onbeforeunload = function () {
    console.log(xhr);
    xhr.abort();
    alert(xhr.status);
};
setInterval(monitor, monitor_interval * 1000);

function monitor_call() {
    monitor_running = true;
    console.log("jobs running");

    xhr = $.ajax({url: './ajax.php',
        data: {
            cmd: 'monitor'
        },
        type: 'post',
        async: true,
        success: function (output) {
            monitor_running = false;
            console.log(output + " job is finished");
        }
    });
}

并在php页面中:

<?php
include_once '../includes/config.php';
$tpl_obj = new template('admin');
$navigation_obj = new navigation();

$auth = $navigation_obj->admin_is_auth();
if (!$auth) {
    die('Auth Failed !');
}

function monitor() {
    sleep(10);
    echo 'done';
//    $monReport['acc'] = monitor::domon('acc');
//    $monReport['smtp'] = monitor::domon('smtp');
//    $monReport['payment'] = monitor::domon('payment');
//    $monReport['dns'] = monitor::domon('dns');
//    return json_encode($monReport);
}

$cmd_post = filter_input(INPUT_POST, 'cmd');
$cmd_get = filter_input(INPUT_GET, 'cmd');


if ($cmd_post == 'monitor') {
    echo monitor();
}

0 个答案:

没有答案