php是否合适做socket

iranw 发布于 2012/09/10 14:56
阅读 14K+
收藏 1

开源之夏第三届火热来袭,高校学生参与赢万元奖金!>>>

做一个网页聊天室(irc服务器)

php的socket是否可以胜任?ajax方法除外

如果php 的socket可以做 他可以支持多大的链接呢

加载中
4
domr
domr

php 做socket没有问题,看下http://www.workerman.net,它是用php socket 写的一个服务器,性能很强悍


0
helloworld_go
helloworld_go
不适合。
iranw
iranw
有同感 老板如此需求 无奈中......
0
helloworld_go
helloworld_go
<?php

    $port
= 9050 ;
   
   
// create a streaming socket, of type TCP/IP
   
$sock = socket_create ( AF_INET , SOCK_STREAM , SOL_TCP );
   
   
// set the option to reuse the port
   
socket_set_option ( $sock , SOL_SOCKET , SO_REUSEADDR , 1 );
   
   
// "bind" the socket to the address to "localhost", on port $port
    // so this means that all connections on this port are now our resposibility to send/recv data, disconnect, etc..
   
socket_bind ( $sock , 0 , $port );
   
   
// start listen for connections
   
socket_listen ( $sock );

   
// create a list of all the clients that will be connected to us..
    // add the listening socket to this list
   
$clients = array( $sock );
   
    while (
true ) {
       
// create a copy, so $clients doesn't get modified by socket_select()
       
$read = $clients ;
       
       
// get a list of all the clients that have data to be read from
        // if there are no clients with data, go to next iteration
       
if ( socket_select ( $read , $write = NULL , $except = NULL , 0 ) < 1 )
            continue;
       
       
// check if there is a client trying to connect
       
if ( in_array ( $sock , $read )) {
           
// accept the client, and add him to the $clients array
           
$clients [] = $newsock = socket_accept ( $sock );
           
           
// send the client a welcome message
           
socket_write ( $newsock , "no noobs, but ill make an exception :)\n" .
           
"There are " .( count ( $clients ) - 1 ). " client(s) connected to the server\n" );
           
           
socket_getpeername ( $newsock , $ip );
            echo
"New client connected: { $ip } \n" ;
           
           
// remove the listening socket from the clients-with-data array
           
$key = array_search ( $sock , $read );
            unset(
$read [ $key ]);
        }
       
       
// loop through all the clients that have data to read from
       
foreach ( $read as $read_sock ) {
           
// read until newline or 1024 bytes
            // socket_read while show errors when the client is disconnected, so silence the error messages
           
$data = @ socket_read ( $read_sock , 1024 , PHP_NORMAL_READ );
           
           
// check if the client is disconnected
           
if ( $data === false ) {
               
// remove client for $clients array
               
$key = array_search ( $read_sock , $clients );
                unset(
$clients [ $key ]);
                echo
"client disconnected.\n" ;
               
// continue to the next client to read from, if any
               
continue;
            }
           
           
// trim off the trailing/beginning white spaces
           
$data = trim ( $data );
           
           
// check if there is any data after trimming off the spaces
           
if (!empty( $data )) {
           
               
// send this to all the clients in the $clients array (except the first one, which is a listening socket)
               
foreach ( $clients as $send_sock ) {
               
                   
// if its the listening sock or the client that we got the message from, go to the next one in the list
                   
if ( $send_sock == $sock || $send_sock == $read_sock )
                        continue;
                   
                   
// write the message to the client -- add a newline character to the end of the message
                   
socket_write ( $send_sock , $data . "\n" );
                   
                }
// end of broadcast foreach
               
           
}
           
        }
// end of reading foreach
   
}

   
// close the listening socket
   
socket_close ( $sock );
?>
0
傅小黑
傅小黑
不适合。。。经常莫名其妙的就断了
燕玉苗
燕玉苗
把套接字通信写在死循环中,并且要判断套接字是否断开,断开要重新连接 while(TRUE){ }
傅小黑
傅小黑
@iranw 代替的方法只能轮询了
iranw
iranw
php就不是主要做socket开发的 老板莫名其妙的需求 抓狂.......
0
Michael_Yuan
Michael_Yuan
靠,不小心憋了一眼楼主的代码,才发现,原来PHP和C的SOCKET部分惊人的相似。
justjavac
justjavac
露怯了。大部分语言的函数都是C一致。网络、操作系统、数据库……的接口都是c style的。 如果你用c连接过mysql的,函数都是一样的。
hmly
hmly
php本来就是和c一样使用相同的套接字接口,只不过封闭了一下。
0
nnnm
nnnm
可以做的。只是问题会相对多些。如前面所言会偶尔断开。与操作系统也有关。记得最终用的SUSE的服务器版本。如果可能可以借助其实语言实现SOCKET,之后PHP使用数据。如果,必须要用这种方式,只能是做好监控及应急办法。
iranw
iranw
就因为问题多 所以和忌讳用php 的socket 打算用python做
0
yak
yak
php适合拼字符串
0
酒逍遥
酒逍遥

php 可以写 socket服务器...不过确实不适合..

网页聊天应该没什么太大问题的..单进程 撑个千把人肯定没问题..

不过php因为是阻塞式的..而且只能单线程 去处理.. 所以当有类似 有N个人同时向另外几千人

同时广播消息时,延迟可能会非常大..

单纯单用户对单用户的聊天应问题不大的

0
蟋蟀哥哥
蟋蟀哥哥
php的socket不适合。。。
iranw
iranw
+1
0
yak
yak

用ab压localhost   -n 10000 -c 200

php5.4(select)    Requests per second:    2.91 [#/sec] (mean)

nodejs v0.8.8    Requests per second:    5935.41 [#/sec] (mean)

yak
yak
test.php <?php use Swoole\Network\Protocol\AppServer; require('vendor/autoload.php'); $AppSvr = new AppServer(); PHP Warning: require_once(LIBPATH/function/cli.php): failed to open stream
matyhtf
matyhtf
和swoole扩展对比做下压力测试吧,
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部