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

编程

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

进程之间的通讯可以通过消息队列,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;

}

}

以上是 swoole学习笔记之多进程注意事项 的全部内容, 来源链接: utcz.com/z/512230.html

回到顶部