编程须知
这个频道内会详细介绍异步编程与同步编程的不同之处以及需要注意的事项。
注意事项
- 不要在代码中执行
sleep
以及其他睡眠函数,这样会导致整个进程阻塞 exit/die
是危险的,会导致worker进程退出- 可通过
register_shutdown_function
来捕获致命错误,在进程异常退出时做一些请求工作,具体参看捕获Server运行期致命错误 - PHP代码中如果有异常抛出,必须在回调函数中进行
try/catch
捕获异常,否则会导致工作进程退出 - swoole不支持
set_exception_handler
,必须使用try/catch
方式处理异常 - Worker进程不得共用同一个
Redis
或MySQL
等网络服务客户端,Redis/MySQL创建连接的相关代码可以放到onWorkerStart
回调函数中,具体参考是否可以共用1个redis或mysql连接
类/函数重复定义
新手非常容易犯这个错误,由于swoole是常驻内存的,所以加载类/函数定义的文件后不会释放。因此引入类/函数的php文件时必须要使用
include_once
或
require_once
,否会发生
cannot redeclare function/class
的致命错误。
内存管理
PHP守护进程与普通Web程序的变量生命周期、内存管理方式完全不同。请参考 swoole_server内存管理 页面。编写 swoole_server
或其他常驻进程时需要特别注意。
进程隔离
进程隔离也是很多新手经常遇到的问题。修改了全局变量的值,为什么不生效,原因就是全局变量在不同的进程,内存空间是隔离的,所以无效。所以使用swoole开发Server程序需要了解
进程隔离
问题。
- 不同的进程中PHP变量不是共享,即使是全局变量,在A进程内修改了它的值,在B进程内是无效的
- 如果需要在不同的Worker进程内共享数据,可以用
Redis
、MySQL
、文件
、Swoole\Table
、APCu
、shmget
等工具实现 - 不同进程的文件句柄是隔离的,所以在A进程创建的Socket连接或打开的文件,在B进程内是无效,即使是将它的fd发送到B进程也是不可用的