Subversion Repositories php-qbpwcf

Rev

Rev 66 | Rev 232 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 66 Rev 226
Line 1... Line 1...
1
#!/usr/bin/php
1
#!/usr/bin/php
2
<?php
2
<?php
3
 
3
 
4
/*
4
/*
5
	QBPWCF, Quick Build PHP website Component base on Fedora Linux.
5
	QBPWCF, Quick Build PHP website Component base on Fedora Linux.
6
    Copyright (C) 2015~2024 Min-Jhin,Chen
6
    Copyright (C) 2014~2025 MIN ZHI, CHEN
7
 
7
 
8
    This file is part of QBPWCF.
8
    This file is part of QBPWCF.
9
 
9
 
10
    QBPWCF is free software: you can redistribute it and/or modify
10
    QBPWCF is free software: you can redistribute it and/or modify
11
    it under the terms of the GNU General Public License as published by
11
    it under the terms of the GNU General Public License as published by
Line 17... Line 17...
17
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
    GNU General Public License for more details.
18
    GNU General Public License for more details.
19
 
19
 
20
    You should have received a copy of the GNU General Public License
20
    You should have received a copy of the GNU General Public License
21
    along with QBPWCF.  If not, see <http://www.gnu.org/licenses/>.
21
    along with QBPWCF.  If not, see <http://www.gnu.org/licenses/>.
22
    
22
 
23
*/
23
*/
24
 
24
 
