Process\Pool::__construct
创建进程池。函数原型:
```php
function Process\Pool::__construct(int $worker_num, int $ipc_type = 0, int $msgqueue_key = 0);
```
参数
----
* `$worker_num`:指定工作进程的数量
* `$ipc_type` 进程间通信的模式,默认为`0`表示不使用任何进程间通信特性
* 设置为`0`时必须设置`onWorkerStart`回调,并且必须在`onWorkerStart`中实现循环逻辑,当`onWorkerStart`函数退出时工作进程会立即退出
* 设置为`SWOOLE_IPC_QUEUE`表示使用系统消息队列通信,可设置`$msgqueue_key`指定消息队列的`KEY`,未设置消息队列`KEY`,将申请私有队列
* 设置为`SWOOLE_IPC_SOCKET`表示使用`Socket`进行通信,需要使用`listen`方法指定监听的地址和端口
* 使用非`0`设置时,必须设置`onMessage`回调,`onWorkerStart`变更为可选
创建进程池。函数原型:
```php
function Process\Pool::__construct(int $worker_num, int $ipc_type = 0, int $msgqueue_key = 0, bool $enable_coroutine = false);
```
参数
----
* `$worker_num`:指定工作进程的数量
* `$ipc_type` 进程间通信的模式,默认为`0`表示不使用任何进程间通信特性
* 设置为`0`时必须设置`onWorkerStart`回调,并且必须在`onWorkerStart`中实现循环逻辑,当`onWorkerStart`函数退出时工作进程会立即退出
* 设置为`SWOOLE_IPC_MSGQUEUE`表示使用系统消息队列通信,可设置`$msgqueue_key`指定消息队列的`KEY`,未设置消息队列`KEY`,将申请私有队列
* 设置为`SWOOLE_IPC_SOCKET`表示使用`Socket`进行通信,需要使用`listen`方法指定监听的地址和端口
* 使用非`0`设置时,必须设置`onMessage`回调,`onWorkerStart`变更为可选
* `$enable_coroutine`:启用协程,使用协程后将无法设置`onMessage`回调,并且只能使用`SWOOLE_IPC_UNIXSOCK`通信方式
协程模式
----
在`4.4`版本中`Process\Pool`模块增加了对协程的支持,可以配置第`4`个参数为`true`来启用。启用协程后底层会
* 禁止设置`onMessage`事件回调
* 在`onWorkerStart`时创建协程,在回调函数中可直接使用协程相关`API`
* 可使用`$pool->getProcess()->exportSocket()`导出管道句柄,实现`Worker`进程间通信
```php
$pool = new Swoole\Process\Pool(1, SWOOLE_IPC_NONE, 0, true);
$pool->on('workerStart', function (Swoole\Process\Pool $pool, int $workerId) {
while (true) {
Co::sleep(0.5);
echo "hello world\n";
}
});
$pool->start();
```
消息队列
------
在使用`SWOOLE_IPC_MSGQUEUE`时可使用`sysvmsg`扩展提供的消息队列`API`向工作进程投递任务。
```php
$q = msg_get_queue($key);
foreach (range(1, 100) as $i) {
$data = json_encode(['data' => base64_encode(random_bytes(1024)), 'id' => uniqid(), 'index' => $i,]);
msg_send($q, $i, $data, false);
}
```
* 必须传入`Pool`创建时使用的`key`
* 底层不支持`msg_send`的第二个参数`mtype`,请传入任意非`0`值