Swoole 再学习

书读百遍其义自见

学习Swoole必备基础

多进程/多线程

  • 了解Linux操作系统进程线程的概念

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.

  • 了解Linux进程/线程切换调度的基本知识

在引入线程的操作系统中,线程是调度和分配的基本单位进程是资源拥有的基本单位
把传统进程的两个属性分开,线程便能轻装运行,从而可显著地提高系统的并发程度。
在同一进程中,线程的切换不会引起进程的切换;在由一个进程中的线程切换到另一个进程中的线程时,才会引起进程的切换。

  • 了解进程间通信的基本知识,如管道、UnixSocket、消息队列、共享内存

Socket

  • 了解SOCKET的基本操作如 accept/connectsend/recvcloselistenbind
  • 了解SOCKET的接收缓存区、发送缓存区、阻塞/非阻塞、超时等概念

IO复用

  • 了解select/poll/epoll
  • 了解基于select/epoll实现的事件循环,Reactor模型
  • 了解可读事件、可写事件

TCP/IP网络协议

  • 了解TCP/IP协议
  • 了解TCPUDP传输协议

调试工具

使用 gdb 调试 Linux 程序

1
2
3
gdb -p 进程ID
gdb php
gdb php core

gdb有3种使用方式:

  • 跟踪正在运行的PHP程序,使用 gdb -p 进程ID
  • 使用gdb运行并调试PHP程序,使用 gdb php -> run server.php 进行调试
  • PHP程序发生coredump后使用gdb加载core内存镜像进行调试 gdb php core

使用 strace 跟踪进程的系统调用

strace可以跟踪系统调用的执行情况,在程序发生问题后,可以用strace分析和跟踪问题。 使用方法:

strace -o /tmp/strace.log -f -p $PID

  • -f: 表示跟踪多线程和多进程,如果不加-f参数,无法抓取到子进程和子线程的运行情况
  • -o: 表示将结果输出到一个文件中
  • -p $PID: 指定跟踪的进程ID,通过ps aux可以看到
  • -tt: 打印系统调用发生的时间,精确到微妙
  • -s: 限定字符串打印的长度,如recvfrom系统调用收到的数据,默认只打印32字节
  • -c 实时统计每个系统调用的耗时
  • -T 打印每个系统调用的耗时

使用 tcpdump 跟踪网络通信过程

1
sudo tcpdump -i any tcp port 9501
  • -i 参数制定了网卡,any表示所有网卡
  • tcp 指定仅监听TCP协议
  • port 制定监听的端口

Server

强大的TCP/UDP Server框架, EventLoop, 事件驱动, 异步, Worker进程组, Task异步任务, 毫秒定时器, SSL/TLS隧道加密

  • Http\ServerServer的子类, 内置了Http的支持
  • WebSocket\ServerHttp\Server的子类, 内置了WebSocket的支持
  • Redis\ServerServer的子类, 内置了Redis服务器端协议的支持

子类可以调用父类的所有方法和属性

Client

TCP/UDP/UnixSocket客户端,支持IPv4/IPv6,支持SSL/TLS隧道加密,支持SSL双向证书,支持同步并发调用,支持异步事件驱动编程。

Coroutine

协程可以理解为纯用户态的线程,其通过协作而不是抢占来进行切换。相对于进程或者线程,协程所有的操作都可以在用户态完成,创建和切换的消耗更低。Swoole可以为每一个请求创建对应的协程,根据IO的状态来合理的调度协程,这会带来了以下优势:

开发者可以无感知的用同步的代码编写方式达到异步IO的效果和性能,避免了传统异步回调所带来的离散的代码逻辑和陷入多层回调中导致代码无法维护。

Process

进程管理模块,可以方便的创建子进程,进程间通信,进程管理。

Table

基于共享内存自旋锁实现的超高性能内存表。彻底解决线程,进程间数据共享,加锁同步等问题。
Table的性能可以达到单线程每秒读写200W

Event

EventLoop API,让用户可以直接操作底层的事件循环,将socketstream,管道等Linux文件加入到事件循环中。
eventloop接口仅可用于socket类型的文件描述符,不能用于磁盘文件读写

常见问题

无法连接到服务器的简单检测手段

  • Linux下,使用netstat -an | grep 端口,查看端口是否已经被打开处于Listening状态
1
2
3
4
5
[root@caoxl Start]# netstat -an | grep 9501
tcp 0 0 127.0.0.1:9501 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:9501 127.0.0.1:44212 TIME_WAIT
[root@caoxl Start]# netstat -an | grep 9501
tcp 0 0 127.0.0.1:9501 127.0.0.1:44212 TIME_WAIT
  • 上一步确认后,再检查防火墙问题
1
2
3
[root@caoxl Start]# iptables -h
iptables v1.4.21
...
  • 注意服务器所使用的IP地址,如果是 127.0.0.1 回环地址,则客户端只能使用127.0.0.1 才能连接上
  • 用的阿里云服务或者腾讯服务,需要在安全权限组进行设置开发的端口

参考

Powered by Hexo and Hexo-theme-hiker

Copyright © 2017 - 2023 Keep It Simple And Stupid All Rights Reserved.

访客数 : | 访问量 :