作者:小么么和 | 来源:互联网 | 2023-05-18 01:13
首先,进程之间的内存是相互独立的,不管是有没有亲缘关系的进程。进程之间的通讯可以通过消息队列,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;
}
}