[TOC]
# 多進程使用
******
怎么才能在一個 php 腳本中,開啟多進程處理呢?這里我們可以使用2種方法(注意,本教程只適用于 linux,php-cli 環境)
## pcntl 擴展
pcntl 是 php 官方的多進程擴展,只能在 linux 環境使用,例如:
```php
<?php
$num = 1;
$str = "EasySwoole,Easy學swoole\n";
$pid = pcntl_fork(); // 新開一個子進程,上面的變量內存將會復制一份到子進程中,這個函數,在主進程中返回子進程進程id,在子進程中返回0,開啟失敗時在主進程返回-1
echo $str; // 這下面的代碼,將會被主進程,子進程共同執行
if ($pid > 0) { // 主進程代碼
echo "我是主進程,子進程的pid是{$pid}\n";
} elseif ($pid == 0) {
echo "我是子進程,我的pid是" . getmypid() . "\n";
} else {
echo "我是主進程,我現在慌得一批,開啟子進程失敗了\n";
}
```
詳細內容可自行搜索了解
<br />
## swoole 擴展
swoole 擴展是面向生產環境的 PHP 異步網絡通信引擎,它也有著進程管理模塊。
```php
<?php
$num = 1;
$str = "EasySwoole,Easy學swoole\n";
$process = new swoole_process(function () use ($str) { // 實例化一個進程類,傳入回調函數
echo $str; // 變量內存照常復制一份,只不過swoole的開啟子進程后使用的是回調方法運行
echo "我是子進程,我的pid是" . getmypid() . "\n";
});
$pid = $process->start(); // 開啟子進程,創建成功返回子進程的PID,創建失敗返回false
echo $str;
if ($pid > 0) { // 主進程代碼
echo "我是主進程,子進程的pid是{$pid}\n";
} else {
echo "我是主進程,我現在不慌了,失敗就失敗吧\n";
}
```
詳細內容可自行搜索了解。
- 引言
- Introduction
- 運行模式
- php-fpm
- php-cli
- 基礎介紹
- 網絡協議
- ip
- tcp
- tcp
- http
- webSocket
- udp
- port端口
- 會話管理
- cookie
- session
- api/token
- linux基礎
- lnmp安裝
- 命令
- 進程管理
- 擴展安裝
- 端口監控
- 防火墻說明
- php7.0
- 部分新特性
- php回調/閉包
- 回調事件
- 閉包/匿名函數
- php多進程
- 多進程開啟
- 進程通信
- 進程信號
- 僵尸進程
- 孤兒進程
- 守護進程
- 同步/異步
- 阻塞/非阻塞
- 協程
- Swoole
- 初始Swoole
- 運行機制
- 生命周期
- composer使用
- EasySwoole
- 設計理念
- 組件說明
- 運行過程
- demo
- 提問的藝術