2020年2月5日 星期三

使用 nginx websocket https to http

最近專案遇到一坑,之前 http 使用 ws 都很順利,但是上了https之後,網頁強制要使用 wss... 就卡住了
Nginx 配置 轉發代理,網路上很多教學都寫一半,最後看懂就~ 這樣寫最精簡,直接 調用ws 去處理後續的東西

NGINX配置文件
server {
    server_name             域名;

    location / {
        root                   PATH;
        index                  index.php index.html index.htm;
        try_files              $uri $uri/ /index.php?$query_string;
    }
 
    location ~ \.php$ {
        root                   PATH;
        fastcgi_pass           unix:/var/run/php-fpm/www.sock;
        fastcgi_index          index.php;
        fastcgi_param          SCRIPT_FILENAME
        $document_root$fastcgi_script_name;
        111111
        include                fastcgi_params;
    }
 
    listen                  443 ssl; # managed by Certbot
    ssl_certificate         證書
    ssl_certificate_key     證書
    include                 /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam             /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
 
    location / {
        proxy_pass             服務位置
        #例如                    http://127.0.0.1:8092/ws;
        proxy_http_version     1.1;
        proxy_set_header       Upgrade $http_upgrade;
        proxy_set_header       Connection "Upgrade";
        proxy_set_header       X-Real-IP $remote_addr;
        add_header             Access-Control-Allow-Origin *;
        proxy_connect_timeout  60s;
        proxy_read_timeout     500s;
        proxy_send_timeout     500s;
    }
 
}
server {
    if ($host = 域名) {
        return                 301 https://$host$request_uri;
        }                      # managed by Certbot
 
        listen                 80;
 
        server_name            域名;
        return                 404; # managed by Certbot
 
    }
Go Server
package main

import (
    "log"
    "net/http"
 
    "github.com/gorilla/websocket"
)
 
func main() {
    upgrader := &websocket.Upgrader{
        //如果有 cross domain 的需求,可加入這個,不檢查 cross domain
        CheckOrigin: func(r *http.Request) bool { return true },
    }
    http.HandleFunc("/"func(w http.ResponseWriter, r *http.Request) {
        cerr := upgrader.Upgrade(w, r, nil)
        if err != nil {
            log.Println("upgrade:", err)
            return
        }
        defer func() {
            log.Println("disconnect !!")
            c.Close()
        }()
        for {
            mtypemsgerr := c.ReadMessage()
            if err != nil {
                log.Println("read:", err)
                break
            }
 
            log.Printf("receive: %s\n", msg)
            msg = []byte("伺服器接收成功")
            log.Printf("re_send: %s\n", msg)
 
            err = c.WriteMessage(mtype, msg)
            if err != nil {
                log.Println("write:", err)
                break
            }
        }
    })
    log.Println("server start at :8000")
    log.Fatal(http.ListenAndServe(":8000"nil))
}
Go Client
package main

import (
    "log"
 
    "github.com/gorilla/websocket"
)
 
func main() {
    // ws_connection := "ws://fishstg.1c5game.com:8000/echo"
    // ws_connection := "wss://18.139.24.117:8092/ws"
    ws_connection := "wss://fishstg.1c5game.com/ws"
    // ws_connection := "wss://echo.websocket.org/"
    log.Printf("ws_connection: %s\n", ws_connection)
    c_err := websocket.DefaultDialer.Dial(ws_connection, nil)
    if err != nil {
        log.Fatal("dial:", err)
    }
    defer c.Close()
 
    i := 1
    for i <= 10 {
        // fmt.Println(i)
        send_msg := "{\"protocol\"  : \"platform_debit_all\",  \"data\"  :{ \"id\":1 , \"gametoken\":123456465 }}"
        log.Printf("send_msg: %s\n", send_msg)
        err = c.WriteMessage(websocket.TextMessage, []byte(send_msg))
        if err != nil {
            log.Println(err)
            return
        }
        _msgerr := c.ReadMessage()
        if err != nil {
            log.Println("read:", err)
            return
        }
        log.Printf("received: %s\n", msg)
        i++
    }
}
----------------------

2019年12月24日 星期二

PHP 數值格式化

<?php

$s  = 1000000;
$s1 = 1000000.1111110;
echo return_number_int_or_floor($s,2) . "<hr>";
echo return_number_int_or_floor($s1,2) . "<hr>";

function return_number_int_or_floor($number, $floor = 0)
{
    if (floor($number) == $number) {
        return $formattedNum = substr(rtrim(number_format($number, $floor, ".", ","), 0), 0, -1);
    }
    return $formattedNum = rtrim(number_format($number, $floor, ".", ","), 0);
}

數值處理,正格式化,剃除整數最後字串為.00的方法



2019年12月18日 星期三

Clear Cache in Laravel

Clear Cache in Laravel
第一次遇到 route 被 Cached...........................................
最快解法
Route::get('/clear-cache', function() {
    Artisan::call('cache:clear');
    return "Cache is cleared";
});

2019年12月12日 星期四

PHP~當客戶端喔

一個寧靜的下午
遇到一個要由PHP 當 客戶端的情境
往往都是PHP 當伺服器在接收客戶端的服務
這次反過來要去當客戶端
發送訊息給另一個伺服器
服務的伺服器為WebSocket Server
這個要搭建起來用PHP + Html5 根本無難度
但是要由PHP send message .... 一直卡住
翻尋許久,求助大大神
最後滑倒後踢到垃圾桶,踩到黃金等等
發現了
# "textalk/websocket
  # use WebSocket\Client;
  # composer  require textalk/websocket