25
/*
25
/*
26
說明:
26
說明:
27
啟動 web socket server.
27
啟動 web socket server.
Line 65... Line 65...
65
	#結束執行,回傳shell 1.
65
	#結束執行,回傳shell 1.
66
	exit(1);
66
	exit(1);
67
 
67
 
68
	}#if end
68
	}#if end
69
 
69
 
70
#設置 include path 
70
#設置 include path
71
set_include_path($output[0].PATH_SEPARATOR.get_include_path());
71
set_include_path($output[0].PATH_SEPARATOR.get_include_path());
72
 
72
 
73
#匯入外部套件
73
#匯入外部套件
74
include("allInOne.php");
74
include("allInOne.php");
75
 
75
 
76
#說明函式
76
#說明函式
77
function help()
77
function help()
78
{
78
{
79
	#印出指令說明
79
	#印出指令說明
80
	echo "Usage of ".basename(__FILE__).":".PHP_EOL; 
80
	echo "Usage of ".basename(__FILE__).":".PHP_EOL;
81
	echo "--addr 代表 Server 要 Listen 的 address".PHP_EOL;
81
	echo "--addr 代表 Server 要 Listen 的 address".PHP_EOL;
82
	echo "--port 代表 Server 要 Listen 的 port".PHP_EOL;
82
	echo "--port 代表 Server 要 Listen 的 port".PHP_EOL;
83
	
83
 
84
	#結束執行
84
	#結束執行
85
	exit;
85
	exit;
86
}
86
}
87
 
87
 
88
#函式說明:
88
#函式說明:
Line 109... Line 109...
109
#如果解析參數失敗
109
#如果解析參數失敗
110
if($parseArgu["status"]==="false")
110
if($parseArgu["status"]==="false")
111
{
111
{
112
	#印出結果
112
	#印出結果
113
	var_dump($parseArgu);
113
	var_dump($parseArgu);
114
	
114
 
115
	#結束執行
115
	#結束執行
116
	exit;
116
	exit;
117
	
117
 
118
}#if end
118
}#if end
119
 
119
 
120
#如果沒有 addr 參數
120
#如果沒有 addr 參數
121
if(!isset($parseArgu["content"]["addr"])){
121
if(!isset($parseArgu["content"]["addr"])){
122
 
122
 
Line 185... Line 185...
185
#若執行失敗
185
#若執行失敗
186
if($checkArguments["status"]==="false"){
186
if($checkArguments["status"]==="false"){
187
 
187
 
188
	#印出結果
188
	#印出結果
189
	var_dump($checkArguments);
189
	var_dump($checkArguments);
190
	
190
 
191
	#結束執行
191
	#結束執行
192
	exit;
192
	exit;
193
 
193
 
194
	}#if end
194
	}#if end
195
 
195
 
196
#若檢查不通過
196
#若檢查不通過
197
if($checkArguments["passed"]==="false"){
197
if($checkArguments["passed"]==="false"){
198
 
198
 
199
	#印出結果
199
	#印出結果
200
	var_dump($checkArguments);
200
	var_dump($checkArguments);
201
	
201
 
202
	#結束執行
202
	#結束執行
203
	exit;
203
	exit;
204
 
204
 
205
	}#if end
205
	}#if end
206
 
206
 
Line 244... Line 244...
244
#如果 啟動失敗
244
#如果 啟動失敗
245
if($nativeSocketTcpIpServer["status"]==="false"){
245
if($nativeSocketTcpIpServer["status"]==="false"){
246
 
246
 
247
	#印出結果
247
	#印出結果
248
	var_dump($nativeSocketTcpIpServer);
248
	var_dump($nativeSocketTcpIpServer);
249
	
249
 
250
	#結束執行
250
	#結束執行
251
	exit;
251
	exit;
252
 
252
 
253
	}#if end
253
	}#if end
254
 
254
 
255
/*
255
/*
256
#函式說明:
256
#函式說明:
257
#提供取得當前路徑的功能
257
#提供取得當前路徑的功能
258
#回傳結果:
258
#回傳結果:
259
#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常. 
259
#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
260
#$result["function"],當前執行的函數名稱.
260
#$result["function"],當前執行的函數名稱.
261
#$result["content"],加密後的結果.
261
#$result["content"],加密後的結果.
262
#$result["error"],錯誤訊息陣列.
262
#$result["error"],錯誤訊息陣列.
263
#$result["argu"],使用的參數.
263
#$result["argu"],使用的參數.
264
#必填參數:
264
#必填參數:
Line 291... Line 291...
291
	#涵式說明:
291
	#涵式說明:
292
	#判斷當前環境為web還是cmd
292
	#判斷當前環境為web還是cmd
293
	#回傳結果:
293
	#回傳結果:
294
	#$result,"web"或"cmd"
294
	#$result,"web"或"cmd"
295
	if(csInformation::getEnv()==="web"){
295
	if(csInformation::getEnv()==="web"){
296
		
296
 
297
		#設置執行失敗
297
		#設置執行失敗
298
		$result["status"]="false";
298
		$result["status"]="false";
299
		
299
 
300
		#設置執行錯誤訊息
300
		#設置執行錯誤訊息
301
		$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
301
		$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
302
		
302
 
303
		#回傳結果
303
		#回傳結果
304
		return $result;
304
		return $result;
305
		
305
 
306
		}#if end
306
		}#if end
307
 
307
 
308
	#取得參數
308
	#取得參數
309
	$result["argu"]=$conf;
309
	$result["argu"]=$conf;
310
 
310
 
311
	#如果 $conf 不為陣列
311
	#如果 $conf 不為陣列
312
	if(gettype($conf)!="array"){
312
	if(gettype($conf)!="array"){
313
	
313
 
314
		#設置執行失敗
314
		#設置執行失敗
315
		$result["status"]="false";
315
		$result["status"]="false";
316
	
316
 
317
		#設置執行錯誤訊息
317
		#設置執行錯誤訊息
318
		$result["error"][]="\$conf變數須為陣列形態";
318
		$result["error"][]="\$conf變數須為陣列形態";
319
	
319
 
320
		#如果傳入的參數為 null
320
		#如果傳入的參數為 null
321
		if($conf==null){
321
		if($conf==null){
322
		
322
 
323
			#設置執行錯誤訊息
323
			#設置執行錯誤訊息
324
			$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
324
			$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
325
		
325
 
326
			}#if end
326
			}#if end
327
 
327
 
328
		#回傳結果
328
		#回傳結果
329
		return $result;
329
		return $result;
330
	
330
 
331
		}#if end
331
		}#if end
332
		
332
 
333
	#檢查參數
333
	#檢查參數
334
	#函式說明:
334
	#函式說明:
335
	#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
335
	#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
336
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
336
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
337
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
337
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
Line 362... Line 362...
362
	#$conf["canBeEmpty"]=array();
362
	#$conf["canBeEmpty"]=array();
363
	#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
363
	#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
364
	#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array();
364
	#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array();
365
	#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
365
	#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
366
	#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("listenIp","listenPort","wsMode","processFuncs");
366
	#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("listenIp","listenPort","wsMode","processFuncs");
367
	#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
367
	#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
368
	#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string","array");
368
	#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string","array");
369
	#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
369
	#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
370
	#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("127.0.0.1",null,"false",null);
370
	#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("127.0.0.1",null,"false",null);
371
	#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
371
	#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
372
	#$conf["arrayCountEqualCheck"][]=array();
372
	#$conf["arrayCountEqualCheck"][]=array();
Line 374... Line 374...
374
	#array_keys=>http://php.net/manual/en/function.array-keys.php
374
	#array_keys=>http://php.net/manual/en/function.array-keys.php
375
	#建議:
375
	#建議:
376
	#增加可省略參數全部不能為空字串或空陣列的參數功能.
376
	#增加可省略參數全部不能為空字串或空陣列的參數功能.
377
	$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
377
	$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
378
	unset($conf["variableCheck::checkArguments"]);
378
	unset($conf["variableCheck::checkArguments"]);
379
			
379
 
380
	#如果檢查參數失敗
380
	#如果檢查參數失敗
381
	if($checkArguments["status"]==="false"){
381
	if($checkArguments["status"]==="false"){
382
		
382
 
383
		#設置執行失敗
383
		#設置執行失敗
384
		$result["status"]="false";
384
		$result["status"]="false";
385
	
385
 
386
		#設置執行錯誤訊息
386
		#設置執行錯誤訊息
387
		$result["error"]=$checkArguments;
387
		$result["error"]=$checkArguments;
388
		
388
 
389
		#回傳結果
389
		#回傳結果
390
		return $result;
390
		return $result;
391
		
391
 
392
		}#if end
392
		}#if end
393
		
393
 
394
	#如果檢查參數不通過
394
	#如果檢查參數不通過
395
	if($checkArguments["passed"]==="false"){
395
	if($checkArguments["passed"]==="false"){
396
		
396
 
397
		#設置執行失敗
397
		#設置執行失敗
398
		$result["status"]="false";
398
		$result["status"]="false";
399
	
399
 
400
		#設置執行錯誤訊息
400
		#設置執行錯誤訊息
401
		$result["error"]=$checkArguments;
401
		$result["error"]=$checkArguments;
402
		
402
 
403
		#回傳結果
403
		#回傳結果
404
		return $result;
404
		return $result;
405
		
405
 
406
		}#if end
406
		}#if end
407
 
407
 
408
	#取得收到的訊息
408
	#取得收到的訊息
409
	$receivedData=$conf["data"];
409
	$receivedData=$conf["data"];
410
	
410
 
411
	#取得 server 的 socket
411
	#取得 server 的 socket
412
	$serverSocket=$conf["serverSock"];
412
	$serverSocket=$conf["serverSock"];
413
	
413
 
414
	#取得 client 的 socket
414
	#取得 client 的 socket
415
	$clientSocket=$conf["clientSock"];
415
	$clientSocket=$conf["clientSock"];
416
	
416
 
417
	#取得 client 的資訊
417
	#取得 client 的資訊
418
	$clientInfo=$conf["clientInfo"];
418
	$clientInfo=$conf["clientInfo"];
419
	
419
 
420
	#取得 client 的索引
420
	#取得 client 的索引
421
	$clientIndex=$conf["clientIndex"];
421
	$clientIndex=$conf["clientIndex"];
422
	
422
 
423
	#取得 all clients 的資訊
423
	#取得 all clients 的資訊
424
	$allConn=$conf["allConn"];
424
	$allConn=$conf["allConn"];
425
	
425
 
426
	#函式說明:
426
	#函式說明:
427
	#呼叫shell執行系統命令,並取得回傳的內容.
427
	#呼叫shell執行系統命令,並取得回傳的內容.
428
	#回傳結果:
428
	#回傳結果:
429
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
429
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
430
	#$result["error"],錯誤訊息陣列.
430
	#$result["error"],錯誤訊息陣列.
Line 477... Line 477...
477
	#exec=>http://php.net/manual/en/function.exec.php
477
	#exec=>http://php.net/manual/en/function.exec.php
478
	#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php
478
	#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php
479
	#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php
479
	#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php
480
	#備註:
480
	#備註:
481
	#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
481
	#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
482
	#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.	
482
	#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
483
	$callShell=external::callShell($conf);
483
	$callShell=external::callShell($conf);
484
	unset($conf);
484
	unset($conf);
485
	
485
 
486
	#如果執行失敗
486
	#如果執行失敗
487
	if($callShell["status"]==="false"){
487
	if($callShell["status"]==="false"){
488
	
488
 
489
		#印出結果
489
		#印出結果
490
		return $callShell;
490
		return $callShell;
491
		
491
 
492
		}#if end
492
		}#if end
493
	
493
 
494
	#取得經過編碼的執行後結果字串
494
	#取得經過編碼的執行後結果字串
495
	$callShellResultStr=base64_encode(urlencode(json_encode($callShell)));
495
	$callShellResultStr=base64_encode(urlencode(json_encode($callShell)));
496
	
496
 
497
	#debug
497
	#debug
498
	#var_dump(__LINE__,$callShellResultStr);
498
	#var_dump(__LINE__,$callShellResultStr);
499
	
499
 
500
	#函式說明:
500
	#函式說明:
501
	#加密 handshake 後要傳送的訊息 
501
	#加密 handshake 後要傳送的訊息
502
	#回傳結果:
502
	#回傳結果:
503
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
503
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
504
	#$result["error"],執行不正常結束的錯訊息陣列.
504
	#$result["error"],執行不正常結束的錯訊息陣列.
505
	#$result["content"],陣列,加密 handshake 後要傳送給 client 的訊息,若有多個代表要分為多個 Fragmentation 來依序傳送.
505
	#$result["content"],陣列,加密 handshake 後要傳送給 client 的訊息,若有多個代表要分為多個 Fragmentation 來依序傳送.
506
	#$result["argu"],陣列,使用的參數.
506
	#$result["argu"],陣列,使用的參數.
Line 512... Line 512...
512
	#$conf["ping"]="true";
512
	#$conf["ping"]="true";
513
	#參考資料:
513
	#參考資料:
514
	#https://www.rfc-editor.org/rfc/rfc6455#page-28, Web Socket Base Framing Protocol.
514
	#https://www.rfc-editor.org/rfc/rfc6455#page-28, Web Socket Base Framing Protocol.
515
	#備註:
515
	#備註:
516
	#目前$conf["text"]長度超過125會出錯.
516
	#目前$conf["text"]長度超過125會出錯.
517
	$talkback=webSock::encode($conf["webSock::encode"]);	
517
	$talkback=webSock::encode($conf["webSock::encode"]);
518
	unset($conf["webSock::encode"]);
518
	unset($conf["webSock::encode"]);
519
		
519
 
520
	#如果產生 web socket 格式封包 失敗
520
	#如果產生 web socket 格式封包 失敗
521
	if($talkback["status"]==="false"){
521
	if($talkback["status"]==="false"){
522
	
522
 
523
		#印出結果
523
		#印出結果
524
		return $talkback;
524
		return $talkback;
525
	
525
 
526
		}#if end
526
		}#if end
527
		
527
 
528
	#針對每個訊息的分段
528
	#針對每個訊息的分段
529
	foreach($talkback["content"] as $msgIndex=>$msg){
529
	foreach($talkback["content"] as $msgIndex=>$msg){
530
		
530
 
531
		#debug - start
531
		#debug - start
532
		
532
 
533
		#提示第幾個訊息
533
		#提示第幾個訊息
534
		echo "第 ".($msgIndex+1)." 個訊息的內容:".PHP_EOL;
534
		echo "第 ".($msgIndex+1)." 個訊息的內容:".PHP_EOL;
535
		
535
 
536
		#函式說明:
536
		#函式說明:
537
		#將字串中的每個字變成bytes陣列
537
		#將字串中的每個字變成bytes陣列
538
		#回傳結果:
538
		#回傳結果:
539
		#$result["content"],bytes陣列.
539
		#$result["content"],bytes陣列.
540
		#必填參數:
540
		#必填參數:
Line 546... Line 546...
546
		#無.
546
		#無.
547
		#備註:
547
		#備註:
548
		#無.
548
		#無.
549
		$str2bytesArray=stringProcess::str2bytesArray($conf["stringProcess::str2bytesArray"]);
549
		$str2bytesArray=stringProcess::str2bytesArray($conf["stringProcess::str2bytesArray"]);
550
		unset($conf["stringProcess::str2bytesArray"]);
550
		unset($conf["stringProcess::str2bytesArray"]);
551
		
551
 
552
		#如果執行失敗
552
		#如果執行失敗
553
		if($str2bytesArray["status"]==="false"){
553
		if($str2bytesArray["status"]==="false"){
554
		
554
 
555
			#印出結果
555
			#印出結果
556
			return $str2bytesArray;
556
			return $str2bytesArray;
557
		
557
 
558
			}#if end
558
			}#if end
559
		
559
 
560
		#針對每個 bytes
560
		#針對每個 bytes
561
		foreach($str2bytesArray["content"] as $byteIndex=>$bytes){
561
		foreach($str2bytesArray["content"] as $byteIndex=>$bytes){
562
		
562
 
563
			#函式說明:
563
			#函式說明:
564
			#將bytes數字(16進位)轉換為bit字串(0跟1來表述)
564
			#將bytes數字(16進位)轉換為bit字串(0跟1來表述)
565
			#回傳結果:
565
			#回傳結果:
566
			#$result["content"],bit字串(0跟1來表述).
566
			#$result["content"],bit字串(0跟1來表述).
567
			#必填參數:
567
			#必填參數:
Line 573... Line 573...
573
			#無.
573
			#無.
574
			#備註:
574
			#備註:
575
			#無.
575
			#無.
576
			$bytes2bitString=stringProcess::bytes2bitString($conf["stringProcess::bytes2bitString"]);
576
			$bytes2bitString=stringProcess::bytes2bitString($conf["stringProcess::bytes2bitString"]);
577
			unset($conf["stringProcess::bytes2bitString"]);
577
			unset($conf["stringProcess::bytes2bitString"]);
578
			
578
 
579
			#如果執行失敗
579
			#如果執行失敗
580
			if($bytes2bitString["status"]==="false"){
580
			if($bytes2bitString["status"]==="false"){
581
			
581
 
582
				#印出結果
582
				#印出結果
583
				return $bytes2bitString;
583
				return $bytes2bitString;
584
		
584
 
585
			}#if end
585
			}#if end
586
			
586
 
587
			#印出 8bit
587
			#印出 8bit
588
			echo $bytes2bitString["content"];
588
			echo $bytes2bitString["content"];
589
			
589
 
590
			#如果為 32 bit 結束
590
			#如果為 32 bit 結束
591
			if(($byteIndex+1)%4===0){
591
			if(($byteIndex+1)%4===0){
592
			
592
 
593
				#印出換行符號
593
				#印出換行符號
594
				echo PHP_EOL;
594
				echo PHP_EOL;
595
			
595
 
596
				}#if end
596
				}#if end
597
		
597
 
598
			}#foreach end
598
			}#foreach end
599
		
599
 
600
		#debug - end
600
		#debug - end
601
		
601
 
602
		#回傳訊息
602
		#回傳訊息
603
		$socket_write=socket_write($clientSocket, $msg, strlen($msg));
603
		$socket_write=socket_write($clientSocket, $msg, strlen($msg));
604
 
604
 
605
		#換行
605
		#換行
606
		echo PHP_EOL;
606
		echo PHP_EOL;
607
 
607
 
608
		#debug
608
		#debug
609
		#var_dump(__LINE__,$socket_write,socket_strerror(socket_last_error($clientSocket)));
609
		#var_dump(__LINE__,$socket_write,socket_strerror(socket_last_error($clientSocket)));
610
		
610
 
611
		}#foreach end	
611
		}#foreach end
612
	
612
 
613
	#初始化結果
613
	#初始化結果
614
	$result=array();
614
	$result=array();
615
 
615
 
616
	#設置執行正常
616
	#設置執行正常
617
	$result["status"]="continue";
617
	$result["status"]="continue";
618
	
618
 
619
	#回傳結果
619
	#回傳結果
620
	return $result;
620
	return $result;
621
 
621
 
622
	}#function pwd end
622
	}#function pwd end
623
	
623
 
624
/*
624
/*
625
#函式說明:
625
#函式說明:
626
#讓 web socket server 尋找對應的 session 檔案內容,看是否透過 email 認證了.
626
#讓 web socket server 尋找對應的 session 檔案內容,看是否透過 email 認證了.
627
#回傳結果:
627
#回傳結果:
628
#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常. 
628
#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
629
#$result["function"],當前執行的函數名稱.
629
#$result["function"],當前執行的函數名稱.
630
#$result["content"],加密後的結果.
630
#$result["content"],加密後的結果.
631
#$result["error"],錯誤訊息陣列.
631
#$result["error"],錯誤訊息陣列.
632
#$result["argu"],使用的參數.
632
#$result["argu"],使用的參數.
633
#必填參數:
633
#必填參數:
Line 660... Line 660...
660
	#涵式說明:
660
	#涵式說明:
661
	#判斷當前環境為web還是cmd
661
	#判斷當前環境為web還是cmd
662
	#回傳結果:
662
	#回傳結果:
663
	#$result,"web"或"cmd"
663
	#$result,"web"或"cmd"
664
	if(csInformation::getEnv()==="web"){
664
	if(csInformation::getEnv()==="web"){
665
		
665
 
666
		#設置執行失敗
666
		#設置執行失敗
667
		$result["status"]="false";
667
		$result["status"]="false";
668
		
668
 
669
		#設置執行錯誤訊息
669
		#設置執行錯誤訊息
670
		$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
670
		$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
671
		
671
 
672
		#回傳結果
672
		#回傳結果
673
		return $result;
673
		return $result;
674
		
674
 
675
		}#if end
675
		}#if end
676
 
676
 
677
	#取得參數
677
	#取得參數
678
	$result["argu"]=$conf;
678
	$result["argu"]=$conf;
679
 
679
 
680
	#如果 $conf 不為陣列
680
	#如果 $conf 不為陣列
681
	if(gettype($conf)!="array"){
681
	if(gettype($conf)!="array"){
682
	
682
 
683
		#設置執行失敗
683
		#設置執行失敗
684
		$result["status"]="false";
684
		$result["status"]="false";
685
	
685
 
686
		#設置執行錯誤訊息
686
		#設置執行錯誤訊息
687
		$result["error"][]="\$conf變數須為陣列形態";
687
		$result["error"][]="\$conf變數須為陣列形態";
688
	
688
 
689
		#如果傳入的參數為 null
689
		#如果傳入的參數為 null
690
		if($conf==null){
690
		if($conf==null){
691
		
691
 
692
			#設置執行錯誤訊息
692
			#設置執行錯誤訊息
693
			$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
693
			$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
694
		
694
 
695
			}#if end
695
			}#if end
696
 
696
 
697
		#回傳結果
697
		#回傳結果
698
		return $result;
698
		return $result;
699
	
699
 
700
		}#if end
700
		}#if end
701
	
701
 
702
	#檢查參數
702
	#檢查參數
703
	#函式說明:
703
	#函式說明:
704
	#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
704
	#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
705
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
705
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
706
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
706
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
Line 731... Line 731...
731
	#$conf["canBeEmpty"]=array();
731
	#$conf["canBeEmpty"]=array();
732
	#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
732
	#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
733
	#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array();
733
	#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array();
734
	#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
734
	#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
735
	#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("listenIp","listenPort","wsMode","processFuncs");
735
	#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("listenIp","listenPort","wsMode","processFuncs");
736
	#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
736
	#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
737
	#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string","array");
737
	#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string","array");
738
	#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
738
	#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
739
	#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("127.0.0.1",null,"false",null);
739
	#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("127.0.0.1",null,"false",null);
740
	#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
740
	#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
741
	#$conf["arrayCountEqualCheck"][]=array();
741
	#$conf["arrayCountEqualCheck"][]=array();
Line 743... Line 743...
743
	#array_keys=>http://php.net/manual/en/function.array-keys.php
743
	#array_keys=>http://php.net/manual/en/function.array-keys.php
744
	#建議:
744
	#建議:
745
	#增加可省略參數全部不能為空字串或空陣列的參數功能.
745
	#增加可省略參數全部不能為空字串或空陣列的參數功能.
746
	$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
746
	$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
747
	unset($conf["variableCheck::checkArguments"]);
747
	unset($conf["variableCheck::checkArguments"]);
748
	
748
 
749
	#如果檢查參數失敗
749
	#如果檢查參數失敗
750
	if($checkArguments["status"]==="false"){
750
	if($checkArguments["status"]==="false"){
751
		
751
 
752
		#設置執行失敗
752
		#設置執行失敗
753
		$result["status"]="false";
753
		$result["status"]="false";
754
	
754
 
755
		#設置執行錯誤訊息
755
		#設置執行錯誤訊息
756
		$result["error"]=$checkArguments;
756
		$result["error"]=$checkArguments;
757
		
757
 
758
		#回傳結果
758
		#回傳結果
759
		return $result;
759
		return $result;
760
		
760
 
761
		}#if end
761
		}#if end
762
		
762
 
763
	#如果檢查參數不通過
763
	#如果檢查參數不通過
764
	if($checkArguments["passed"]==="false"){
764
	if($checkArguments["passed"]==="false"){
765
		
765
 
766
		#設置執行失敗
766
		#設置執行失敗
767
		$result["status"]="false";
767
		$result["status"]="false";
768
	
768
 
769
		#設置執行錯誤訊息
769
		#設置執行錯誤訊息
770
		$result["error"]=$checkArguments;
770
		$result["error"]=$checkArguments;
771
		
771
 
772
		#回傳結果
772
		#回傳結果
773
		return $result;
773
		return $result;
774
		
774
 
775
		}#if end
775
		}#if end
776
 
776
 
777
	#取得收到的訊息
777
	#取得收到的訊息
778
	$receivedData=$conf["data"];
778
	$receivedData=$conf["data"];
779
	
779
 
780
	#取得 server 的 socket
780
	#取得 server 的 socket
781
	$serverSocket=$conf["serverSock"];
781
	$serverSocket=$conf["serverSock"];
782
	
782
 
783
	#取得 client 的 socket
783
	#取得 client 的 socket
784
	$clientSocket=$conf["clientSock"];
784
	$clientSocket=$conf["clientSock"];
785
	
785
 
786
	#取得 client 的資訊
786
	#取得 client 的資訊
787
	$clientInfo=$conf["clientInfo"];
787
	$clientInfo=$conf["clientInfo"];
788
	
788
 
789
	#取得 client 的索引
789
	#取得 client 的索引
790
	$clientIndex=$conf["clientIndex"];
790
	$clientIndex=$conf["clientIndex"];
791
	
791
 
792
	#取得 all clients 的資訊
792
	#取得 all clients 的資訊
793
	$allConn=$conf["allConn"];
793
	$allConn=$conf["allConn"];
794
	
794
 
795
	#解析收到的資料
795
	#解析收到的資料
796
	$receivedData=json_decode($receivedData);
796
	$receivedData=json_decode($receivedData);
797
	
797
 
798
	#檢查參數($receivedData)
798
	#檢查參數($receivedData)
799
	#函式說明:
799
	#函式說明:
800
	#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
800
	#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
801
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
801
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
802
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
802
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
Line 827... Line 827...
827
	#$conf["canBeEmpty"]=array();
827
	#$conf["canBeEmpty"]=array();
828
	#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
828
	#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
829
	#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array();
829
	#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array();
830
	#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
830
	#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
831
	$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("timeout");
831
	$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("timeout");
832
	#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
832
	#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
833
	$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
833
	$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
834
	#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
834
	#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
835
	$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("300");
835
	$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("300");
836
	#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
836
	#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
837
	#$conf["arrayCountEqualCheck"][]=array();
837
	#$conf["arrayCountEqualCheck"][]=array();
Line 839... Line 839...
839
	#array_keys=>http://php.net/manual/en/function.array-keys.php
839
	#array_keys=>http://php.net/manual/en/function.array-keys.php
840
	#建議:
840
	#建議:
841
	#增加可省略參數全部不能為空字串或空陣列的參數功能.
841
	#增加可省略參數全部不能為空字串或空陣列的參數功能.
842
	$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
842
	$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
843
	unset($conf["variableCheck::checkArguments"]);
843
	unset($conf["variableCheck::checkArguments"]);
844
	
844
 
845
	#如果檢查參數失敗
845
	#如果檢查參數失敗
846
	if($checkArguments["status"]==="false"){
846
	if($checkArguments["status"]==="false"){
847
		
847
 
848
		#設置執行失敗
848
		#設置執行失敗
849
		$result["status"]="false";
849
		$result["status"]="false";
850
	
850
 
851
		#設置執行錯誤訊息
851
		#設置執行錯誤訊息
852
		$result["error"]=$checkArguments;
852
		$result["error"]=$checkArguments;
853
		
853
 
854
		#回傳結果
854
		#回傳結果
855
		return $result;
855
		return $result;
856
		
856
 
857
		}#if end
857
		}#if end
858
		
858
 
859
	#如果檢查參數不通過
859
	#如果檢查參數不通過
860
	if($checkArguments["passed"]==="false"){
860
	if($checkArguments["passed"]==="false"){
861
		
861
 
862
		#設置執行失敗
862
		#設置執行失敗
863
		$result["status"]="false";
863
		$result["status"]="false";
864
	
864
 
865
		#設置執行錯誤訊息
865
		#設置執行錯誤訊息
866
		$result["error"]=$checkArguments;
866
		$result["error"]=$checkArguments;
867
		
867
 
868
		#回傳結果
868
		#回傳結果
869
		return $result;
869
		return $result;
870
		
870
 
871
		}#if end
871
		}#if end
872
		
872
 
873
	#告訴 web socket server 要尋找對應的session檔案內容,看是否透過email認證了.
873
	#告訴 web socket server 要尋找對應的session檔案內容,看是否透過email認證了.
874
	#...
874
	#...
875
	
-
 
876
	}#function checkStatusOfEmailVarify end
-
 
877
875
 
-
 
876
	}#function checkStatusOfEmailVarify end
-
 
877