导航

PHP win32service - Windows 系统后台服务

Posted on 2022-05-10 17:29  eastson  阅读(108)  评论(0编辑  收藏  举报

https://www.php.net/manual/zh/book.win32service.php

<?php
//No timeouts, Flush Content immediatly
set_time_limit(0);
ob_implicit_flush();

//Service Settings
$phpPath = "D:\\PHPSTUDY\\Extensions\\php\\php7.3.4nts";
$ServiceName = 'phpServiceName';
$ServiceDisplay = 'phpDisplayName';

//Windows Service Control
$ServiceAction = "status";

if ( isset($_GET['ServiceAction']) and strlen($_GET['ServiceAction']) ) {
    $ServiceAction = addslashes($_GET['ServiceAction']);
} else if ( isset($argv) and isset($argv[1]) and strlen($argv[1]) ) {
    $ServiceAction = $argv[1];
}

if( $ServiceAction == "status" ) {
    $ServiceStatus = win32_query_service_status($ServiceName);
    if (is_int($ServiceStatus)) {
        echo "Error Code: 0x" . dechex($ServiceStatus) . "\nSee https://www.php.net/manual/en/win32service.constants.errors.php\n\n";
        exit;
    }
    if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_STOPPED ) {
        echo "Service Stopped\n\n";
    } else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_START_PENDING ) {
        echo "Service Start Pending\n\n";
    } else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_STOP_PENDING ) {
        echo "Service Stop Pending\n\n";
    } else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_RUNNING ) {
        echo "Service Running\n\n";
    } else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_CONTINUE_PENDING ) {
        echo "Service Continue Pending\n\n";
    } else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_PAUSE_PENDING ) {
        echo "Service Pause Pending\n\n";
    } else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_PAUSED ) {
        echo "Service Paused\n\n";
    } else{
        echo "Service Unknown\n\n";
    }
    exit;
} else if ( $ServiceAction == "install" ) {
    //Install Windows Service
    $errorCode = win32_create_service( Array(
        'service' => $ServiceName,
        'display' => $ServiceDisplay,
        'params' => __FILE__ . " run",
        'path' => $phpPath . "\\php.exe",
    ));
    if ($errorCode) {
        echo "Error Code: 0x" . dechex($errorCode) . "\nSee https://www.php.net/manual/en/win32service.constants.errors.php\n\n";
    } else {
        echo "Service Installed\n\n";
    }
    exit;
} else if ( $ServiceAction == "uninstall" ) {
    //Remove Windows Service
    $errorCode = win32_delete_service($ServiceName);
    if ($errorCode) {
        echo "Error Code: 0x" . dechex($errorCode) . "\nSee https://www.php.net/manual/en/win32service.constants.errors.php\n\n";
    } else {
        echo "Service Removed\n\n";
    }
    exit;
} else if( $ServiceAction == "start") {
    //Start Windows Service
    $errorCode = win32_start_service($ServiceName);
    if ($errorCode) {
        echo "Error Code: 0x" . dechex($errorCode) . "\nSee https://www.php.net/manual/en/win32service.constants.errors.php\n\n";
    } else {
        echo "Service Started\n\n";
    }
    exit;
} else if( $ServiceAction == "stop" ) {
    //Stop Windows Service
    $errorCode = win32_stop_service($ServiceName);
    if ($errorCode) {
        echo "Error Code: 0x" . dechex($errorCode) . "\nSee https://www.php.net/manual/en/win32service.constants.errors.php\n\n";
    } else {
        echo "Service Stopped\n\n";
    }
    exit;
} else if ( $ServiceAction == "run" ) {
    //Run Windows Service
    win32_start_service_ctrl_dispatcher($ServiceName);
    win32_set_service_status(WIN32_SERVICE_RUNNING);
} else if ( $ServiceAction == "debug" ) {
    //Debug Windows Service
    set_time_limit(10);
} else {
    exit();
}

//Server Loop
while (1) {
    //Handle Windows Service Request
    usleep(100*1000);
    if ( $ServiceAction == "run" ) {
        switch ( win32_get_last_control_message() ) {
            case WIN32_SERVICE_CONTROL_CONTINUE:
                break;
            case WIN32_SERVICE_CONTROL_INTERROGATE:
                win32_set_service_status(WIN32_NO_ERROR);
                break;
            case WIN32_SERVICE_CONTROL_STOP:
                win32_set_service_status(WIN32_SERVICE_STOPPED);
                exit;
            default:
                win32_set_service_status(WIN32_ERROR_CALL_NOT_IMPLEMENTED);
        }
    }

    //User Loop
    sleep(1);

    //YOUR CODE HERE
    echo "YOUR CODE HERE\n";
}

//Exit
if ( $ServiceAction == "run" ) {
    win32_set_service_status(WIN32_SERVICE_STOPPED);
}

exit();

注意权限问题,要以管理员身份执行php脚本。
可能碰到的错误码:https://www.php.net/manual/en/win32service.constants.errors.php