目前使用的socket传输原理Demo #!/usr/bin/php <?php define("SEPARATOR", "|=+=|");//used for explode filename and contents //client $filename = "data"; $fp = fsockopen("127.0.0.1", 20000, $errno, $errstr, 30); if (!$fp) { echo "$errstr ($errno)<br />/n"; } else { fwrite($fp, $filename.SEPARATOR); $out = file_get_contents($filename);//read data in once fwrite($fp, $out); } fclose($fp); ?> #!/usr/bin/php <?php define("SEPARATOR", "|=+=|");//used for explode filename and contents define("APP_RECV_PACK_SIZE", 1024*10); //server $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_bind($socket, '127.0.0.1', 20000); socket_listen($socket); $path = "/home/linvo/socket_copy/"; while (true) { $connection = socket_accept($socket); if($connection) { $timer = new timer(); $timer->start(); $buffer = ''; $begin = TRUE; while(socket_recv($connection, $buffer, APP_RECV_PACK_SIZE, 0)) { if ($begin) { $msg = explode(SEPARATOR, $buffer); $file_name = $msg[0]; $file_head = $msg[1]; $file_addr = $path . $file_name . ".bak"; $fp = fopen($file_addr, "wb"); //create new file if (!$fp) { echo "Create file error!/n"; break; } else { fwrite($fp, $file_head); //begin to write } $begin = FALSE; continue; } //write the remaining data with loop fwrite($fp, $buffer); } $timer->stop(); echo $timer->spent()."/n"; fclose($fp); socket_close($connection); } } socket_close($socket); ?> 这几天一直在解决文件调度时候出现的种种问题:包括文件完整性、批量调度时的效率、监控事件粒度、高频率调度时频繁失败等问题,以及一些其他bug的修正。