進程是什麼,進程能幹什麼,怎麼開啓進程

大家好,我是文傑,今天來給大家講下自己的研究,如果想嘗試的,需要服務器搭建swoole服務

 

一 什麼是進程

進程就是正在運行的程序的一個實例:如在某個終端裏面運行PHP腳本,這時候就是已經開啓了一個進程,會有對應的進程ID,即PID

 

二 swoole Process爲什麼要管理進程

PHP 自帶的 pcntl,存在很多不足,如:

1 沒有提供進程間通信的功能

2 不支持重定向標準輸入和輸出

3 只提供了 fork 這樣原始的接口,容易使用錯誤

 

其實啊,我們在搭建mysql的主從配置時候,也有遇到過進程的,它是有三個進程在偷偷跑的,分別是

i/o進程,去請求主庫的binlog日誌,將得到的binlog日誌寫道relay log日誌中

主庫會生成一個log dump進程,用來給從庫i/o進程傳binlog

sql進程,會讀取relay log文件中的日誌,並解析爲具體的操作,具體操作就比如你的update,delete,created,來實現主從操作一致的,最終達到同步的目的

好了,不扯遠了,想了解的,自己去搭建一個吧,或者再關注我的博客,晚點給大家搭建一個主從分離

 

三 Process 提供瞭如下特性:

Process 提供了比 pcntl 更強大的功能,更易用的 API,使 PHP 在多進程編程方面更加輕鬆。

可以方便的實現進程間通訊

支持重定向標準輸入和輸出,在子進程內 echo 不會打印屏幕,而是寫入管道,讀鍵盤輸入可以重定向爲管道讀取數據

提供了 exec 接口,創建的進程可以執行其他程序,與原 PHP 父進程之間可以方便的通信

 

process.php

 

<?php
// process.php 這個整個是個主進程
$process = new swoole_process(function(swoole_process $pro) {

    // 類似在linux終端裏面執行一個命令 類似 php redis.php
    $pro->exec('/usr/local/php/bin/php',[
        '../../server/http_server.php'
    ]);// 執行一個外部程序
}, false);// true 第二個參數爲true,則不會打印在終端了,放管道里面去了
$pid = $process->start();// 創建一個子進程,返回子進程ID
echo $pid. PHP_EOL;
swoole_process::wait();// 回收子進程

 

http_server.php

<?php
// 需要在cli運行,不然會報錯的
// httpserver 是基於server的
// 監聽0.0.0.0 表示監聽所有地址
$http = new swoole_http_server('0.0.0.0', 8811);

$http->set(
    [
        'enable_static_handler' => true,//開啓靜態文件請求處理功能,需配合 document_root 使用 默認 false
        'document_root' => '/home/wwwroot/default/twj/swoole/data',//設置靜態處理器的路徑。類型爲數組,默認不啓用
    ]
);
// 上面$htt->set(),如果它有靜態資源,就不會再走後面的邏輯了


// $request 請求
// $response 響應
$http->on('request', function ($request, $response) {
//    var_dump($_GET);// 是獲取不到的,要通過$request獲取
//    var_dump($request->get);// 只能在服務器看到,瀏覽器是看不到的

    $content = [
        'get' => $request->get,
        'post' => $request->post,
        'header' => $request->header,
        'date:' => date('Y-M-D H:i:s'),
    ];
    $filename = './access.log';
    go(function () use ($filename, $content) {
        $bool = Swoole\Coroutine\System::writeFile($filename, json_encode($content ), FILE_APPEND);
        var_dump($bool);
    });


    // 設置cookie
    $response->cookie('singwa', '值', time() + 1800);

    // 如果要把數據放在瀏覽器,就要用end()這個方法,而且必須要是string
    $response->end("<h1>HTTPserver</h1>");

});
$http->start();

查看進程 ,ps aux的功能是打印出所有進程

 

 ps aux | grep process.php 可以查看他的父進程 主進程ID是22441

 

pstree命令是用於查看進程樹之間的關係,即哪個進程是父進程,哪個是子進程,可以清楚的看出來是誰創建了誰

 pstree -p 22441 查看父進程下的子進程詳情

22441 是主進程 22442 就是我剛剛在主進程中開啓的進程ID,22443就是http_server.php的進程,22445就是http_server.php的work進程

ps aft | grep http_server.php

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章