编程须知

最后更新于:2022-04-02 06:16:38

# 编程须知 [TOC] 这个频道内会详细介绍异步编程与同步编程的不同之处以及需要注意的事项。 ## 注意事项 * 不要在代码中执行`sleep`以及其他睡眠函数,这样会导致整个进程阻塞 * `exit/die`是危险的,会导致`Worker`进程退出 * 可通过`register_shutdown_function`来捕获致命错误,在进程异常退出时做一些清理工作,具体参考[捕获Server运行期致命错误](捕获Server运行期致命错误.md "捕获Server运行期致命错误") * `PHP`代码中如果有异常抛出,必须在回调函数中进行`try/catch`捕获异常,否则会导致工作进程退出 * 不支持`set_exception_handler`,必须使用`try/catch`方式处理异常 * `Worker`进程不得共用同一个`Redis`或`MySQL`等网络服务客户端,`Redis/MySQL`创建连接的相关代码可以放到`onWorkerStart`回调函数中,具体参考[是否可以共用1个redis或mysql连接](是否可以共用1个redis或mysql连接.md) ## 异步编程 * 异步程序要求代码中不得包含任何同步阻塞操作 * **异步与同步代码不能混用,一旦应用程序使用了任何同步阻塞的代码,程序即退化为同步模式** ## 协程编程 使用`Coroutine`特性,请认真阅读[协程编程须知](Coroutine-编程须知.md) ## 并发编程 请务必注意与`同步阻塞`模式不同,`异步`和`协程`模式下程序是**并发执行**的,在同一时间内`Server`会存在多个请求,因此**应用程序必须为每个客户端或请求,创建不同的资源和上下文**。否则不同的客户端和请求之间可能会产生数据和逻辑错乱。 ## 类/函数重复定义 新手非常容易犯这个错误,由于`Swoole`是常驻内存的,所以加载类/函数定义的文件后不会释放。因此引入类/函数的php文件时必须要使用`include_once`或`require_once`,否则会发生`cannot redeclare function/class`的致命错误。 ## 内存管理 `PHP`守护进程与普通`Web`程序的变量生命周期、内存管理方式完全不同。请参考[Server 内存管理](Server内存管理机制.md)页面。**编写`Server`或其他常驻进程时需要特别注意。** ## 进程隔离 `Swoole\Server`程序的不同`Worker`进程之间是隔离的,在编程时操作全局变量、定时器、事件监听,仅在当前进程内有效。请参考[进程隔离](进程隔离.md) `Swoole`提供的`Table`、`Atomic`、`Lock`组件是可以用于多进程编程的,但必须在`Server->start`之前创建。另外`Server`维持的`TCP`客户端连接也可以跨进程操作,如`Server->send`和`Server->close`。
';