`
matyhtf
  • 浏览: 82860 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

PHP写的异步高并发服务器,基于libevent

    博客分类:
  • PHP
阅读更多

本文章于2013年11月修改。

swoole已使用C重写作为PHP扩展来运行。项目地址:https://github.com/matyhtf/swoole

swoole提供了PHP的高性能Server,异步IO,AsyncMySQL等特性。

 

原PHP代码框架迁移至https://github.com/matyhtf/swoole_framework。保留原有代码和web框架。

--------------------------------------------------------------------------------------------------

 

Swoole Socket网络开发框架,是基于php的libevent和pcntl模块的,并且只能用于Linux/Unix系统下。请先启用pcntl,安装libevent扩展。

pcntl:PHP核心模块已包含了pcntl,只需在编译时加入--enable-pcntl即可,当然也可以用extension扩展

libevent:http://pecl.php.net/package/libevent

编写的类需要继承自TCPServer类,在SwooleSocket包中。目前只提供了单进程异步事件模型,适合用于IO耗时较少的网络服务器程序,比如聊天室。多进程异步模型,多进程同步模型,会在近期提供。基类的代码,请从http://code.google.com/p/swoole/检出

 

<?php
require 'TCPServer.php';

class MyServer extends TCPServer
{
    function onRecive($client_id,$data)
    {
        $data = trim($data);
		if($data=="quit")
		{
			$this->close($client_id);
			return true;
		}
		elseif($data=='shutdown')
		{
		    $this->shutdown();
		}
		else
		{
		    $client_socket_name =  stream_socket_get_name($this->client_sock[$client_id],true);
    		echo "Server send response data to client $client_socket_name\n";
    		$send = date('Y-m-d H:i:s')."$client_socket_name said:$data\n";
    		$this->sendAll($client_id,$send);
		}
    }
    /**
     * 发送到所有客户端
     * @param $data
     * @return unknown_type
     */
	function sendAll($client_id,$data)
	{
	    foreach($this->client_sock as $k=>$sock)
	    {
	        if($k==$client_id) continue;
	        fwrite($sock,$data);
	    }
	}
    /**
     * 发送到某个客户端
     * @param $client_id
     * @param $data
     * @return unknown_type
     */
	function sendTo($client_id,$data)
	{
	    fwrite($this->client_sock[$client_id],$data);
	}

    function onStart()
    {
        echo "Server in running!\n";
    }

    function onConnect($client_id)
    {
        $this->sendAll($client_id,"Client $client_id is connected!\n");
    }

    function onClose($client_id)
    {
        $this->sendAll($client_id,"Client $client_id is closed!\n");
    }

    function onShutdown()
    {
        echo "Server in stop!\n";
    }
}

$server = new MyServer('0.0.0.0',8005);
$server->run();

 

 

客户端程序

 

 

<?php
class Stdio
{
    static $in;
    static $out;
    static $buffer_size = 1024;

    static function input($h='')
    {
        if(!self::$in) self::$in = fopen('php://stdin','r');
        if($h) self::output($h);
        return trim(fread(self::$in,self::$buffer_size));
    }
    static function output($string)
    {
        if(!self::$out) self::$out = fopen('php://stdout','w');
        return fwrite(self::$out,$string);
    }
}

$fp = stream_socket_client('tcp://127.0.0.1:8005',$errno, $errstr);
$socket = serialize($fp);
if(!$fp)
{
    echo "ERROR: $errno - $errstr<br />\n";
}
else
{
    $pid = pcntl_fork();
    if($pid==-1)
    {
        exit("fork fail!\n");
    }
    //child
    elseif($pid==0)
    {
        var_dump($socket);
        $fp2 = unserialize($socket);
        while(!feof($fp2))
        {
            Stdio::output(fgets($fp2, 1024));
        }
    }
    //parent
    else
    {
        while($string!=="quit")
        {
            if(!is_writable($fp)) break;
            $string = Stdio::input("qq#");
            fwrite($fp,$string);
        }
        posix_kill($pid, 9);
    }
    fclose($fp);
}

php tcpserver.php 运行服务器程序

php tcpclient.php 运行客户端程序,客户端有2个进程,主进程负责接收输入信息,发送到网络。另一个进程,接收网络信息,显示在屏幕上。

分享到:
评论

相关推荐

    linux memcache和libevent安装包

    Memcached与Libevent结合使用,可以构建出高并发、低延迟的Web服务。例如,一个基于Libevent的服务器可以监听客户端的请求,当请求到达时,服务器从Memcached中快速获取数据,然后返回给客户端,从而避免了直接查询...

    安装 libevent

    对于PHP开发者而言,使用`libevent`可以通过扩展来实现异步IO操作,从而提升应用程序的性能。本文将详细介绍如何在系统上安装`libevent`库及其PHP扩展。 #### 二、安装libevent **步骤1:下载libevent** 首先,...

    libevent-1.4.11-stable.tar.gz

    - PHP在处理高并发网络请求时,可以利用libevent实现异步非阻塞I/O,提升性能。例如,通过pecl扩展libevent到PHP中,创建事件基础结构,监听socket事件。 - 使用`libevent_event_new`创建事件,`libevent_event_...

    基于PHP的Workerman 高性能的PHP socket 服务器框架.zip

    Workerman是一款基于PHP开发的高性能、高并发的TCP/UDP/HTTP服务器框架,适用于构建长期运行的服务,如WebSocket服务、TCP服务、HTTP服务等。它为PHP开发者提供了一个无需依赖其他运行环境(如Apache或Nginx)就能...

    4种PHP异步执行的常用方式.除了ajax,你还知道几种异步调用方式?

    ReactPHP是一个基于libevent和libev的PHP异步I/O库,可以构建非阻塞的网络应用。通过EventLoop,你可以监听各种事件,包括网络连接、文件描述符等,实现异步处理。 总的来说,PHP异步执行的方法多种多样,具体选择...

    基于PHP的Workerman高性能的PHPsocket服务器框架源码.zip

    《深入理解基于PHP的Workerman高性能PHP Socket服务器框架》 在现代互联网开发中,服务器性能是决定应用响应速度和用户体验的关键因素之一。PHP作为一种广泛使用的脚本语言,一直以来以其便捷性和灵活性深受开发者...

    libevent-2.1.8 + event-2.3.0.zip

    PHP的libevent扩展使得PHP可以直接调用libevent的接口,实现非阻塞I/O和异步处理。这在开发WebSocket服务器、长连接服务等高并发场景下非常有用。 2. PHP7与event库的结合: event扩展为PHP7提供了与event库交互...

    2014PHP 异步并行编程_韩天峰(PHPCONCHINA2014)

    - **传统PHP的限制**:传统的PHP基于同步模型运行,每个HTTP请求都需要等待前一个请求完成后才能继续执行,这导致了在高并发场景下的性能瓶颈。 - **异步编程的概念**:异步编程允许程序在等待某些操作(如数据库...

    php一对多之socket通信 基于pecl的event库(linux需要安装libevent开发库).zip

    在PHP中实现一对多的socket通信,通常会涉及到网络编程和并发处理,这对于构建服务器端应用,特别是需要处理大量客户端连接的应用来说至...结合libevent的底层性能优化,这样的解决方案特别适合高并发的网络服务场景。

    libevent-release-2.0.22-stable

    libevent 的核心在于其事件模型,它允许开发者编写非阻塞的、高并发的网络服务器。这种事件驱动的编程方式使得程序能够高效地处理大量并发连接,而无需为每个连接创建独立的线程或进程。通过注册事件处理器,...

    Linux下编译安装php libevent扩展实例

    libevent提供了多种事件机制,如epoll、kqueue等,可以高效地处理大量并发连接,非常适合构建高并发的网络服务器。在PHP中结合libevent,开发者可以轻松实现异步非阻塞I/O,提高服务器的吞吐量和响应速度。

    异步 Web 框架.zip

    异步Web框架是一种用于构建高性能、高并发网络应用的编程模型。在传统的Web框架中,服务器通常采用同步I/O处理模式,即每个请求都会阻塞一个线程,直到响应完成。这种方式在面对高并发场景时,可能会导致大量线程被...

    PHP扩展swoole,PHP7及以上版本可用

    1. **异步非阻塞I/O**:Swoole利用epoll(Linux)和kqueue(FreeBSD)等事件驱动模型,实现I/O操作的异步非阻塞,提高了服务器处理高并发请求的能力。 2. **协程(Coroutine)**:Swoole在PHP7中引入了协程支持,...

    基于apache的网络通信模型

    它基于libevent库,利用异步非阻塞I/O来提高服务器性能,尤其适合处理大量并发连接。Zevent通过监听套接字上的事件,例如连接请求、数据读写、连接关闭等,只在有实际活动时唤醒工作线程,降低了CPU的空转率。 在...

    workerman视图文件模板源码.rar

    它采用事件驱动、异步非阻塞的方式处理请求,基于libevent或libuv库,能够充分利用多核CPU资源,实现高并发处理。Workerman支持TCP、UDP和HTTP等多种协议,并且可以自定义协议,这使得它非常灵活,可以适应各种服务...

    php.rar_The Process

    在实际应用中,理解并熟练掌握这些概念和技术,可以有效地利用PHP处理复杂的Web服务场景,特别是在高并发和高性能需求的项目中。通过合理地设计进程间的协作模式,可以提高系统的响应速度和资源利用率,为用户提供更...

    workman开源高性能的PHP socket 服务框架

    1. **异步非阻塞**:Workerman采用事件驱动模型,基于libevent库(或它的PHP封装pecl-event扩展)实现异步非阻塞I/O,能够处理大量并发连接,提高系统的吞吐量。 2. **多进程/线程模型**:Workerman支持多进程和多...

    symfony-react-server:[不推荐使用]在ReactPHP之上构建的Symfony异步服务器

    在Web开发中,ReactPHP常被用来创建实时、高并发的服务器端应用。 Symfony是一个流行的PHP框架,主要用于构建复杂的企业级Web应用。它提供了一整套工具和服务,包括依赖注入、路由、模板引擎、安全管理和ORM等,以...

    workerman源码解压包

    Workerman提供了进程管理、任务调度、并发处理等功能,使得PHP可以处理高并发的网络请求,不再局限于Web应用。 2. **事件驱动与异步编程**:Workerman基于事件驱动模型,采用libevent或ReactPHP等库来实现异步I/O...

    workman编写的聊天室PHP前端源码

    由于它使用了libevent和Epoll事件模型,因此在处理大量并发连接时表现出色,尤其适合构建高并发的网络服务。 2. **PHP异步编程**: PHP传统上是一种同步编程语言,但Workerman引入了异步编程的概念,通过非阻塞I/O...

Global site tag (gtag.js) - Google Analytics