热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

swoole学习笔记之多进程注意事项

首先,进程之间的内存是相互独立的,不管是有没有亲缘关系的进程。进程之间的通讯可以通过消息队列,socket,消息中间件等进行实现,swoole内有内置的内存table,相比于其他消

首先,进程之间的内存是相互独立的,不管是有没有亲缘关系的进程。

进程之间的通讯可以通过消息队列,socket,消息中间件等进行实现,swoole内有内置的内存table,相比于其他消息中间件更加高效,不过也有局限性(个人理解,只在于swoole内使用) 之前的文章里比较详细

socket

$this->socket=stream_socket_server($socket_address);//socket_address地址如tcp://0.0.0.0:9805 创建socket资源句柄
$clientSocket=stream_socket_accept($this->socket); //阻塞监听

linux消息队列

msg_send($msg_queue,10,"发送的消息");
msg_receive($msg_queue,10,$message_type,1024,$message);//从消息队列中收取消息 阻塞接收

swoole注意事项:

1.对象的生命周期

https://wiki.swoole.com/wiki/page/354.html

程序全局期:

    在start之前创建的所有对象,只有在服务停止之后才会结束

进程全局期:

    在onworkstart等进程启动事件内创建的对象,在整个进程中都是有效的,在这个进程结束的时候对象才会被销毁回收

会话期:

    客户端发送连接请求onConnect创建的对象,在会话结束onClose后被销毁回收

请求期:

    客户端发送请求,服务端接受请求onReceive创建的对象,在请求结束,返回结果response后被销毁回收

 

2.内存机制

局部变量:

    在函数内新创建的对象会在函数运行结束后销毁回收

全局变量:

PHP中,有3类全局变量。

  • 使用global关键词声明的变量
  • 使用static关键词声明的类静态变量、函数静态变量
  • PHP的超全局变量,包括$_GET$_POST$GLOBALS
  • 以上是官方的(注意,以面向对象形式编写代码的时候更好分辨全局和局部。)
捕获Server运行期致命错误(官方解释)

Server运行期一旦发生致命错误,那客户端连接将无法得到回应。如Web服务器,如果有致命错误应当向客户端发送Http 500 错误信息。

在PHP中可以通过register_shutdown_function + error_get_last 2个函数来捕获致命错误,并将错误信息发送给客户端连接。具体代码示例如下:

register_shutdown_function("handleFatal");

function handleFatal()
{
    $error = error_get_last();
    switch ($error["type"] ?? null) {
        case E_ERROR :
        case E_PARSE :
        case E_CORE_ERROR :
        case E_COMPILE_ERROR :
            $message = $error["message"] . PHP_EOL;
            if (isset($_SERVER["REQUEST_URI"])) {
                $message .= "[QUERY] " . $_SERVER["REQUEST_URI"];
            }
            // log or send:
            // error_log($message);
            // $server->send($fd, $message);
            break;
    }
}

推荐阅读
author-avatar
小么么和
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有