開心的加載進去,剩下的就差不多了....
$client = new Client("ws://" . $this->input->server('HTTP_HOST') . ":".'port');
$client->send('47b6"}}');
$client->receive();
<途中插曲>
Port 忘記打開.... 所以一直連接不上

2019年12月4日 星期三

WebSocket 壓力測試 Example(多執行緒)

使用工具 :
Python 3.8
程式碼:
import websocket
try:
    import thread
except ImportError:
    import _thread as thread
import time
import threading
import json

"""
這是一個卡 WebSocket 的 Example
"""

def on_message(ws, message):
    # parse x:
    message = json.loads(message)
    print("message", message, "\n")
    print("\n");


def on_error(ws, error):
    # print(error)
    print("error", error, "\n")


def on_close(ws):
    print("### closed ###")

def on_open(ws):
    print("ws coennet...")
    # def run(*args):
    #     print("ws coennet...")
    #     # for i in range(3):
    #     #     time.sleep(1)
    #     #     ws.send("Hello %d" % i)
    #     # time.sleep(1)
    #     # ws.close()
    #     print("thread terminating...")
    # thread.start_new_thread(run, ())


def run_s(i):
    websocket.enableTrace(True)
    wsc = "接口"
    ws = websocket.WebSocketApp(wsc,
                                on_message=on_message,
                                on_error=on_error,
                                on_close=on_close)
    ws.on_open = on_open
    ws.run_forever()


if __name__ == "__main__":
    # 建立 5 個子執行緒
    num = 1
    threads = []
    for i in range(num):
        threads.append(threading.Thread(target=run_s, args=(i,)))
        threads[i].start()
    # 等待所有子執行緒結束
    for i in range(num):
        threads[i].join()

    print("Done.")
QQ,我的臉書被排擠了.........

2019年10月5日 星期六

快速且大量數據寫入Mysql。每秒10萬筆數據插入

最近在玩 Golang 語言,發現它的平行雲算真的強大 !!!!!

關鍵字

  • sync.WaitGroup 
  1. 所先引用函式庫
  2. 設定  wg.Add(1) 與 調用要跑的方法
  3. 最後  呼叫  wg.Wait() 阻塞它,等待 goroutine們的執行完畢
-------------------------------------------------------------
分享我的code



以上就是我在處理大量log,入庫的方法,調用多平行運算方法,在處理大量數據,再透過其他手法,突破AWS 的 IPOS限制,達到S : 10萬筆數據寫入的方法<當然表結構沒有設計得很完美,但是堪用就好....>

2018年8月17日 星期五

無聊閒逛,且做出來的一個簡單樣子

亞太股票

最近開始在自學一些前端工.... ><!
也準備著手去搞一些MIS的專業技能,雲服務感覺很重要 !!!

2018年8月14日 星期二

2018年8月9日 星期四

分享文章 利用 composer 實作 CodeIgniter 輸出報表

使用情境        之前要PHP 產生報表,都要先去下載 phpspreadsheet (前身 php execl ),把整個物件放進去專案內,假如用框架又要再調整一些load.... 剛好看到這篇  利用  composer  phpspreadsheet   library,只要修改 application/config/config.php 中的 $config['composer_autoload'] = 'vendor/autoload.php'; ,在想要實作的 use 需要的 class ,一個簡單報表就可以產生了~~ 備註 : Execl2007 需要 php-zip 擴展

https://arjunphp.com/generate-excel-phpspreadsheet-codeigniter-php/

2018年8月6日 星期一

分享一些不錯的PHP小函式

1. 檢查 參數是否存在 與 是否為空
function checkRequest($Request, $checkArray)
{
    foreach ($checkArray as $key => $value) {
        if (array_key_exists($value, $Request) == false && empty($Request[$value])) {
            return false;
        }
    }
    return true;
}
==================
時常要校驗請求的參數是否有缺少或者是不為空值,可以利用  array_key_exists  與  empty 快速篩選出結果,就可以不用寫一大堆 if else ......

2. 調用Curl Post 
    本小魯前幾天遇到一個 會被導向301的問題,所以在
//函数中加入下面这条语句 curl抓取页面时遇到重定向的解决方法
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

/**
* [my_curl 外部連線 http]
* @param [string] $url [description]
* @param [array] $post [description]
* @return [string] $result [description]
*/
function curlPost($url, $post)
{

// echo $url . '<hr>';
// echo "<pre>";
// print_r($post);
// echo "</pre>";
// echo "<hr>";
// ====================
//初始化curl
$ch = curl_init();
//永遠抓最新
$header[] = "Cache-Control: no-cache";
$header[] = "Pragma: no-cache";
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
//等待時間
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($ch, CURLOPT_TIMEOUT, 4);
//抓取指定網頁
curl_setopt($ch, CURLOPT_URL, $url);
//post提交方式
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
//设置header
curl_setopt($ch, CURLOPT_HEADER, 0);
//要求结果為字串且输出到屏幕上
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//函数中加入下面这条语句 curl抓取页面时遇到重定向的解决方法
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$result = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpCode != 200) {
$result = "";
}
curl_close($ch);
return $result;
}


拯救老電腦

 Sempron 3850 Socket AM1入門四核處理器 2014 8ram  作業系統 windows 10 1904 評論: 八年的核心,其他的故障電腦拆解零組件都是拼裝. 整體使用上,可以基本文書,瀏覽網站,聽音樂等等都可以接受的。 下次再來繼續搞更多..