# 3.2 運行代碼
這里以運行示例項目代碼為例
## 克隆
```bash
$>git clone git@github.com:pinguo/php-msf-demo.git php-msf-demo
$>cd php-msf-demo
$>ll
drwxr-xr-x 10 worker worker 340 Sep 4 14:40 app
-rwxr-xr-x 1 worker worker 9984 Sep 4 14:40 build.sh
-rwxr-xr-x 1 worker worker 61 Sep 4 14:40 checkstyle.sh
-rw-r--r-- 1 worker worker 650 Sep 4 15:12 composer.json
-rw-r--r-- 1 worker worker 22582 Sep 4 14:40 composer.lock
drwxr-xr-x 13 worker worker 442 Sep 4 14:40 config
-rwxr-xr-x 1 worker worker 586 Sep 4 14:40 console.php
-rw-r--r-- 1 worker worker 18093 Sep 4 14:40 LICENSE
-rw-r--r-- 1 worker worker 233 Sep 4 14:40 README.md
-rwxr-xr-x 1 worker worker 617 Sep 4 14:40 server.php
drwxr-xr-x 3 worker worker 102 Sep 4 14:40 test
drwxr-xr-x 3 worker worker 102 Sep 4 14:40 www
```
## 運行
### build.sh(Docker環境)
```bash
$>cd php-msf-demo
$>./build.sh
```
### 登入Docker容器
```
$> ssh -p 2202 worker@127.0.0.1
密碼:"worker"(無雙引號)
```
其中`2202`端口是根據映射`-p 2202:22`來的,如果有修改請調整為修改后的值。
### composer
```bash
$>cd /home/worker/data/www/php-msf-demo
$>composer install -vvv
```
如果出現下面的情況:
```
Reading ./composer.json
Loading config file /home/worker/.composer/config.json
Loading config file /home/worker/.composer/auth.json
Loading config file ./composer.json
[UnexpectedValueException]
Your github oauth token for github.com contains invalid characters: "your auth token"
Exception trace:
() at phar:///home/worker/php/bin/composer/src/Composer/IO/BaseIO.php:104
Composer\IO\BaseIO->loadConfiguration() at phar:///home/worker/php/bin/composer/src/Composer/Factory.php:325
Composer\Factory->createComposer() at phar:///home/worker/php/bin/composer/src/Composer/Factory.php:576
Composer\Factory::create() at phar:///home/worker/php/bin/composer/src/Composer/Console/Application.php:332
Composer\Console\Application->getComposer() at phar:///home/worker/php/bin/composer/src/Composer/Console/Application.php:444
Composer\Console\Application->getPluginCommands() at phar:///home/worker/php/bin/composer/src/Composer/Console/Application.php:149
Composer\Console\Application->doRun() at phar:///home/worker/php/bin/composer/vendor/symfony/console/Application.php:127
Symfony\Component\Console\Application->run() at phar:///home/worker/php/bin/composer/src/Composer/Console/Application.php:100
Composer\Console\Application->run() at phar:///home/worker/php/bin/composer/bin/composer:54
require() at /home/worker/php/bin/composer:24
```
請在[Github Personal Setting](https://github.com/settings/tokens)添加Personal access tokens,然后將token復制下來保存到:
```bash
$>vi /home/worker/.composer/auth.json
{
"github-oauth": {
"github.com": "your auth token"
}
}
```
### supervisor
```bash
$>supervisorctl
supervisor> update
php-msf-demo: added process group
supervisor> status
msf:php-msf-demo RUNNING pid 26958, uptime 0:00:31
//...
```
### 訪問服務
Demo示例項目配置了HTTP索引頁,直接瀏覽器訪問[http://127.0.0.1:8000](http://127.0.0.1:8000),可以看到如下界面:

### 查看服務日志
```bash
$>cat ~/data/msf-php-msf-demo/server.log
_______ ____
________ / /_ ____ ____ ___ _____/ __/
___/ __ \/ __ \/ __ \______/ __ `__ \/ ___/ /_
__/ /_/ / / / / /_/ /_____/ / / / / (__ ) __/
_/ .___/_/ /_/ .___/ /_/ /_/ /_/____/_/
/_/ /_/ Camera360 Open Source TM
[2017-08-30 11:19:54] MSF Version: 3.0.0
[2017-08-30 11:19:54] Swoole Version: 1.9.15
[2017-08-30 11:19:54] PHP Version: 7.1.8
[2017-08-30 11:19:54] Application ENV: production
[2017-08-30 11:19:54] Worker Number: 4
[2017-08-30 11:19:54] Task Number: 8
[2017-08-30 11:19:54] Listen Addr: 0.0.0.0
[2017-08-30 11:19:54] Listen Port: 8000
[2017-08-30 11:19:54] Config Manager: Enabled
[2017-08-30 11:19:54] Inotify Reload: Enabled
```
### 監控應用運行日志
```bash
$>tail -f /home/worker/data/www/runtime/php-msf-demo/*.log
2017/08/30 10:09:21 [notice] [demo] [logid:59a61e51c3474d74175f647f] [0(ms)] [1(MB)] [/Bench/RedisPoolSet] [controller=Bench method=actionRedisPoolSet verb=GET status=200] profile[] counting[]
2017/08/30 10:09:22 [notice] [demo] [logid:59a61e52c3474d74175f6480] [0(ms)] [1(MB)] [/Bench/RedisPoolSet] [controller=Bench method=actionRedisPoolSet verb=GET status=200] profile[] counting[]
2017/08/30 10:09:23 [notice] [demo] [logid:59a61e53c3474d74175f6481] [0(ms)] [1(MB)] [/Bench/RedisPoolSet] [controller=Bench method=actionRedisPoolSet verb=GET status=200] profile[] counting[]
2017/08/30 10:09:49 [notice] [demo] [logid:59a61e6dc3474d74175f6482] [0(ms)] [1(MB)] [/Monitor] [controller=Monitor method=actionIndex verb=GET status=200] profile[] counting[]
2017/08/30 10:39:50 [notice] [demo] [logid:59a62576c3474d746001a631] [42(ms)] [1(MB)] [/Bench/HttpCallBack] [controller=Bench method=actionHttpCallBack verb=GET] profile[] counting[]
2017/08/30 10:39:52 [notice] [demo] [logid:59a62578c3474d746001a632] [3(ms)] [1(MB)] [/Bench/HttpCallBack] [controller=Bench method=actionHttpCallBack verb=GET] profile[] counting[]
2017/08/30 10:40:00 [notice] [demo] [logid:59a62580c3474d746001a633] [44(ms)] [1(MB)] [/Bench/HttpCoroutine] [controller=Bench method=actionHttpCoroutine verb=GET] profile[297#dns-127.0.0.1=0.4(ms)/1,955#api-http://127.0.0.1:80/=1.5(ms)/1] counting[]
2017/08/30 10:40:01 [notice] [demo] [logid:59a62581c3474d746001a634] [4(ms)] [1(MB)] [/Bench/HttpCoroutine] [controller=Bench method=actionHttpCoroutine verb=GET] profile[726#dns-127.0.0.1=0.2(ms)/1,587#api-http://127.0.0.1:80/=3.9(ms)/1] counting[]
2017/08/30 10:40:02 [notice] [demo] [logid:59a62582c3474d746001a635] [4(ms)] [1(MB)] [/Bench/HttpCoroutine] [controller=Bench method=actionHttpCoroutine verb=GET] profile[332#dns-127.0.0.1=0.1(ms)/1,584#api-http://127.0.0.1:80/=3.3(ms)/1] counting[]
2017/08/30 10:40:02 [notice] [demo] [logid:59a62582c3474d746001a636] [3(ms)] [1(MB)] [/Bench/HttpCoroutine] [controller=Bench method=actionHttpCoroutine verb=GET] profile[882#dns-127.0.0.1=0.1(ms)/1,493#api-http://127.0.0.1:80/=3.0(ms)/1] counting[]
```
快捷指令

監控運行日志
* logp
監控PHP日志
* logn
監控nginx日志
- 0 文檔說明
- 1 為什么研發新框架
- 1.1 傳統php-fpm工作模式的問題
- 1.2 壓測數據對比
- 1.3 小結
- 2 微服務框架研發概覽
- 2.1 通信框架技術選型
- 2.2 swoole
- 2.3 協程原理
- 2.4 異步、并發
- 2.5 小結
- 3 框架運行環境
- 3.1 環境變量
- 3.2 運行代碼
- 3.3 docker
- 3.4 小結
- 4 框架結構
- 4.1 結構概述
- 4.2 控制器
- 4.3 模型
- 4.4 視圖
- 4.5 同步任務
- 4.6 配置
- 4.7 路由
- 4.8 小結
- 5 框架組件
- 5.1 協程
- 5.2 類的加載
- 5.3 異步Http Client
- 5.4 請求上下文
- 5.5 連接池
- 5.6 對象池
- 5.7 RPC
- 5.8 公共庫
- 5.9 RESTful
- 5.10 多語言
- 5.11 雜項
- 5.12 小結
- 6 常見問題
- 7 附錄