PHP win32service - Windows 系統後臺服務
阿新 • • 發佈:2022-05-10
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