本文实例讲述了php开启多进程的方法。分享给大家供大家参考。具体实现方法如下:
代码如下:
<?php
$IP='192.168.1.1';//Windows電腦的IP
$Port='5900'; //VNC使用的Port
$ServerPort='9999';//Linux Server對外使用的Port
$RemoteSocket=false;//連線到VNC的Socket
function SignalFunction($Signal){
//這是主Process的訊息處理函數
global $PID;//Child Process的PID
switch ($Signal)
{
case SIGTRAP:
case SIGTERM:
//收到結束程式的Signal
if($PID)
{
//送一個SIGTERM的訊號給Child告訴他趕快結束掉嘍
posix_kill($PID,SIGTERM);
//等待Child Process結束,避免zombie
pcntl_wait($Status);
}
//關閉主Process開啟的Socket
DestroySocket();
exit(0); //結束主Process
break;
case SIGCHLD:
/*
當Child Process結束掉時,Child會送一個SIGCHLD訊號給Parrent
當Parrent收到SIGCHLD,就知道Child Process已經結束嘍 ,該做一些
結束的動作*/
unset($PID); //將$PID清空,表示Child Process已經結束
pcntl_wait($Status); //避免Zombie
break;
default:
}
}
function ChildSignalFunction($Signal){
//這是Child Process的訊息處理函數
switch ($Signal)
{
case SIGTRAP:
case SIGTERM:
//Child Process收到結束的訊息
DestroySocket(); //關閉Socket
exit(0); //結束Child Process
default:
}
}
function ProcessSocket($ConnectedServerSocket){
//Child Process Socket處理函數
//$ConnectedServerSocket -> 外部連進來的Socket
global $ServerSocket,$RemoteSocket,$IP,$Port;
$ServerSocket=$ConnectedServerSocket;
declare(ticks = 1); //這一行一定要加,不然沒辦法設定訊息處理函數。
//設定訊息處理函數
if(!pcntl_signal(SIGTERM, "ChildSignalFunction")) return;
if(!pcntl_signal(SIGTRAP, "ChildSignalFunction")) return;
//建立一個連線到VNC的Socket
$RemoteSocket=socket_create(AF_INET, SOCK_STREAM,SOL_TCP);
//連線到內部的VNC
@$RemoteConnected=socket_connect($RemoteSocket,$IP,$Port);
if(!$RemoteConnected) return; //無法連線到VNC 結束
//將Socket的處理設為Nonblock,避免程式被Block住
if(!socket_set_nonblock($RemoteSocket)) return;
if(!socket_set_nonblock($ServerSocket)) return;
while(true)
新闻热点
疑难解答