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

南楼画角 提交于 2020-01-06 21:07:13

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

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

进程之间的通讯可以通过消息队列,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;
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!