# 开发者必须知道的几个问题
**1、swoole不依赖apache或者nginx**
swoole本身已经是一个类似apache/nginx的容器,只要PHP环境OK swoole就可以运行。
**2、是命令行启动的**
启动方式类似apache使用命令启动。
**3、长链接必须加心跳**
长链接必须加心跳,长链接必须加心跳,长链接必须加心跳,重要的话说三遍。
长链接长时间不通讯肯定会被防火墙干掉而断开。不加心跳的长链接应用就等着老板KO你吧。[心跳说明](heart_beat.md)
**4、客户端和服务端协议一定要对应才能通讯**
这个是开发者非常常见的问题。例如客户端是用websocket协议,服务端必须也是websocket协议(服务端```new swoole_websocket_server("0.0.0.0", 9501)```)才能连得上,才能通讯。
不要尝试在浏览器地址栏访问websocket协议端口,不要尝试用webscoket协议访问裸tcp协议端口,协议一定要对应。
这里的原理类似如果你要和英国人交流,那么要使用英语。如果要和日本人交流,那么要使用日语。这里的语言就类似与通许协议,双方(客户端和服务端)必须使用相同的语言才能交流,否则无法通讯。
**5、链接失败可能的原因**
刚开始使用swoole时很常见的一个问题是客户端链接服务端失败。 原因一般如下:
1、服务器防火墙(包括云服务器安全组)阻止了链接 (50%几率是这个)
2、客户端和服务端使用的协议不一致 (30%几率)
3、ip或者端口写错了 (15%的几率)
4、服务端没启动
**6、编码注意事项**
* 不要在代码中执行sleep以及其他睡眠函数,这样会导致整个进程阻塞
* exit/die是危险的,会导致worker进程退出,如果需要返回,可以调用return。
* 可通过register_shutdown_function来捕获致命错误,在进程异常退出时做一些请求工作
* PHP代码中如果有异常抛出,必须在回调函数中进行try/catch捕获异常,否则会导致工作进程退出
* swoole不支持set_exception_handler,必须使用try/catch方式处理异常
* Worker进程不得共用同一个Redis或MySQL等网络服务客户端,Redis/MySQL创建连接的相关代码可以放到onWorkerStart回调函数中
**7、改代码要重启**
swoole是常驻内存的扩展,加载类/函数定义的文件后不会释放,改代码要重启swoole server才能看到新代码的效果。
**8、支持更高并发**
如果业务并发连接数超过1000同时在线,请务必[优化linux内核](内核参数调优.md).
**9、注意避免类和常量的重复定义**
由于swoole是常驻内存的,加载类/函数定义的文件后不会释放,所以要避免多次require/include相同的类或者常量的定义文件。建议使用require_once/include_once加载文件,否则会发生```cannot redeclare function/class``` 的致命错误。
**10、进程隔离**
进程隔离也是很多新手经常遇到的问题。修改了全局变量的值,为什么不生效,原因就是全局变量在不同的进程,内存空间是隔离的,所以无效。所以使用swoole开发Server程序需要了解进程隔离问题。
* 不同的进程中PHP变量不是共享,即使是全局变量,在A进程内修改了它的值,在B进程内是无效的
* 如果需要在不同的Worker进程内共享数据,可以用Redis、MySQL、文件、Swoole\Table、APCu、shmget等工具实现
* 不同进程的文件句柄是隔离的,所以在A进程创建的Socket连接或打开的文件,在B进程内是无效,即使是将它的fd发送到B进程也是不可用的
**11、不支持的函数**
swoole运行在PHP CLI模式下,PHP CLI模式下无法使用HTTP相关的函数。
* header、setcookie、session_start等函数,可以使用swoole_http_response->header(),swoole_http_response->cookie(),也无法使用move_uploaded_file(),is_uploaded_file()这些函数。
* 无法使用php://input,请用swoole_http_request->rawContent()代替。
* 无法使用$_SERVER、$_GET、$_POST、$_FILES、$_COOKIE、$_SESSION、$_REQUEST,请使用swoole_http_request->$server、swoole_http_request->$get,swoole_http_request->$post,swoole_http_request->$files,swoole_http_request->$cookie分别替代
- swoole简介
- swoole功能概述
- 序章
- 开发必读
- 1 环境搭建
- 1.1 环境搭建
- 1.2 搭建Echo服务器
- 2 初识Swoole
- 2.1 Worker进程
- 2.2 TaskWorker进程
- 2.3 Timer定时器
- 2.4 Process进程
- 2.5 Table内存表
- 2.6 多端口监听
- 2.7 sendfile文件支持
- 2.8 SSL支持
- 2.9 热重启
- 2.10 http_server
- 附录*server配置
- 附录*server函数
- 附录*server属性
- 附录*server回调函数
- 附录*server高级特性
- 心跳检测
- 3 Swoole协议
- 3.1 EOF协议
- 3.2 固定包头协议
- 3.3 Http协议
- 3.4 WebSocket协议
- 3.5 MTQQ协议
- 内置http_server
- 内置websocket_server
- Swoole\Redis\Server
- 4 Swoole异步IO
- 4.1 AsyncIO
- 异步文件系统IO
- swoole_async_readfile
- swoole_async_writefile
- swoole_async_read
- swoole_async_write
- 5 swoole异步客户端
- ws_client
- http_client
- mysql_client
- redis_client
- tcp_client
- http2_client
- 6 swoole协程
- Swoole\Coroutine\Http\Client
- Swoole\Coroutine\MySQL
- Swoole\Coroutine\Redis
- Coroutine\PostgreSQL
- Swoole\Coroutine\Client
- Swoole\Coroutine\Socket
- Swoole\Coroutine\Channel
- Coroutine
- Swoole\Coroutine::create
- Swoole\Coroutine::resume
- Swoole\Coroutine::suspend
- Swoole\Coroutine::sleep
- Coroutine::getaddrinfo
- Coroutine::gethostbyname
- swoole_async_dns_lookup_coro
- Swoole\Coroutine::getuid
- getDefer
- setDefer
- recv
- Coroutine::stats
- Coroutine::fread
- Coroutine::fget
- Coroutine::fwrite
- Coroutine::readFIle
- Coroutine::writeFIle
- Coroutine::exec
- 7 swoole_process
- process::construct
- process::start
- process::name
- process::signal
- process::setaffinity
- process::exit
- process::kill
- process::daemon
- process->exec
- process::wait
- process::alarm
- 8 swoole定时器
- swoole_timer_tick
- swoole_timer_after
- swoole_timer_clear
- 9 swoole_event
- swoole_event_add
- swoole_event_set
- swoole_event_del
- swoole_event_wait
- swoole_event_defer
- swoole_event_write
- swoole_event_exit
- swoole提供的function
- 常见问题
- 客户端链接失败原因
- 如何设置进程数
- 如何实现异步任务
- 如何选择swoole三种模式
- php中哪些函数是阻塞的
- 是否可以共用1个redis或mysql连接
- 如何在回调函数中访问外部的变量
- 为什么不要send完后立即close
- 不同的Server程序实例间如何通信
- MySQL的连接池、异步、断线重连
- 在php-fpm或apache中使用swoole
- 学习Swoole需要掌握哪些基础知识
- 在phpinfo中有在php-m中没有
- 同步阻塞与异步非阻塞选择
- CURL发送POST请求服务器端超时
- 附录
- 预定义常量
- 内核参数调优
- php四种回调写法
- 守护进程程序常用数据结构
- swoole生命周期
- swoole_server中内存管理机制
- 使用jemalloc优化swoole内存分配性能
- Reactor、Worker、Task的关系
- Manager进程
- Swoole的实现
- Reactor线程
- 安装扩展
- swoole-worker手册
- swoole相关开源项目
- 写在后面的话
- 版本更新记录
- 4.0