Ti do anche qualche altro suggerimento, o per lo meno ci provo

Puoi utilizzare l'estensione
http://pecl.php.net/package/win32ps
http://it.php.net/w32api

dato che sei su windows, per permettere al servizio di decidere se può partire a convertire un altro processo o meno (puoi fare un fork del servizio di conversione se usi PHP o avvii un thread se usi C# ad esempio)

Per quanto riguarda la possibilità di eseguire del codice PHP come un vero e proprio servizio di sistema dai un occhio qua
http://netevil.org/blog/2005/sep/run...rvice-on-win32

e anche
http://it.php.net/win32service

------

un esempio concreto del servizio scritto in php potrebbe essere
Codice PHP:
if ($argv[1] == 'run')
{
  
set_time_limit(0);

  
$socket socket_create(AF_INETSOCK_STREAMSOL_TCP);

  if (
socket_bind($socket/** ASCOLTA SOLO IN LOCALE **/ '127.0.0.1'/** SULLA PORTA **/ 9999) == false)
  {
    die(
socket_strerror(socket_last_error());
  }

  if (
socket_set_option($socketSOL_SOCKETSO_REUSEADDR1) == false)
  { 
    die(
socket_strerror(socket_last_error()); 
  }

  if (
socket_set_nonblock($socket) == false)
  { 
    die(
socket_strerror(socket_last_error()); 
  } 

  if (
socket_listen($socket10) == false)
  {
    die(
socket_strerror(socket_last_error());
  }

  
win32_start_service_ctrl_dispatcher('nome-servizio-php');

  while (
WIN32_SERVICE_CONTROL_STOP != win32_get_last_control_message())
  {
    
$readSocket = array(&$socket);
    if ((
$numberOfEvents socket_select($readSocket$writeSocket NULL$errorSocket NULL0) === false)
    {
      die(
'Error while executing socket_select');
    }
    else if (
$numberOfEvents 0)
    {
      
acquireClient($socket);
    }
  }

Questo codice non l'ho minimamente testato, ma grosso modo dovrebbe essere corretto! Con questo codice si attiva la socket che si mette in ascolto SOLO in locale sulla porta 9999 e poi parte il servizio dove dentro verifica se c'è qualche evento di tipo lettura sulla socket che abbiamo messo in ascolto ... l'evento di lettura per le socket in ascolto vuol dire che c'è una richiesta di connessione.

La funzione che ho messo li, acquireClient a cui viene passata la socket dovrebbe fare qualcosa tipo

Codice PHP:
function acquireClient(&$ServerSocket)
{
  
$clientSocket socket_accept($ServerSocket);
  
  if ((
$pid pcntl_ fork()) == -1)
  {
    die(
'Unable to fork! Can't process the request!');
  }
  else if ($pid === 0)
  {
    /** Richiama una terza funzione che usa le funzioni socket_read e socket_write per dialogare con il processo chiamante **/
    /** Una volta fatto il tutto deve essere TASSATIVAMENTE chiamata la funzione exit(); altrimenti il processo figlio va ad eseguire la roba del processo padre! **/
    exit();
  }
  else
  {
    /** Processo padre, può tornare nel normale ciclo **/
    return;
  }

qui c'è un elenco di link
http://www.php.net/socket_create
http://www.php.net/socket_bind
http://www.php.net/socket_listen
http://www.php.net/socket_set_option
http://www.php.net/socket_set_nonblock
http://www.php.net/socket_accept
http://www.php.net/socket_read
http://www.php.net/socket_write
http://www.php.net/pcntl_fork
http://www.php.net/win32_start_service_ctrl_dispatcher
http://www.php.net/win32_get_last_control_message()

Studiati SOPRATTUTTO il funzionamento della funzione pcntl_fork! Inoltre c'è da vedere se può lavorare bene con la gestione dei servizi di windows perché li lavorano con i thread

Detto questo, se dovesserò esserci problemi con i servizi, ti basta scartare i servizi di windows e, non ricordo dove sta sul web, usi un servizio che non fa altro che avviare un processo, in questo caso lo script php.
Deve per forza essere un servizio perché essendo su un dedicato non può essere altro

Inoltre se scrivi questo servizio, o pseudo-tale, puoi anche implementare altre funzionalità di controllo e statisitche. Usando la funzione w32api dovresti essere in grado di definire "l'affinità" di un processo su un dato processore ed in questo modo usando le librerie di statistica sui processi e sul carico della macchina puoi decidere dove mettere il tutto