本文实例讲述了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)
{
//這邊我們採用pooling的方式去取得資料
$NoRecvData=false; //這個變數用來判別外部的連線是否有讀到資料
$NoRemoteRecvData=false;//這個變數用來判別VNC連線是否有讀到資料
@$RecvData=socket_read($ServerSocket,4096,PHP_BINARY_READ);
//從外部連線讀取4096 bytes的資料
@$RemoteRecvData=socket_read($RemoteSocket,4096,PHP_BINARY_READ);
//從vnc連線連線讀取4096 bytes的資料
if($RemoteRecvData==='')
{
//VNC連線中斷,該結束嘍
echo"Remote Connection Close\n";
return;
}
if($RemoteRecvData===false)
{
/*
由於我們是採用nonblobk模式
這裡的情況就是vnc連線沒有可供讀取的資料
*/
$NoRemoteRecvData=true;
//清除掉Last Errror
socket_clear_error($RemoteSocket);
}
if($RecvData==='')
{
//外部連線中斷,該結束嘍
echo"Client Connection Close\n";
return;
}
if($RecvData===false)
{
/*
由於我們是採用nonblobk模式
這裡的情況就是外部連線沒有可供讀取的資料
*/
$NoRecvData=true;
//清除掉Last Errror
socket_clear_error($ServerSocket);
}
if($NoRecvData&&$NoRemoteRecvData)
{
//如果外部連線以及VNC連線都沒有資料可以讀取時,
//就讓程式睡個0.1秒,避免長期佔用CPU資源
usleep(100000);
//睡醒後,繼續作pooling的動作讀取socket
continue;
}
//Recv Data
if(!$NoRecvData)
{
//外部連線讀取到資料
while(true)
{
//把外部連線讀到的資料,轉送到VNC連線上
@$WriteLen=socket_write($RemoteSocket,$RecvData);
if($WriteLen===false)
{
//由於網路傳輸的問題,目前暫時無法寫入資料
//先睡個0.1秒再繼續嘗試。
usleep(100000);
continue;
}
if($WriteLen===0)
{
//遠端連線中斷,程式該結束了
echo"Remote Write Connection Close\n";
return;
}
//從外部連線讀取的資料,已經完全送給VNC連線時,中斷這個迴圈。
if($WriteLen==strlen($RecvData)) break;
//如果資料一次送不完就得拆成好幾次傳送,直到所有的資料全部送出為止
$RecvData=substr($RecvData,$WriteLen);
}
}
if(!$NoRemoteRecvData)
{
//這邊是從VNC連線讀取到的資料,再轉送回外部的連線
//原理跟上面差不多不再贅述
while(true)
{
@$WriteLen=socket_write($ServerSocket,$RemoteRecvData);
if($WriteLen===false)
{
usleep(100000);
continue;
}
if($WriteLen===0)
{
echo"Remote Write Connection Close\n";
return;
}
if($WriteLen==strlen($RemoteRecvData)) break;
$RemoteRecvData=substr($RemoteRecvData,$WriteLen);
}
}
}
}
function DestroySocket(){
//用來關閉已經開啟的Socket
global$ServerSocket,$RemoteSocket;
if($RemoteSocket)
{
//如果已經開啟VNC連線
//在Close Socket前必須將Socket shutdown不然對方不知到你已經關閉連線了
@socket_shutdown($RemoteSocket,2);
socket_clear_error($RemoteSocket);
//關閉Socket
socket_close($RemoteSocket);
}
//關閉外部的連線
@socket_shutdown($ServerSocket,2);
socket_clear_error($ServerSocket);
socket_close($ServerSocket);
}
//這裡是整個程式的開頭,程式從這邊開始執行
//這裡首先執行一次fork
$PID=pcntl_fork();
if($PID==-1) die("could not fork");
//如果$PID不為0表示這是Parrent Process
//$PID就是Child Process
//這是Parrent Process 自己結束掉,讓Child成為一個Daemon。
if($PID) die("Daemon PID:$PID\n");
//從這邊開始,就是Daemon模式在執行了
//將目前的Process跟終端機脫離成為daemon模式
if(!posix_setsid()) die("could not detach from terminal\n");
//設定daemon 的訊息處理函數
declare(ticks = 1);
if(!pcntl_signal(SIGTERM, "SignalFunction")) die("Error!!!\n");
if(!pcntl_signal(SIGTRAP, "SignalFunction")) die("Error!!!\n");
if(!pcntl_signal(SIGCHLD, "SignalFunction")) die("Error!!!\n");
//建立外部連線的Socket
$ServerSocket=socket_create(AF_INET, SOCK_STREAM,SOL_TCP);
//設定外部連線監聽的IP以及Port,IP欄位設0,表示經聽所有介面的IP
if(!socket_bind($ServerSocket,0,$ServerPort)) die("Cannot Bind Socket!\n");
//開始監聽Port
if(!socket_listen($ServerSocket)) die("Cannot Listen!\n");
//將Socket設為nonblock模式
if(!socket_set_nonblock($ServerSocket)) die("Cannot Set Server Socket to Block!\n");
//清空$PID變數,表示目前沒有任何的Child Process
unset($PID);
while(true)
{
//進入pooling模式,每隔1秒鐘就去檢查有沒有連線進來。
sleep(1);
//檢查有沒有連線進來
@$ConnectedServerSocket=socket_accept($ServerSocket);
if($ConnectedServerSocket!==false)
{
//有人連進來嘍
//起始一個Child Process用來處理連線
$PID=pcntl_fork();
if($PID==-1) die("could not fork");
if($PID) continue;//這是daemon process,繼續回去監聽。
//這裡是Child Process開始
//執行Socket裡函數
ProcessSocket($ConnectedServerSocket);
//處理完Socket後,結束掉Socket
DestroySocket();
//結束Child Process
exit(0);
}
}
希望本文所述对大家的php程序设计有所帮助。

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Dreamweaver Mac版
Alat pembangunan web visual

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

SublimeText3 versi Inggeris
Disyorkan: Versi Win, menyokong gesaan kod!

DVWA
Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini
