精华内容
下载资源
问答
  • 并且一个进程能处理N个连接后,在多fork几个这样的子进程,那是不是就能突破进程限制呢?没错,只有你内存够大,CPU处理能力没问题,就能达到有多少个文件描述符(fd)就能保持多少个连接!(文...

    引入
    上一篇博文中的预派生子进程模式的服务器虽然能解决一定程度的并发,但是太依赖进程的数量了,实际运行中一个进程只能处理一个连接,那有没有办法能让一个进程能同时处理很多个(最好理论上能处理无限个)连接呢?并且一个进程能处理N个连接后,在多fork几个这样的子进程,那是不是就能突破进程的限制呢?没错,只有你内存够大,CPU处理能力没问题,就能达到有多少个文件描述符(fd)就能保持多少个连接!(文件描述符是一个自增数字,范围是1 ~ 1600万,fd超过1600万后会自动从1开始进行复用)

    知识预备
    什么是IO复用
    Linux中select的原理
    PHP调用linux的select函数

    要点解析
    要点1:怎么实现进程复用?
    要实现进程复用IO就得让这个进程找到多个连接,即便处理响应的地方阻塞了(程序要执行逻辑,绝大部分都要等待处理结果,阻塞是很正常的,如果需要处理比较耗时的任务就得到交给异步线程了),但是监听连接的地方不会阻塞,来一个连接,记录一个,然后利用linux的select机制去触发回调,这样一个进程不就能同时处理N个请求了吗?
    要点2:怎么判断是该服务端发送消息了还是有新的客户端连接进入了?
    这个就是上面知识预备中select的原理了,select会在linux系统中去监听,一旦发现socket可读,会从内核空间传递至用户空间,在用户空间通过逻辑判断是服务端socket可读,还是客户端的socket可读,逻辑是这样的,我们预先存储好服务端的socket连接信息,select遍历这些socket时就判断可读的socket是不是属于我们存储好的服务端socket,如果不是服务端的socket就说明是一个新的socket,新的socket从哪里来?别的地方来的,那就是客户端的socket,既然客户端的socket可读了,那我们就去读客户端的内容,进行自己的逻辑处理,然后做出相应;反过来,如果是服务端的socket可读了,说明有新的连接进来了,就与新进来的socket建立连接并监听。

    代码实现:

    <?php
    
    class Worker{
        //监听socket
        protected $socket = NULL;
        //连接事件回调
        public $onConnect = NULL;
        //接收消息事件回调
        public $onMessage = NULL;
        public $workerNum=4; //子进程个数
        public  $allSocket; //存放所有socket
    
        public function __construct($socket_address) {
            //监听地址+端口
            $this->socket=stream_socket_server($socket_address);
            stream_set_blocking($this->socket,0); //设置非阻塞
            $this->allSocket[(int)$this->socket]=$this->socket;
        }
        public function start() {
            //获取配置文件
            $this->fork();
        }
    
        public function fork(){
            $this->accept();//子进程负责接收客户端请求
        }
        public  function  accept(){
            //创建多个子进程阻塞接收服务端socket
            while (true){
                $write=$except=[];
                //需要监听socket
                $read=$this->allSocket;
                //状态谁改变
                stream_select($read,$write,$except,60);
    
                //怎么区分服务端跟客户端
                foreach ($read as $index=>$val){
                    //当前发生改变的是服务端,有连接进入
                    if($val === $this->socket){
                        $clientSocket=stream_socket_accept($this->socket); //阻塞监听
                        //触发事件的连接的回调
                        if(!empty($clientSocket) && is_callable($this->onConnect)){
                            call_user_func($this->onConnect,$clientSocket);
                        }
                        $this->allSocket[(int)$clientSocket]=$clientSocket;
                    }else{
                        //从连接当中读取客户端的内容
                        $buffer=fread($val,1024);
                        //如果数据为空,或者为false,不是资源类型
                        if(empty($buffer)){
                            if(feof($val) || !is_resource($val)){
                                //触发关闭事件
                                fclose($val);
                                unset($this->allSocket[(int)$val]);
                                continue;
                            }
                        }
                        //正常读取到数据,触发消息接收事件,响应内容
                        if(!empty($buffer) && is_callable($this->onMessage)){
                            call_user_func($this->onMessage,$val,$buffer);
                        }
                    }
                }
            }
    
        }
    
    }
    
    
    $worker = new Worker('tcp://0.0.0.0:9800');
    
    
    //连接事件
    $worker->onConnect = function ($fd) {
        //echo '连接事件触发',(int)$fd,PHP_EOL;
    };
    
    //消息接收
    $worker->onMessage = function ($conn, $message) {
        //事件回调当中写业务逻辑
        //var_dump($conn,$message);
        $content="我收到你的信息了";
        $http_resonse = "HTTP/1.1 200 OK\r\n";
        $http_resonse .= "Content-Type: text/html;charset=UTF-8\r\n";
        $http_resonse .= "Connection: keep-alive\r\n"; //连接保持
        $http_resonse .= "Server: php socket server\r\n";
        $http_resonse .= "Content-length: ".strlen($content)."\r\n\r\n";
        $http_resonse .= $content;
        fwrite($conn, $http_resonse);
    };
    
    $worker->start(); //启动
    

    测试
    运行
    在这里插入图片描述
    这次来波更多的,请求9W,并发1k(注意,系统还是1G运行内存,而且全是长连接,并且是单进程,可以比较上一篇博客的测试结果)
    在这里插入图片描述
    在这里插入图片描述
    完全没问题,一个进程的情况下,没用什么逻辑处理吞吐量就能达到了9W+

    但是这个模式的服务器依旧存在缺点:这个也是select机制的问题,因为select会遍历每一个socket,直到找到可读的那个,如果有100万socket,select需要做循环100万次,其中只有1次是命中的,剩下的99万9999次都是无效的,白白浪费了CPU资源;而且从linux的内核空间传递到我们php的用户空间的数据传递也会消耗资源的。

    展开全文
  •  还可以把后两种设计形式结合起来:用多个进程来实现,其中每个进程包含几个线程。在这种情况下,进程内部的线程之间可以通信,不同的进程之间也可以通信。  上面讲述了可以把完成给定任务所需的工作分到多个进程...
  • 几个简单的防御措施: 1. 修改ssh服务的默认端口 ssh服务的默认端口是22,一般的恶意用户也往往扫描或尝试连接22端口。所以第一步就是修改这个默认端口 打开/etc/ssh/sshd_config,找到 Port 22 然后将22修改为...

    网络上的服务器很容易受到攻击,最惨的就是被人登录并拿到root权限。有几个简单的防御措施:

    1. 修改ssh服务的默认端口

    ssh服务的默认端口是22,一般的恶意用户也往往扫描或尝试连接22端口。所以第一步就是修改这个默认端口
    打开/etc/ssh/sshd_config,找到
    Port 22
    然后将22修改为其它没有被占用的端口,如1022。最好在1-1024之间,防止与用户进程端口冲突。
    然后重启sshd即可
    sudo /etc/init.d/ssh restart

    2. 限制IP

    首先修改/etc/hosts.allow文件,将可访问服务器ssh服务的客户IP加入其中,格式如下
    sshd:192.168.1.0/255.255.255.0
    sshd: 202.114.23.45
    sshd: 211.67.67.89
    然后修改/etc/hosts.deny文件,加入禁用其它客户连接ssh服务
    sshd: ALL

    3.升级服务器

    矛与盾的故事永远没有结局,经常升级服务器是必备的
    apt-get update
    apt-get dist-upgrade

    4.检查登录日志

    不怕一万,就怕万一,没有攻不破的城堡,有些小偷可能是小白,或者来也匆匆,去也匆匆,在服务器上做完坏事没有擦除痕迹,所以经常检查登录日志,也是一种安全手段
    more /var/log/secure // 新版的Ubuntu都没有这个文件了
    who /var/log/wtmp

    干了些什么?
    root账户下输入su - username
    切换到username下输入
    history
    能看到这个用户历史命令,默认最近的1000条

    5、在终端中查看日志

    dmesg的命令显示Linux内核的消息缓冲器,其被存储在存储器中。运行这个命令,你会得到很多的输出。
    要过滤此输出并搜索你感兴趣的消息,你可以将使用管道grep:

    dmesg | grep something
    你还可以将dmesg命令的输出管道用less,这样可以按照你自己的速度滚动浏览消息。要退出less,请按Q。

    dmesg | less

    如果一个grep搜索产生大量的结果,你可以将其输出管道用less:
    dmesg | grep something | less
    除了在任何文本编辑器中打开位于/var/log中的日志文件之外,还可以使用cat命令将日志(或任何其他文件)的内容打印到终端:

    cat /var/log/syslog
    像上面的dmesg命令一样,这将产生大量的输出。你可以使用grep和less命令来处理输出:

    grep something /var/log/syslog
    less /var/log/syslog
    其他有用的命令包括头和尾命令。头打印文件中的前n行,而尾部打印文件中的最后n行,如果要查看最近的日志消息,则tail命令特别有用。

    head -n 10 /var/log/syslog
    tail -n 10 /var/log/syslog

    某些应用程序可能不会写入系统日志,并且可能会产生自己的日志文件,你可以使用相同的方式进行操作,通常也可以在/var/log目录中找到它们。例如,Apache Web服务器创建一个包含其日志的/var/log/apache2目录。

    6、常用日志目录代表的意思

    => /var/log/messages:常规日志消息
    => /var/log/boot:系统启动日志
    => /var/log/debug:调试日志消息
    => /var/log/auth.log:用户登录和身份验证日志
    => /var/log/daemon.log:运行squid,ntpd等其他日志消息到这个文件
    => /var/log/dmesg:Linux内核环缓存日志
    => /var/log/dpkg.log:所有二进制包日志都包括程序包安装和其他信息
    => /var/log/faillog:用户登录日志文件失败
    => /var/log/kern.log:内核日志文件
    => /var/log/lpr.log:打印机日志文件
    => /var/log/mail.:所有邮件服务器消息日志文件
    => /var/log/mysql.
    :MySQL服务器日志文件
    => /var/log/user.log:所有用户级日志
    => /var/log/xorg.0.log:X.org日志文件
    => /var/log/apache2/:Apache Web服务器日志文件目录
    => /var/log/lighttpd/
    :Lighttpd Web服务器日志文件目录
    => /var/log/fsck/*:fsck命令日志
    => /var/log/apport.log:应用程序崩溃报告/日志文件
    => /var/log/syslog:系统日志
    => /var/log/ufw:ufw防火墙日志
    => /var/log/gufw:gufw防火墙日志

    使用tail,more,less和grep命令。

    tail -f /var/log/apport.log
    more /var/log/xorg.0.log
    cat /var/log/mysql.err
    less /var/log/messages
    grep -i fail /var/log/boot

    转载于:https://www.cnblogs.com/tham/p/10431538.html

    展开全文
  •  还可以把后两种设计形式结合起来:用多个进程来实现,其中每个进程包含几个线程。在这种情况下,进程内部的线程之间可以通信,不同的进程之间也可以通信。  上面讲述了可以把完成给定任务所需的工作分到多个进程...
  • 入门学习Linux常用必会60命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    建议在/mnt里建几个/mnt/cdrom、/mnt/floppy、/mnt/mo等目录,当作目录的专用挂载点。举例而言,如要挂载下列5个设备,其执行指令可能如下 (假设都是Linux的ext2系统,如果是Windows XX请将ext2改成vfat): 软盘 ==...
  • 你必须知道的495C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    我在设计一状态机,用函数表示每种状态,每函数都会返回一指向下一状态的函数的指针。可我找不到任何方法来声明这样的函数——感觉我需要一返回指针的函数,返回的指针指向的又是返回指针的函数……,如此...
  • CGI程序的伸缩性不很理想,因为它为每一正在运行的CGI程序开一独立进程。解决方法就是将经常用来编写CGI程序的语言的解释器编译进你的web服务器(比如mod_perl,JSP)。PHP就可以以这种方式安装,虽然很少有人愿意...
  • 我在设计一状态机,用函数表示每种状态,每函数都会返回一指向下一状态的函数的指针。可我找不到任何方法来声明这样的函数——感觉我需要一返回指针的函数,返回的指针指向的又是返回指针的函数……,如此...
  • 《你必须知道的495C语言问题》

    热门讨论 2010-03-20 16:41:18
    我在设计一状态机,用函数表示每种状态,每函数都会返回一指向下一状态的函数的指针。可我找不到任何方法来声明这样的函数——感觉我需要一返回指针的函数,返回的指针指向的又是返回指针的函数……,如此...
  • 你必须知道的495C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    4.4 我有函数,它应该接受并初始化一指针void f(int *ip) f static int dummy = 5; ip = &dummy;g 但是当我如下调用时: int *ip; f(ip); 调用者的指针却没有任何变化。. . . . . . . . . . . . . . . 18 4.5 我...
  • 安全测试的思路

    2019-02-24 10:37:00
     (1)查看这APP进程中,有没有存在debug 和info log.  (2)清缓存后,登录不上,说明没有残存cookie.同一账号,记住密码,连续登陆天,看会不会生效,cookie有时间限制;登陆失败后,不能记录密码的功能. ...
    安全测试的思路
      作为国内做安全最好的公司肯定要问一些安全测试的题。我将我准备的安全测试的思路说了一些:
      (1)查看这个APP进程中,有没有存在debug 和info log.
      (2)清缓存后,登录不上,说明没有残存cookie.同一账号,记住密码,连续登陆几天,看会不会生效,cookie有时间限制;登陆失败后,不能记录密码的功能.
      (3)登录成功后生成的Cookie,是否是http only?,否则容易被脚本盗取,使用火狐的cookie Manager.
      (4)在地址栏直接输入各个功能页面的URL地址,看系统如何处理,是否能够直接链接查看(匿名查看),是否有权限控制,是否直接执行,并返回相应结果页
      (5)错误登陆的次数限制,防止暴力破解
      (6)用户名和密码是否通过加密的方式,发送给Web服务器.
      (7)什么都不输入,点击提交按钮,看提示信息。(非空检查)

    转载于:https://www.cnblogs.com/veggiegfei/p/10425481.html

    展开全文
  • 一般来说同步反映了进程之间的协作性质,往往指有几个进程共同完成一个任务时在时间次序上的某种限制进程相互之间各自的存在及作用,通过交换信息完成通信。如接力比赛中一组队员使用接力棒等。 进程互斥...
  • 3.5.3 给40亿个不重复的unsigned int的整数,没排过序的,然后再给几个数,如何快速判断这几个数是否在那40亿个数当中? 3.5.4 在一个文件中有10G个整数,乱序排列,要求找出中位数。内存限制为2G。 3.5.5 时分秒针...
  • Wsyscheck.exe

    2008-11-01 18:08:04
    如不确定,使用本功能前最好退出杀软进程),只保留系统必须的几个进程,然后执行上述三个子菜单功能。 如果Wsyscheck的窗口本身已采取随机字符,如果仍然被木马禁用,请将Wsyscheck改名后运行。 Wangsea 20071109
  • 例如,您可以将程序分组在一起并同时运行它们,添加各种应用程序限制和与Internet 相关的限制,选择哪些进程使用哪些资源,使用各种恢复选项(快速恢复和即时恢复),以及各种其他有用的兼容性和与跟踪相关的功能。...
  • 新版Android开发教程.rar

    千次下载 热门讨论 2010-12-14 15:49:11
    开放手机联盟包括手机制造商、手机芯片厂商和移动运营商类。目前,联盟成员 数 量已经达到了 43 家。 移动手机联盟创始成员: Aplix 、 Ascender 、 Audience 、 Broadcom 、中国移动、 eBay 、 Esmertec 、谷歌、...
  • Android 上百实例源码分析以及开源分析 集合打包4

    千次下载 热门讨论 2012-07-10 21:54:03
    尽管记录不一定精准,但是从这个项目中,可以学习几个不同的技术:加速器交互、语音更新、后台运行服 务等。 本项目有16个目标文件。 CaloriesNotifier 继承接口StepListener, SpeakingTimer.Listener 能量通知,...
  • 并利用具体的例子来全面介绍每特性,不仅讨论了各个特性是什么,还说明了它是如何工作的,如何使用这特性来开发软件,以及有关的常见陷阱。  本书面向所有oracle 数据库应用开发人员和dba。 作译者 作者  ...
  • Loadrunner报错日志

    2014-10-24 15:12:34
    这个的错误的原因比较复杂,也可能很简单也可能需要查看好几个地方,解决起来不同的操作系统方式也不同。 1、首先检查是不是连接weblogic服务过大部分被拒绝,需要监控weblogic的连接等待情况,此时需要增加...
  • IIS6.0 IIS,互联网信息服务

    热门讨论 2010-08-23 21:20:55
    经过验证,WWW、FTP等几个服务经过这样的修改都可以在Windows XP家庭版上正常运行。不过经过这样处理安装的IIS在运行上可能存在某种未知的缺陷。 四、在Vista系统中安装IIS7.0相对于早先的版本,IIS 7.0 带来了许多...
  • 10g数据库体系结构的权威图书,涵盖了所有最重要的Oracle体系结构特性,包括文件、内存结构和进程,锁和闩,事务、并发和多版本,表和索引,数据类型,以及分区和并行,并利用具体的例子来充分介绍每特性,不仅...
  • 由于硬盘是机械结构,而内存是电子结构,它们两者之间的速度相差好几个数量级,因而使用硬盘来虚拟主内存将导致程序运行的速度大幅度降低。  11、硬盘空间不足  使用Windows系统平台的缺点之一就是对文件的管理...
  • 下面介绍几个真实案例来说明这个库的优势: 有一款特殊的手机,每次开启某个Activity时都报错,提示没有在清单中声明,但其他几百万机型都没问题,这种情况很可能就是系统bug了,由于是在onclick回调里直接使用...
  • 要的是,Linux 上有公认的 C 语言世界最好的编译器 gcc,如果你想得到一效率更高的开 发环境(并不一定是最友好的,但一定是最强大的),我建议你一定要好好的熟悉一下 Linux。 三.如何得到Linux? 据我所知...
  • LINGO软件的学习

    2009-08-08 22:36:50
    因此,派生集的索引数是最终原始父集的个数,索引的取值是从原始父集到当前派生集所作限制的总和。 总的来说,LINGO可识别的集只有两种类型:原始集和派生集。 在一模型中,原始集是基本的对象,不能再被拆分成...

空空如也

空空如也

1 2 3
收藏数 56
精华内容 22
关键字:

进程限制几个最好