나중에 다른 응용 프로그램과 함께 사용할 수 있도록 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();