单进程版
<?php
$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_bind($socket,'127.0.0.1',9091) or die("error");
socket_listen($socket,5);//开机
while(true)
{
$client=socket_accept($socket);//有人电话进入
//子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
$buf=socket_read($client,1024);
echo $buf; // 客户端请求头
$html="HTTP/1.1 200 OK".PHP_EOL
."Content-type:text/html;charset=utf-8".PHP_EOL.PHP_EOL;
if(preg_match("/sleep/i",$buf))
{
sleep(10);
socket_write($client,$html);
socket_write($client,"this is server.休克了10秒,模拟很繁忙的样纸");
}
else
{
socket_write($client,$html);
socket_write($client,"this is server");
}
socket_close($client);//关掉 客户端socket
}
socket_close($socket);//关机
直接在浏览器输入地址访问就行了
多进程版
<?php
$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_bind($socket,'0.0.0.0',9091) or die("error");
socket_listen($socket,5);//开机
while(true)
{
$client=socket_accept($socket);//有人电话进入
$pid = pcntl_fork();
//父进程和子进程都会执行下面代码
if ($pid == -1) {
//错误处理:创建子进程失败时返回-1.
die('could not fork');
} else if ($pid) {
socket_close($client);
//父进程会得到子进程号,所以这里是父进程执行的逻辑
//pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。
} else {
//子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
$buf=socket_read($client,1024);
echo $buf;
$html="HTTP/1.1 200 OK".PHP_EOL
."Content-type:text/html;charset=utf-8".PHP_EOL.PHP_EOL;
if(preg_match("/sleep/i",$buf))
{
sleep(10);
socket_write($client,"this is server.休克了10秒,模拟很繁忙的样纸");
}
else
{
socket_write($client,$html);
socket_write($client,"this is server");
}
socket_close($client);//关掉 客户端socket
}
}
socket_close($socket);//关机
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
ps -ef | grep socket | wc -l
多进程版改良版
<?php
$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_bind($socket,'0.0.0.0',9091) or die("error");
socket_listen($socket,5);//开机
$child=0;
while(true)
{
$client=socket_accept($socket);//有人电话进入
$pid = pcntl_fork();
//父进程和子进程都会执行下面代码
if ($pid == -1) {
//错误处理:创建子进程失败时返回-1.
die('could not fork');
} else if ($pid) {
socket_close($client);
//父进程会得到子进程号,所以这里是父进程执行的逻辑
// pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。
$child++;
if($child>=3)
{
pcntl_wait($status);
$child--;
}
} else {
//子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
$buf=socket_read($client,1024);
echo $buf;
$html="HTTP/1.1 200 OK".PHP_EOL
."Content-type:text/html;charset=utf-8".PHP_EOL.PHP_EOL;
if(preg_match("/sleep/i",$buf))
{
sleep(10);
socket_write($client,$html);
socket_write($client,"this is server.休克了10秒,模拟很繁忙的样纸");
}
else
{
socket_write($client,$html);
socket_write($client,"this is server");
}
socket_close($client);//关掉 客户端socket
exit;
}
}
socket_close($socket);//关机