WebSocket 是什麼
1 |
瀏覽器和伺服器只需要完成一次交握,兩者之間就直接可以建立永續性的連線,並允許資料進行雙向傳送。 |
--
Workerman 是什麼
1 |
Workerman是一款纯PHP开发的开源高性能的PHP socket 服务器框架。被广泛的用于手机app、移动通讯,微信小程序,手游服务端、网络游戏、PHP聊天室、硬件通讯、智能家居、车联网、物联网等领域的开发。 支持TCP长连接,支持Websocket、HTTP等协议,支持自定义协议。拥有异步Mysql、异步Redis、异步Http、异步消息队列等众多高性能组件。 |
--
從 putty 退出背景執行也不終止
- Error while sending QUERY packet
- Keeping a process running after putty or terminal has been closed [duplicate]
1 |
nohup node app & |
--
實際使用的範例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
<?php date_default_timezone_set('Asia/Taipei'); require_once './Autoloader.php'; use Workerman\Worker; use Workerman\Lib\Timer; spl_autoload_register(function ($class_name) { $load_FileName = str_replace('\\', '/', $class_name); $file_name = __DIR__ ."/". $load_FileName .".php"; if ( is_file($file_name) === true ) { require_once( $file_name ); } }); // Use App\MySQL; use App\onConnect; use App\onMessage; use App\onClose; // ini_set('display_errors',true); ini_set('error_reporting',E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED); const MYSQL_DBNAME = 'db'; const MYSQL_HOST = 'localhost'; const MYSQL_USERNAME = 'username'; const MYSQL_PASSWORD = 'password'; define( "PDO_DSN", "mysql:dbname=". MYSQL_DBNAME .";host=". MYSQL_HOST .";charset=utf8" ); $checkUser = $connections_array = $Room = array(); // ssl 證書 $context = array( 'ssl' => array( // 使用绝对路径 'local_cert' => '/etc/httpd/ssl/apache2.crt', // 也可以是crt文件 'local_pk' => '/etc/httpd/ssl/apache2.key', 'verify_peer' => false, ) ); // 创建一个Worker监听2346端口,使用websocket协议通讯 $worker = new Worker("websocket://0.0.0.0:2346", $context); $worker->transport = 'ssl'; // 1 個進程 同步資料 $worker->count = 1; // 定時器 $worker->onWorkerStart = function() { // 每秒執行一次 Timer::add( 1, function() { global $connections_array; foreach ($connections_array as $conn) { // 整分報時 if ( date('s')=='00' ) { $JV = array( 'Command'=>'Ping', 'Value'=>date('H:i:s') ); $conn->send( json_encode($JV) ); } // 檢查是否有問題存在 沒有的話就隨機出一題 $JV = array( 'Command'=>'CheckQuestionExist', 'Value'=>'' ); $conn->send( json_encode($JV) ); } }); }; // $worker->onConnect = function($connection) { onConnect::connect($connection); }; // 接收 $worker->onMessage = function($connection, $data) { onMessage::message($connection, $data); }; // 結束 $worker->onClose = function($connection) { onClose::close($connection); }; // 运行worker Worker::runAll(); |
--
CentOS7 開啟防火牆
1 2 |
firewall-cmd --zone=public --add-port=2346/tcp --permanent firewall-cmd --reload |
--
睡一覺起來有關資料庫應用不正常問題
workerman 是一個常駐程式,說白就是一個無限迴圈的程式。MySQL 有設計一個 Wait Timeout 的機制,預設是 28800 秒 (8 小時),因為在程式初期測試時因為不可能閒置到 8 小時,而且只要一使用時間就會重新計算,所以大部分發現的時機都是睡一覺隔天使用才發現資料庫的功能都已經失效
1 2 3 4 |
SHOW VARIABLES LIKE "wait_timeout" Variable_name Value wait_timeout 28800 |
顯示處理程序列表
1 2 3 4 5 6 7 |
SHOW PROCESSLIST Id User Host db Command Time State Info 2 MJAPP_AutoDial 192.168.100.201:49854 MJAPP_AutoDial Sleep 2329 NULL 5 phpmyadmin localhost NULL Sleep 0 NULL 6 root localhost NULL Query 0 NULL |
--
MySQL server has gone away
要使用 try{} catch(){} 來攔截 MySQL 錯誤,必須在初始 PDO 時開啟錯誤攔截
1 2 |
$db = new PDO(PDO_DSN, MYSQL_USERNAME, MYSQL_PASSWORD, $options); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); |
然後在 workerman 使用 SQL 之前檢查連線
1 2 3 4 5 6 |
\App\MySQL::CheckConnection(); $sql = " SELECT LINEUser.* FROM LINEUser WHERE Create_Time>=:Create_Time "; $pre = $db->prepare($sql); $pre->bindValue(':Create_Time', $json['value']); $pre->execute(); |
\App\MySQL::CheckConnection() 程式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php namespace App; class MySQL { function __construct() { } public static function CheckConnection() { global $db; try { $db->query('select 1'); } catch (\PDOException $e) { $options = array( \PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8' ); $db = new \PDO(PDO_DSN, MYSQL_USERNAME, MYSQL_PASSWORD, $options); // $db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); } } } |
--
2,421 total views, 1 views today