编程须知

这个频道内会详细介绍异步编程与同步编程的不同之处以及需要注意的事项。

注意事项

  • 不要在代码中执行sleep以及其他睡眠函数,这样会导致整个进程阻塞
  • exit/die是危险的,会导致Worker进程退出
  • 可通过register_shutdown_function来捕获致命错误,在进程异常退出时做一些清理工作,具体参考 /wiki/page/305.html
  • PHP代码中如果有异常抛出,必须在回调函数中进行try/catch捕获异常,否则会导致工作进程退出
  • 不支持set_exception_handler,必须使用try/catch方式处理异常
  • Worker进程不得共用同一个RedisMySQL等网络服务客户端,Redis/MySQL创建连接的相关代码可以放到onWorkerStart回调函数中,具体参考 /wiki/page/325.html

异步编程

  • 异步程序要求代码中不得包含任何同步阻塞操作
  • 异步与同步代码不能混用,一旦应用程序使用了任何同步阻塞的代码,程序即退化为同步模式

协程编程

使用Coroutine特性,请认真阅读 协程编程须知

并发编程

请务必注意与同步阻塞模式不同,异步协程模式下程序是并发执行的,在同一时间内Server会存在多个请求,因此应用程序必须为每个客户端或请求,创建不同的资源和上下文。否则不同的客户端和请求之间可能会产生数据和逻辑错乱。

类/函数重复定义

新手非常容易犯这个错误,由于Swoole是常驻内存的,所以加载类/函数定义的文件后不会释放。因此引入类/函数的php文件时必须要使用include_oncerequire_once,否则会发生cannot redeclare function/class 的致命错误。

内存管理

PHP守护进程与普通Web程序的变量生命周期、内存管理方式完全不同。请参考 Server 内存管理 页面。编写Server或其他常驻进程时需要特别注意。

进程隔离

Swoole\Server程序的不同Worker进程之间是隔离的,在编程时操作全局变量、定时器、事件监听,仅在当前进程内有效。请参考 进程隔离

Swoole提供的TableAtomicLock组件是可以用于多进程编程的,但必须在Server->start之前创建。另外Server维持的TCP客户端连接也可以跨进程操作,如Server->sendServer->close