2010-07-31 4 views
0

나중에 다른 응용 프로그램과 함께 사용할 수 있도록 PHP에서 Windows 용 inetd와 유사한 서비스를 만들려고합니다.PHP 소켓 및 proc_open

그래서 내가 생각할 수있는 것은 Steam Server와 proc_open을 사용하여 스트림을 프로세스 (inetd)에 직접 파이프하는 것입니다. Windows에서는 pcntl_fork()가 없으므로 PHP는 스레딩을 지원하지 않습니다.

여기까지 내 코드가 있습니다. inetdtest 프로그램은 단일 printf (C로 작성)이있는 간단한 프로그램입니다. 하지만 문제는 내가 netcat을 통해 내 서버에 연결할 때 응답 메시지가 없다는 것입니다. 이 (cat 프로그램으로 리눅스에 사용) 여기의 약자로

<?php 
define ('SERVICE_COMMAND', 'inetdtest'); 
define ('SERVICE_PORT', 35123); 

function main() { 
    echo "Simple inetd starting...\n"; 
    $socket = stream_socket_server('tcp://0.0.0.0:' . SERVICE_PORT, $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN); 


    if ($socket === false) { 
     echo "Can't bind to service port.\n"; 
     echo "[$errno] $errstr"; 
     die(1); 
    } 
    $processes = array(); 
    while (true) { 
     $current = @stream_socket_accept($socket, 5, $host); 
     if ($current !== false) { 
      echo 'Incomming connection from client ' . $host . "\n"; 
      echo "Lunching child process... "; 

      $io = array(
       0 => $current, 
       1 => $current, 
       2 => array('file', 'stderr.log', 'a') 
      ); 

      $proc = proc_open(SERVICE_COMMAND, $io, $pipes, NULL, NULL, array('bypass_shell')); 
      $status = proc_get_status($proc); 
      echo " DONE! PID : {$status['pid']}\n"; 
      $processes[] = array($current, $proc); 
     } 
     foreach ($processes as $k=>$v) { 
      $status = proc_get_status($v[1]); 
      if (false === $status['running']) { 
       echo "Finalizing process {$status['pid']}... "; 
       fflush($v[0]); 
       fclose($v[0]); 
       proc_close($v[1]); 
       unset($processes[$k]); 
       echo "DONE!\n"; 
      } 
     } 
    } 
} 
main(); 

답변

1

코드는 작품을 justs, 그래서 문제는 사물의 창 측의 어딘가에 자리 잡고 있습니다.

는 한 가지, 당신이 전달하는 옵션, 쉘을 우회하는 경우,이 이미 일을 해결할 수

array('bypass_shell'=>true) 

로 제공한다. 이 부분의 까다로운 부분은 소켓 fd를 프로세스에 전달한다는 것입니다. 프로세스를 제대로 처리 할 수도 있고 그렇지 않을 수도 있습니다. 나는 이런 것들이 창문에서 어떻게 이루어질 지 모르지만 방정식에서 cmd을 자르면 도움이 될뿐입니다.

여전히 작동하지 않는다면 네트워크 또는 하위 프로세스에서 데이터를 기다리고 네트워크 소켓에서 프로세스 파이프로 데이터를 보내거나 그 반대로 루프를 생성해야합니다.