# WebServer
WorkerMan自带了一个简单的Web服务器,同样也是基于Worker实现的。文件位置在Workerman/WebServer.php。这个WebServer开发的目的主要是为了方便运行一些简单的Web程序,例如workerman-todpole等web界面程序。
## 使用方法
在Applications/YourApp/start.php中添加
```php
use \Workerman\Worker;
use \Workerman\WebServer;
require_once __DIR__ . '/Workerman/Autoloader.php';
// 这里监听8080端口,如果要监听80端口,需要root权限,并且端口没有被其它程序占用
$webserver = new WebServer('http://0.0.0.0:8080');
// 类似nginx配置中的root选项,添加域名与网站根目录的关联,可设置多个域名多个目录
$webserver->addRoot('www.example.com', '/your/path/of/web/');
$webserver->addRoot('blog.example.com', '/your/path/of/blog/');
// 设置开启多少进程
$webserver->count = 4;
Worker::runAll();
```
# WorkerMan的Webserver与普通Web开发异同
### 1、普通Web程序架构运行机制
一般的Web程序一般都是基于nginx+php-fpm或者apache+php的架构开发的,这些架构的运行机制一般是是每个请求都会经过请求初始化、创建执行环境、词法解析、语法解析、编译生成opcode以及请求关闭释放各种资源(如果有opcode缓存会跳过词法解析、语法解析、编译生成opcode步骤)
### 2、WorkerMan架构Web程序运行机制
WorkerMan是常驻内存的运行机制,只要PHP文件被载入编译过一次,便会常驻内存,不会再去从磁盘读取或者再去编译,并省去了重复的请求初始化、创建执行环境、词法解析、语法解析、编译生成opcode以及请求关闭释放各种资源等诸多耗时的步骤。剩下的只是简单的计算过程,所以性能很高。正因为常驻内存,所以类、函数、常量等定义代码只要运行一次,便可以永久使用,不会被销毁,所以要避免反复加载类、函数、常量等定义文件。比较简单的办法是使用require\_once加载文件,避免重复加载重复定义。
### 3、避免使用exit、die语句
同样的,在程序中避免使用exit、die语句,使用exit、die会导致进程退出。可以使用```\\Workerman\\Protocols\\Http::end($msg)```函数替代exit、die函数。
### 4、HTTP相关函数的使用
WorkerMan运行在PHP CLI模式下,PHP CLI模式下无法使用HTTP相关的函数,例如```header、setcookie、session\_start```等函数,请使用```/Workerman/Protocols/Http.php```文件中的```header、setcookie、sessionStart```等方法替换。
### 5、Web入口文件
WorkerMan的WebServer默认使用index.php作为Web入口文件,例如配置```$webserver->setRoot('www.example.com', '/home/www/');```,则www.example.com
的入口文件为```/home/www/index.php```。当url访问的文件(包括静态文件和PHP文件)不存在时,会自动调用入口文件index.php
### 6、可用的超全局变量
可用的超全局变量有```$\_SERVER、$\_GET、$\_POST、$\_FILES、$\_COOKIE、$\_SESSION、$\_REQUEST```。
无法使用```php://input```,请用```$GLOBALS\['HTTP\_RAW\_POST\_DATA'\] ```代替。
注意HTTP文件上传中,WorkerMan的```$\_FILES```结构与传统PHP中的```$\_FILES```结构不同,WorkerMan中```$\_FILES```结构类似
```php
var_export($_FILES);
array(
0 => array(
'file_name' => 'logo.png', // 文件名称
'file_size' => 23654, // 文件大小
'file_data' => '*****', // 文件的二进制数据
),
1 => array(
'file_name' => 'file.tar.gz', // 文件名称
'file_size' => 128966, // 文件大小
'file_data' => '*****', // 文件的二进制数据
),
...
);
```
保存文件代码类似
```php
// 例如保存到/tmp目录下
foreach($_FILES as $file_info)
{
file_put_contents('/tmp/'.$file_info['file_name'], $file_info['file_data']);
}
```
WorkerMan中无法使用```move\_uploaded\_file() is\_uploaded\_file()```这些函数。
### 7、可以设置onWorkerStart、onWorkerStop回调
可以设置onWorkerStart、onWorkerStop回调,做进程启动时全局初始化及进程退出(stop等命令)数据保存清理工作
- 序言
- 原理
- 开发必读
- 入门指引
- 特性
- 简单的开发示例
- 安装
- 环境要求
- 下载安装
- 启动停止
- 开发流程
- 开发前必读
- 目录结构
- 开发规范
- 基本流程
- 通讯协议
- 通讯协议作用
- 定制通讯协议
- 一些例子
- Worker类
- 构造函数
- 属性
- id
- count
- name
- protocol
- transport
- reusePort
- connections
- stdoutFile
- pidFile
- logFile
- user
- reloadable
- daemonize
- globalEvent
- 回调属性
- onWorkerStart
- onWorkerReload
- onConnect
- onMessage
- onClose
- onBufferFull
- onBufferDrain
- onError
- 接口
- runAll
- stopAll
- listen
- TcpConnection类
- 属性
- id
- protocol
- worker
- maxSendBufferSize
- defaultMaxSendBufferSize
- maxPackageSize
- 回调属性
- onMessage
- onClose
- onBufferFull
- onBufferDrain
- onError
- 接口
- send
- getRemoteIp
- getRemotePort
- close
- destroy
- pauseRecv
- resumeRecv
- pipe
- AsyncTcpConnection类
- 构造函数
- connect
- reconnect
- transport
- Timer定时器类
- add
- del
- 定时器注意事项
- WebServer
- 调试
- 基本调试
- 查看运行状态
- 网络抓包
- 跟踪系统调用
- 常用组件
- GlobalData数据共享组件
- GlobalDataServer
- GlobalDataClient
- Channel分布式通讯组件
- ChannelServer
- channelClient
- 例子-集群推送
- 例子-分组发送
- FileMonitor文件监控组件
- MySQL组件
- workerman/mysql
- swoole/mysql(异步)
- redis组件
- swoole/redis
- 异步http组件
- swoole/http-client
- 异步消息队列组件
- react/zmq
- react/stomp
- 异步dns组件
- swoole/dns
- 常见问题
- 心跳
- 客户端链接失败原因
- 是否支持多线程
- 与其它框架整合
- 运行多个workerman
- 支持哪些协议
- 如何设置进程数
- 查看客户端连接数
- 对象和资源的持久化
- 例子无法工作
- 启动失败
- 停止失败
- 支持多少并发
- 更改代码不生效
- 向指定客户端发送数据
- 如何主动推送消息
- 在其它项目中推送
- 如何实现异步任务
- status里send_fail的原因
- Windows下开发Linux下部署
- 是否支持socket.io
- 终端关闭导致workerman关闭
- 与nginx apache的关系
- 禁用函数检查
- 平滑重启原理
- 为Flash开843端口
- 如何广播数据
- 如何建立udp服务
- 监听ipv6
- 关闭未认证的链接
- 传输加密-ssl/tsl
- 创建wss服务
- 创建https服务
- workerman作为客户端
- 作为ws/wss客户端
- PHP的几种回调写法
- 附录
- Linux内核调优
- 压力测试
- 安装扩展
- websocket协议
- ws协议
- text协议
- frame协议
- 不支持的函数/特性
- 版权信息