Subversion Repositories php-qbpwcf

Rev

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

Rev 220 Rev 226
Line 1... Line 1...
1
<?php
1
<?php
2
/*
2
/*
3
 
3
 
4
	QBPWCF, Quick Build PHP website Component base on Fedora Linux.
4
	QBPWCF, Quick Build PHP website Component base on Fedora Linux.
5
    Copyright (C) 2015~2024 Min-Jhin,Chen
5
    Copyright (C) 2014~2025 MIN ZHI, CHEN
6
 
6
 
7
    This file is part of QBPWCF.
7
    This file is part of QBPWCF.
8
 
8
 
9
    QBPWCF is free software: you can redistribute it and/or modify
9
    QBPWCF is free software: you can redistribute it and/or modify
10
    it under the terms of the GNU General Public License as published by
10
    it under the terms of the GNU General Public License as published by
Line 19... Line 19...
19
    You should have received a copy of the GNU General Public License
19
    You should have received a copy of the GNU General Public License
20
    along with QBPWCF.  If not, see <http://www.gnu.org/licenses/>.
20
    along with QBPWCF.  If not, see <http://www.gnu.org/licenses/>.
21
 
21
 
22
*/
22
*/
23
namespace qbpwcf;
23
namespace qbpwcf;
24
	
24
 
25
/*
25
/*
26
類別說明:
26
類別說明:
27
跟socket應用相關的類別.
27
跟socket應用相關的類別.
28
備註:
28
備註:
29
無.
29
無.
Line 46... Line 46...
46
	#__call=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic
46
	#__call=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic
47
	#備註:
47
	#備註:
48
	#無.
48
	#無.
49
	*/
49
	*/
50
	public function __call($method,$arguments){
50
	public function __call($method,$arguments){
51
		
51
 
52
		#取得當前執行的函式
52
		#取得當前執行的函式
53
		$result["function"]=__FUNCTION__;
53
		$result["function"]=__FUNCTION__;
54
		
54
 
55
		#設置執行不正常
55
		#設置執行不正常
56
		$result["status"]="false";
56
		$result["status"]="false";
57
		
57
 
58
		#設置執行錯誤
58
		#設置執行錯誤
59
		$result["error"][]=__NAMESPACE__ ."/".$method."() 不存在!";
59
		$result["error"][]=__NAMESPACE__ ."/".$method."() 不存在!";
60
		
60
 
61
		#設置所丟入的參數
61
		#設置所丟入的參數
62
		$result["error"][]=$arguments;
62
		$result["error"][]=$arguments;
63
		
63
 
64
		#回傳結果
64
		#回傳結果
65
		return $result;
65
		return $result;
66
		
66
 
67
		}#function __call end
67
		}#function __call end
68
		
68
 
69
	/*
69
	/*
70
	#函式說明:
70
	#函式說明:
71
	#當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.
71
	#當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.
72
	#回傳結果:
72
	#回傳結果:
73
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
73
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
Line 82... Line 82...
82
	#__callStatic=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic
82
	#__callStatic=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic
83
	#備註:
83
	#備註:
84
	#無.
84
	#無.
85
	*/
85
	*/
86
	public static function __callStatic($method,$arguments){
86
	public static function __callStatic($method,$arguments){
87
		
87
 
88
		#取得當前執行的函式
88
		#取得當前執行的函式
89
		$result["function"]=__FUNCTION__;
89
		$result["function"]=__FUNCTION__;
90
		
90
 
91
		#設置執行不正常
91
		#設置執行不正常
92
		$result["status"]="false";
92
		$result["status"]="false";
93
		
93
 
94
		#設置執行錯誤
94
		#設置執行錯誤
95
		$result["error"][]="欲呼叫的". __NAMESPACE__ ."/".$method."() 不存在!";
95
		$result["error"][]="欲呼叫的". __NAMESPACE__ ."/".$method."() 不存在!";
96
		
96
 
97
		#設置所丟入的參數
97
		#設置所丟入的參數
98
		$result["error"][]=$arguments;
98
		$result["error"][]=$arguments;
99
		
99
 
100
		#回傳結果
100
		#回傳結果
101
		return $result;
101
		return $result;
102
		
102
 
103
		}#function __callStatic end	
103
		}#function __callStatic end
104
	
104
 
105
	/*
105
	/*
106
	#函式說明:
106
	#函式說明:
107
	#建立 unix domain socket server, 僅提供具備檔案存取權限的用戶使用,預設提供可以下達任何指令的功能.
107
	#建立 unix domain socket server, 僅提供具備檔案存取權限的用戶使用,預設提供可以下達任何指令的功能.
108
	#回傳結果:
108
	#回傳結果:
109
	#$result["status"],"true"代表執行正常;"false"代表執行不正常.
109
	#$result["status"],"true"代表執行正常;"false"代表執行不正常.
Line 139... Line 139...
139
	#http://php.net/manual/en/function.stream-socket-server.php
139
	#http://php.net/manual/en/function.stream-socket-server.php
140
	#備註:
140
	#備註:
141
	#無.
141
	#無.
142
	*/
142
	*/
143
	public static function unixDomainSockServer(&$conf){
143
	public static function unixDomainSockServer(&$conf){
144
		
144
 
145
		#初始化要回傳的結果
145
		#初始化要回傳的結果
146
		$result=array();
146
		$result=array();
147
 
147
 
148
		#取得當前執行的函數名稱
148
		#取得當前執行的函數名稱
149
		$result["function"]=__FUNCTION__;
149
		$result["function"]=__FUNCTION__;
150
		
150
 
151
		#如果沒有參數
151
		#如果沒有參數
152
		if(func_num_args()==0){
152
		if(func_num_args()==0){
153
			
153
 
154
			#設置執行失敗
154
			#設置執行失敗
155
			$result["status"]="false";
155
			$result["status"]="false";
156
			
156
 
157
			#設置執行錯誤訊息
157
			#設置執行錯誤訊息
158
			$result["error"]="函數".$result["function"]."需要參數";
158
			$result["error"]="函數".$result["function"]."需要參數";
159
			
159
 
160
			#回傳結果
160
			#回傳結果
161
			return $result;
161
			return $result;
162
			
162
 
163
			}#if end
163
			}#if end
164
 
164
 
165
		#涵式說明:
165
		#涵式說明:
166
		#判斷當前環境為web還是cmd
166
		#判斷當前環境為web還是cmd
167
		#回傳結果:
167
		#回傳結果:
168
		#$result,"web"或"cmd"
168
		#$result,"web"或"cmd"
169
		if(csInformation::getEnv()==="web"){
169
		if(csInformation::getEnv()==="web"){
170
			
170
 
171
			#設置執行失敗
171
			#設置執行失敗
172
			$result["status"]="false";
172
			$result["status"]="false";
173
			
173
 
174
			#設置執行錯誤訊息
174
			#設置執行錯誤訊息
175
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
175
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
176
			
176
 
177
			#回傳結果
177
			#回傳結果
178
			return $result;
178
			return $result;
179
			
179
 
180
			}#if end
180
			}#if end
181
		
181
 
182
		#取得參數
182
		#取得參數
183
		$result["argu"]=$conf;
183
		$result["argu"]=$conf;
184
 
184
 
185
		#如果 $conf 不為陣列
185
		#如果 $conf 不為陣列
186
		if(gettype($conf)!="array"){
186
		if(gettype($conf)!="array"){
187
		
187
 
188
			#設置執行失敗
188
			#設置執行失敗
189
			$result["status"]="false";
189
			$result["status"]="false";
190
		
190
 
191
			#設置執行錯誤訊息
191
			#設置執行錯誤訊息
192
			$result["error"][]="\$conf變數須為陣列形態";
192
			$result["error"][]="\$conf變數須為陣列形態";
193
		
193
 
194
			#如果傳入的參數為 null
194
			#如果傳入的參數為 null
195
			if($conf==null){
195
			if($conf==null){
196
			
196
 
197
				#設置執行錯誤訊息
197
				#設置執行錯誤訊息
198
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
198
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
199
			
199
 
200
				}#if end
200
				}#if end
201
 
201
 
202
			#回傳結果
202
			#回傳結果
203
			return $result;
203
			return $result;
204
		
204
 
205
			}#if end
205
			}#if end
206
			
206
 
207
		#檢查參數
207
		#檢查參數
208
		#函式說明:
208
		#函式說明:
209
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
209
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
210
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
210
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
211
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
211
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
Line 219... Line 219...
219
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
219
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
220
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
220
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
221
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
221
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
222
		#必填寫的參數:
222
		#必填寫的參數:
223
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
223
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
224
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;	
224
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
225
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
225
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
226
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
226
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
227
		#可以省略的參數:
227
		#可以省略的參數:
228
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
228
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
229
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("sock","fileArgu");
229
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("sock","fileArgu");
Line 237... Line 237...
237
		#$conf["canBeEmpty"]=array();
237
		#$conf["canBeEmpty"]=array();
238
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
238
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
239
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("changeOwner","changePermission","sessionTimeout","addOnProcessFunc","funcToRunWhenIdle","infoToFunction","shutdownStrAddr");
239
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("changeOwner","changePermission","sessionTimeout","addOnProcessFunc","funcToRunWhenIdle","infoToFunction","shutdownStrAddr");
240
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
240
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
241
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("changeOwner","changePermission","sessionTimeout","addOnProcessFunc","funcToRunWhenIdle","infoToFunction","paramsForFuncToRunWhenIdle","shutdownStrAddr");
241
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("changeOwner","changePermission","sessionTimeout","addOnProcessFunc","funcToRunWhenIdle","infoToFunction","paramsForFuncToRunWhenIdle","shutdownStrAddr");
242
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
242
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
243
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string","array","array","array","array","array");
243
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string","array","array","array","array","array");
244
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf[\"mustBeFilledVar\"]".
244
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf[\"mustBeFilledVar\"]".
245
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("root.".webUser,null,"300",null,null,null,array(),null);
245
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("root.".webUser,null,"300",null,null,null,array(),null);
246
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
246
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
247
		#$conf["disallowAllSkipableVarIsEmpty"]="";
247
		#$conf["disallowAllSkipableVarIsEmpty"]="";
Line 251... Line 251...
251
		#$conf["arrayCountEqualCheck"][]=array();
251
		#$conf["arrayCountEqualCheck"][]=array();
252
		#參考資料來源:
252
		#參考資料來源:
253
		#array_keys=>http://php.net/manual/en/function.array-keys.php
253
		#array_keys=>http://php.net/manual/en/function.array-keys.php
254
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
254
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
255
		unset($conf["variableCheck::checkArguments"]);
255
		unset($conf["variableCheck::checkArguments"]);
256
			
256
 
257
		#如果檢查參數失敗
257
		#如果檢查參數失敗
258
		if($checkArguments["status"]==="false"){
258
		if($checkArguments["status"]==="false"){
259
			
259
 
260
			#設置執行失敗
260
			#設置執行失敗
261
			$result["status"]="false";
261
			$result["status"]="false";
262
			
262
 
263
			#設置錯誤訊息
263
			#設置錯誤訊息
264
			$result["error"]=$checkArguments;
264
			$result["error"]=$checkArguments;
265
			
265
 
266
			#回傳結果
266
			#回傳結果
267
			return $result;
267
			return $result;
268
			
268
 
269
			}#if end
269
			}#if end
270
			
270
 
271
		#如果檢查參數不通過
271
		#如果檢查參數不通過
272
		if($checkArguments["passed"]==="false"){
272
		if($checkArguments["passed"]==="false"){
273
			
273
 
274
			#設置執行失敗
274
			#設置執行失敗
275
			$result["status"]="false";
275
			$result["status"]="false";
276
			
276
 
277
			#設置錯誤訊息
277
			#設置錯誤訊息
278
			$result["error"]=$checkArguments;
278
			$result["error"]=$checkArguments;
279
			
279
 
280
			#回傳結果
280
			#回傳結果
281
			return $result;
281
			return $result;
282
			
282
 
283
			}#if end
283
			}#if end
284
		
284
 
285
		#縮減 socket 的路徑,避免出錯.
285
		#縮減 socket 的路徑,避免出錯.
286
		#函式說明:
286
		#函式說明:
287
		#將檔案目錄的絕對位置中的 "../" 剔除變成直觀的路徑.
287
		#將檔案目錄的絕對位置中的 "../" 剔除變成直觀的路徑.
288
		#回傳結果:
288
		#回傳結果:
289
		#$result["status"],執行是否成功,"true"代表執行成功,"false"代表執行失敗.
289
		#$result["status"],執行是否成功,"true"代表執行成功,"false"代表執行失敗.
Line 301... Line 301...
301
		#無.
301
		#無.
302
		#備註:
302
		#備註:
303
		#考慮用realpath取代
303
		#考慮用realpath取代
304
		$changeDirByDotDotSolidus=stringProcess::changeDirByDotDotSolidus($conf["stringProcess::changeDirByDotDotSolidus"]);
304
		$changeDirByDotDotSolidus=stringProcess::changeDirByDotDotSolidus($conf["stringProcess::changeDirByDotDotSolidus"]);
305
		unset($conf["stringProcess::changeDirByDotDotSolidus"]);
305
		unset($conf["stringProcess::changeDirByDotDotSolidus"]);
306
		
306
 
307
		#如果執行異常
307
		#如果執行異常
308
		if($changeDirByDotDotSolidus["status"]==="false"){
308
		if($changeDirByDotDotSolidus["status"]==="false"){
309
			
309
 
310
			#設置執行失敗
310
			#設置執行失敗
311
			$result["status"]="false";
311
			$result["status"]="false";
312
			
312
 
313
			#設置錯誤訊息
313
			#設置錯誤訊息
314
			$result["error"]=$changeDirByDotDotSolidus;
314
			$result["error"]=$changeDirByDotDotSolidus;
315
			
315
 
316
			#回傳結果
316
			#回傳結果
317
			return $result;
317
			return $result;
318
			
318
 
319
			}#if end
319
			}#if end
320
		
320
 
321
		#取得整理過後的直觀路徑
321
		#取得整理過後的直觀路徑
322
		$conf["sock"]=$changeDirByDotDotSolidus["changedPath"];
322
		$conf["sock"]=$changeDirByDotDotSolidus["changedPath"];
323
		
323
 
324
		#取得 socket 的路徑
324
		#取得 socket 的路徑
325
		#函式說明:
325
		#函式說明:
326
		#將字串特定關鍵字與其後面的內容剔除
326
		#將字串特定關鍵字與其後面的內容剔除
327
		#回傳結果:
327
		#回傳結果:
328
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
328
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
Line 345... Line 345...
345
		#無.
345
		#無.
346
		#備註:
346
		#備註:
347
		#無.
347
		#無.
348
		$delStrAfterKeyWord=stringProcess::delStrAfterKeyWord($conf["stringProcess::delStrAfterKeyWord"]);
348
		$delStrAfterKeyWord=stringProcess::delStrAfterKeyWord($conf["stringProcess::delStrAfterKeyWord"]);
349
		unset($conf["stringProcess::delStrAfterKeyWord"]);
349
		unset($conf["stringProcess::delStrAfterKeyWord"]);
350
		
350
 
351
		#如果執行失敗
351
		#如果執行失敗
352
		if($delStrAfterKeyWord["status"]==="false"){
352
		if($delStrAfterKeyWord["status"]==="false"){
353
		
353
 
354
			#設置執行失敗
354
			#設置執行失敗
355
			$result["status"]="false";
355
			$result["status"]="false";
356
			
356
 
357
			#設置錯誤訊息
357
			#設置錯誤訊息
358
			$result["error"][]=$delStrAfterKeyWord;
358
			$result["error"][]=$delStrAfterKeyWord;
359
			
359
 
360
			#設置錯誤訊息
360
			#設置錯誤訊息
361
			$result["error"][]="建立 unix domain socket(".$conf["sock"].") 失敗";
361
			$result["error"][]="建立 unix domain socket(".$conf["sock"].") 失敗";
362
			
362
 
363
			#印出錯誤訊息
363
			#印出錯誤訊息
364
			echo print_r($result,true);
364
			echo print_r($result,true);
365
			
365
 
366
			#回傳結果
366
			#回傳結果
367
			return $result;
367
			return $result;
368
		
368
 
369
			}#if end
369
			}#if end
370
		
370
 
371
		#如果有 "/"
371
		#如果有 "/"
372
		if($delStrAfterKeyWord["founded"]==="true"){
372
		if($delStrAfterKeyWord["founded"]==="true"){
373
		
373
 
374
			#確保建立socket的路徑有存在
374
			#確保建立socket的路徑有存在
375
			#函式說明:
375
			#函式說明:
376
			#確保路徑存在.
376
			#確保路徑存在.
377
			#回傳結果:
377
			#回傳結果:
378
			#$result["status"],執行正常與否,"true"代表正常,"false"代表不正常.
378
			#$result["status"],執行正常與否,"true"代表正常,"false"代表不正常.
Line 397... Line 397...
397
			#無.
397
			#無.
398
			#備註:
398
			#備註:
399
			#無.
399
			#無.
400
			$validatePath=fileAccess::validatePath($conf["fileAccess::validatePath"]);
400
			$validatePath=fileAccess::validatePath($conf["fileAccess::validatePath"]);
401
			unset($conf["fileAccess::validatePath"]);
401
			unset($conf["fileAccess::validatePath"]);
402
			
402
 
403
			#如果執行失敗
403
			#如果執行失敗
404
			if($validatePath["status"]==="false"){
404
			if($validatePath["status"]==="false"){
405
			
405
 
406
				#設置執行失敗
406
				#設置執行失敗
407
				$result["status"]="false";
407
				$result["status"]="false";
408
				
408
 
409
				#設置錯誤訊息
409
				#設置錯誤訊息
410
				$result["error"][]=$validatePath;
410
				$result["error"][]=$validatePath;
411
				
411
 
412
				#設置錯誤訊息
412
				#設置錯誤訊息
413
				$result["error"][]="建立 unix domain socket(".$conf["sock"].") 失敗";
413
				$result["error"][]="建立 unix domain socket(".$conf["sock"].") 失敗";
414
				
414
 
415
				#印出錯誤訊息
415
				#印出錯誤訊息
416
				echo print_r($result,true);
416
				echo print_r($result,true);
417
				
417
 
418
				#回傳結果
418
				#回傳結果
419
				return $result;
419
				return $result;
420
				
420
 
421
				}#if end
421
				}#if end
422
		
422
 
423
			}#if end
423
			}#if end
424
		
424
 
425
		#如果同名 unix domain socket file 存在
425
		#如果同名 unix domain socket file 存在
426
		if(file_exists($conf["sock"])){
426
		if(file_exists($conf["sock"])){
427
			
427
 
428
			#則移除之.
428
			#則移除之.
429
			unlink($conf["sock"]);
429
			unlink($conf["sock"]);
430
		
430
 
431
			}#if end
431
			}#if end
432
		
432
 
433
		#預設的 unix socket addr
433
		#預設的 unix socket addr
434
		$unixAddr="unix://".$conf["sock"];
434
		$unixAddr="unix://".$conf["sock"];
435
		
435
 
436
		#建立 unix domain socket
436
		#建立 unix domain socket
437
		$socket=stream_socket_server($unixAddr, $errno, $errstr);
437
		$socket=stream_socket_server($unixAddr, $errno, $errstr);
438
		
438
 
439
		#如果建立 unix domain socket 失敗
439
		#如果建立 unix domain socket 失敗
440
		if(!$socket){
440
		if(!$socket){
441
			
441
 
442
			#設置執行失敗
442
			#設置執行失敗
443
			$result["status"]="false";
443
			$result["status"]="false";
444
			
444
 
445
			#設置錯誤訊息
445
			#設置錯誤訊息
446
			$result["error"][]=$errstr." (".$errno.")";
446
			$result["error"][]=$errstr." (".$errno.")";
447
			
447
 
448
			#設置錯誤訊息
448
			#設置錯誤訊息
449
			$result["error"][]="建立 unix domain socket(".$conf["sock"].") 失敗";
449
			$result["error"][]="建立 unix domain socket(".$conf["sock"].") 失敗";
450
			
450
 
451
			#印出錯誤訊息
451
			#印出錯誤訊息
452
			echo print_r($result,true);
452
			echo print_r($result,true);
453
			
453
 
454
			#回傳結果
454
			#回傳結果
455
			return $result;
455
			return $result;
456
	
456
 
457
			}#if end
457
			}#if end
458
			
458
 
459
		#如果建立 unix domain socket 成功
459
		#如果建立 unix domain socket 成功
460
		else{
460
		else{
461
			
461
 
462
			#產生用於代表結束本函式的字串
462
			#產生用於代表結束本函式的字串
463
			#函式說明:
463
			#函式說明:
464
			#使用 linux 的 uuid 指令來產生 uuid 字串
464
			#使用 linux 的 uuid 指令來產生 uuid 字串
465
			#回傳結果:
465
			#回傳結果:
466
			#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
466
			#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
Line 474... Line 474...
474
			#參考資料:
474
			#參考資料:
475
			#無.
475
			#無.
476
			#備註:
476
			#備註:
477
			#無.
477
			#無.
478
			$uuid=cmd::uuid();
478
			$uuid=cmd::uuid();
479
			
479
 
480
			#如果執行失敗
480
			#如果執行失敗
481
			if($uuid["status"]==="false"){
481
			if($uuid["status"]==="false"){
482
			
482
 
483
				#設置執行失敗
483
				#設置執行失敗
484
				$result["status"]="false";
484
				$result["status"]="false";
485
				
485
 
486
				#設置錯誤訊息
486
				#設置錯誤訊息
487
				$result["error"]=$uuid;
487
				$result["error"]=$uuid;
488
				
488
 
489
				#回傳結果
489
				#回傳結果
490
				return $result;
490
				return $result;
491
			
491
 
492
				}#if end
492
				}#if end
493
			
493
 
494
			#設置代表結束本服務的uuid字串
494
			#設置代表結束本服務的uuid字串
495
			$shutdownStr=$uuid["content"];
495
			$shutdownStr=$uuid["content"];
496
			
496
 
497
			#如果沒有設置
497
			#如果沒有設置
498
			if(!isset($conf["shutdownStrAddr"])){
498
			if(!isset($conf["shutdownStrAddr"])){
499
			
499
 
500
				#初始化存放 shutdownStr 的檔案
500
				#初始化存放 shutdownStr 的檔案
501
				$conf["shutdownStrAddr"]=$conf["sock"].".shutdownStr";
501
				$conf["shutdownStrAddr"]=$conf["sock"].".shutdownStr";
502
				
502
 
503
				}#if end
503
				}#if end
504
				
504
 
505
			#如果檔案位置名稱跟socket一樣
505
			#如果檔案位置名稱跟socket一樣
506
			else if($conf["sock"]===$conf["shutdownStrAddr"]){
506
			else if($conf["sock"]===$conf["shutdownStrAddr"]){
507
	
507
 
508
				#設置執行失敗
508
				#設置執行失敗
509
				$result["status"]="false";
509
				$result["status"]="false";
510
				
510
 
511
				#設置錯誤訊息
511
				#設置錯誤訊息
512
				$result["error"][]="參數shutdownStrAddr跟sock不可一樣";
512
				$result["error"][]="參數shutdownStrAddr跟sock不可一樣";
513
				
513
 
514
				#設置錯誤訊息
514
				#設置錯誤訊息
515
				$result["error"][]=$checkArguments;
515
				$result["error"][]=$checkArguments;
516
				
516
 
517
				#回傳結果
517
				#回傳結果
518
				return $result;
518
				return $result;
519
			
519
 
520
				}#else end
520
				}#else end
521
			
521
 
522
			#建立裡面儲存若要結束本程式需要接收到什麼樣的字串
522
			#建立裡面儲存若要結束本程式需要接收到什麼樣的字串
523
			#函式說明:
523
			#函式說明:
524
			#將字串寫入到檔案
524
			#將字串寫入到檔案
525
			#回傳結果:
525
			#回傳結果:
526
			#$result["status"],"true"表示檔案寫入成功,"false"表示檔案寫入失敗.
526
			#$result["status"],"true"表示檔案寫入成功,"false"表示檔案寫入失敗.
Line 553... Line 553...
553
			#無.
553
			#無.
554
			#備註:
554
			#備註:
555
			#無.
555
			#無.
556
			$writeTextIntoFile=fileAccess::writeTextIntoFile($conf["fileAccess::writeTextIntoFile"]);
556
			$writeTextIntoFile=fileAccess::writeTextIntoFile($conf["fileAccess::writeTextIntoFile"]);
557
			unset($conf["fileAccess::writeTextIntoFile"]);
557
			unset($conf["fileAccess::writeTextIntoFile"]);
558
			
558
 
559
			#如果執行失敗
559
			#如果執行失敗
560
			if($writeTextIntoFile["status"]==="false"){
560
			if($writeTextIntoFile["status"]==="false"){
561
			
561
 
562
				#設置執行失敗
562
				#設置執行失敗
563
				$result["status"]="false";
563
				$result["status"]="false";
564
				
564
 
565
				#設置錯誤訊息
565
				#設置錯誤訊息
566
				$result["error"]=$writeTextIntoFile;
566
				$result["error"]=$writeTextIntoFile;
567
				
567
 
568
				#回傳結果
568
				#回傳結果
569
				return $result;
569
				return $result;
570
			
570
 
571
				}#if end
571
				}#if end
572
				
572
 
573
			#debug
573
			#debug
574
			#var_dump(__LINE__,$writeTextIntoFile);exit;
574
			#var_dump(__LINE__,$writeTextIntoFile);exit;
575
			
575
 
576
			#初始化 client 陣列
576
			#初始化 client 陣列
577
			$client=array();
577
			$client=array();
578
			
578
 
579
			#如果有設置$conf["changeOwner"]
579
			#如果有設置$conf["changeOwner"]
580
			if(isset($conf["changeOwner"])){
580
			if(isset($conf["changeOwner"])){
581
				
581
 
582
				#如果裡面的"."不是一個
582
				#如果裡面的"."不是一個
583
				if(substr_count($conf["changeOwner"],".")!==1){
583
				if(substr_count($conf["changeOwner"],".")!==1){
584
					
584
 
585
					#設置執行失敗
585
					#設置執行失敗
586
					$result["status"]="false";
586
					$result["status"]="false";
587
					
587
 
588
					#設置錯誤訊息
588
					#設置錯誤訊息
589
					$result["error"][]="參數 changeOwner 應為 username.groupname";
589
					$result["error"][]="參數 changeOwner 應為 username.groupname";
590
					
590
 
591
					#印出錯誤訊息
591
					#印出錯誤訊息
592
					echo print_r($result,true);
592
					echo print_r($result,true);
593
					
593
 
594
					#回傳結果
594
					#回傳結果
595
					return $result;
595
					return $result;
596
					
596
 
597
					}#if end
597
					}#if end
598
					
598
 
599
				#改變檔案的擁有者
599
				#改變檔案的擁有者
600
				#函式說明:
600
				#函式說明:
601
				#使用 linux 的 chown 指令來修改目標檔案或目錄的擁有者跟群組擁有者資訊.
601
				#使用 linux 的 chown 指令來修改目標檔案或目錄的擁有者跟群組擁有者資訊.
602
				#回傳結果:
602
				#回傳結果:
603
				#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
603
				#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
Line 621... Line 621...
621
				#無.
621
				#無.
622
				#備註:
622
				#備註:
623
				#無.
623
				#無.
624
				$chown=cmd::chown($conf["cmd::chown"]);
624
				$chown=cmd::chown($conf["cmd::chown"]);
625
				unset($conf["cmd::chown"]);
625
				unset($conf["cmd::chown"]);
626
				
626
 
627
				#如果改變檔案擁有者限失敗
627
				#如果改變檔案擁有者限失敗
628
				if($chown===false){
628
				if($chown===false){
629
					
629
 
630
					#設置執行失敗
630
					#設置執行失敗
631
					$result["status"]="false";
631
					$result["status"]="false";
632
					
632
 
633
					#設置錯誤訊息
633
					#設置錯誤訊息
634
					$result["error"][]="改變 ".$conf["sock"]." 檔案的擁有資訊為 ".explode(".",$conf["changeOwner"])[0]." 失敗,通常只有系統帳戶才能變更之.";
634
					$result["error"][]="改變 ".$conf["sock"]." 檔案的擁有資訊為 ".explode(".",$conf["changeOwner"])[0]." 失敗,通常只有系統帳戶才能變更之.";
635
					
635
 
636
					#印出錯誤訊息
636
					#印出錯誤訊息
637
					echo print_r($result,true);
637
					echo print_r($result,true);
638
					
638
 
639
					#回傳結果
639
					#回傳結果
640
					return $result;	
640
					return $result;
641
					
641
 
642
					}#if end
642
					}#if end
643
				
643
 
644
				}#if end
644
				}#if end
645
				
645
 
646
			#如果有設置 $conf["changePermission"]
646
			#如果有設置 $conf["changePermission"]
647
			if(isset($conf["changePermission"])){
647
			if(isset($conf["changePermission"])){
648
				
648
 
649
				#函式說明:
649
				#函式說明:
650
				#使用 linux 的 chmod 指令來修改目標檔案或目錄的權限.
650
				#使用 linux 的 chmod 指令來修改目標檔案或目錄的權限.
651
				#回傳結果:
651
				#回傳結果:
652
				#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
652
				#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
653
				#$result["error"],錯誤訊息.
653
				#$result["error"],錯誤訊息.
Line 668... Line 668...
668
				#無.
668
				#無.
669
				#備註:
669
				#備註:
670
				#無.
670
				#無.
671
				$chmod=cmd::chmod($conf["cmd::chmod"]);
671
				$chmod=cmd::chmod($conf["cmd::chmod"]);
672
				unset($conf["cmd::chmod"]);
672
				unset($conf["cmd::chmod"]);
673
				
673
 
674
				#如果變更檔案權限失敗
674
				#如果變更檔案權限失敗
675
				if($chmod["status"]==="false"){
675
				if($chmod["status"]==="false"){
676
				
676
 
677
					#設置執行失敗
677
					#設置執行失敗
678
					$result["status"]="false";
678
					$result["status"]="false";
679
					
679
 
680
					#設置錯誤訊息
680
					#設置錯誤訊息
681
					$result["error"]=$chmod;
681
					$result["error"]=$chmod;
682
					
682
 
683
					#印出錯誤訊息
683
					#印出錯誤訊息
684
					echo print_r($result,true);
684
					echo print_r($result,true);
685
					
685
 
686
					#回傳結果
686
					#回傳結果
687
					return $result;	
687
					return $result;
688
				
688
 
689
					}#if end
689
					}#if end
690
				
690
 
691
				}#if end
691
				}#if end
692
			
692
 
693
			#初始化儲存 server 資訊的變數,預設數值為 $result 自己
693
			#初始化儲存 server 資訊的變數,預設數值為 $result 自己
694
			$result["serverCache"]=&$result;
694
			$result["serverCache"]=&$result;
695
			
695
 
696
			#初始化方便識別 server 資訊的變數
696
			#初始化方便識別 server 資訊的變數
697
			$serverCache=&$result["serverCache"];
697
			$serverCache=&$result["serverCache"];
698
			
698
 
699
			#初始化 server site cache
699
			#初始化 server site cache
700
			$serverCache["serverSide"]=array();
700
			$serverCache["serverSide"]=array();
701
			
701
 
702
			#初始化 儲存 透過 proc 執行的子程序 
702
			#初始化 儲存 透過 proc 執行的子程序
703
			$serverCache["serverSide"]["procs"]=array();
703
			$serverCache["serverSide"]["procs"]=array();
704
			
704
 
705
			#初始化 client site cache
705
			#初始化 client site cache
706
			$serverCache["clientSide"]=array();
706
			$serverCache["clientSide"]=array();
707
			
707
 
708
			#初始化方便識別 client site cache 資訊的變數
708
			#初始化方便識別 client site cache 資訊的變數
709
			$clientCache=&$serverCache["clientSide"];
709
			$clientCache=&$serverCache["clientSide"];
710
			
710
 
711
			#將建立的 listen sock 放到 $master 陣列
711
			#將建立的 listen sock 放到 $master 陣列
712
			$master[] = $socket;
712
			$master[] = $socket;
713
			
713
 
714
			#永久監聽, 不 timeout
714
			#永久監聽, 不 timeout
715
			while(true){
715
			while(true){
716
				
716
 
717
				#debug
717
				#debug
718
				#var_dump(__LINE__,gmdate("Y-m-d H:i:s",time()));
718
				#var_dump(__LINE__,gmdate("Y-m-d H:i:s",time()));
719
				
719
 
720
				#設置給 stream_select 監控的sock變數
720
				#設置給 stream_select 監控的sock變數
721
				$read = $write = $except = $master;
721
				$read = $write = $except = $master;
722
				
722
 
723
				#等待5秒,看有沒有連線進來讀寫資料
723
				#等待5秒,看有沒有連線進來讀寫資料
724
				$mod_fd = stream_select($read, $write, $except, 5);
724
				$mod_fd = stream_select($read, $write, $except, 5);
725
				
725
 
726
				#如果執行失敗
726
				#如果執行失敗
727
				if($mod_fd===FALSE){
727
				if($mod_fd===FALSE){
728
					
728
 
729
					#提示錯誤訊息
729
					#提示錯誤訊息
730
					echo "Stream_select failed at ".gmdate("Y-m-d H:i:s",time());
730
					echo "Stream_select failed at ".gmdate("Y-m-d H:i:s",time());
731
					
731
 
732
					#結束監聽
732
					#結束監聽
733
					exit(1);
733
					exit(1);
734
					
734
 
735
					}#if end
735
					}#if end
736
					
736
 
737
				#如果沒有訊息,代表閒置時可以做的事情
737
				#如果沒有訊息,代表閒置時可以做的事情
738
				else if($mod_fd===0){
738
				else if($mod_fd===0){
739
				
739
 
740
					#提示idle
740
					#提示idle
741
					echo ".";
741
					echo ".";
742
				
742
 
743
					#清除 session timeout 的連線 - start
743
					#清除 session timeout 的連線 - start
744
				
744
 
745
					#初始化要給 server 的回應
745
					#初始化要給 server 的回應
746
					$res=array();
746
					$res=array();
747
				
747
 
748
					#初始化計數移除幾個用戶
748
					#初始化計數移除幾個用戶
749
					$res["delIdleConCount"]=0;
749
					$res["delIdleConCount"]=0;
750
					
750
 
751
					#針對每個 $client
751
					#針對每個 $client
752
					foreach($client as $index=>$uncheckClient){
752
					foreach($client as $index=>$uncheckClient){
753
						
753
 
754
						#如果上次的要求時間為300秒前.
754
						#如果上次的要求時間為300秒前.
755
						if(time()-(int)$uncheckClient["last_req_time"]>$conf["sessionTimeout"]){
755
						if(time()-(int)$uncheckClient["last_req_time"]>$conf["sessionTimeout"]){
756
							
756
 
757
							#移除該用戶變數
757
							#移除該用戶變數
758
							unset($client["$index"]);
758
							unset($client["$index"]);
759
							
759
 
760
							#計數移除了幾個用戶
760
							#計數移除了幾個用戶
761
							$res["delIdleConCount"]++;
761
							$res["delIdleConCount"]++;
762
							
762
 
763
							}#if end
763
							}#if end
764
						
764
 
765
						}#foreach end
765
						}#foreach end
766
						
766
 
767
					#設置執行正常
767
					#設置執行正常
768
					$res["status"]="true";
768
					$res["status"]="true";
769
					
769
 
770
					#如果有移除閒置的連線
770
					#如果有移除閒置的連線
771
					if($res["delIdleConCount"]>0){
771
					if($res["delIdleConCount"]>0){
772
					
772
 
773
						#印出給 server 的訊息
773
						#印出給 server 的訊息
774
						echo PHP_EOL."response:".PHP_EOL.print_r($res,true);
774
						echo PHP_EOL."response:".PHP_EOL.print_r($res,true);
775
					
775
 
776
						}#if end
776
						}#if end
777
					
777
 
778
					#清除 session timeout 的連線 - end
778
					#清除 session timeout 的連線 - end
779
					
779
 
780
					#清除 太久沒有 被查詢的 proc(子程序) - start
780
					#清除 太久沒有 被查詢的 proc(子程序) - start
781
					
781
 
782
					#初始化要給 server 的回應
782
					#初始化要給 server 的回應
783
					$res=array();
783
					$res=array();
784
					
784
 
785
					#初始化計數移除幾個沒被關注的子程序
785
					#初始化計數移除幾個沒被關注的子程序
786
					$res["delIdleProcCount"]=0;
786
					$res["delIdleProcCount"]=0;
787
					
787
 
788
					#針對每個 子程序
788
					#針對每個 子程序
789
					foreach($serverCache["serverSide"]["procs"] as $procIndex=>$procInfo){
789
					foreach($serverCache["serverSide"]["procs"] as $procIndex=>$procInfo){
790
						
790
 
791
						#debug
791
						#debug
792
						#var_dump(__FUNCTION__,__LINE__,$procInfo);
792
						#var_dump(__FUNCTION__,__LINE__,$procInfo);
793
						
793
 
794
						#如果上次的要求時間為300秒前.
794
						#如果上次的要求時間為300秒前.
795
						if(time()-(int)$procInfo["latestAccessTime"]>$conf["sessionTimeout"]){
795
						if(time()-(int)$procInfo["latestAccessTime"]>$conf["sessionTimeout"]){
796
							
796
 
797
							#若運行中
797
							#若運行中
798
							if($procInfo["content"][0]["statusCode"]==="?"){
798
							if($procInfo["content"][0]["statusCode"]==="?"){
799
							
799
 
800
								#更新資訊
800
								#更新資訊
801
								#函式說明:
801
								#函式說明:
802
								#更新透過proc執行的多程序資訊.
802
								#更新透過proc執行的多程序資訊.
803
								#回傳結果:
803
								#回傳結果:
804
								#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
804
								#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
Line 815... Line 815...
815
								#無.
815
								#無.
816
								#備註:
816
								#備註:
817
								#無.
817
								#無.
818
								$proc_update=threads::proc_update($conf["threads::proc_update"]);
818
								$proc_update=threads::proc_update($conf["threads::proc_update"]);
819
								unset($conf["threads::proc_update"]);
819
								unset($conf["threads::proc_update"]);
820
								
820
 
821
								#若執行不正常
821
								#若執行不正常
822
								if($proc_update["status"]==="false"){
822
								if($proc_update["status"]==="false"){
823
								
823
 
824
									#設置執行失敗
824
									#設置執行失敗
825
									$result["status"]="false";
825
									$result["status"]="false";
826
									
826
 
827
									#設置錯誤訊息
827
									#設置錯誤訊息
828
									$result["error"]=$proc_update;
828
									$result["error"]=$proc_update;
829
									
829
 
830
									#印出錯誤訊息
830
									#印出錯誤訊息
831
									echo print_r($result,true);
831
									echo print_r($result,true);
832
									
832
 
833
									#回傳結果
833
									#回傳結果
834
									return $result;	
834
									return $result;
835
								
835
 
836
									}#if end
836
									}#if end
837
								
837
 
838
								#更新程序狀態
838
								#更新程序狀態
839
								$procInfo["content"]=$proc_update["content"][0];
839
								$procInfo["content"]=$proc_update["content"][0];
840
								
840
 
841
								#更新會後存取時間
841
								#更新會後存取時間
842
								
842
 
843
								#若已經執行結束
843
								#若已經執行結束
844
								if($procInfo["content"]["statusCode"]!=="?"){
844
								if($procInfo["content"]["statusCode"]!=="?"){
845
								
845
 
846
									#換下一個
846
									#換下一個
847
									continue;
847
									continue;
848
								
848
 
849
									}#if end
849
									}#if end
850
								
850
 
851
								#執行到這代表一樣再運行中
851
								#執行到這代表一樣再運行中
852
								
852
 
853
								#終止程序
853
								#終止程序
854
								proc_close($procInfo["content"]["process"]);
854
								proc_close($procInfo["content"]["process"]);
855
								
855
 
856
								#移除該用戶變數
856
								#移除該用戶變數
857
								unset($serverCache["serverSide"]["procs"][$procIndex]);	
857
								unset($serverCache["serverSide"]["procs"][$procIndex]);
858
								
858
 
859
								#換下一個
859
								#換下一個
860
								continue;
860
								continue;
861
							
861
 
862
								}#if end
862
								}#if end
863
							
863
 
864
							#反之為已運行結束
864
							#反之為已運行結束
865
							
865
 
866
							#移除該用戶變數
866
							#移除該用戶變數
867
							unset($serverCache["serverSide"]["procs"][$procIndex]);
867
							unset($serverCache["serverSide"]["procs"][$procIndex]);
868
							
868
 
869
							#計數移除幾個沒被關注的子程序
869
							#計數移除幾個沒被關注的子程序
870
							$res["delIdleProcCount"]++;
870
							$res["delIdleProcCount"]++;
871
							
871
 
872
							}#if end
872
							}#if end
873
						
873
 
874
						}#foreach end
874
						}#foreach end
875
						
875
 
876
					#設置執行正常
876
					#設置執行正常
877
					$res["status"]="true";
877
					$res["status"]="true";
878
					
878
 
879
					#如果有移除沒被關注的子程序
879
					#如果有移除沒被關注的子程序
880
					if($res["delIdleProcCount"]>0){
880
					if($res["delIdleProcCount"]>0){
881
					
881
 
882
						#印出給 server 的訊息
882
						#印出給 server 的訊息
883
						echo PHP_EOL."response:".PHP_EOL.print_r($res,true);
883
						echo PHP_EOL."response:".PHP_EOL.print_r($res,true);
884
					
884
 
885
						}#if end
885
						}#if end
886
					
886
 
887
					#清除 太久沒有 被查詢的 proc(子程序) - end
887
					#清除 太久沒有 被查詢的 proc(子程序) - end
888
					
888
 
889
					#如果有設置 idle 要執行的函式
889
					#如果有設置 idle 要執行的函式
890
					if(isset($conf["funcToRunWhenIdle"])){
890
					if(isset($conf["funcToRunWhenIdle"])){
891
					
891
 
892
						#提示有idle要執行的函式
892
						#提示有idle要執行的函式
893
						echo "response:".PHP_EOL."There is funcToRunWhenIdle param set.".PHP_EOL;
893
						echo "response:".PHP_EOL."There is funcToRunWhenIdle param set.".PHP_EOL;
894
					
894
 
895
						#針對每個 funcToRunWhenIdle
895
						#針對每個 funcToRunWhenIdle
896
						foreach($conf["funcToRunWhenIdle"] as $index => $funcToRunWhenIdle){
896
						foreach($conf["funcToRunWhenIdle"] as $index => $funcToRunWhenIdle){
897
							
897
 
898
							#提示正要執行的函式
898
							#提示正要執行的函式
899
							echo "response:".PHP_EOL."Executeing ".$funcToRunWhenIdle."...".PHP_EOL;
899
							echo "response:".PHP_EOL."Executeing ".$funcToRunWhenIdle."...".PHP_EOL;
900
							
900
 
901
							#初始化要給 funcToRunWhenIdle 函式的參數
901
							#初始化要給 funcToRunWhenIdle 函式的參數
902
							$parasmForFuncToRunWhenIdle=array();
902
							$parasmForFuncToRunWhenIdle=array();
903
							
903
 
904
							#取得所有用戶
904
							#取得所有用戶
905
							$parasmForFuncToRunWhenIdle["client"]=&$client;
905
							$parasmForFuncToRunWhenIdle["client"]=&$client;
906
							
906
 
907
							#如果有設置 infoToFunction
907
							#如果有設置 infoToFunction
908
							if(isset($conf["infoToFunction"])){
908
							if(isset($conf["infoToFunction"])){
909
							
909
 
910
								#設置info
910
								#設置info
911
								$parasmForFuncToRunWhenIdle["info"]=&$conf["infoToFunction"];
911
								$parasmForFuncToRunWhenIdle["info"]=&$conf["infoToFunction"];
912
							
912
 
913
								}#if end
913
								}#if end
914
							
914
 
915
							#debug
915
							#debug
916
							#var_dump(__FILE__,__LINE__,$serverCache["serverSide"]);
916
							#var_dump(__FILE__,__LINE__,$serverCache["serverSide"]);
917
							
917
 
918
							#如果屬於該 $funcToRunWhenIdle 的 server side cache 不存在
918
							#如果屬於該 $funcToRunWhenIdle 的 server side cache 不存在
919
							if(!isset($serverCache["serverSide"]["funcToRunWhenIdle"][$funcToRunWhenIdle])){
919
							if(!isset($serverCache["serverSide"]["funcToRunWhenIdle"][$funcToRunWhenIdle])){
920
							
920
 
921
								#初始化為空陣列
921
								#初始化為空陣列
922
								$serverCache["serverSide"]["funcToRunWhenIdle"][$funcToRunWhenIdle]=array();
922
								$serverCache["serverSide"]["funcToRunWhenIdle"][$funcToRunWhenIdle]=array();
923
							
923
 
924
								}#if end
924
								}#if end
925
							
925
 
926
							#設置給予 $funcToRunWhenIdle 函式的 serverCache 參數
926
							#設置給予 $funcToRunWhenIdle 函式的 serverCache 參數
927
							$parasmForFuncToRunWhenIdle["serverCache"]=&$serverCache;
927
							$parasmForFuncToRunWhenIdle["serverCache"]=&$serverCache;
928
							
928
 
929
							#儲存 $funcToRunWhenIdle 函式 的運行結束的時間點到 server side 的 cache
929
							#儲存 $funcToRunWhenIdle 函式 的運行結束的時間點到 server side 的 cache
930
							$serverCache["serverSide"]["funcToRunWhenIdle"][$funcToRunWhenIdle]["lastRunTime"]=time::unix()["content"];
930
							$serverCache["serverSide"]["funcToRunWhenIdle"][$funcToRunWhenIdle]["lastRunTime"]=time::unix()["content"];
931
							
931
 
932
							#如果有要指定給 $funcToRunWhenIdle 的參數
932
							#如果有要指定給 $funcToRunWhenIdle 的參數
933
							if(isset($conf["paramsForFuncToRunWhenIdle"][$index])){
933
							if(isset($conf["paramsForFuncToRunWhenIdle"][$index])){
934
							
934
 
935
								#針對每個 要給予 funcToRunWhenIdle 的參數
935
								#針對每個 要給予 funcToRunWhenIdle 的參數
936
								foreach($conf["paramsForFuncToRunWhenIdle"][$index] as $arguKeyForFuncToRunWhenIdle => $arguValueForFuncToRunWhenIdle){
936
								foreach($conf["paramsForFuncToRunWhenIdle"][$index] as $arguKeyForFuncToRunWhenIdle => $arguValueForFuncToRunWhenIdle){
937
								
937
 
938
									#設置給予 funcToRunWhenIdle 的參數
938
									#設置給予 funcToRunWhenIdle 的參數
939
									$parasmForFuncToRunWhenIdle[$arguKeyForFuncToRunWhenIdle]=$arguValueForFuncToRunWhenIdle;
939
									$parasmForFuncToRunWhenIdle[$arguKeyForFuncToRunWhenIdle]=$arguValueForFuncToRunWhenIdle;
940
								
940
 
941
									#debug
941
									#debug
942
									#var_dump(__LINE__,$parasmForFuncToRunWhenIdle);
942
									#var_dump(__LINE__,$parasmForFuncToRunWhenIdle);
943
								
943
 
944
									}#foreach end
944
									}#foreach end
945
							
945
 
946
								}#if end
946
								}#if end
947
							
947
 
948
							/* debug
948
							/* debug
949
							
949
 
950
							#函式說明:
950
							#函式說明:
951
							#撰寫log
951
							#撰寫log
952
							#回傳結果:
952
							#回傳結果:
953
							#$result["status"],狀態,"true"或"false".
953
							#$result["status"],狀態,"true"或"false".
954
							#$result["error"],錯誤訊息陣列.
954
							#$result["error"],錯誤訊息陣列.
Line 971... Line 971...
971
							#無.
971
							#無.
972
							#備註:
972
							#備註:
973
							#無.
973
							#無.
974
							$record=logs::record($conf["logs::record"]);
974
							$record=logs::record($conf["logs::record"]);
975
							unset($conf["logs::record"]);
975
							unset($conf["logs::record"]);
976
							
976
 
977
							#如果執行失敗
977
							#如果執行失敗
978
							if($record["status"]==="false"){
978
							if($record["status"]==="false"){
979
							
979
 
980
								#設置執行錯誤識別
980
								#設置執行錯誤識別
981
								$result["status"]="false";
981
								$result["status"]="false";
982
							
982
 
983
								#設置執行錯誤
983
								#設置執行錯誤
984
								$result["error"]=$record;
984
								$result["error"]=$record;
985
							
985
 
986
								#回傳結果
986
								#回傳結果
987
								return $result;
987
								return $result;
988
							
988
 
989
								}#if end
989
								}#if end
990
							
990
 
991
							*/
991
							*/
992
							
992
 
993
							#debug
993
							#debug
994
							#var_dump(__LINE__,$parasmForFuncToRunWhenIdle);
994
							#var_dump(__LINE__,$parasmForFuncToRunWhenIdle);
995
							
995
 
996
							#debug
996
							#debug
997
							#var_dump(__LINE__,"\$call_user_func=".$funcToRunWhenIdle."(\$parasmForFuncToRunWhenIdle);");
997
							#var_dump(__LINE__,"\$call_user_func=".$funcToRunWhenIdle."(\$parasmForFuncToRunWhenIdle);");
998
							
998
 
999
							#呼叫 $funcToRunWhenIdle 函式,參數用 $client[$request->id], 取得執行後的回應.
999
							#呼叫 $funcToRunWhenIdle 函式,參數用 $client[$request->id], 取得執行後的回應.
1000
							eval("\$call_user_func=".$funcToRunWhenIdle."(\$parasmForFuncToRunWhenIdle);");
1000
							eval("\$call_user_func=".$funcToRunWhenIdle."(\$parasmForFuncToRunWhenIdle);");
1001
							
1001
 
1002
							/* debug
1002
							/* debug
1003
							
1003
 
1004
							#函式說明:
1004
							#函式說明:
1005
							#撰寫log
1005
							#撰寫log
1006
							#回傳結果:
1006
							#回傳結果:
1007
							#$result["status"],狀態,"true"或"false".
1007
							#$result["status"],狀態,"true"或"false".
1008
							#$result["error"],錯誤訊息陣列.
1008
							#$result["error"],錯誤訊息陣列.
Line 1025... Line 1025...
1025
							#無.
1025
							#無.
1026
							#備註:
1026
							#備註:
1027
							#無.
1027
							#無.
1028
							$record=logs::record($conf["logs::record"]);
1028
							$record=logs::record($conf["logs::record"]);
1029
							unset($conf["logs::record"]);
1029
							unset($conf["logs::record"]);
1030
							
1030
 
1031
							#如果執行失敗
1031
							#如果執行失敗
1032
							if($record["status"]==="false"){
1032
							if($record["status"]==="false"){
1033
							
1033
 
1034
								#設置執行錯誤識別
1034
								#設置執行錯誤識別
1035
								$result["status"]="false";
1035
								$result["status"]="false";
1036
							
1036
 
1037
								#設置執行錯誤
1037
								#設置執行錯誤
1038
								$result["error"]=$record;
1038
								$result["error"]=$record;
1039
							
1039
 
1040
								#回傳結果
1040
								#回傳結果
1041
								return $result;
1041
								return $result;
1042
							
1042
 
1043
								}#if end
1043
								}#if end
1044
								
1044
 
1045
							*/	
1045
							*/
1046
							
1046
 
1047
							#儲存 $funcToRunWhenIdle 函式 的運行結果資訊到 server side 的 cache
1047
							#儲存 $funcToRunWhenIdle 函式 的運行結果資訊到 server side 的 cache
1048
							$serverCache["serverSide"]["funcToRunWhenIdle"][$funcToRunWhenIdle]["result"]=&$call_user_func;
1048
							$serverCache["serverSide"]["funcToRunWhenIdle"][$funcToRunWhenIdle]["result"]=&$call_user_func;
1049
						
1049
 
1050
							#儲存 $funcToRunWhenIdle 函式 的運行結束的時間點到 server side 的 cache
1050
							#儲存 $funcToRunWhenIdle 函式 的運行結束的時間點到 server side 的 cache
1051
							$serverCache["serverSide"]["funcToRunWhenIdle"][$funcToRunWhenIdle]["lastEndTime"]=time::unix()["content"];
1051
							$serverCache["serverSide"]["funcToRunWhenIdle"][$funcToRunWhenIdle]["lastEndTime"]=time::unix()["content"];
1052
							
1052
 
1053
							#debug
1053
							#debug
1054
							#var_dump(__FILE__,__LINE__,$serverCache);
1054
							#var_dump(__FILE__,__LINE__,$serverCache);
1055
							
1055
 
1056
							#如果 運行 $funcToRunWhenIdle 後回傳的內容含有 key 為 status 的元素
1056
							#如果 運行 $funcToRunWhenIdle 後回傳的內容含有 key 為 status 的元素
1057
							if(isset($call_user_func["status"])){
1057
							if(isset($call_user_func["status"])){
1058
							
1058
 
1059
								#如果其數值為 "false"
1059
								#如果其數值為 "false"
1060
								if($call_user_func["status"]==="false"){
1060
								if($call_user_func["status"]==="false"){
1061
							
1061
 
1062
									#印出訊息,結束執行
1062
									#印出訊息,結束執行
1063
									var_dump(__FILE__,__LINE__,$call_user_func);exit;
1063
									var_dump(__FILE__,__LINE__,$call_user_func);exit;
1064
							
1064
 
1065
									}#if end
1065
									}#if end
1066
							
1066
 
1067
								}#if end
1067
								}#if end
1068
							
1068
 
1069
							#如果有訊息要提示
1069
							#如果有訊息要提示
1070
							if(isset($call_user_func["content"])){
1070
							if(isset($call_user_func["content"])){
1071
							
1071
 
1072
								#印出提示訊息
1072
								#印出提示訊息
1073
								var_dump($call_user_func["content"]);
1073
								var_dump($call_user_func["content"]);
1074
							
1074
 
1075
								}#if end
1075
								}#if end
1076
							
1076
 
1077
							#如果 運行 $funcToRunWhenIdle 後回傳的內容含有 key 為 cache 的元素
1077
							#如果 運行 $funcToRunWhenIdle 後回傳的內容含有 key 為 cache 的元素
1078
							if(isset($call_user_func["cache"])){
1078
							if(isset($call_user_func["cache"])){
1079
							
1079
 
1080
								#debug
1080
								#debug
1081
								#var_dump(__FILE__,__LINE__,$call_user_func["cache"]);
1081
								#var_dump(__FILE__,__LINE__,$call_user_func["cache"]);
1082
							
1082
 
1083
								#儲存到 server side 的 cache
1083
								#儲存到 server side 的 cache
1084
								$serverCache["serverSide"]["funcToRunWhenIdle"][$funcToRunWhenIdle]["cache"]=&$call_user_func["cache"];
1084
								$serverCache["serverSide"]["funcToRunWhenIdle"][$funcToRunWhenIdle]["cache"]=&$call_user_func["cache"];
1085
							
1085
 
1086
								/*
1086
								/*
1087
								#debug
1087
								#debug
1088
								#函式說明:
1088
								#函式說明:
1089
								#撰寫log
1089
								#撰寫log
1090
								#回傳結果:
1090
								#回傳結果:
Line 1109... Line 1109...
1109
								#無.
1109
								#無.
1110
								#備註:
1110
								#備註:
1111
								#無.
1111
								#無.
1112
								$record=logs::record($conf["logs::record"]);
1112
								$record=logs::record($conf["logs::record"]);
1113
								unset($conf["logs::record"]);
1113
								unset($conf["logs::record"]);
1114
								
1114
 
1115
								#如果執行失敗
1115
								#如果執行失敗
1116
								if($record["status"]==="false"){
1116
								if($record["status"]==="false"){
1117
								
1117
 
1118
									#設置執行錯誤識別
1118
									#設置執行錯誤識別
1119
									$result["status"]="false";
1119
									$result["status"]="false";
1120
								
1120
 
1121
									#設置執行錯誤
1121
									#設置執行錯誤
1122
									$result["error"]=$record;
1122
									$result["error"]=$record;
1123
								
1123
 
1124
									#回傳結果
1124
									#回傳結果
1125
									return $result;
1125
									return $result;
1126
								
1126
 
1127
									}#if end
1127
									}#if end
1128
								*/
1128
								*/
1129
								
1129
 
1130
								}#if end
1130
								}#if end
1131
							
1131
 
1132
							#如果回傳結果含有 exit 元素
1132
							#如果回傳結果含有 exit 元素
1133
							if(isset($call_user_func["exit"])){
1133
							if(isset($call_user_func["exit"])){
1134
							
1134
 
1135
								/*
1135
								/*
1136
								#debug
1136
								#debug
1137
								#函式說明:
1137
								#函式說明:
1138
								#撰寫log
1138
								#撰寫log
1139
								#回傳結果:
1139
								#回傳結果:
Line 1158... Line 1158...
1158
								#無.
1158
								#無.
1159
								#備註:
1159
								#備註:
1160
								#無.
1160
								#無.
1161
								$record=logs::record($conf["logs::record"]);
1161
								$record=logs::record($conf["logs::record"]);
1162
								unset($conf["logs::record"]);
1162
								unset($conf["logs::record"]);
1163
								
1163
 
1164
								#如果執行失敗
1164
								#如果執行失敗
1165
								if($record["status"]==="false"){
1165
								if($record["status"]==="false"){
1166
								
1166
 
1167
									#設置執行錯誤識別
1167
									#設置執行錯誤識別
1168
									$result["status"]="false";
1168
									$result["status"]="false";
1169
								
1169
 
1170
									#設置執行錯誤
1170
									#設置執行錯誤
1171
									$result["error"]=$record;
1171
									$result["error"]=$record;
1172
								
1172
 
1173
									#回傳結果
1173
									#回傳結果
1174
									return $result;
1174
									return $result;
1175
								
1175
 
1176
									}#if end
1176
									}#if end
1177
								*/
1177
								*/
1178
							
1178
 
1179
								#如果是要結束daemon執行
1179
								#如果是要結束daemon執行
1180
								if($call_user_func["exit"]==="true"){
1180
								if($call_user_func["exit"]==="true"){
1181
									
1181
 
1182
									#設置daemon結束的原因
1182
									#設置daemon結束的原因
1183
									$call_user_func["exit"]="exit by funcToRunWhenIdle(".$funcToRunWhenIdle.")";
1183
									$call_user_func["exit"]="exit by funcToRunWhenIdle(".$funcToRunWhenIdle.")";
1184
									
1184
 
1185
									#設置執行正常
1185
									#設置執行正常
1186
									$result["status"]="true";
1186
									$result["status"]="true";
1187
									
1187
 
1188
									#結束執行
1188
									#結束執行
1189
									return $result;
1189
									return $result;
1190
									
1190
 
1191
									}#if end
1191
									}#if end
1192
							
1192
 
1193
								}#if end
1193
								}#if end
1194
						
1194
 
1195
							#提示正要執行的函式
1195
							#提示正要執行的函式
1196
							echo "response:".PHP_EOL.$funcToRunWhenIdle." Executed.".PHP_EOL;
1196
							echo "response:".PHP_EOL.$funcToRunWhenIdle." Executed.".PHP_EOL;
1197
							
1197
 
1198
							}#foreach end
1198
							}#foreach end
1199
					
1199
 
1200
						}#if end
1200
						}#if end
1201
							
1201
 
1202
					#等待下個要求
1202
					#等待下個要求
1203
					continue;
1203
					continue;
1204
				
1204
 
1205
					}#if end
1205
					}#if end
1206
				
1206
 
1207
				#有偵測到讀寫的動作
1207
				#有偵測到讀寫的動作
1208
				else{
1208
				else{
1209
				
1209
 
1210
					#針對每個 sock 陣列
1210
					#針對每個 sock 陣列
1211
					foreach($read as $readStream){
1211
					foreach($read as $readStream){
1212
						
1212
 
1213
						#如果元素是 listen 的 socket
1213
						#如果元素是 listen 的 socket
1214
						if($readStream === $socket){
1214
						if($readStream === $socket){
1215
							
1215
 
1216
							#當等待別人連線時,若有人連線進來.
1216
							#當等待別人連線時,若有人連線進來.
1217
							$conn = stream_socket_accept($socket);
1217
							$conn = stream_socket_accept($socket);
1218
							
1218
 
1219
							#取得 meta data
1219
							#取得 meta data
1220
							#$stream_meta_data=stream_get_meta_data($conn);
1220
							#$stream_meta_data=stream_get_meta_data($conn);
1221
							
1221
 
1222
							#debug
1222
							#debug
1223
							#var_dump(__LINE__,$stream_meta_data);
1223
							#var_dump(__LINE__,$stream_meta_data);
1224
								
1224
 
1225
							#印出有連線進來的訊息
1225
							#印出有連線進來的訊息
1226
							echo "received a connection".PHP_EOL;
1226
							echo "received a connection".PHP_EOL;
1227
							
1227
 
1228
							#初始化取得的內容
1228
							#初始化取得的內容
1229
							$request="";
1229
							$request="";
1230
							
1230
 
1231
							#初始化要回應的內容
1231
							#初始化要回應的內容
1232
							$res=array();
1232
							$res=array();
1233
						
1233
 
1234
							#取得 request 的時間
1234
							#取得 request 的時間
1235
							$last_req_time=time();
1235
							$last_req_time=time();
1236
						
1236
 
1237
							#當有要求時
1237
							#當有要求時
1238
							while(!feof($conn)){
1238
							while(!feof($conn)){
1239
								
1239
 
1240
								#讀取要求
1240
								#讀取要求
1241
								$tmp=fgets($conn, 1024);
1241
								$tmp=fgets($conn, 1024);
1242
								
1242
 
1243
								#如果讀到 PHP_EOL
1243
								#如果讀到 PHP_EOL
1244
								if($tmp===PHP_EOL){
1244
								if($tmp===PHP_EOL){
1245
									
1245
 
1246
									#結束讀取要求
1246
									#結束讀取要求
1247
									break;	
1247
									break;
1248
									
1248
 
1249
									}#if end
1249
									}#if end
1250
								
1250
 
1251
								#串接回應
1251
								#串接回應
1252
								$request=$request.$tmp;
1252
								$request=$request.$tmp;
1253
							
1253
 
1254
								}#while end
1254
								}#while end
1255
							
1255
 
1256
							#印出有連線進來的訊息
1256
							#印出有連線進來的訊息
1257
							echo "received content:".PHP_EOL.$request.PHP_EOL;
1257
							echo "received content:".PHP_EOL.$request.PHP_EOL;
1258
							
1258
 
1259
							#parse request json
1259
							#parse request json
1260
							$request=json_decode($request);
1260
							$request=json_decode($request);
1261
							
1261
 
1262
							#如果 parse json 失敗
1262
							#如果 parse json 失敗
1263
							if($request===false){
1263
							if($request===false){
1264
								
1264
 
1265
								#設置錯誤訊息
1265
								#設置錯誤訊息
1266
								$res["error"]="要求格式必須為json";
1266
								$res["error"]="要求格式必須為json";
1267
								
1267
 
1268
								#設置執行失敗
1268
								#設置執行失敗
1269
								$res["status"]="false";
1269
								$res["status"]="false";
1270
								
1270
 
1271
								#印出回的訊息
1271
								#印出回的訊息
1272
								echo "res:".print_r($res,true);
1272
								echo "res:".print_r($res,true);
1273
								
1273
 
1274
								#寫入回應的內容
1274
								#寫入回應的內容
1275
								fwrite($conn,json_encode($res).PHP_EOL);
1275
								fwrite($conn,json_encode($res).PHP_EOL);
1276
							
1276
 
1277
								#結束回應
1277
								#結束回應
1278
								fwrite($conn,PHP_EOL.PHP_EOL);
1278
								fwrite($conn,PHP_EOL.PHP_EOL);
1279
							
1279
 
1280
								#關閉socket連線,將回應輸出.
1280
								#關閉socket連線,將回應輸出.
1281
								fclose($conn);
1281
								fclose($conn);
1282
								
1282
 
1283
								#等待下個要求
1283
								#等待下個要求
1284
								continue;
1284
								continue;
1285
								
1285
 
1286
								}#if end
1286
								}#if end
1287
								
1287
 
1288
							#若無ID資訊
1288
							#若無ID資訊
1289
							if(!isset($request->id)){
1289
							if(!isset($request->id)){
1290
								
1290
 
1291
								#無窮迴圈
1291
								#無窮迴圈
1292
								while(true){
1292
								while(true){
1293
								
1293
 
1294
									#set client id 設置要回應的訊息
1294
									#set client id 設置要回應的訊息
1295
									#函式說明:
1295
									#函式說明:
1296
									#呼叫shell執行系統命令,並取得回傳的內容.
1296
									#呼叫shell執行系統命令,並取得回傳的內容.
1297
									#回傳結果:
1297
									#回傳結果:
1298
									#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1298
									#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
Line 1352... Line 1352...
1352
									#備註:
1352
									#備註:
1353
									#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
1353
									#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
1354
									#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
1354
									#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
1355
									$callShell=external::callShell($conf["external::callShell"]);
1355
									$callShell=external::callShell($conf["external::callShell"]);
1356
									unset($conf["external::callShell"]);
1356
									unset($conf["external::callShell"]);
1357
									
1357
 
1358
									#如果執行失敗
1358
									#如果執行失敗
1359
									if($callShell["status"]==="false"){
1359
									if($callShell["status"]==="false"){
1360
										
1360
 
1361
										#設置執行失敗
1361
										#設置執行失敗
1362
										$result["status"]="false";
1362
										$result["status"]="false";
1363
										
1363
 
1364
										#設置錯誤訊息
1364
										#設置錯誤訊息
1365
										$result["error"]=$callShell;
1365
										$result["error"]=$callShell;
1366
										
1366
 
1367
										#回傳結果
1367
										#回傳結果
1368
										return $result;	
1368
										return $result;
1369
										
1369
 
1370
										}#if end
1370
										}#if end
1371
									
1371
 
1372
									#如果沒有預期的 uuid 回應
1372
									#如果沒有預期的 uuid 回應
1373
									if(!isset($callShell["output"][0])){
1373
									if(!isset($callShell["output"][0])){
1374
									
1374
 
1375
										#設置執行失敗
1375
										#設置執行失敗
1376
										$result["status"]="false";
1376
										$result["status"]="false";
1377
										
1377
 
1378
										#設置錯誤訊息
1378
										#設置錯誤訊息
1379
										$result["error"][]="get uuid failed!";
1379
										$result["error"][]="get uuid failed!";
1380
										
1380
 
1381
										#設置錯誤訊息
1381
										#設置錯誤訊息
1382
										$result["error"][]=$callShell;
1382
										$result["error"][]=$callShell;
1383
										
1383
 
1384
										#回傳結果
1384
										#回傳結果
1385
										return $result;	
1385
										return $result;
1386
									
1386
 
1387
										}#if end
1387
										}#if end
1388
									
1388
 
1389
									#檢查 client id 是否已經存在
1389
									#檢查 client id 是否已經存在
1390
									if(isset($client[$callShell["output"][0]])){
1390
									if(isset($client[$callShell["output"][0]])){
1391
										
1391
 
1392
										#休息一微秒
1392
										#休息一微秒
1393
										usleep(1);
1393
										usleep(1);
1394
										
1394
 
1395
										#再次建立id試試
1395
										#再次建立id試試
1396
										continue;
1396
										continue;
1397
										
1397
 
1398
										}#if end
1398
										}#if end
1399
										
1399
 
1400
									#設置回應的id
1400
									#設置回應的id
1401
									$res["id"]=$callShell["output"][0];
1401
									$res["id"]=$callShell["output"][0];
1402
										
1402
 
1403
									#建立id完畢
1403
									#建立id完畢
1404
									break;
1404
									break;
1405
								
1405
 
1406
									}#while end
1406
									}#while end
1407
								
1407
 
1408
								#儲存使用者id與最後一次來request的時間
1408
								#儲存使用者id與最後一次來request的時間
1409
								$client[$res["id"]]=array("last_req_time"=>$last_req_time);
1409
								$client[$res["id"]]=array("last_req_time"=>$last_req_time);
1410
								
1410
 
1411
								#印出用戶端列表
1411
								#印出用戶端列表
1412
								echo "clients:".print_r($client,true);
1412
								echo "clients:".print_r($client,true);
1413
								
1413
 
1414
								#設置執行正常
1414
								#設置執行正常
1415
								$res["status"]="true";
1415
								$res["status"]="true";
1416
								
1416
 
1417
								#印出回的訊息
1417
								#印出回的訊息
1418
								echo "response:".PHP_EOL.print_r($res,true);
1418
								echo "response:".PHP_EOL.print_r($res,true);
1419
								
1419
 
1420
								#寫入回應的內容
1420
								#寫入回應的內容
1421
								fwrite($conn,json_encode($res).PHP_EOL);
1421
								fwrite($conn,json_encode($res).PHP_EOL);
1422
							
1422
 
1423
								#結束回應
1423
								#結束回應
1424
								fwrite($conn,PHP_EOL.PHP_EOL);
1424
								fwrite($conn,PHP_EOL.PHP_EOL);
1425
								
1425
 
1426
								#關閉socket連線,將回應輸出.
1426
								#關閉socket連線,將回應輸出.
1427
								fclose($conn);
1427
								fclose($conn);
1428
								
1428
 
1429
								#等待下個要求
1429
								#等待下個要求
1430
								continue;
1430
								continue;
1431
								
1431
 
1432
								}#if end
1432
								}#if end
1433
							
1433
 
1434
							#若ID資訊不存在
1434
							#若ID資訊不存在
1435
							if(!isset($client[$request->id])){
1435
							if(!isset($client[$request->id])){
1436
								
1436
 
1437
								#設置執行失敗
1437
								#設置執行失敗
1438
								$res["status"]="false";
1438
								$res["status"]="false";
1439
								
1439
 
1440
								#設置ID不存在的訊息
1440
								#設置ID不存在的訊息
1441
								$res["error"]="ID:".$request->id." 不存在,請再要一次ID.";
1441
								$res["error"]="ID:".$request->id." 不存在,請再要一次ID.";
1442
								
1442
 
1443
								#印出回的訊息
1443
								#印出回的訊息
1444
								echo "response:".PHP_EOL.print_r($res,true);
1444
								echo "response:".PHP_EOL.print_r($res,true);
1445
								
1445
 
1446
								#寫入回應的內容
1446
								#寫入回應的內容
1447
								fwrite($conn,json_encode($res).PHP_EOL);
1447
								fwrite($conn,json_encode($res).PHP_EOL);
1448
							
1448
 
1449
								#結束回應
1449
								#結束回應
1450
								fwrite($conn,PHP_EOL.PHP_EOL);
1450
								fwrite($conn,PHP_EOL.PHP_EOL);
1451
								
1451
 
1452
								#關閉socket連線,將回應輸出.
1452
								#關閉socket連線,將回應輸出.
1453
								fclose($conn);
1453
								fclose($conn);
1454
								
1454
 
1455
								#等待下個要求
1455
								#等待下個要求
1456
								continue;
1456
								continue;
1457
								
1457
 
1458
								}#if end
1458
								}#if end
1459
							
1459
 
1460
							#如果有客製化訊息
1460
							#如果有客製化訊息
1461
							if(isset($request->custom)){
1461
							if(isset($request->custom)){
1462
							
1462
 
1463
								#取代之
1463
								#取代之
1464
								$request=$request->custom;
1464
								$request=$request->custom;
1465
							
1465
 
1466
								}#if end
1466
								}#if end
1467
							
1467
 
1468
							#若有要執行的指令 cmd,且非客製化.
1468
							#若有要執行的指令 cmd,且非客製化.
1469
							if(isset($request->cmd)){
1469
							if(isset($request->cmd)){
1470
								
1470
 
1471
								#如果是要結束連線
1471
								#如果是要結束連線
1472
								if($request->cmd==="quit"){
1472
								if($request->cmd==="quit"){
1473
								
1473
 
1474
									#設置執行正常
1474
									#設置執行正常
1475
									$res["status"]="true";
1475
									$res["status"]="true";
1476
								
1476
 
1477
									#設置訊息
1477
									#設置訊息
1478
									$res["content"]="將關閉與您的連線";
1478
									$res["content"]="將關閉與您的連線";
1479
								
1479
 
1480
									#寫入回應的內容
1480
									#寫入回應的內容
1481
									fwrite($conn,json_encode($res).PHP_EOL);
1481
									fwrite($conn,json_encode($res).PHP_EOL);
1482
							
1482
 
1483
									#結束回應
1483
									#結束回應
1484
									fwrite($conn,PHP_EOL.PHP_EOL);
1484
									fwrite($conn,PHP_EOL.PHP_EOL);
1485
								
1485
 
1486
									#關閉socket連線,將回應輸出.
1486
									#關閉socket連線,將回應輸出.
1487
									fclose($conn);
1487
									fclose($conn);
1488
								
1488
 
1489
									#移除該用戶變數
1489
									#移除該用戶變數
1490
									unset($client[$index]);
1490
									unset($client[$index]);
1491
									
1491
 
1492
									#計數移除了幾個用戶
1492
									#計數移除了幾個用戶
1493
									$res["delCount"]++;
1493
									$res["delCount"]++;
1494
									
1494
 
1495
									#設置執行正常
1495
									#設置執行正常
1496
									$res["status"]="true";
1496
									$res["status"]="true";
1497
									
1497
 
1498
									#印出回的訊息
1498
									#印出回的訊息
1499
									echo "response:".PHP_EOL.print_r($res,true);
1499
									echo "response:".PHP_EOL.print_r($res,true);
1500
									
1500
 
1501
									#等待下個要求
1501
									#等待下個要求
1502
									continue;
1502
									continue;
1503
								
1503
 
1504
									}#if end
1504
									}#if end
1505
									
1505
 
1506
								#如果是要結束server
1506
								#如果是要結束server
1507
								if($request->cmd===$shutdownStr){
1507
								if($request->cmd===$shutdownStr){
1508
								
1508
 
1509
									#設置執行正常
1509
									#設置執行正常
1510
									$res["status"]="true";
1510
									$res["status"]="true";
1511
								
1511
 
1512
									#設置訊息
1512
									#設置訊息
1513
									$res["content"]="本服務將結束";
1513
									$res["content"]="本服務將結束";
1514
								
1514
 
1515
									#寫入回應的內容
1515
									#寫入回應的內容
1516
									fwrite($conn,json_encode($res).PHP_EOL);
1516
									fwrite($conn,json_encode($res).PHP_EOL);
1517
							
1517
 
1518
									#結束回應
1518
									#結束回應
1519
									fwrite($conn,PHP_EOL.PHP_EOL);
1519
									fwrite($conn,PHP_EOL.PHP_EOL);
1520
								
1520
 
1521
									#關閉socket連線,將回應輸出.
1521
									#關閉socket連線,將回應輸出.
1522
									fclose($conn);
1522
									fclose($conn);
1523
								
1523
 
1524
									#設置執行正常
1524
									#設置執行正常
1525
									$result["status"]="true";
1525
									$result["status"]="true";
1526
								
1526
 
1527
									#結束本程式
1527
									#結束本程式
1528
									return $result;
1528
									return $result;
1529
									
1529
 
1530
									}#if end
1530
									}#if end
1531
								
1531
 
1532
								#涵式說明:
1532
								#涵式說明:
1533
								#呼叫shell執行系統命令,並取得回傳的內容.
1533
								#呼叫shell執行系統命令,並取得回傳的內容.
1534
								#回傳的結果:
1534
								#回傳的結果:
1535
								#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1535
								#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1536
								#$result["error"],錯誤訊息陣列.
1536
								#$result["error"],錯誤訊息陣列.
Line 1546... Line 1546...
1546
								#$conf["command"],字串,要執行的指令與.
1546
								#$conf["command"],字串,要執行的指令與.
1547
								$conf["external::callShell"]["command"]=$request->cmd;
1547
								$conf["external::callShell"]["command"]=$request->cmd;
1548
								#$conf["fileArgu"],字串,變數__FILE__的內容.
1548
								#$conf["fileArgu"],字串,變數__FILE__的內容.
1549
								$conf["external::callShell"]["fileArgu"]=$conf["fileArgu"];
1549
								$conf["external::callShell"]["fileArgu"]=$conf["fileArgu"];
1550
								#可省略參數:
1550
								#可省略參數:
1551
								
1551
 
1552
								#如果有指定參數
1552
								#如果有指定參數
1553
								if(isset($request->param)){
1553
								if(isset($request->param)){
1554
								
1554
 
1555
									#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
1555
									#$conf["argu"],陣列字串,指令搭配的參數,預設為空陣列.
1556
									$conf["external::callShell"]["argu"]=$request->param;
1556
									$conf["external::callShell"]["argu"]=$request->param;
1557
								
1557
 
1558
									}#if end
1558
									}#if end
1559
								
1559
 
1560
								#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").
1560
								#$conf["arguIsAddr"],陣列字串,指令搭配的哪些參數為路徑,為路徑的參數會進行轉換以便符合呼叫當前函數的位置,預設不指定,若有3個參數,其中第3個參數為路徑,則表示為array("false","false","true").
1561
								#$conf["arguIsAddr"]=array();	
1561
								#$conf["arguIsAddr"]=array();
1562
								#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.
1562
								#$conf["pre"],陣列,要在本指令前執行的每個指令與參數.
1563
								#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.
1563
								#$conf["pre"][$i]["cmd"],字串,要在本指令前執行的第$i+1個指令.
1564
								#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.
1564
								#$conf["pre"][$i]["param"],陣列字串,要在本指令前執行的第$i+1個指令的參數.
1565
								#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".
1565
								#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".
1566
								#$conf["enablePrintDescription"]="true";
1566
								#$conf["enablePrintDescription"]="true";
1567
								#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容.
1567
								#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容.
1568
								#$conf["printDescription"]="";
1568
								#$conf["printDescription"]="";
1569
								
1569
 
1570
								#如果有參數
1570
								#如果有參數
1571
								if(isset($request->param)){
1571
								if(isset($request->param)){
1572
								
1572
 
1573
									#如果有識別是否已經 escaped 參數
1573
									#如果有識別是否已經 escaped 參數
1574
									if(isset($request->escaped)){
1574
									if(isset($request->escaped)){
1575
									
1575
 
1576
										#設置預設要 escape
1576
										#設置預設要 escape
1577
										$needEscaped="true";
1577
										$needEscaped="true";
1578
										
1578
 
1579
										#如果已經 ecaped
1579
										#如果已經 ecaped
1580
										if($request->escaped){
1580
										if($request->escaped){
1581
										
1581
 
1582
											#設置不用 escape
1582
											#設置不用 escape
1583
											$needEscaped="false";
1583
											$needEscaped="false";
1584
										
1584
 
1585
											}#if end
1585
											}#if end
1586
									
1586
 
1587
										#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".
1587
										#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".
1588
										$conf["external::callShell"]["escapeshellarg"]=$needEscaped;
1588
										$conf["external::callShell"]["escapeshellarg"]=$needEscaped;
1589
									
1589
 
1590
										}#if end
1590
										}#if end
1591
								
1591
 
1592
									}#if end
1592
									}#if end
1593
								
1593
 
1594
								#如果有設置要用特定的使用者身份執行
1594
								#如果有設置要用特定的使用者身份執行
1595
								if(isset($request->user) && isset($request->password)){
1595
								if(isset($request->user) && isset($request->password)){
1596
									
1596
 
1597
									#$conf["username"],字串,要用什麼使用者來執行,預設為執行php的使用者,該參數不適用於apache環境.
1597
									#$conf["username"],字串,要用什麼使用者來執行,預設為執行php的使用者,該參數不適用於apache環境.
1598
									$conf["external::callShell"]["username"]=$request->user;
1598
									$conf["external::callShell"]["username"]=$request->user;
1599
									
1599
 
1600
									#$conf["password"],字串,與$conf["username"]搭配的使用者密碼,預設不使用密碼,該參數不適用於apache環境.
1600
									#$conf["password"],字串,與$conf["username"]搭配的使用者密碼,預設不使用密碼,該參數不適用於apache環境.
1601
									$conf["external::callShell"]["password"]=$request->password;
1601
									$conf["external::callShell"]["password"]=$request->password;
1602
									
1602
 
1603
									}#if end
1603
									}#if end
1604
								
1604
 
1605
								#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要,Fedora的selinux會擋住該操作;"false"代表不要,預設為"false".
1605
								#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要,Fedora的selinux會擋住該操作;"false"代表不要,預設為"false".
1606
								#$conf["useScript"]="";
1606
								#$conf["useScript"]="";
1607
								#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 "/tmp/.qbpwcf_tmp/external/callShell/".
1607
								#$conf["logFilePath"],字串,當 $conf["useScript"] 為 "true" 時,輸出的內容要暫存到哪裡,預設為 "/tmp/.qbpwcf_tmp/external/callShell/".
1608
								#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";
1608
								#$conf["logFilePath"]=".qbpwcf_tmp/external/callShell/";
1609
								#$conf["inBackGround"],字串,是否要在背景執行,且不會等待程式執行結束再執行下一個指令,"true"代表是,"false"代表不要,預設為"false",如果$conf["command"]有用「;」區隔的多個指令將會出錯.
1609
								#$conf["inBackGround"],字串,是否要在背景執行,且不會等待程式執行結束再執行下一個指令,"true"代表是,"false"代表不要,預設為"false",如果$conf["command"]有用「;」區隔的多個指令將會出錯.
Line 1614... Line 1614...
1614
								#exec=>http://php.net/manual/en/function.exec.php
1614
								#exec=>http://php.net/manual/en/function.exec.php
1615
								#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php
1615
								#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php
1616
								#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php
1616
								#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php
1617
								$callShell=external::callShell($conf["external::callShell"]);
1617
								$callShell=external::callShell($conf["external::callShell"]);
1618
								unset($conf["external::callShell"]);
1618
								unset($conf["external::callShell"]);
1619
								
1619
 
1620
								#設置要回覆的內容
1620
								#設置要回覆的內容
1621
								$res=$callShell;
1621
								$res=$callShell;
1622
								
1622
 
1623
								#印出回的訊息
1623
								#印出回的訊息
1624
								echo "response:".PHP_EOL.print_r($res,true);
1624
								echo "response:".PHP_EOL.print_r($res,true);
1625
								
1625
 
1626
								#寫入回應的內容
1626
								#寫入回應的內容
1627
								fwrite($conn,json_encode($res).PHP_EOL);
1627
								fwrite($conn,json_encode($res).PHP_EOL);
1628
								
1628
 
1629
								#結束回應
1629
								#結束回應
1630
								fwrite($conn,PHP_EOL.PHP_EOL);
1630
								fwrite($conn,PHP_EOL.PHP_EOL);
1631
								
1631
 
1632
								#關閉socket連線,將回應輸出.
1632
								#關閉socket連線,將回應輸出.
1633
								fclose($conn);
1633
								fclose($conn);
1634
								
1634
 
1635
								#更新使用者id與最後一次來request的時間
1635
								#更新使用者id與最後一次來request的時間
1636
								$client[$request->id]["last_req_time"]=$last_req_time;	
1636
								$client[$request->id]["last_req_time"]=$last_req_time;
1637
								
1637
 
1638
								#等待下個要求
1638
								#等待下個要求
1639
								continue;
1639
								continue;
1640
								
1640
 
1641
								}#if end
1641
								}#if end
1642
							
1642
 
1643
							#設置接收到json字串資訊
1643
							#設置接收到json字串資訊
1644
							$client[$request->id]["request"]=(array)($request);
1644
							$client[$request->id]["request"]=(array)($request);
1645
							
1645
 
1646
							#設置用戶端的socket
1646
							#設置用戶端的socket
1647
							$client[$request->id]["socket"]=$conn;
1647
							$client[$request->id]["socket"]=$conn;
1648
							
1648
 
1649
							#如果有要求在背景中執行指令的訊息
1649
							#如果有要求在背景中執行指令的訊息
1650
							if(isset($request->cmdInBg)){
1650
							if(isset($request->cmdInBg)){
1651
							
1651
 
1652
								#debug
1652
								#debug
1653
								#var_dump(__FUNCTION__,__LINE__,$request);
1653
								#var_dump(__FUNCTION__,__LINE__,$request);
1654
							
1654
 
1655
								#如果有參數
1655
								#如果有參數
1656
								if(isset($request->param)){
1656
								if(isset($request->param)){
1657
								
1657
 
1658
									#函式說明:
1658
									#函式說明:
1659
									#將一維陣列轉換為用特定符號間隔的字串,ex:array("1","2","3") to "a;b;c;".
1659
									#將一維陣列轉換為用特定符號間隔的字串,ex:array("1","2","3") to "a;b;c;".
1660
									#回傳的結果:
1660
									#回傳的結果:
1661
									#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1661
									#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1662
									#$result["function"],當前執行的function名稱
1662
									#$result["function"],當前執行的function名稱
Line 1677... Line 1677...
1677
									#無.
1677
									#無.
1678
									#備註:
1678
									#備註:
1679
									#無.
1679
									#無.
1680
									$arrayToString=arrays::arrayToString($conf["arrays::arrayToString"]);
1680
									$arrayToString=arrays::arrayToString($conf["arrays::arrayToString"]);
1681
									unset($conf["arrays::arrayToString"]);
1681
									unset($conf["arrays::arrayToString"]);
1682
								
1682
 
1683
									#如果執行失敗
1683
									#如果執行失敗
1684
									if($arrayToString["status"]==="false"){
1684
									if($arrayToString["status"]==="false"){
1685
										
1685
 
1686
										#設置執行失敗
1686
										#設置執行失敗
1687
										$result["status"]="false";
1687
										$result["status"]="false";
1688
										
1688
 
1689
										#設置錯誤訊息
1689
										#設置錯誤訊息
1690
										$result["error"]=$arrayToString;
1690
										$result["error"]=$arrayToString;
1691
										
1691
 
1692
										#回傳結果
1692
										#回傳結果
1693
										return $result;
1693
										return $result;
1694
									
1694
 
1695
										}#if end
1695
										}#if end
1696
								
1696
 
1697
									#串接參數
1697
									#串接參數
1698
									$request->cmdInBg=$request->cmdInBg.$arrayToString["content"];
1698
									$request->cmdInBg=$request->cmdInBg.$arrayToString["content"];
1699
								
1699
 
1700
									}#if end
1700
									}#if end
1701
							
1701
 
1702
								#函式說明:
1702
								#函式說明:
1703
								#透過proc來多執行序運作.
1703
								#透過proc來多執行序運作.
1704
								#回傳結果:
1704
								#回傳結果:
1705
								#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1705
								#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1706
								#$reuslt["error"],執行不正常結束的錯訊息陣列.
1706
								#$reuslt["error"],執行不正常結束的錯訊息陣列.
Line 1724... Line 1724...
1724
								#https://www.php.net/manual/en/function.proc-get-status.php
1724
								#https://www.php.net/manual/en/function.proc-get-status.php
1725
								#備註:
1725
								#備註:
1726
								#若需要取得當下的執行狀況,請使用 self::proc_update 來更新.
1726
								#若需要取得當下的執行狀況,請使用 self::proc_update 來更新.
1727
								$proc=threads::proc($conf["threads::proc"]);
1727
								$proc=threads::proc($conf["threads::proc"]);
1728
								unset($conf["threads::proc"]);
1728
								unset($conf["threads::proc"]);
1729
							
1729
 
1730
								#如果執行失敗
1730
								#如果執行失敗
1731
								if($proc["status"]==="false"){
1731
								if($proc["status"]==="false"){
1732
									
1732
 
1733
									#設置執行失敗
1733
									#設置執行失敗
1734
									$result["status"]="false";
1734
									$result["status"]="false";
1735
									
1735
 
1736
									#設置錯誤訊息
1736
									#設置錯誤訊息
1737
									$result["error"]=$proc;
1737
									$result["error"]=$proc;
1738
									
1738
 
1739
									#回傳結果
1739
									#回傳結果
1740
									return $result;
1740
									return $result;
1741
								
1741
 
1742
									}#if end
1742
									}#if end
1743
								
1743
 
1744
								#函式說明:
1744
								#函式說明:
1745
								#使用 linux 的 uuid 指令來產生 uuid 字串
1745
								#使用 linux 的 uuid 指令來產生 uuid 字串
1746
								#回傳結果:
1746
								#回傳結果:
1747
								#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1747
								#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1748
								#$result["error"],錯誤訊息.
1748
								#$result["error"],錯誤訊息.
Line 1755... Line 1755...
1755
								#參考資料:
1755
								#參考資料:
1756
								#無.
1756
								#無.
1757
								#備註:
1757
								#備註:
1758
								#無.
1758
								#無.
1759
								$uuid=cmd::uuid();
1759
								$uuid=cmd::uuid();
1760
								
1760
 
1761
								#如果執行失敗
1761
								#如果執行失敗
1762
								if($uuid["status"]==="false"){
1762
								if($uuid["status"]==="false"){
1763
										
1763
 
1764
									#設置執行失敗
1764
									#設置執行失敗
1765
									$result["status"]="false";
1765
									$result["status"]="false";
1766
									
1766
 
1767
									#設置錯誤訊息
1767
									#設置錯誤訊息
1768
									$result["error"]=$uuid;
1768
									$result["error"]=$uuid;
1769
									
1769
 
1770
									#回傳結果
1770
									#回傳結果
1771
									return $result;
1771
									return $result;
1772
								
1772
 
1773
									}#if end
1773
									}#if end
1774
								
1774
 
1775
								#取得 uuid
1775
								#取得 uuid
1776
								$uuid=$uuid["content"];
1776
								$uuid=$uuid["content"];
1777
								
1777
 
1778
								#儲存到 server side 的 procs
1778
								#儲存到 server side 的 procs
1779
								$result["serverCache"]["serverSide"]["procs"][$uuid]=$proc;
1779
								$result["serverCache"]["serverSide"]["procs"][$uuid]=$proc;
1780
								
1780
 
1781
								#設置最後的檢查時間為當下
1781
								#設置最後的檢查時間為當下
1782
								$result["serverCache"]["serverSide"]["procs"][$uuid]["latestAccessTime"]=time();
1782
								$result["serverCache"]["serverSide"]["procs"][$uuid]["latestAccessTime"]=time();
1783
								
1783
 
1784
								#設置要回覆的內容
1784
								#設置要回覆的內容
1785
								$res=array("status"=>"true","content"=>$uuid);
1785
								$res=array("status"=>"true","content"=>$uuid);
1786
								
1786
 
1787
								#印出回的訊息
1787
								#印出回的訊息
1788
								echo "response:".PHP_EOL.print_r($res,true);
1788
								echo "response:".PHP_EOL.print_r($res,true);
1789
								
1789
 
1790
								#寫入回應的內容
1790
								#寫入回應的內容
1791
								fwrite($conn,json_encode($res).PHP_EOL);
1791
								fwrite($conn,json_encode($res).PHP_EOL);
1792
								
1792
 
1793
								#結束回應
1793
								#結束回應
1794
								fwrite($conn,PHP_EOL.PHP_EOL);
1794
								fwrite($conn,PHP_EOL.PHP_EOL);
1795
								
1795
 
1796
								#關閉socket連線,將回應輸出.
1796
								#關閉socket連線,將回應輸出.
1797
								fclose($conn);
1797
								fclose($conn);
1798
								
1798
 
1799
								#更新使用者id與最後一次來request的時間
1799
								#更新使用者id與最後一次來request的時間
1800
								$client[$request->id]["last_req_time"]=$last_req_time;
1800
								$client[$request->id]["last_req_time"]=$last_req_time;
1801
								
1801
 
1802
								#等待下個要求
1802
								#等待下個要求
1803
								continue;
1803
								continue;
1804
							
1804
 
1805
								}#if end
1805
								}#if end
1806
							
1806
 
1807
							#如果要查詢程序執行的狀況
1807
							#如果要查詢程序執行的狀況
1808
							if(isset($request->QueryProcByUUID)){
1808
							if(isset($request->QueryProcByUUID)){
1809
							
1809
 
1810
								#如果沒有 proc 資訊
1810
								#如果沒有 proc 資訊
1811
								if(!isset($result["serverCache"]["serverSide"]["procs"])){
1811
								if(!isset($result["serverCache"]["serverSide"]["procs"])){
1812
								
1812
 
1813
									#設置要回覆的內容
1813
									#設置要回覆的內容
1814
									$res=array("status"=>"true","content"=>"");
1814
									$res=array("status"=>"true","content"=>"");
1815
									
1815
 
1816
									#印出回的訊息
1816
									#印出回的訊息
1817
									echo "response:".PHP_EOL.print_r($res,true);
1817
									echo "response:".PHP_EOL.print_r($res,true);
1818
									
1818
 
1819
									#寫入回應的內容
1819
									#寫入回應的內容
1820
									fwrite($conn,json_encode($res).PHP_EOL);
1820
									fwrite($conn,json_encode($res).PHP_EOL);
1821
									
1821
 
1822
									#結束回應
1822
									#結束回應
1823
									fwrite($conn,PHP_EOL.PHP_EOL);
1823
									fwrite($conn,PHP_EOL.PHP_EOL);
1824
									
1824
 
1825
									#關閉socket連線,將回應輸出.
1825
									#關閉socket連線,將回應輸出.
1826
									fclose($conn);
1826
									fclose($conn);
1827
									
1827
 
1828
									#更新使用者id與最後一次來request的時間
1828
									#更新使用者id與最後一次來request的時間
1829
									$client[$request->id]["last_req_time"]=$last_req_time;
1829
									$client[$request->id]["last_req_time"]=$last_req_time;
1830
									
1830
 
1831
									#等待下個要求
1831
									#等待下個要求
1832
									continue;
1832
									continue;
1833
								
1833
 
1834
									}#if end
1834
									}#if end
1835
							
1835
 
1836
								#函式說明:
1836
								#函式說明:
1837
								#更新透過proc執行的多程序資訊.
1837
								#更新透過proc執行的多程序資訊.
1838
								#回傳結果:
1838
								#回傳結果:
1839
								#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1839
								#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1840
								#$reuslt["error"],執行不正常結束的錯訊息陣列.
1840
								#$reuslt["error"],執行不正常結束的錯訊息陣列.
Line 1850... Line 1850...
1850
								#無.
1850
								#無.
1851
								#備註:
1851
								#備註:
1852
								#無.
1852
								#無.
1853
								$proc_update=threads::proc_update($conf["threads::proc_update"]);
1853
								$proc_update=threads::proc_update($conf["threads::proc_update"]);
1854
								unset($conf["threads::proc_update"]);
1854
								unset($conf["threads::proc_update"]);
1855
								
1855
 
1856
								#如果執行失敗
1856
								#如果執行失敗
1857
								if($proc_update["status"]==="false"){
1857
								if($proc_update["status"]==="false"){
1858
										
1858
 
1859
									#設置執行失敗
1859
									#設置執行失敗
1860
									$result["status"]="false";
1860
									$result["status"]="false";
1861
									
1861
 
1862
									#設置錯誤訊息
1862
									#設置錯誤訊息
1863
									$result["error"]=$proc_update;
1863
									$result["error"]=$proc_update;
1864
									
1864
 
1865
									#回傳結果
1865
									#回傳結果
1866
									return $result;
1866
									return $result;
1867
									
1867
 
1868
									}#if end
1868
									}#if end
1869
									
1869
 
1870
								#更新 serverSide 的 proc cache
1870
								#更新 serverSide 的 proc cache
1871
								$result["serverCache"]["serverSide"]["procs"][$request->QueryProcByUUID]["content"]=$proc_update["content"];
1871
								$result["serverCache"]["serverSide"]["procs"][$request->QueryProcByUUID]["content"]=$proc_update["content"];
1872
								
1872
 
1873
								#設置最後檢查的時間
1873
								#設置最後檢查的時間
1874
								$result["serverCache"]["serverSide"]["procs"][$request->QueryProcByUUID]["latestAccessTime"]=time();
1874
								$result["serverCache"]["serverSide"]["procs"][$request->QueryProcByUUID]["latestAccessTime"]=time();
1875
								
1875
 
1876
								#印出子程序的資訊
1876
								#印出子程序的資訊
1877
								echo "proc info:".PHP_EOL.print_r($proc_update["content"][0],true);
1877
								echo "proc info:".PHP_EOL.print_r($proc_update["content"][0],true);
1878
								
1878
 
1879
								#初始化要回傳的內容
1879
								#初始化要回傳的內容
1880
								$res=array();
1880
								$res=array();
1881
								
1881
 
1882
								#設置 pid
1882
								#設置 pid
1883
								$res["pid"]=$proc_update["content"][0]["proc_get_status"]["pid"];
1883
								$res["pid"]=$proc_update["content"][0]["proc_get_status"]["pid"];
1884
								
1884
 
1885
								#設置輸入的內容
1885
								#設置輸入的內容
1886
								$res["input"]=$proc_update["content"][0]["input"];
1886
								$res["input"]=$proc_update["content"][0]["input"];
1887
								
1887
 
1888
								#預設設置已經結束執行
1888
								#預設設置已經結束執行
1889
								$res["running"]="false";
1889
								$res["running"]="false";
1890
								
1890
 
1891
								#如果尚在執行
1891
								#如果尚在執行
1892
								if($proc_update["content"][0]["statusCode"]==="?"){
1892
								if($proc_update["content"][0]["statusCode"]==="?"){
1893
								
1893
 
1894
									#設置正在執行
1894
									#設置正在執行
1895
									$res["running"]="true";
1895
									$res["running"]="true";
1896
								
1896
 
1897
									}#if end
1897
									}#if end
1898
								
1898
 
1899
								#如果已經結束執行
1899
								#如果已經結束執行
1900
								if($res["running"]==="false"){
1900
								if($res["running"]==="false"){
1901
								
1901
 
1902
									#設置執行後得到的標準輸出
1902
									#設置執行後得到的標準輸出
1903
									$res["output"]=$proc_update["content"][0]["content"];
1903
									$res["output"]=$proc_update["content"][0]["content"];
1904
									
1904
 
1905
									#設置執行後得到的錯誤輸出
1905
									#設置執行後得到的錯誤輸出
1906
									$res["error"]=$proc_update["content"][0]["error"];
1906
									$res["error"]=$proc_update["content"][0]["error"];
1907
								
1907
 
1908
									}#if end
1908
									}#if end
1909
									
1909
 
1910
								#設置回應正常
1910
								#設置回應正常
1911
								$res["status"]="true";
1911
								$res["status"]="true";
1912
								
1912
 
1913
								#印出回的訊息
1913
								#印出回的訊息
1914
								echo "response:".PHP_EOL.print_r($res,true);
1914
								echo "response:".PHP_EOL.print_r($res,true);
1915
								
1915
 
1916
								#寫入回應的內容
1916
								#寫入回應的內容
1917
								fwrite($conn,json_encode($res).PHP_EOL);
1917
								fwrite($conn,json_encode($res).PHP_EOL);
1918
								
1918
 
1919
								#結束回應
1919
								#結束回應
1920
								fwrite($conn,PHP_EOL.PHP_EOL);
1920
								fwrite($conn,PHP_EOL.PHP_EOL);
1921
								
1921
 
1922
								#關閉socket連線,將回應輸出.
1922
								#關閉socket連線,將回應輸出.
1923
								fclose($conn);
1923
								fclose($conn);
1924
								
1924
 
1925
								#更新使用者id與最後一次來request的時間
1925
								#更新使用者id與最後一次來request的時間
1926
								$client[$request->id]["last_req_time"]=$last_req_time;
1926
								$client[$request->id]["last_req_time"]=$last_req_time;
1927
								
1927
 
1928
								#等待下個要求
1928
								#等待下個要求
1929
								continue;
1929
								continue;
1930
							
1930
 
1931
								}#if end
1931
								}#if end
1932
							
1932
 
1933
							#debug
1933
							#debug
1934
							#var_dump(__LINE__,$conn,$client[$request->id]);
1934
							#var_dump(__LINE__,$conn,$client[$request->id]);
1935
							
1935
 
1936
							#如果存在 addOnProcessFunc
1936
							#如果存在 addOnProcessFunc
1937
							if(isset($conf["addOnProcessFunc"])){
1937
							if(isset($conf["addOnProcessFunc"])){
1938
								
1938
 
1939
								#針對每個 addOnProcessFunc
1939
								#針對每個 addOnProcessFunc
1940
								foreach($conf["addOnProcessFunc"] as $addOnProcessFunc){
1940
								foreach($conf["addOnProcessFunc"] as $addOnProcessFunc){
1941
									
1941
 
1942
									#如果有設置 infoToFunction
1942
									#如果有設置 infoToFunction
1943
									if(isset($conf["infoToFunction"])){
1943
									if(isset($conf["infoToFunction"])){
1944
									
1944
 
1945
										#設置info
1945
										#設置info
1946
										$client[$request->id]["info"]=&$conf["infoToFunction"];
1946
										$client[$request->id]["info"]=&$conf["infoToFunction"];
1947
										
1947
 
1948
										}#if end
1948
										}#if end
1949
									
1949
 
1950
									#設置client cache
1950
									#設置client cache
1951
									$client[$request->id]["clientCache"]=&$clientCache;
1951
									$client[$request->id]["clientCache"]=&$clientCache;
1952
									
1952
 
1953
									#呼叫 $addOnProcessFunc 函式,參數用 $client[$request->id], 取得執行後的回應.
1953
									#呼叫 $addOnProcessFunc 函式,參數用 $client[$request->id], 取得執行後的回應.
1954
									eval("\$call_user_func=".$addOnProcessFunc."(\$client[\$request->id]);");
1954
									eval("\$call_user_func=".$addOnProcessFunc."(\$client[\$request->id]);");
1955
									
1955
 
1956
									/* debug
1956
									/* debug
1957
									
1957
 
1958
									#函式說明:
1958
									#函式說明:
1959
									#撰寫log
1959
									#撰寫log
1960
									#回傳結果:
1960
									#回傳結果:
1961
									#$result["status"],狀態,"true"或"false".
1961
									#$result["status"],狀態,"true"或"false".
1962
									#$result["error"],錯誤訊息陣列.
1962
									#$result["error"],錯誤訊息陣列.
Line 1979... Line 1979...
1979
									#無.
1979
									#無.
1980
									#備註:
1980
									#備註:
1981
									#無.
1981
									#無.
1982
									$record=logs::record($conf["logs::record"]);
1982
									$record=logs::record($conf["logs::record"]);
1983
									unset($conf["logs::record"]);
1983
									unset($conf["logs::record"]);
1984
									
1984
 
1985
									#如果執行失敗
1985
									#如果執行失敗
1986
									if($record["status"]==="false"){
1986
									if($record["status"]==="false"){
1987
									
1987
 
1988
										#設置執行錯誤識別
1988
										#設置執行錯誤識別
1989
										$result["status"]="false";
1989
										$result["status"]="false";
1990
									
1990
 
1991
										#設置執行錯誤
1991
										#設置執行錯誤
1992
										$result["error"]=$record;
1992
										$result["error"]=$record;
1993
									
1993
 
1994
										#回傳結果
1994
										#回傳結果
1995
										return $result;
1995
										return $result;
1996
									
1996
 
1997
										}#if end
1997
										}#if end
1998
									
1998
 
1999
									*/
1999
									*/
2000
									
2000
 
2001
									#如果回應不是 array
2001
									#如果回應不是 array
2002
									if(gettype($call_user_func)!=="array"){
2002
									if(gettype($call_user_func)!=="array"){
2003
									
2003
 
2004
										#設置執行失敗
2004
										#設置執行失敗
2005
										$result["status"]="false";
2005
										$result["status"]="false";
2006
										
2006
 
2007
										#設置錯誤訊息
2007
										#設置錯誤訊息
2008
										$result["error"][]=$call_user_func;
2008
										$result["error"][]=$call_user_func;
2009
										
2009
 
2010
										#設置錯誤訊息
2010
										#設置錯誤訊息
2011
										$result["error"][]=$conf;
2011
										$result["error"][]=$conf;
2012
										
2012
 
2013
										#印出error資訊
2013
										#印出error資訊
2014
										echo "error:".print_r($result,true);
2014
										echo "error:".print_r($result,true);
2015
										
2015
 
2016
										#回應錯誤訊息給用戶
2016
										#回應錯誤訊息給用戶
2017
										fwrite($conn,json_encode($result).PHP_EOL);
2017
										fwrite($conn,json_encode($result).PHP_EOL);
2018
										
2018
 
2019
										#結束回應
2019
										#結束回應
2020
										fwrite($conn,PHP_EOL.PHP_EOL);
2020
										fwrite($conn,PHP_EOL.PHP_EOL);
2021
									
2021
 
2022
										#關閉socket連線,將回應輸出.
2022
										#關閉socket連線,將回應輸出.
2023
										fclose($conn);
2023
										fclose($conn);
2024
										
2024
 
2025
										#回傳結果
2025
										#回傳結果
2026
										return $result;
2026
										return $result;
2027
										
2027
 
2028
										}#if end
2028
										}#if end
2029
									
2029
 
2030
									#檢查回應的格式
2030
									#檢查回應的格式
2031
									#函式說明:
2031
									#函式說明:
2032
									#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
2032
									#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
2033
									#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2033
									#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2034
									#$reuslt["error"],執行不正常結束的錯訊息陣列.
2034
									#$reuslt["error"],執行不正常結束的錯訊息陣列.
Line 2042... Line 2042...
2042
									#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
2042
									#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
2043
									#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
2043
									#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
2044
									#$result["notNeedVar"],字串陣列,多餘的參數名稱.
2044
									#$result["notNeedVar"],字串陣列,多餘的參數名稱.
2045
									#必填寫的參數:
2045
									#必填寫的參數:
2046
									#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
2046
									#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
2047
									$conf["variableCheck::checkArguments"]["varInput"]=&$call_user_func;	
2047
									$conf["variableCheck::checkArguments"]["varInput"]=&$call_user_func;
2048
									#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
2048
									#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
2049
									$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
2049
									$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
2050
									#可以省略的參數:
2050
									#可以省略的參數:
2051
									#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
2051
									#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
2052
									$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("status");
2052
									$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("status");
Line 2060... Line 2060...
2060
									#$conf["canBeEmpty"]=array();
2060
									#$conf["canBeEmpty"]=array();
2061
									#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
2061
									#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
2062
									#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("function","continue");
2062
									#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("function","continue");
2063
									#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
2063
									#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
2064
									$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("function","continue","content","cache","argu","error");
2064
									$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("function","continue","content","cache","argu","error");
2065
									#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
2065
									#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
2066
									$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string",null,"array","array","array");
2066
									$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string",null,"array","array","array");
2067
									#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
2067
									#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
2068
									$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array($addOnProcessFunc,"true",null,null,null,null);
2068
									$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array($addOnProcessFunc,"true",null,null,null,null);
2069
									#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
2069
									#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
2070
									#$conf["disallowAllSkipableVarIsEmpty"]="";
2070
									#$conf["disallowAllSkipableVarIsEmpty"]="";
Line 2074... Line 2074...
2074
									#$conf["arrayCountEqualCheck"][]=array();
2074
									#$conf["arrayCountEqualCheck"][]=array();
2075
									#參考資料來源:
2075
									#參考資料來源:
2076
									#array_keys=>http://php.net/manual/en/function.array-keys.php
2076
									#array_keys=>http://php.net/manual/en/function.array-keys.php
2077
									$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
2077
									$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
2078
									unset($conf["variableCheck::checkArguments"]);
2078
									unset($conf["variableCheck::checkArguments"]);
2079
									
2079
 
2080
									#如果檢查參數失敗
2080
									#如果檢查參數失敗
2081
									if($checkArguments["status"]==="false"){
2081
									if($checkArguments["status"]==="false"){
2082
										
2082
 
2083
										#設置執行失敗
2083
										#設置執行失敗
2084
										$result["status"]="false";
2084
										$result["status"]="false";
2085
										
2085
 
2086
										#設置錯誤訊息
2086
										#設置錯誤訊息
2087
										$result["error"]=$checkArguments;
2087
										$result["error"]=$checkArguments;
2088
										
2088
 
2089
										#印出error資訊
2089
										#印出error資訊
2090
										echo "error:".print_r($result,true);
2090
										echo "error:".print_r($result,true);
2091
										
2091
 
2092
										#回應錯誤訊息給用戶
2092
										#回應錯誤訊息給用戶
2093
										fwrite($conn,json_encode($result).PHP_EOL);
2093
										fwrite($conn,json_encode($result).PHP_EOL);
2094
										
2094
 
2095
										#結束回應
2095
										#結束回應
2096
										fwrite($conn,PHP_EOL.PHP_EOL);
2096
										fwrite($conn,PHP_EOL.PHP_EOL);
2097
									
2097
 
2098
										#關閉socket連線,將回應輸出.
2098
										#關閉socket連線,將回應輸出.
2099
										fclose($conn);
2099
										fclose($conn);
2100
										
2100
 
2101
										#回傳結果
2101
										#回傳結果
2102
										return $result;
2102
										return $result;
2103
										
2103
 
2104
										}#if end
2104
										}#if end
2105
										
2105
 
2106
									#如果檢查參數不通過
2106
									#如果檢查參數不通過
2107
									if($checkArguments["passed"]==="false"){
2107
									if($checkArguments["passed"]==="false"){
2108
										
2108
 
2109
										#設置執行失敗
2109
										#設置執行失敗
2110
										$result["status"]="false";
2110
										$result["status"]="false";
2111
										
2111
 
2112
										#設置錯誤訊息
2112
										#設置錯誤訊息
2113
										$result["error"]=$checkArguments;
2113
										$result["error"]=$checkArguments;
2114
										
2114
 
2115
										#印出error資訊
2115
										#印出error資訊
2116
										echo "error:".print_r($result,true);
2116
										echo "error:".print_r($result,true);
2117
										
2117
 
2118
										#回應錯誤訊息給用戶
2118
										#回應錯誤訊息給用戶
2119
										fwrite($conn,json_encode($result).PHP_EOL);
2119
										fwrite($conn,json_encode($result).PHP_EOL);
2120
										
2120
 
2121
										#結束回應
2121
										#結束回應
2122
										fwrite($conn,PHP_EOL.PHP_EOL);
2122
										fwrite($conn,PHP_EOL.PHP_EOL);
2123
									
2123
 
2124
										#關閉socket連線,將回應輸出.
2124
										#關閉socket連線,將回應輸出.
2125
										fclose($conn);
2125
										fclose($conn);
2126
										
2126
 
2127
										#回傳結果
2127
										#回傳結果
2128
										return $result;
2128
										return $result;
2129
										
2129
 
2130
										}#if end
2130
										}#if end
2131
									
2131
 
2132
									#如果回應不正常
2132
									#如果回應不正常
2133
									if($call_user_func["status"]==="false"){
2133
									if($call_user_func["status"]==="false"){
2134
									
2134
 
2135
										#設置執行失敗
2135
										#設置執行失敗
2136
										$result["status"]="false";
2136
										$result["status"]="false";
2137
											
2137
 
2138
										#設置錯誤訊息
2138
										#設置錯誤訊息
2139
										$result["error"][]=$call_user_func;
2139
										$result["error"][]=$call_user_func;
2140
										
2140
 
2141
										#設置錯誤訊息
2141
										#設置錯誤訊息
2142
										$result["error"][]=$conf;
2142
										$result["error"][]=$conf;
2143
											
2143
 
2144
										#印出error資訊
2144
										#印出error資訊
2145
										echo "error:".print_r($result,true);
2145
										echo "error:".print_r($result,true);
2146
										
2146
 
2147
										#回應錯誤訊息給用戶
2147
										#回應錯誤訊息給用戶
2148
										fwrite($conn,json_encode($result).PHP_EOL);
2148
										fwrite($conn,json_encode($result).PHP_EOL);
2149
										
2149
 
2150
										#結束回應
2150
										#結束回應
2151
										fwrite($conn,PHP_EOL.PHP_EOL);
2151
										fwrite($conn,PHP_EOL.PHP_EOL);
2152
									
2152
 
2153
										#關閉socket連線,將回應輸出.
2153
										#關閉socket連線,將回應輸出.
2154
										fclose($conn);
2154
										fclose($conn);
2155
										
2155
 
2156
										#回傳結果
2156
										#回傳結果
2157
										return $result;
2157
										return $result;
2158
									
2158
 
2159
										}#if end
2159
										}#if end
2160
									
2160
 
2161
									#如果回應有 content 元素
2161
									#如果回應有 content 元素
2162
									if(isset($call_user_func["content"])){
2162
									if(isset($call_user_func["content"])){
2163
										
2163
 
2164
										#用收到 content 元素內容來更新 $client[id]["request"]
2164
										#用收到 content 元素內容來更新 $client[id]["request"]
2165
										$client[$request->id]["request"]=$call_user_func["content"];
2165
										$client[$request->id]["request"]=$call_user_func["content"];
2166
									
2166
 
2167
										}#if end
2167
										}#if end
2168
									
2168
 
2169
									#如果回傳 cache 元素
2169
									#如果回傳 cache 元素
2170
									if(isset($call_user_func["cache"])){
2170
									if(isset($call_user_func["cache"])){
2171
										
2171
 
2172
										#用收到 cache 元素內容來更新 server side 的 cache
2172
										#用收到 cache 元素內容來更新 server side 的 cache
2173
										$result["serverCache"]["clientSide"]["addOnProcessFunc"][$addOnProcessFunc]=&$call_user_func["cache"];
2173
										$result["serverCache"]["clientSide"]["addOnProcessFunc"][$addOnProcessFunc]=&$call_user_func["cache"];
2174
									
2174
 
2175
										}#if end
2175
										}#if end
2176
									
2176
 
2177
									#如果回應不要往後面執行
2177
									#如果回應不要往後面執行
2178
									if($call_user_func["continue"]==="false"){
2178
									if($call_user_func["continue"]==="false"){
2179
									
2179
 
2180
										#結束 foreach
2180
										#結束 foreach
2181
										break;
2181
										break;
2182
									
2182
 
2183
										}#if end
2183
										}#if end
2184
										
2184
 
2185
									}#foreach end
2185
									}#foreach end
2186
							
2186
 
2187
								}#if end
2187
								}#if end
2188
							
2188
 
2189
							#執行到這代表是要保持連線
2189
							#執行到這代表是要保持連線
2190
							
2190
 
2191
							#設置執行正常
2191
							#設置執行正常
2192
							$res["status"]="true";
2192
							$res["status"]="true";
2193
							
2193
 
2194
							#印出回的訊息
2194
							#印出回的訊息
2195
							echo "response:".PHP_EOL.print_r($res,true);
2195
							echo "response:".PHP_EOL.print_r($res,true);
2196
							
2196
 
2197
							#debug
2197
							#debug
2198
							#var_dump(__LINE__,$conn,get_resource_type($conn));
2198
							#var_dump(__LINE__,$conn,get_resource_type($conn));
2199
							
2199
 
2200
							#如果資源形態沒有異常(用戶關閉連線後,會有resource type變成"Unknown"的結果)
2200
							#如果資源形態沒有異常(用戶關閉連線後,會有resource type變成"Unknown"的結果)
2201
							if(get_resource_type($conn)!=="Unknown"){
2201
							if(get_resource_type($conn)!=="Unknown"){
2202
							
2202
 
2203
								#函式說明:
2203
								#函式說明:
2204
								#用fwrite寫入到resource,可以指定每個寫入字串的結尾方式.
2204
								#用fwrite寫入到resource,可以指定每個寫入字串的結尾方式.
2205
								#回傳結果:
2205
								#回傳結果:
2206
								#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
2206
								#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
2207
								#$result["error"],錯誤訊息陣列.
2207
								#$result["error"],錯誤訊息陣列.
Line 2225... Line 2225...
2225
								#https://www.php.net/manual/en/function.socket-get-status.php
2225
								#https://www.php.net/manual/en/function.socket-get-status.php
2226
								#備註:
2226
								#備註:
2227
								#無.
2227
								#無.
2228
								$fwrite=sock::fwrite($conf["sock::fwrite"]);
2228
								$fwrite=sock::fwrite($conf["sock::fwrite"]);
2229
								unset($conf["sock::fwrite"]);
2229
								unset($conf["sock::fwrite"]);
2230
								
2230
 
2231
								#如果執行失敗
2231
								#如果執行失敗
2232
								if($fwrite["status"]==="false"){
2232
								if($fwrite["status"]==="false"){
2233
									
2233
 
2234
									#如果有 is_writable
2234
									#如果有 is_writable
2235
									if(isset($fwrite["is_writable"])){
2235
									if(isset($fwrite["is_writable"])){
2236
									
2236
 
2237
										#如果有 is_writable
2237
										#如果有 is_writable
2238
										if($fwrite["is_writable"]==="true"){
2238
										if($fwrite["is_writable"]==="true"){
2239
										
2239
 
2240
											#設置執行失敗
2240
											#設置執行失敗
2241
											$result["status"]="false";
2241
											$result["status"]="false";
2242
											
2242
 
2243
											#設置錯誤訊息
2243
											#設置錯誤訊息
2244
											$result["error"]=$fwrite;
2244
											$result["error"]=$fwrite;
2245
											
2245
 
2246
											#印出error資訊
2246
											#印出error資訊
2247
											echo "error:".print_r($result,true);
2247
											echo "error:".print_r($result,true);
2248
											
2248
 
2249
											#結束並回傳1給shell
2249
											#結束並回傳1給shell
2250
											exit(1);
2250
											exit(1);
2251
										
2251
 
2252
											}#if end
2252
											}#if end
2253
									
2253
 
2254
										}#if end
2254
										}#if end
2255
										
2255
 
2256
									#反之
2256
									#反之
2257
									else{
2257
									else{
2258
									
2258
 
2259
										#設置執行失敗
2259
										#設置執行失敗
2260
										$result["status"]="false";
2260
										$result["status"]="false";
2261
										
2261
 
2262
										#設置錯誤訊息
2262
										#設置錯誤訊息
2263
										$result["error"]=$fwrite;
2263
										$result["error"]=$fwrite;
2264
										
2264
 
2265
										#印出error資訊
2265
										#印出error資訊
2266
										echo "error:".print_r($result,true);
2266
										echo "error:".print_r($result,true);
2267
										
2267
 
2268
										#結束並回傳1給shell
2268
										#結束並回傳1給shell
2269
										exit(1);
2269
										exit(1);
2270
									
2270
 
2271
										}#else end
2271
										}#else end
2272
									
2272
 
2273
									}#if end
2273
									}#if end
2274
								
2274
 
2275
								}#if end
2275
								}#if end
2276
								
2276
 
2277
							#更新使用者id與最後一次來request的時間
2277
							#更新使用者id與最後一次來request的時間
2278
							$client[$request->id]["last_req_time"]=$last_req_time;
2278
							$client[$request->id]["last_req_time"]=$last_req_time;
2279
							
2279
 
2280
							#印出用戶端列表
2280
							#印出用戶端列表
2281
							echo "clients:".print_r($client,true);
2281
							echo "clients:".print_r($client,true);
2282
							
2282
 
2283
							#等待下個要求
2283
							#等待下個要求
2284
							continue;
2284
							continue;
2285
							
2285
 
2286
							}#if end
2286
							}#if end
2287
						
2287
 
2288
						#socket 陣列不是我們建立的 socket
2288
						#socket 陣列不是我們建立的 socket
2289
						else{
2289
						else{
2290
							
2290
 
2291
							#顯示 socket 的狀態
2291
							#顯示 socket 的狀態
2292
							var_dump("socket_get_status".socket_get_status($conn));
2292
							var_dump("socket_get_status".socket_get_status($conn));
2293
							
2293
 
2294
							}#else end
2294
							}#else end
2295
							
2295
 
2296
						}#foreach end
2296
						}#foreach end
2297
				
2297
 
2298
					}#else end
2298
					}#else end
2299
				
2299
 
2300
				}#while end
2300
				}#while end
2301
		
2301
 
2302
			#關閉 unix domain socket
2302
			#關閉 unix domain socket
2303
			fclose($socket);
2303
			fclose($socket);
2304
			
2304
 
2305
			}#else end
2305
			}#else end
2306
		
2306
 
2307
		}#function unixDomainSockServer end
2307
		}#function unixDomainSockServer end
2308
	
2308
 
2309
	/*
2309
	/*
2310
	#函式說明:
2310
	#函式說明:
2311
	#連線到 unixDomainSockServer 提供的 unix domain socket.
2311
	#連線到 unixDomainSockServer 提供的 unix domain socket.
2312
	#回傳結果:
2312
	#回傳結果:
2313
	#$result["status"],"true"代表執行正常;"false"代表執行不正常.
2313
	#$result["status"],"true"代表執行正常;"false"代表執行不正常.
Line 2335... Line 2335...
2335
	#http://php.net/manual/en/function.stream-get-contents.php
2335
	#http://php.net/manual/en/function.stream-get-contents.php
2336
	#備註:
2336
	#備註:
2337
	#無.
2337
	#無.
2338
	*/
2338
	*/
2339
	public static function unixDomainSockClient(&$conf){
2339
	public static function unixDomainSockClient(&$conf){
2340
		
2340
 
2341
		#初始化要回傳的結果
2341
		#初始化要回傳的結果
2342
		$result=array();
2342
		$result=array();
2343
 
2343
 
2344
		#取得當前執行的函數名稱
2344
		#取得當前執行的函數名稱
2345
		$result["function"]=__FUNCTION__;
2345
		$result["function"]=__FUNCTION__;
2346
		
2346
 
2347
		#如果沒有參數
2347
		#如果沒有參數
2348
		if(func_num_args()==0){
2348
		if(func_num_args()==0){
2349
			
2349
 
2350
			#設置執行失敗
2350
			#設置執行失敗
2351
			$result["status"]="false";
2351
			$result["status"]="false";
2352
			
2352
 
2353
			#設置執行錯誤訊息
2353
			#設置執行錯誤訊息
2354
			$result["error"]="函數".$result["function"]."需要參數";
2354
			$result["error"]="函數".$result["function"]."需要參數";
2355
			
2355
 
2356
			#回傳結果
2356
			#回傳結果
2357
			return $result;
2357
			return $result;
2358
			
2358
 
2359
			}#if end
2359
			}#if end
2360
 
2360
 
2361
		#取得參數
2361
		#取得參數
2362
		$result["argu"]=$conf;
2362
		$result["argu"]=$conf;
2363
 
2363
 
2364
		#如果 $conf 不為陣列
2364
		#如果 $conf 不為陣列
2365
		if(gettype($conf)!="array"){
2365
		if(gettype($conf)!="array"){
2366
		
2366
 
2367
			#設置執行失敗
2367
			#設置執行失敗
2368
			$result["status"]="false";
2368
			$result["status"]="false";
2369
		
2369
 
2370
			#設置執行錯誤訊息
2370
			#設置執行錯誤訊息
2371
			$result["error"][]="\$conf變數須為陣列形態";
2371
			$result["error"][]="\$conf變數須為陣列形態";
2372
		
2372
 
2373
			#如果傳入的參數為 null
2373
			#如果傳入的參數為 null
2374
			if($conf==null){
2374
			if($conf==null){
2375
			
2375
 
2376
				#設置執行錯誤訊息
2376
				#設置執行錯誤訊息
2377
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
2377
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
2378
			
2378
 
2379
				}#if end
2379
				}#if end
2380
 
2380
 
2381
			#回傳結果
2381
			#回傳結果
2382
			return $result;
2382
			return $result;
2383
		
2383
 
2384
			}#if end
2384
			}#if end
2385
			
2385
 
2386
		#檢查參數
2386
		#檢查參數
2387
		#函式說明:
2387
		#函式說明:
2388
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
2388
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
2389
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2389
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2390
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
2390
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
Line 2398... Line 2398...
2398
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
2398
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
2399
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
2399
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
2400
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
2400
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
2401
		#必填寫的參數:
2401
		#必填寫的參數:
2402
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
2402
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
2403
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;	
2403
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
2404
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
2404
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
2405
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
2405
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
2406
		#可以省略的參數:
2406
		#可以省略的參數:
2407
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
2407
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
2408
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("sock");
2408
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("sock");
Line 2416... Line 2416...
2416
		#$conf["canBeEmpty"]=array();
2416
		#$conf["canBeEmpty"]=array();
2417
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
2417
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
2418
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("id","cmd","param","escaped","custom");
2418
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("id","cmd","param","escaped","custom");
2419
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
2419
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
2420
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("id","cmd","param","escaped","custom","raw");
2420
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("id","cmd","param","escaped","custom","raw");
2421
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
2421
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
2422
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","array","string","array","string");
2422
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","array","string","array","string");
2423
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
2423
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
2424
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null,null,null,"false",null,null);
2424
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null,null,null,"false",null,null);
2425
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
2425
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
2426
		#$conf["disallowAllSkipableVarIsEmpty"]="";
2426
		#$conf["disallowAllSkipableVarIsEmpty"]="";
Line 2430... Line 2430...
2430
		#$conf["arrayCountEqualCheck"][]=array();
2430
		#$conf["arrayCountEqualCheck"][]=array();
2431
		#參考資料來源:
2431
		#參考資料來源:
2432
		#array_keys=>http://php.net/manual/en/function.array-keys.php
2432
		#array_keys=>http://php.net/manual/en/function.array-keys.php
2433
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
2433
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
2434
		unset($conf["variableCheck::checkArguments"]);
2434
		unset($conf["variableCheck::checkArguments"]);
2435
			
2435
 
2436
		#如果檢查參數失敗
2436
		#如果檢查參數失敗
2437
		if($checkArguments["status"]==="false"){
2437
		if($checkArguments["status"]==="false"){
2438
			
2438
 
2439
			#設置執行失敗
2439
			#設置執行失敗
2440
			$result["status"]="false";
2440
			$result["status"]="false";
2441
			
2441
 
2442
			#設置錯誤訊息
2442
			#設置錯誤訊息
2443
			$result["error"]=$checkArguments;
2443
			$result["error"]=$checkArguments;
2444
			
2444
 
2445
			#回傳結果
2445
			#回傳結果
2446
			return $result;
2446
			return $result;
2447
			
2447
 
2448
			}#if end
2448
			}#if end
2449
			
2449
 
2450
		#如果檢查參數不通過
2450
		#如果檢查參數不通過
2451
		if($checkArguments["passed"]==="false"){
2451
		if($checkArguments["passed"]==="false"){
2452
			
2452
 
2453
			#設置執行失敗
2453
			#設置執行失敗
2454
			$result["status"]="false";
2454
			$result["status"]="false";
2455
			
2455
 
2456
			#設置錯誤訊息
2456
			#設置錯誤訊息
2457
			$result["error"]=$checkArguments;
2457
			$result["error"]=$checkArguments;
2458
			
2458
 
2459
			#回傳結果
2459
			#回傳結果
2460
			return $result;
2460
			return $result;
2461
			
2461
 
2462
			}#if end
2462
			}#if end
2463
		
2463
 
2464
		#檢查 unix socket 檔案 $conf["sock"] 是否存在.
2464
		#檢查 unix socket 檔案 $conf["sock"] 是否存在.
2465
		#函式說明:
2465
		#函式說明:
2466
		#檢查多個檔案與資料夾是否存在.
2466
		#檢查多個檔案與資料夾是否存在.
2467
		#回傳的結果:
2467
		#回傳的結果:
2468
		#$result["status"],執行正常與否,"true"代表正常,"false"代表不正常.
2468
		#$result["status"],執行正常與否,"true"代表正常,"false"代表不正常.
Line 2492... Line 2492...
2492
		#備註:
2492
		#備註:
2493
		#函數file_exists檢查的路徑為檔案系統的路徑
2493
		#函數file_exists檢查的路徑為檔案系統的路徑
2494
		#$result["varName"][$i]結果未實作
2494
		#$result["varName"][$i]結果未實作
2495
		$checkMultiFileExist=fileAccess::checkMultiFileExist($conf["variableCheck::checkArguments"]);
2495
		$checkMultiFileExist=fileAccess::checkMultiFileExist($conf["variableCheck::checkArguments"]);
2496
		unset($conf["variableCheck::checkArguments"]);
2496
		unset($conf["variableCheck::checkArguments"]);
2497
		
2497
 
2498
		#如果檢查失敗
2498
		#如果檢查失敗
2499
		if($checkMultiFileExist["status"]==="false"){
2499
		if($checkMultiFileExist["status"]==="false"){
2500
		
2500
 
2501
			#設置執行失敗
2501
			#設置執行失敗
2502
			$result["status"]="false";
2502
			$result["status"]="false";
2503
			
2503
 
2504
			#設置錯誤訊息
2504
			#設置錯誤訊息
2505
			$result["error"]=$checkMultiFileExist;
2505
			$result["error"]=$checkMultiFileExist;
2506
			
2506
 
2507
			#回傳結果
2507
			#回傳結果
2508
			return $result;
2508
			return $result;
2509
		
2509
 
2510
			}#if end
2510
			}#if end
2511
			
2511
 
2512
		#如果檢查失敗
2512
		#如果檢查失敗
2513
		if($checkMultiFileExist["allExist"]==="false"){
2513
		if($checkMultiFileExist["allExist"]==="false"){
2514
		
2514
 
2515
			#設置執行失敗
2515
			#設置執行失敗
2516
			$result["status"]="false";
2516
			$result["status"]="false";
2517
			
2517
 
2518
			#設置錯誤訊息
2518
			#設置錯誤訊息
2519
			$result["error"]=$checkMultiFileExist;
2519
			$result["error"]=$checkMultiFileExist;
2520
			
2520
 
2521
			#回傳結果
2521
			#回傳結果
2522
			return $result;
2522
			return $result;
2523
		
2523
 
2524
			}#if end
2524
			}#if end
2525
		
2525
 
2526
		#初始化取得的回應
2526
		#初始化取得的回應
2527
		$result["content"]="";
2527
		$result["content"]="";
2528
		
2528
 
2529
		#debug
2529
		#debug
2530
		#var_dump(__LINE__,"before connect");
2530
		#var_dump(__LINE__,"before connect");
2531
		
2531
 
2532
		#嘗試30秒內連線到 unix domain socket
2532
		#嘗試30秒內連線到 unix domain socket
2533
		$fp=@stream_socket_client("unix://".$conf["sock"], $errno, $errstr, 30, STREAM_CLIENT_ASYNC_CONNECT );
2533
		$fp=@stream_socket_client("unix://".$conf["sock"], $errno, $errstr, 30, STREAM_CLIENT_ASYNC_CONNECT );
2534
		
2534
 
2535
		#如果開啟 unix domain socket 失敗
2535
		#如果開啟 unix domain socket 失敗
2536
		if(!$fp){
2536
		if(!$fp){
2537
			
2537
 
2538
			#設置執行錯誤識別
2538
			#設置執行錯誤識別
2539
			$result["status"]="false";
2539
			$result["status"]="false";
2540
			
2540
 
2541
			#設置錯誤訊息
2541
			#設置錯誤訊息
2542
			$result["error"]=$errstr." (".$errno.")";
2542
			$result["error"]=$errstr." (".$errno.")";
2543
			
2543
 
2544
			#回傳結果
2544
			#回傳結果
2545
			return $result;
2545
			return $result;
2546
			
2546
 
2547
			}#if end
2547
			}#if end
2548
		
2548
 
2549
		#反之開啟 unix domain socket 成功,且沒有raw參數存在
2549
		#反之開啟 unix domain socket 成功,且沒有raw參數存在
2550
		else if(!isset($conf["raw"])){
2550
		else if(!isset($conf["raw"])){
2551
			
2551
 
2552
			#初始化要傳送的要求
2552
			#初始化要傳送的要求
2553
			$req=array();
2553
			$req=array();
2554
			
2554
 
2555
			#如果有設置 $conf["id"]
2555
			#如果有設置 $conf["id"]
2556
			if(isset($conf["id"])){
2556
			if(isset($conf["id"])){
2557
				
2557
 
2558
				#設置識別自己的id
2558
				#設置識別自己的id
2559
				$req["id"]=$conf["id"];
2559
				$req["id"]=$conf["id"];
2560
				
2560
 
2561
				}#if end
2561
				}#if end
2562
				
2562
 
2563
			#如果有設置 $conf["cmd"]
2563
			#如果有設置 $conf["cmd"]
2564
			if(isset($conf["cmd"])){
2564
			if(isset($conf["cmd"])){
2565
				
2565
 
2566
				#設置要執行的指令
2566
				#設置要執行的指令
2567
				$req["cmd"]=$conf["cmd"];
2567
				$req["cmd"]=$conf["cmd"];
2568
				
2568
 
2569
				}#if end
2569
				}#if end
2570
				
2570
 
2571
			#如果有設置 $conf["param"]
2571
			#如果有設置 $conf["param"]
2572
			if(isset($conf["param"])){
2572
			if(isset($conf["param"])){
2573
				
2573
 
2574
				#設置要執行的指令參數
2574
				#設置要執行的指令參數
2575
				$req["param"]=$conf["param"];
2575
				$req["param"]=$conf["param"];
2576
				
2576
 
2577
				#設置參數是否已經escaped
2577
				#設置參數是否已經escaped
2578
				$req["escaped"]=$conf["escaped"];
2578
				$req["escaped"]=$conf["escaped"];
2579
				
2579
 
2580
				}#if end
2580
				}#if end
2581
			
2581
 
2582
			#如果有設置 $conf["custom"]
2582
			#如果有設置 $conf["custom"]
2583
			if(isset($conf["custom"])){
2583
			if(isset($conf["custom"])){
2584
			
2584
 
2585
				#用 $conf["custom"] 來取代 $req
2585
				#用 $conf["custom"] 來取代 $req
2586
				$req=$conf["custom"];
2586
				$req=$conf["custom"];
2587
				
2587
 
2588
				#如果有設置 $conf["id"]
2588
				#如果有設置 $conf["id"]
2589
				if(isset($conf["id"])){
2589
				if(isset($conf["id"])){
2590
					
2590
 
2591
					#設置識別自己的id
2591
					#設置識別自己的id
2592
					$req["id"]=$conf["id"];
2592
					$req["id"]=$conf["id"];
2593
					
2593
 
2594
					}#if end
2594
					}#if end
2595
			
2595
 
2596
				}#if end
2596
				}#if end
2597
			
2597
 
2598
			#debug
2598
			#debug
2599
			#var_dump(__LINE__,"before write ".json_encode($req));
2599
			#var_dump(__LINE__,"before write ".json_encode($req));
2600
			
2600
 
2601
			#傳送要求
2601
			#傳送要求
2602
			fwrite($fp,json_encode($req).PHP_EOL);
2602
			fwrite($fp,json_encode($req).PHP_EOL);
2603
					
2603
 
2604
			#結束要求
2604
			#結束要求
2605
			fwrite($fp,PHP_EOL.PHP_EOL);
2605
			fwrite($fp,PHP_EOL.PHP_EOL);
2606
				
2606
 
2607
			#如果回應為空	
2607
			#如果回應為空
2608
			while(strlen($result["content"])<2){
2608
			while(strlen($result["content"])<2){
2609
				
2609
 
2610
				#當有回應時
2610
				#當有回應時
2611
				while(!feof($fp)){
2611
				while(!feof($fp)){
2612
					
2612
 
2613
					#讀取回應
2613
					#讀取回應
2614
					$tmp=fgets($fp, 1024);
2614
					$tmp=fgets($fp, 1024);
2615
					
2615
 
2616
					#debug
2616
					#debug
2617
					#var_dump($tmp);
2617
					#var_dump($tmp);
2618
					
2618
 
2619
					#debug
2619
					#debug
2620
					#var_dump(__LINE__,"got ".$tmp);
2620
					#var_dump(__LINE__,"got ".$tmp);
2621
					
2621
 
2622
					#如果讀到 PHP_EOL
2622
					#如果讀到 PHP_EOL
2623
					if($tmp===PHP_EOL){
2623
					if($tmp===PHP_EOL){
2624
					
2624
 
2625
						#結束讀取回應
2625
						#結束讀取回應
2626
						break 2;
2626
						break 2;
2627
						
2627
 
2628
						}#if end
2628
						}#if end
2629
					
2629
 
2630
					#串接回應
2630
					#串接回應
2631
					$result["content"]=$result["content"].$tmp;
2631
					$result["content"]=$result["content"].$tmp;
2632
				
2632
 
2633
					}#while end
2633
					}#while end
2634
				
2634
 
2635
				}#while end
2635
				}#while end
2636
			
2636
 
2637
			#關閉 socket
2637
			#關閉 socket
2638
			fclose($fp);
2638
			fclose($fp);
2639
		
2639
 
2640
			}#else end
2640
			}#else end
2641
			
2641
 
2642
		#反之有有raw參數存在
2642
		#反之有有raw參數存在
2643
		else{
2643
		else{
2644
		
2644
 
2645
			#傳送要求
2645
			#傳送要求
2646
			fwrite($fp,trim($conf["raw"]).PHP_EOL);
2646
			fwrite($fp,trim($conf["raw"]).PHP_EOL);
2647
						
2647
 
2648
			#當有回應時
2648
			#當有回應時
2649
			while(!feof($fp)){
2649
			while(!feof($fp)){
2650
				
2650
 
2651
				#讀取回應
2651
				#讀取回應
2652
				$tmp=fgets($fp, 1024);
2652
				$tmp=fgets($fp, 1024);
2653
				
2653
 
2654
				#debug
2654
				#debug
2655
				#var_dump($tmp);
2655
				#var_dump($tmp);
2656
				
2656
 
2657
				#debug
2657
				#debug
2658
				#var_dump(__LINE__,"got ".$tmp);
2658
				#var_dump(__LINE__,"got ".$tmp);
2659
				
2659
 
2660
				#如果讀到 PHP_EOL
2660
				#如果讀到 PHP_EOL
2661
				if($tmp===PHP_EOL){
2661
				if($tmp===PHP_EOL){
2662
									
2662
 
2663
					#結束讀取回應
2663
					#結束讀取回應
2664
					break;	
2664
					break;
2665
					
2665
 
2666
					}#if end
2666
					}#if end
2667
							
2667
 
2668
				#串接回應
2668
				#串接回應
2669
				$result["content"]=$result["content"].$tmp;
2669
				$result["content"]=$result["content"].$tmp;
2670
			
2670
 
2671
				}#while end
2671
				}#while end
2672
			
2672
 
2673
			#關閉 socket
2673
			#關閉 socket
2674
			fclose($fp);	
2674
			fclose($fp);
2675
		
2675
 
2676
			}#else end
2676
			}#else end
2677
		
2677
 
2678
		#設置執行正常
2678
		#設置執行正常
2679
		$result["status"]="true";
2679
		$result["status"]="true";
2680
		
2680
 
2681
		#回傳結果
2681
		#回傳結果
2682
		return $result;
2682
		return $result;
2683
		
2683
 
2684
		}#function unixDomainSockClient end
2684
		}#function unixDomainSockClient end
2685
	
2685
 
2686
	/*
2686
	/*
2687
	#函式說明:
2687
	#函式說明:
2688
	#連線到 usr/bin/qbpwcf-usock.php 產生的  unix domain socket,運行指定的指令.
2688
	#連線到 usr/bin/qbpwcf-usock.php 產生的  unix domain socket,運行指定的指令.
2689
	#回傳結果:
2689
	#回傳結果:
2690
	#$result["status"],"true"代表執行正常;"false"代表執行不正常.
2690
	#$result["status"],"true"代表執行正常;"false"代表執行不正常.
Line 2710... Line 2710...
2710
	#無.
2710
	#無.
2711
	#備註:
2711
	#備註:
2712
	#無.
2712
	#無.
2713
	*/
2713
	*/
2714
	public static function execAnyCmdByQBPWCFunixSocket(&$conf){
2714
	public static function execAnyCmdByQBPWCFunixSocket(&$conf){
2715
	
2715
 
2716
		#初始化要回傳的結果
2716
		#初始化要回傳的結果
2717
		$result=array();
2717
		$result=array();
2718
 
2718
 
2719
		#取得當前執行的函數名稱
2719
		#取得當前執行的函數名稱
2720
		$result["function"]=__FUNCTION__;
2720
		$result["function"]=__FUNCTION__;
2721
		
2721
 
2722
		#如果沒有參數
2722
		#如果沒有參數
2723
		if(func_num_args()==0){
2723
		if(func_num_args()==0){
2724
			
2724
 
2725
			#設置執行失敗
2725
			#設置執行失敗
2726
			$result["status"]="false";
2726
			$result["status"]="false";
2727
			
2727
 
2728
			#設置執行錯誤訊息
2728
			#設置執行錯誤訊息
2729
			$result["error"]="函數".$result["function"]."需要參數";
2729
			$result["error"]="函數".$result["function"]."需要參數";
2730
			
2730
 
2731
			#回傳結果
2731
			#回傳結果
2732
			return $result;
2732
			return $result;
2733
			
2733
 
2734
			}#if end
2734
			}#if end
2735
		
2735
 
2736
		#取得參數
2736
		#取得參數
2737
		$result["argu"]=$conf;
2737
		$result["argu"]=$conf;
2738
 
2738
 
2739
		#如果 $conf 不為陣列
2739
		#如果 $conf 不為陣列
2740
		if(gettype($conf)!="array"){
2740
		if(gettype($conf)!="array"){
2741
		
2741
 
2742
			#設置執行失敗
2742
			#設置執行失敗
2743
			$result["status"]="false";
2743
			$result["status"]="false";
2744
		
2744
 
2745
			#設置執行錯誤訊息
2745
			#設置執行錯誤訊息
2746
			$result["error"][]="\$conf變數須為陣列形態";
2746
			$result["error"][]="\$conf變數須為陣列形態";
2747
		
2747
 
2748
			#如果傳入的參數為 null
2748
			#如果傳入的參數為 null
2749
			if($conf==null){
2749
			if($conf==null){
2750
			
2750
 
2751
				#設置執行錯誤訊息
2751
				#設置執行錯誤訊息
2752
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
2752
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
2753
			
2753
 
2754
				}#if end
2754
				}#if end
2755
 
2755
 
2756
			#回傳結果
2756
			#回傳結果
2757
			return $result;
2757
			return $result;
2758
		
2758
 
2759
			}#if end
2759
			}#if end
2760
			
2760
 
2761
		#檢查參數
2761
		#檢查參數
2762
		#函式說明:
2762
		#函式說明:
2763
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
2763
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
2764
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2764
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2765
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
2765
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
Line 2773... Line 2773...
2773
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
2773
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
2774
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
2774
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
2775
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
2775
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
2776
		#必填寫的參數:
2776
		#必填寫的參數:
2777
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
2777
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
2778
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;	
2778
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
2779
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
2779
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
2780
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
2780
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
2781
		#可以省略的參數:
2781
		#可以省略的參數:
2782
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
2782
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
2783
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("fileArgu","command");
2783
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("fileArgu","command");
Line 2791... Line 2791...
2791
		#$conf["canBeEmpty"]=array();
2791
		#$conf["canBeEmpty"]=array();
2792
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
2792
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
2793
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("sock");
2793
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("sock");
2794
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
2794
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
2795
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("sock","argu","commandIncludeArgu","commandInBg");
2795
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("sock","argu","commandIncludeArgu","commandInBg");
2796
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
2796
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
2797
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","array","string","string");
2797
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","array","string","string");
2798
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
2798
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
2799
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(qbpwcf_usock_path,array(),"false","false");
2799
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(qbpwcf_usock_path,array(),"false","false");
2800
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
2800
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
2801
		#$conf["disallowAllSkipableVarIsEmpty"]="";
2801
		#$conf["disallowAllSkipableVarIsEmpty"]="";
Line 2805... Line 2805...
2805
		#$conf["arrayCountEqualCheck"][]=array();
2805
		#$conf["arrayCountEqualCheck"][]=array();
2806
		#參考資料來源:
2806
		#參考資料來源:
2807
		#array_keys=>http://php.net/manual/en/function.array-keys.php
2807
		#array_keys=>http://php.net/manual/en/function.array-keys.php
2808
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
2808
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
2809
		unset($conf["variableCheck::checkArguments"]);
2809
		unset($conf["variableCheck::checkArguments"]);
2810
			
2810
 
2811
		#如果檢查參數失敗
2811
		#如果檢查參數失敗
2812
		if($checkArguments["status"]==="false"){
2812
		if($checkArguments["status"]==="false"){
2813
			
2813
 
2814
			#設置執行失敗
2814
			#設置執行失敗
2815
			$result["status"]="false";
2815
			$result["status"]="false";
2816
			
2816
 
2817
			#設置錯誤訊息
2817
			#設置錯誤訊息
2818
			$result["error"]=$checkArguments;
2818
			$result["error"]=$checkArguments;
2819
			
2819
 
2820
			#回傳結果
2820
			#回傳結果
2821
			return $result;
2821
			return $result;
2822
			
2822
 
2823
			}#if end
2823
			}#if end
2824
			
2824
 
2825
		#如果檢查參數不通過
2825
		#如果檢查參數不通過
2826
		if($checkArguments["passed"]==="false"){
2826
		if($checkArguments["passed"]==="false"){
2827
			
2827
 
2828
			#設置執行失敗
2828
			#設置執行失敗
2829
			$result["status"]="false";
2829
			$result["status"]="false";
2830
			
2830
 
2831
			#設置錯誤訊息
2831
			#設置錯誤訊息
2832
			$result["error"]=$checkArguments;
2832
			$result["error"]=$checkArguments;
2833
			
2833
 
2834
			#回傳結果
2834
			#回傳結果
2835
			return $result;
2835
			return $result;
2836
			
2836
 
2837
			}#if end
2837
			}#if end
2838
	
2838
 
2839
		#如果指令已經包含參數了
2839
		#如果指令已經包含參數了
2840
		if($conf["commandIncludeArgu"]==="true"){
2840
		if($conf["commandIncludeArgu"]==="true"){
2841
			
2841
 
2842
			#函式說明:
2842
			#函式說明:
2843
			#將指令字串解析成陣列,方便給予 external::callShell 使用 
2843
			#將指令字串解析成陣列,方便給予 external::callShell 使用
2844
			#回傳結果:
2844
			#回傳結果:
2845
			#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2845
			#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2846
			#$reuslt["error"],執行不正常結束的錯訊息陣列.
2846
			#$reuslt["error"],執行不正常結束的錯訊息陣列.
2847
			#$result["function"],當前執行的函式名稱.
2847
			#$result["function"],當前執行的函式名稱.
2848
			#$result["content"],解析好的指令陣列.
2848
			#$result["content"],解析好的指令陣列.
Line 2858... Line 2858...
2858
			#無.
2858
			#無.
2859
			#備註:
2859
			#備註:
2860
			#無.
2860
			#無.
2861
			$parseCmdString=cmd::parseCmdString($conf["cmd::parseCmdString"]);
2861
			$parseCmdString=cmd::parseCmdString($conf["cmd::parseCmdString"]);
2862
			unset($conf["cmd::parseCmdString"]);
2862
			unset($conf["cmd::parseCmdString"]);
2863
		
2863
 
2864
			#debug
2864
			#debug
2865
			#var_dump(__FUNCTION__,__LINE__,$parseCmdString);exit;
2865
			#var_dump(__FUNCTION__,__LINE__,$parseCmdString);exit;
2866
		
2866
 
2867
			#如果執行失敗
2867
			#如果執行失敗
2868
			if($parseCmdString["status"]==="false"){
2868
			if($parseCmdString["status"]==="false"){
2869
				
2869
 
2870
				#設置執行失敗
2870
				#設置執行失敗
2871
				$result["status"]="false";
2871
				$result["status"]="false";
2872
				
2872
 
2873
				#設置錯誤訊息
2873
				#設置錯誤訊息
2874
				$result["error"]=$parseCmdString;
2874
				$result["error"]=$parseCmdString;
2875
				
2875
 
2876
				#回傳結果
2876
				#回傳結果
2877
				return $result;
2877
				return $result;
2878
				
2878
 
2879
				}#if end
2879
				}#if end
2880
				
2880
 
2881
			#取得解析好的指令名稱
2881
			#取得解析好的指令名稱
2882
			$conf["command"]=$parseCmdString["cmd"];
2882
			$conf["command"]=$parseCmdString["cmd"];
2883
			
2883
 
2884
			#取得解析好的參數陣列
2884
			#取得解析好的參數陣列
2885
			$conf["argu"]=$parseCmdString["argus"];
2885
			$conf["argu"]=$parseCmdString["argus"];
2886
		
2886
 
2887
			#debug
2887
			#debug
2888
			#var_dump(__LINE__,$parseCmdString);
2888
			#var_dump(__LINE__,$parseCmdString);
2889
		
2889
 
2890
			}#if end
2890
			}#if end
2891
	
2891
 
2892
		#函式說明:
2892
		#函式說明:
2893
		#呼叫shell執行系統命令,並取得回傳的內容.
2893
		#呼叫shell執行系統命令,並取得回傳的內容.
2894
		#回傳結果:
2894
		#回傳結果:
2895
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2895
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2896
		#$result["error"],錯誤訊息陣列.
2896
		#$result["error"],錯誤訊息陣列.
Line 2946... Line 2946...
2946
		#備註:
2946
		#備註:
2947
		#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
2947
		#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
2948
		#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
2948
		#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
2949
		$callShell=external::callShell($conf["external::callShell"]);
2949
		$callShell=external::callShell($conf["external::callShell"]);
2950
		unset($conf["external::callShell"]);
2950
		unset($conf["external::callShell"]);
2951
	
2951
 
2952
		#debug
2952
		#debug
2953
		#var_dump(__LINE__,$callShell);
2953
		#var_dump(__LINE__,$callShell);
2954
	
2954
 
2955
		#如果檢查參數作業出錯
2955
		#如果檢查參數作業出錯
2956
		if($callShell["status"]=="false"){
2956
		if($callShell["status"]=="false"){
2957
			
2957
 
2958
			#設置執行錯誤識別
2958
			#設置執行錯誤識別
2959
			$result["status"]="false";
2959
			$result["status"]="false";
2960
			
2960
 
2961
			#設置錯誤訊息
2961
			#設置錯誤訊息
2962
			$result["error"]=$callShell;
2962
			$result["error"]=$callShell;
2963
			
2963
 
2964
			#回傳結果
2964
			#回傳結果
2965
			return $result;
2965
			return $result;
2966
			
2966
 
2967
			}#if end
2967
			}#if end
2968
	
2968
 
2969
		#函式說明:
2969
		#函式說明:
2970
		#連線到 unixDomainSockServer 提供的 unix domain socket.
2970
		#連線到 unixDomainSockServer 提供的 unix domain socket.
2971
		#回傳結果:
2971
		#回傳結果:
2972
		#$result["status"],"true"代表執行正常;"false"代表執行不正常.
2972
		#$result["status"],"true"代表執行正常;"false"代表執行不正常.
2973
		#$result["error"],錯誤訊息陣列.
2973
		#$result["error"],錯誤訊息陣列.
Line 2984... Line 2984...
2984
		#$conf["param"],參數陣列.
2984
		#$conf["param"],參數陣列.
2985
		$conf["sock::unixDomainSockClient"]["param"]=$callShell["escape"]["argu"];
2985
		$conf["sock::unixDomainSockClient"]["param"]=$callShell["escape"]["argu"];
2986
		#$conf["escaped"],字串,param參數是否已經escaped了,預設為"false",反之為"true".
2986
		#$conf["escaped"],字串,param參數是否已經escaped了,預設為"false",反之為"true".
2987
		$conf["sock::unixDomainSockClient"]["escaped"]="true";
2987
		$conf["sock::unixDomainSockClient"]["escaped"]="true";
2988
		#$conf["custom"],陣列,要客制化傳輸的內容,會覆蓋以上除了$conf["id"]以外的可省略參數.
2988
		#$conf["custom"],陣列,要客制化傳輸的內容,會覆蓋以上除了$conf["id"]以外的可省略參數.
2989
		
2989
 
2990
		#如果要在背景執行指令
2990
		#如果要在背景執行指令
2991
		if($conf["commandInBg"]==="true" && isset($conf["sock::unixDomainSockClient"]["cmd"]) ){
2991
		if($conf["commandInBg"]==="true" && isset($conf["sock::unixDomainSockClient"]["cmd"]) ){
2992
		
2992
 
2993
			#設定要在背景執行的指令
2993
			#設定要在背景執行的指令
2994
			$conf["sock::unixDomainSockClient"]["custom"]["cmdInBg"]=$conf["sock::unixDomainSockClient"]["cmd"];
2994
			$conf["sock::unixDomainSockClient"]["custom"]["cmdInBg"]=$conf["sock::unixDomainSockClient"]["cmd"];
2995
			
2995
 
2996
			#設定要在背景執行的指令
2996
			#設定要在背景執行的指令
2997
			$conf["sock::unixDomainSockClient"]["custom"]["param"]=$conf["sock::unixDomainSockClient"]["param"];
2997
			$conf["sock::unixDomainSockClient"]["custom"]["param"]=$conf["sock::unixDomainSockClient"]["param"];
2998
			
2998
 
2999
			#移除不要的參數
2999
			#移除不要的參數
3000
			unset($conf["sock::unixDomainSockClient"]["cmd"]);
3000
			unset($conf["sock::unixDomainSockClient"]["cmd"]);
3001
			
3001
 
3002
			#移除不要的參數
3002
			#移除不要的參數
3003
			unset($conf["sock::unixDomainSockClient"]["param"]);
3003
			unset($conf["sock::unixDomainSockClient"]["param"]);
3004
			
3004
 
3005
			#保存 custom 參數
3005
			#保存 custom 參數
3006
			$custom=$conf["sock::unixDomainSockClient"]["custom"];
3006
			$custom=$conf["sock::unixDomainSockClient"]["custom"];
3007
		
3007
 
3008
			#debug
3008
			#debug
3009
			#var_dump(__LINE__,$custom);
3009
			#var_dump(__LINE__,$custom);
3010
		
3010
 
3011
			}#if end
3011
			}#if end
3012
		
3012
 
3013
		#$conf["raw"],字串,要直接傳送的字串內容,會忽略其他可省略參數.
3013
		#$conf["raw"],字串,要直接傳送的字串內容,會忽略其他可省略參數.
3014
		#$conf["raw"]="";
3014
		#$conf["raw"]="";
3015
		#參考資料:
3015
		#參考資料:
3016
		#http://php.net/manual/en/function.stream-socket-client.php
3016
		#http://php.net/manual/en/function.stream-socket-client.php
3017
		#http://php.net/manual/en/function.stream-get-contents.php
3017
		#http://php.net/manual/en/function.stream-get-contents.php
3018
		#備註:
3018
		#備註:
3019
		#無.
3019
		#無.
3020
		$paramsOfUnixDomainSockClient=$conf["sock::unixDomainSockClient"];
3020
		$paramsOfUnixDomainSockClient=$conf["sock::unixDomainSockClient"];
3021
		$unixDomainSockClient=sock::unixDomainSockClient($paramsOfUnixDomainSockClient);
3021
		$unixDomainSockClient=sock::unixDomainSockClient($paramsOfUnixDomainSockClient);
3022
		unset($paramsOfUnixDomainSockClient);
3022
		unset($paramsOfUnixDomainSockClient);
3023
		
3023
 
3024
		#如果執行失敗
3024
		#如果執行失敗
3025
		if($unixDomainSockClient["status"]==="false"){
3025
		if($unixDomainSockClient["status"]==="false"){
3026
		
3026
 
3027
			#設置執行錯誤識別
3027
			#設置執行錯誤識別
3028
			$result["status"]="false";
3028
			$result["status"]="false";
3029
			
3029
 
3030
			#設置錯誤訊息
3030
			#設置錯誤訊息
3031
			$result["error"]=$unixDomainSockClient;
3031
			$result["error"]=$unixDomainSockClient;
3032
			
3032
 
3033
			#回傳結果
3033
			#回傳結果
3034
			return $result;
3034
			return $result;
3035
		
3035
 
3036
			}#if end
3036
			}#if end
3037
		
3037
 
3038
		#debug
3038
		#debug
3039
		#var_dump(__LINE__,$unixDomainSockClient);
3039
		#var_dump(__LINE__,$unixDomainSockClient);
3040
		
3040
 
3041
		#如果不是 json 字串
3041
		#如果不是 json 字串
3042
		if(json_validate(trim($unixDomainSockClient["content"]))==="false"){
3042
		if(json_validate(trim($unixDomainSockClient["content"]))==="false"){
3043
		
3043
 
3044
			#設置執行錯誤識別
3044
			#設置執行錯誤識別
3045
			$result["status"]="false";
3045
			$result["status"]="false";
3046
			
3046
 
3047
			#設置錯誤訊息
3047
			#設置錯誤訊息
3048
			$result["error"][]=trim($unixDomainSockClient["content"])." is not json string!";
3048
			$result["error"][]=trim($unixDomainSockClient["content"])." is not json string!";
3049
			
3049
 
3050
			#設置錯誤訊息
3050
			#設置錯誤訊息
3051
			$result["error"][]=$unixDomainSockClient;
3051
			$result["error"][]=$unixDomainSockClient;
3052
			
3052
 
3053
			#回傳結果
3053
			#回傳結果
3054
			return $result;
3054
			return $result;
3055
		
3055
 
3056
			}#if end
3056
			}#if end
3057
		
3057
 
3058
		#取得json回應
3058
		#取得json回應
3059
		$jsonRes=json_decode(trim($unixDomainSockClient["content"]));
3059
		$jsonRes=json_decode(trim($unixDomainSockClient["content"]));
3060
		
3060
 
3061
		#debug
3061
		#debug
3062
		#var_dump(__LINE__,$jsonRes);
3062
		#var_dump(__LINE__,$jsonRes);
3063
		
3063
 
3064
		#如果執行失敗
3064
		#如果執行失敗
3065
		if($jsonRes===null){
3065
		if($jsonRes===null){
3066
		
3066
 
3067
			#設置執行錯誤識別
3067
			#設置執行錯誤識別
3068
			$result["status"]="false";
3068
			$result["status"]="false";
3069
			
3069
 
3070
			#設置錯誤訊息
3070
			#設置錯誤訊息
3071
			$result["error"]=$unixDomainSockClient;
3071
			$result["error"]=$unixDomainSockClient;
3072
			
3072
 
3073
			#回傳結果
3073
			#回傳結果
3074
			return $result;
3074
			return $result;
3075
		
3075
 
3076
			}#if end
3076
			}#if end
3077
			
3077
 
3078
		#如果沒有產生新id
3078
		#如果沒有產生新id
3079
		if(!isset($jsonRes->id)){
3079
		if(!isset($jsonRes->id)){
3080
		
3080
 
3081
			#設置執行錯誤識別
3081
			#設置執行錯誤識別
3082
			$result["status"]="false";
3082
			$result["status"]="false";
3083
			
3083
 
3084
			#設置錯誤訊息
3084
			#設置錯誤訊息
3085
			$result["error"]=$unixDomainSockClient;
3085
			$result["error"]=$unixDomainSockClient;
3086
			
3086
 
3087
			#回傳結果
3087
			#回傳結果
3088
			return $result;
3088
			return $result;
3089
		
3089
 
3090
			}#if end
3090
			}#if end
3091
			
3091
 
3092
		#用新的id再傳送一次要求給 qbpwcf_usock_path
3092
		#用新的id再傳送一次要求給 qbpwcf_usock_path
3093
		$paramsOfUnixDomainSockClient=$conf["sock::unixDomainSockClient"];
3093
		$paramsOfUnixDomainSockClient=$conf["sock::unixDomainSockClient"];
3094
		$paramsOfUnixDomainSockClient["id"]=$jsonRes->id;
3094
		$paramsOfUnixDomainSockClient["id"]=$jsonRes->id;
3095
		#var_dump(__LINE__,$paramsOfUnixDomainSockClient);
3095
		#var_dump(__LINE__,$paramsOfUnixDomainSockClient);
3096
		$unixDomainSockClient=sock::unixDomainSockClient($paramsOfUnixDomainSockClient);
3096
		$unixDomainSockClient=sock::unixDomainSockClient($paramsOfUnixDomainSockClient);
3097
		unset($paramsOfUnixDomainSockClient);
3097
		unset($paramsOfUnixDomainSockClient);
3098
		
3098
 
3099
		#如果執行失敗
3099
		#如果執行失敗
3100
		if($unixDomainSockClient["status"]==="false"){
3100
		if($unixDomainSockClient["status"]==="false"){
3101
		
3101
 
3102
			#設置執行錯誤識別
3102
			#設置執行錯誤識別
3103
			$result["status"]="false";
3103
			$result["status"]="false";
3104
			
3104
 
3105
			#設置錯誤訊息
3105
			#設置錯誤訊息
3106
			$result["error"]=$unixDomainSockClient;
3106
			$result["error"]=$unixDomainSockClient;
3107
			
3107
 
3108
			#回傳結果
3108
			#回傳結果
3109
			return $result;
3109
			return $result;
3110
		
3110
 
3111
			}#if end
3111
			}#if end
3112
	
3112
 
3113
		#debug
3113
		#debug
3114
		#var_dump(__LINE__,$unixDomainSockClient["content"]);
3114
		#var_dump(__LINE__,$unixDomainSockClient["content"]);
3115
	
3115
 
3116
		#如果輸出非 json 
3116
		#如果輸出非 json
3117
		if(json_validate(trim($unixDomainSockClient["content"]))===false){
3117
		if(json_validate(trim($unixDomainSockClient["content"]))===false){
3118
		
3118
 
3119
			#設置錯誤識別
3119
			#設置錯誤識別
3120
			$result["status"]="false";
3120
			$result["status"]="false";
3121
			
3121
 
3122
			#設置錯誤訊息
3122
			#設置錯誤訊息
3123
			$result["error"][]="got not json output";
3123
			$result["error"][]="got not json output";
3124
			
3124
 
3125
			#設置錯誤訊息
3125
			#設置錯誤訊息
3126
			$result["error"][]=json_last_error().":".json_last_error_msg();
3126
			$result["error"][]=json_last_error().":".json_last_error_msg();
3127
			
3127
 
3128
			#回傳結果
3128
			#回傳結果
3129
			return $result;
3129
			return $result;
3130
			
3130
 
3131
			}#if end
3131
			}#if end
3132
	
3132
 
3133
		#取得json回應
3133
		#取得json回應
3134
		$jsonRes=(array)json_decode($unixDomainSockClient["content"]);
3134
		$jsonRes=(array)json_decode($unixDomainSockClient["content"]);
3135
	
3135
 
3136
		#如果執行失敗
3136
		#如果執行失敗
3137
		if($jsonRes===null){
3137
		if($jsonRes===null){
3138
		
3138
 
3139
			#設置執行錯誤識別
3139
			#設置執行錯誤識別
3140
			$result["status"]="false";
3140
			$result["status"]="false";
3141
			
3141
 
3142
			#設置錯誤訊息
3142
			#設置錯誤訊息
3143
			$result["error"]=$unixDomainSockClient;
3143
			$result["error"]=$unixDomainSockClient;
3144
			
3144
 
3145
			#回傳結果
3145
			#回傳結果
3146
			return $result;
3146
			return $result;
3147
		
3147
 
3148
			}#if end
3148
			}#if end
3149
		
3149
 
3150
		#如果執行指令失敗
3150
		#如果執行指令失敗
3151
		if($jsonRes["status"]==="false"){
3151
		if($jsonRes["status"]==="false"){
3152
		
3152
 
3153
			#設置執行錯誤識別
3153
			#設置執行錯誤識別
3154
			$result["status"]="false";
3154
			$result["status"]="false";
3155
			
3155
 
3156
			#設置錯誤訊息
3156
			#設置錯誤訊息
3157
			$result["error"]=$jsonRes["error"];
3157
			$result["error"]=$jsonRes["error"];
3158
			
3158
 
3159
			#回傳結果
3159
			#回傳結果
3160
			return $result;
3160
			return $result;
3161
		
3161
 
3162
			}#if end
3162
			}#if end
3163
	
3163
 
3164
		#執行正常
3164
		#執行正常
3165
		$result["status"]="true";
3165
		$result["status"]="true";
3166
	
3166
 
3167
		#設置執行的結果
3167
		#設置執行的結果
3168
		$result["content"]=$jsonRes;
3168
		$result["content"]=$jsonRes;
3169
	
3169
 
3170
		#回傳結果
3170
		#回傳結果
3171
		return $result;
3171
		return $result;
3172
	
3172
 
3173
		}#public function execAnyCmdByQBPWCFunixSocket end
3173
		}#public function execAnyCmdByQBPWCFunixSocket end
3174
	
3174
 
3175
	/*
3175
	/*
3176
	#函式說明:
3176
	#函式說明:
3177
	#詢問透過 sock::unixDomainSockServer 執行的程序狀況
3177
	#詢問透過 sock::unixDomainSockServer 執行的程序狀況
3178
	#回傳結果:
3178
	#回傳結果:
3179
	#$result["status"],"true"代表執行正常;"false"代表執行不正常.
3179
	#$result["status"],"true"代表執行正常;"false"代表執行不正常.
Line 3197... Line 3197...
3197
	#無.
3197
	#無.
3198
	#備註:
3198
	#備註:
3199
	#無.
3199
	#無.
3200
	*/
3200
	*/
3201
	public static function getProcInfo(&$conf){
3201
	public static function getProcInfo(&$conf){
3202
	
3202
 
3203
		#初始化要回傳的結果
3203
		#初始化要回傳的結果
3204
		$result=array();
3204
		$result=array();
3205
 
3205
 
3206
		#取得當前執行的函數名稱
3206
		#取得當前執行的函數名稱
3207
		$result["function"]=__FUNCTION__;
3207
		$result["function"]=__FUNCTION__;
3208
		
3208
 
3209
		#如果沒有參數
3209
		#如果沒有參數
3210
		if(func_num_args()==0){
3210
		if(func_num_args()==0){
3211
			
3211
 
3212
			#設置執行失敗
3212
			#設置執行失敗
3213
			$result["status"]="false";
3213
			$result["status"]="false";
3214
			
3214
 
3215
			#設置執行錯誤訊息
3215
			#設置執行錯誤訊息
3216
			$result["error"]="函數".$result["function"]."需要參數";
3216
			$result["error"]="函數".$result["function"]."需要參數";
3217
			
3217
 
3218
			#回傳結果
3218
			#回傳結果
3219
			return $result;
3219
			return $result;
3220
			
3220
 
3221
			}#if end
3221
			}#if end
3222
		
3222
 
3223
		#取得參數
3223
		#取得參數
3224
		$result["argu"]=$conf;
3224
		$result["argu"]=$conf;
3225
 
3225
 
3226
		#如果 $conf 不為陣列
3226
		#如果 $conf 不為陣列
3227
		if(gettype($conf)!="array"){
3227
		if(gettype($conf)!="array"){
3228
		
3228
 
3229
			#設置執行失敗
3229
			#設置執行失敗
3230
			$result["status"]="false";
3230
			$result["status"]="false";
3231
		
3231
 
3232
			#設置執行錯誤訊息
3232
			#設置執行錯誤訊息
3233
			$result["error"][]="\$conf變數須為陣列形態";
3233
			$result["error"][]="\$conf變數須為陣列形態";
3234
		
3234
 
3235
			#如果傳入的參數為 null
3235
			#如果傳入的參數為 null
3236
			if($conf==null){
3236
			if($conf==null){
3237
			
3237
 
3238
				#設置執行錯誤訊息
3238
				#設置執行錯誤訊息
3239
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
3239
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
3240
			
3240
 
3241
				}#if end
3241
				}#if end
3242
 
3242
 
3243
			#回傳結果
3243
			#回傳結果
3244
			return $result;
3244
			return $result;
3245
		
3245
 
3246
			}#if end
3246
			}#if end
3247
			
3247
 
3248
		#檢查參數
3248
		#檢查參數
3249
		#函式說明:
3249
		#函式說明:
3250
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
3250
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
3251
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3251
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3252
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
3252
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
Line 3260... Line 3260...
3260
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
3260
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
3261
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
3261
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
3262
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
3262
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
3263
		#必填寫的參數:
3263
		#必填寫的參數:
3264
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
3264
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
3265
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;	
3265
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
3266
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
3266
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
3267
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
3267
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
3268
		#可以省略的參數:
3268
		#可以省略的參數:
3269
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
3269
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
3270
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("uuid");
3270
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("uuid");
Line 3278... Line 3278...
3278
		#$conf["canBeEmpty"]=array();
3278
		#$conf["canBeEmpty"]=array();
3279
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
3279
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
3280
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("sock");
3280
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("sock");
3281
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
3281
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
3282
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("sock");
3282
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("sock");
3283
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
3283
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
3284
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
3284
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
3285
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
3285
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
3286
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(qbpwcf_usock_path);
3286
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(qbpwcf_usock_path);
3287
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
3287
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
3288
		#$conf["disallowAllSkipableVarIsEmpty"]="";
3288
		#$conf["disallowAllSkipableVarIsEmpty"]="";
Line 3292... Line 3292...
3292
		#$conf["arrayCountEqualCheck"][]=array();
3292
		#$conf["arrayCountEqualCheck"][]=array();
3293
		#參考資料來源:
3293
		#參考資料來源:
3294
		#array_keys=>http://php.net/manual/en/function.array-keys.php
3294
		#array_keys=>http://php.net/manual/en/function.array-keys.php
3295
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
3295
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
3296
		unset($conf["variableCheck::checkArguments"]);
3296
		unset($conf["variableCheck::checkArguments"]);
3297
			
3297
 
3298
		#如果檢查參數失敗
3298
		#如果檢查參數失敗
3299
		if($checkArguments["status"]==="false"){
3299
		if($checkArguments["status"]==="false"){
3300
			
3300
 
3301
			#設置執行失敗
3301
			#設置執行失敗
3302
			$result["status"]="false";
3302
			$result["status"]="false";
3303
			
3303
 
3304
			#設置錯誤訊息
3304
			#設置錯誤訊息
3305
			$result["error"]=$checkArguments;
3305
			$result["error"]=$checkArguments;
3306
			
3306
 
3307
			#回傳結果
3307
			#回傳結果
3308
			return $result;
3308
			return $result;
3309
			
3309
 
3310
			}#if end
3310
			}#if end
3311
			
3311
 
3312
		#如果檢查參數不通過
3312
		#如果檢查參數不通過
3313
		if($checkArguments["passed"]==="false"){
3313
		if($checkArguments["passed"]==="false"){
3314
			
3314
 
3315
			#設置執行失敗
3315
			#設置執行失敗
3316
			$result["status"]="false";
3316
			$result["status"]="false";
3317
			
3317
 
3318
			#設置錯誤訊息
3318
			#設置錯誤訊息
3319
			$result["error"]=$checkArguments;
3319
			$result["error"]=$checkArguments;
3320
			
3320
 
3321
			#回傳結果
3321
			#回傳結果
3322
			return $result;
3322
			return $result;
3323
			
3323
 
3324
			}#if end
3324
			}#if end
3325
	
3325
 
3326
		函式說明:
3326
		函式說明:
3327
		#連線到 unixDomainSockServer 提供的 unix domain socket.
3327
		#連線到 unixDomainSockServer 提供的 unix domain socket.
3328
		#回傳結果:
3328
		#回傳結果:
3329
		#$result["status"],"true"代表執行正常;"false"代表執行不正常.
3329
		#$result["status"],"true"代表執行正常;"false"代表執行不正常.
3330
		#$result["error"],錯誤訊息陣列.
3330
		#$result["error"],錯誤訊息陣列.
Line 3352... Line 3352...
3352
		#備註:
3352
		#備註:
3353
		#無.
3353
		#無.
3354
		$paramsOfUnixDomainSockClient=$conf["sock::unixDomainSockClient"];
3354
		$paramsOfUnixDomainSockClient=$conf["sock::unixDomainSockClient"];
3355
		$unixDomainSockClient=sock::unixDomainSockClient($paramsOfUnixDomainSockClient);
3355
		$unixDomainSockClient=sock::unixDomainSockClient($paramsOfUnixDomainSockClient);
3356
		unset($paramsOfUnixDomainSockClient);
3356
		unset($paramsOfUnixDomainSockClient);
3357
		
3357
 
3358
		#如果執行失敗
3358
		#如果執行失敗
3359
		if($unixDomainSockClient["status"]==="false"){
3359
		if($unixDomainSockClient["status"]==="false"){
3360
		
3360
 
3361
			#設置執行錯誤識別
3361
			#設置執行錯誤識別
3362
			$result["status"]="false";
3362
			$result["status"]="false";
3363
			
3363
 
3364
			#設置錯誤訊息
3364
			#設置錯誤訊息
3365
			$result["error"]=$unixDomainSockClient;
3365
			$result["error"]=$unixDomainSockClient;
3366
			
3366
 
3367
			#回傳結果
3367
			#回傳結果
3368
			return $result;
3368
			return $result;
3369
		
3369
 
3370
			}#if end
3370
			}#if end
3371
		
3371
 
3372
		#debug
3372
		#debug
3373
		#var_dump(__LINE__,$unixDomainSockClient);
3373
		#var_dump(__LINE__,$unixDomainSockClient);
3374
		
3374
 
3375
		#如果不是 json 字串
3375
		#如果不是 json 字串
3376
		if(json_validate(trim($unixDomainSockClient["content"]))==="false"){
3376
		if(json_validate(trim($unixDomainSockClient["content"]))==="false"){
3377
		
3377
 
3378
			#設置執行錯誤識別
3378
			#設置執行錯誤識別
3379
			$result["status"]="false";
3379
			$result["status"]="false";
3380
			
3380
 
3381
			#設置錯誤訊息
3381
			#設置錯誤訊息
3382
			$result["error"][]=trim($unixDomainSockClient["content"])." is not json string!";
3382
			$result["error"][]=trim($unixDomainSockClient["content"])." is not json string!";
3383
			
3383
 
3384
			#設置錯誤訊息
3384
			#設置錯誤訊息
3385
			$result["error"][]=$unixDomainSockClient;
3385
			$result["error"][]=$unixDomainSockClient;
3386
			
3386
 
3387
			#回傳結果
3387
			#回傳結果
3388
			return $result;
3388
			return $result;
3389
		
3389
 
3390
			}#if end
3390
			}#if end
3391
		
3391
 
3392
		#取得json回應
3392
		#取得json回應
3393
		$jsonRes=json_decode(trim($unixDomainSockClient["content"]));
3393
		$jsonRes=json_decode(trim($unixDomainSockClient["content"]));
3394
		
3394
 
3395
		#debug
3395
		#debug
3396
		#var_dump(__LINE__,$jsonRes);
3396
		#var_dump(__LINE__,$jsonRes);
3397
		
3397
 
3398
		#如果執行失敗
3398
		#如果執行失敗
3399
		if($jsonRes===null){
3399
		if($jsonRes===null){
3400
		
3400
 
3401
			#設置執行錯誤識別
3401
			#設置執行錯誤識別
3402
			$result["status"]="false";
3402
			$result["status"]="false";
3403
			
3403
 
3404
			#設置錯誤訊息
3404
			#設置錯誤訊息
3405
			$result["error"]=$unixDomainSockClient;
3405
			$result["error"]=$unixDomainSockClient;
3406
			
3406
 
3407
			#回傳結果
3407
			#回傳結果
3408
			return $result;
3408
			return $result;
3409
		
3409
 
3410
			}#if end
3410
			}#if end
3411
			
3411
 
3412
		#如果沒有產生新id
3412
		#如果沒有產生新id
3413
		if(!isset($jsonRes->id)){
3413
		if(!isset($jsonRes->id)){
3414
		
3414
 
3415
			#設置執行錯誤識別
3415
			#設置執行錯誤識別
3416
			$result["status"]="false";
3416
			$result["status"]="false";
3417
			
3417
 
3418
			#設置錯誤訊息
3418
			#設置錯誤訊息
3419
			$result["error"]=$unixDomainSockClient;
3419
			$result["error"]=$unixDomainSockClient;
3420
			
3420
 
3421
			#回傳結果
3421
			#回傳結果
3422
			return $result;
3422
			return $result;
3423
		
3423
 
3424
			}#if end
3424
			}#if end
3425
			
3425
 
3426
		#用新的id再傳送一次要求給 qbpwcf_usock_path
3426
		#用新的id再傳送一次要求給 qbpwcf_usock_path
3427
		$paramsOfUnixDomainSockClient=$conf["sock::unixDomainSockClient"];
3427
		$paramsOfUnixDomainSockClient=$conf["sock::unixDomainSockClient"];
3428
		$paramsOfUnixDomainSockClient["id"]=$jsonRes->id;
3428
		$paramsOfUnixDomainSockClient["id"]=$jsonRes->id;
3429
		$unixDomainSockClient=sock::unixDomainSockClient($paramsOfUnixDomainSockClient);
3429
		$unixDomainSockClient=sock::unixDomainSockClient($paramsOfUnixDomainSockClient);
3430
		unset($paramsOfUnixDomainSockClient);
3430
		unset($paramsOfUnixDomainSockClient);
3431
		
3431
 
3432
		#如果執行失敗
3432
		#如果執行失敗
3433
		if($unixDomainSockClient["status"]==="false"){
3433
		if($unixDomainSockClient["status"]==="false"){
3434
		
3434
 
3435
			#設置執行錯誤識別
3435
			#設置執行錯誤識別
3436
			$result["status"]="false";
3436
			$result["status"]="false";
3437
			
3437
 
3438
			#設置錯誤訊息
3438
			#設置錯誤訊息
3439
			$result["error"]=$unixDomainSockClient;
3439
			$result["error"]=$unixDomainSockClient;
3440
			
3440
 
3441
			#回傳結果
3441
			#回傳結果
3442
			return $result;
3442
			return $result;
3443
		
3443
 
3444
			}#if end
3444
			}#if end
3445
	
3445
 
3446
		#debug
3446
		#debug
3447
		#var_dump(__LINE__,$unixDomainSockClient["content"]);
3447
		#var_dump(__LINE__,$unixDomainSockClient["content"]);
3448
	
3448
 
3449
		#如果輸出非 json 
3449
		#如果輸出非 json
3450
		if(json_validate(trim($unixDomainSockClient["content"]))===false){
3450
		if(json_validate(trim($unixDomainSockClient["content"]))===false){
3451
		
3451
 
3452
			#設置錯誤識別
3452
			#設置錯誤識別
3453
			$result["status"]="false";
3453
			$result["status"]="false";
3454
			
3454
 
3455
			#設置錯誤訊息
3455
			#設置錯誤訊息
3456
			$result["error"][]="got not json output";
3456
			$result["error"][]="got not json output";
3457
			
3457
 
3458
			#設置錯誤訊息
3458
			#設置錯誤訊息
3459
			$result["error"][]=json_last_error().":".json_last_error_msg();
3459
			$result["error"][]=json_last_error().":".json_last_error_msg();
3460
			
3460
 
3461
			#設置原始訊息
3461
			#設置原始訊息
3462
			$result["error"][]="ori res:".$unixDomainSockClient["content"];
3462
			$result["error"][]="ori res:".$unixDomainSockClient["content"];
3463
			
3463
 
3464
			#回傳結果
3464
			#回傳結果
3465
			return $result;
3465
			return $result;
3466
			
3466
 
3467
			}#if end
3467
			}#if end
3468
	
3468
 
3469
		#取得json回應
3469
		#取得json回應
3470
		$jsonRes=(array)json_decode($unixDomainSockClient["content"]);
3470
		$jsonRes=(array)json_decode($unixDomainSockClient["content"]);
3471
	
3471
 
3472
		#如果執行失敗
3472
		#如果執行失敗
3473
		if($jsonRes===null){
3473
		if($jsonRes===null){
3474
		
3474
 
3475
			#設置執行錯誤識別
3475
			#設置執行錯誤識別
3476
			$result["status"]="false";
3476
			$result["status"]="false";
3477
			
3477
 
3478
			#設置錯誤訊息
3478
			#設置錯誤訊息
3479
			$result["error"]=$unixDomainSockClient;
3479
			$result["error"]=$unixDomainSockClient;
3480
			
3480
 
3481
			#回傳結果
3481
			#回傳結果
3482
			return $result;
3482
			return $result;
3483
		
3483
 
3484
			}#if end
3484
			}#if end
3485
		
3485
 
3486
		#如果執行指令失敗
3486
		#如果執行指令失敗
3487
		if($jsonRes["status"]==="false"){
3487
		if($jsonRes["status"]==="false"){
3488
		
3488
 
3489
			#設置執行錯誤識別
3489
			#設置執行錯誤識別
3490
			$result["status"]="false";
3490
			$result["status"]="false";
3491
			
3491
 
3492
			#設置錯誤訊息
3492
			#設置錯誤訊息
3493
			$result["error"]=$jsonRes["error"];
3493
			$result["error"]=$jsonRes["error"];
3494
			
3494
 
3495
			#回傳結果
3495
			#回傳結果
3496
			return $result;
3496
			return $result;
3497
		
3497
 
3498
			}#if end
3498
			}#if end
3499
	
3499
 
3500
		#移除不需要的元素
3500
		#移除不需要的元素
3501
		unset($jsonRes["status"]);
3501
		unset($jsonRes["status"]);
3502
	
3502
 
3503
		#執行正常
3503
		#執行正常
3504
		$result["status"]="true";
3504
		$result["status"]="true";
3505
	
3505
 
3506
		#$result["content"],陣列,程序的資訊.
3506
		#$result["content"],陣列,程序的資訊.
3507
		#$result["content"]["pid"],字串,程序的pid.
3507
		#$result["content"]["pid"],字串,程序的pid.
3508
		#$result["content"]["running"],字串,是否正常執行中.
3508
		#$result["content"]["running"],字串,是否正常執行中.
3509
		#$result["content"]["statusCode"],字串,回傳給 shell 的代碼.
3509
		#$result["content"]["statusCode"],字串,回傳給 shell 的代碼.
3510
		#$result["content"]["input"],字串,輸入的內容.
3510
		#$result["content"]["input"],字串,輸入的內容.
3511
		#$result["content"]["output"],字串,標準輸出的內容.
3511
		#$result["content"]["output"],字串,標準輸出的內容.
3512
		#$result["content"]["error"],字串,錯誤輸出的內容.
3512
		#$result["content"]["error"],字串,錯誤輸出的內容.
3513
	
3513
 
3514
		#初始執行的結果
3514
		#初始執行的結果
3515
		$result["content"]=$jsonRes;
3515
		$result["content"]=$jsonRes;
3516
	
3516
 
3517
		#回傳結果
3517
		#回傳結果
3518
		return $result;
3518
		return $result;
3519
	
3519
 
3520
		}#function getProcInfo end
3520
		}#function getProcInfo end
3521
	
3521
 
3522
	/*
3522
	/*
3523
	#函式說明:
3523
	#函式說明:
3524
	#傳送 raw 訊息到  unix domain socket.
3524
	#傳送 raw 訊息到  unix domain socket.
3525
	#回傳結果:
3525
	#回傳結果:
3526
	#$result["status"],"true"代表執行正常;"false"代表執行不正常.
3526
	#$result["status"],"true"代表執行正常;"false"代表執行不正常.
Line 3539... Line 3539...
3539
	#無.
3539
	#無.
3540
	#備註:
3540
	#備註:
3541
	#無.
3541
	#無.
3542
	*/
3542
	*/
3543
	public static function sendRawMsgUnixSocket(&$conf){
3543
	public static function sendRawMsgUnixSocket(&$conf){
3544
	
3544
 
3545
		#初始化要回傳的結果
3545
		#初始化要回傳的結果
3546
		$result=array();
3546
		$result=array();
3547
 
3547
 
3548
		#取得當前執行的函數名稱
3548
		#取得當前執行的函數名稱
3549
		$result["function"]=__FUNCTION__;
3549
		$result["function"]=__FUNCTION__;
3550
		
3550
 
3551
		#如果沒有參數
3551
		#如果沒有參數
3552
		if(func_num_args()==0){
3552
		if(func_num_args()==0){
3553
			
3553
 
3554
			#設置執行失敗
3554
			#設置執行失敗
3555
			$result["status"]="false";
3555
			$result["status"]="false";
3556
			
3556
 
3557
			#設置執行錯誤訊息
3557
			#設置執行錯誤訊息
3558
			$result["error"]="函數".$result["function"]."需要參數";
3558
			$result["error"]="函數".$result["function"]."需要參數";
3559
			
3559
 
3560
			#回傳結果
3560
			#回傳結果
3561
			return $result;
3561
			return $result;
3562
			
3562
 
3563
			}#if end
3563
			}#if end
3564
		
3564
 
3565
		#取得參數
3565
		#取得參數
3566
		$result["argu"]=$conf;
3566
		$result["argu"]=$conf;
3567
 
3567
 
3568
		#如果 $conf 不為陣列
3568
		#如果 $conf 不為陣列
3569
		if(gettype($conf)!="array"){
3569
		if(gettype($conf)!="array"){
3570
		
3570
 
3571
			#設置執行失敗
3571
			#設置執行失敗
3572
			$result["status"]="false";
3572
			$result["status"]="false";
3573
		
3573
 
3574
			#設置執行錯誤訊息
3574
			#設置執行錯誤訊息
3575
			$result["error"][]="\$conf變數須為陣列形態";
3575
			$result["error"][]="\$conf變數須為陣列形態";
3576
		
3576
 
3577
			#如果傳入的參數為 null
3577
			#如果傳入的參數為 null
3578
			if($conf==null){
3578
			if($conf==null){
3579
			
3579
 
3580
				#設置執行錯誤訊息
3580
				#設置執行錯誤訊息
3581
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
3581
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
3582
			
3582
 
3583
				}#if end
3583
				}#if end
3584
 
3584
 
3585
			#回傳結果
3585
			#回傳結果
3586
			return $result;
3586
			return $result;
3587
		
3587
 
3588
			}#if end
3588
			}#if end
3589
			
3589
 
3590
		#函式說明:
3590
		#函式說明:
3591
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
3591
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
3592
		#回傳結果:
3592
		#回傳結果:
3593
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3593
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3594
		#$result["error"],執行不正常結束的錯訊息陣列.
3594
		#$result["error"],執行不正常結束的錯訊息陣列.
Line 3639... Line 3639...
3639
		#array_keys=>http://php.net/manual/en/function.array-keys.php
3639
		#array_keys=>http://php.net/manual/en/function.array-keys.php
3640
		#備註:
3640
		#備註:
3641
		#無.
3641
		#無.
3642
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
3642
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
3643
		unset($conf["variableCheck::checkArguments"]);
3643
		unset($conf["variableCheck::checkArguments"]);
3644
	
3644
 
3645
		#如果執行失敗
3645
		#如果執行失敗
3646
		if($checkArguments["status"]==="false"){
3646
		if($checkArguments["status"]==="false"){
3647
		
3647
 
3648
			#設置執行錯誤識別
3648
			#設置執行錯誤識別
3649
			$result["status"]="false";
3649
			$result["status"]="false";
3650
			
3650
 
3651
			#設置錯誤訊息
3651
			#設置錯誤訊息
3652
			$result["error"]=$checkArguments["error"];
3652
			$result["error"]=$checkArguments["error"];
3653
			
3653
 
3654
			#回傳結果
3654
			#回傳結果
3655
			return $result;
3655
			return $result;
3656
		
3656
 
3657
			}#if end
3657
			}#if end
3658
			
3658
 
3659
		#如果檢查不通過
3659
		#如果檢查不通過
3660
		if($checkArguments["status"]==="false"){
3660
		if($checkArguments["status"]==="false"){
3661
		
3661
 
3662
			#設置執行錯誤識別
3662
			#設置執行錯誤識別
3663
			$result["status"]="false";
3663
			$result["status"]="false";
3664
			
3664
 
3665
			#設置錯誤訊息
3665
			#設置錯誤訊息
3666
			$result["error"]=$checkArguments["error"];
3666
			$result["error"]=$checkArguments["error"];
3667
			
3667
 
3668
			#回傳結果
3668
			#回傳結果
3669
			return $result;
3669
			return $result;
3670
		
3670
 
3671
			}#if end
3671
			}#if end
3672
			
3672
 
3673
		#讓存放unix domain socket的路徑存在
3673
		#讓存放unix domain socket的路徑存在
3674
		#函式說明:
3674
		#函式說明:
3675
		#確保路徑存在.
3675
		#確保路徑存在.
3676
		#回傳結果:
3676
		#回傳結果:
3677
		#$result["status"],執行正常與否,"true"代表正常,"false"代表不正常.
3677
		#$result["status"],執行正常與否,"true"代表正常,"false"代表不正常.
Line 3696... Line 3696...
3696
		#無.
3696
		#無.
3697
		#備註:
3697
		#備註:
3698
		#無.
3698
		#無.
3699
		$validatePath=fileAccess::validatePath($conf["fileAccess::validatePath"]);
3699
		$validatePath=fileAccess::validatePath($conf["fileAccess::validatePath"]);
3700
		unset($conf["fileAccess::validatePath"]);
3700
		unset($conf["fileAccess::validatePath"]);
3701
		
3701
 
3702
		#如果執行失敗
3702
		#如果執行失敗
3703
		if($validatePath["status"]==="false"){
3703
		if($validatePath["status"]==="false"){
3704
			
3704
 
3705
			#設置錯誤識別
3705
			#設置錯誤識別
3706
			$result["status"]="false";
3706
			$result["status"]="false";
3707
			
3707
 
3708
			#設置錯誤訊息
3708
			#設置錯誤訊息
3709
			$result["error"]=$validatePath;
3709
			$result["error"]=$validatePath;
3710
			
3710
 
3711
			#回傳結果
3711
			#回傳結果
3712
			return $result;
3712
			return $result;
3713
			
3713
 
3714
			}#if end
3714
			}#if end
3715
		
3715
 
3716
		#變更 working dir
3716
		#變更 working dir
3717
		$chdir=chdir($validatePath["path"]);
3717
		$chdir=chdir($validatePath["path"]);
3718
		
3718
 
3719
		#嘗試30秒內連線到 unix domain socket
3719
		#嘗試30秒內連線到 unix domain socket
3720
		$fp=stream_socket_client("unix://".$validatePath["fileName"], $errno, $errstr, 30, STREAM_CLIENT_ASYNC_CONNECT );
3720
		$fp=stream_socket_client("unix://".$validatePath["fileName"], $errno, $errstr, 30, STREAM_CLIENT_ASYNC_CONNECT );
3721
		
3721
 
3722
		#如果開啟 unix domain socket 失敗
3722
		#如果開啟 unix domain socket 失敗
3723
		if(!$fp){
3723
		if(!$fp){
3724
			
3724
 
3725
			#設置執行錯誤識別
3725
			#設置執行錯誤識別
3726
			$result["status"]="false";
3726
			$result["status"]="false";
3727
			
3727
 
3728
			#設置錯誤訊息
3728
			#設置錯誤訊息
3729
			$result["error"]=$errstr." (".$errno.")";
3729
			$result["error"]=$errstr." (".$errno.")";
3730
			
3730
 
3731
			#回傳結果
3731
			#回傳結果
3732
			return $result;
3732
			return $result;
3733
			
3733
 
3734
			}#if end
3734
			}#if end
3735
			
3735
 
3736
		#傳遞訊息
3736
		#傳遞訊息
3737
		$fwrite=fwrite($fp,$conf["msg"]);
3737
		$fwrite=fwrite($fp,$conf["msg"]);
3738
	
3738
 
3739
		#如果傳遞失敗
3739
		#如果傳遞失敗
3740
		if($fwrite===false){
3740
		if($fwrite===false){
3741
		
3741
 
3742
			#關閉unix domain socket
3742
			#關閉unix domain socket
3743
			@fclose($fp);
3743
			@fclose($fp);
3744
			
3744
 
3745
			#設置執行失敗
3745
			#設置執行失敗
3746
			$result["status"]="false";
3746
			$result["status"]="false";
3747
		
3747
 
3748
			#設置執行錯誤訊息
3748
			#設置執行錯誤訊息
3749
			$result["error"][]="傳遞訊息(".$conf["msg"].")失敗";
3749
			$result["error"][]="傳遞訊息(".$conf["msg"].")失敗";
3750
			
3750
 
3751
			#回傳結果
3751
			#回傳結果
3752
			return $result;
3752
			return $result;
3753
		
3753
 
3754
			}#if end
3754
			}#if end
3755
			
3755
 
3756
		#設置執行正常
3756
		#設置執行正常
3757
		$result["status"]="true";
3757
		$result["status"]="true";
3758
		
3758
 
3759
		#回傳結果
3759
		#回傳結果
3760
		return $result;
3760
		return $result;
3761
	
3761
 
3762
		}#function sendRawMsgUnixSocket
3762
		}#function sendRawMsgUnixSocket
3763
	
3763
 
3764
	/*
3764
	/*
3765
	#連線到 sock::unixDomainSocketServer 產生的  unix domain socket,傳送指定的訊息.
3765
	#連線到 sock::unixDomainSocketServer 產生的  unix domain socket,傳送指定的訊息.
3766
	#回傳結果:
3766
	#回傳結果:
3767
	#$result["status"],"true"代表執行正常;"false"代表執行不正常.
3767
	#$result["status"],"true"代表執行正常;"false"代表執行不正常.
3768
	#$result["error"],錯誤訊息陣列.
3768
	#$result["error"],錯誤訊息陣列.
Line 3779... Line 3779...
3779
	#無.
3779
	#無.
3780
	#備註:
3780
	#備註:
3781
	#無.
3781
	#無.
3782
	*/
3782
	*/
3783
	public static function sendAnyMsgToQBPWCFunixSocket(&$conf){
3783
	public static function sendAnyMsgToQBPWCFunixSocket(&$conf){
3784
	
3784
 
3785
		#初始化要回傳的結果
3785
		#初始化要回傳的結果
3786
		$result=array();
3786
		$result=array();
3787
 
3787
 
3788
		#取得當前執行的函數名稱
3788
		#取得當前執行的函數名稱
3789
		$result["function"]=__FUNCTION__;
3789
		$result["function"]=__FUNCTION__;
3790
		
3790
 
3791
		#如果沒有參數
3791
		#如果沒有參數
3792
		if(func_num_args()==0){
3792
		if(func_num_args()==0){
3793
			
3793
 
3794
			#設置執行失敗
3794
			#設置執行失敗
3795
			$result["status"]="false";
3795
			$result["status"]="false";
3796
			
3796
 
3797
			#設置執行錯誤訊息
3797
			#設置執行錯誤訊息
3798
			$result["error"]="函數".$result["function"]."需要參數";
3798
			$result["error"]="函數".$result["function"]."需要參數";
3799
			
3799
 
3800
			#回傳結果
3800
			#回傳結果
3801
			return $result;
3801
			return $result;
3802
			
3802
 
3803
			}#if end
3803
			}#if end
3804
		
3804
 
3805
		#取得參數
3805
		#取得參數
3806
		$result["argu"]=$conf;
3806
		$result["argu"]=$conf;
3807
 
3807
 
3808
		#如果 $conf 不為陣列
3808
		#如果 $conf 不為陣列
3809
		if(gettype($conf)!="array"){
3809
		if(gettype($conf)!="array"){
3810
		
3810
 
3811
			#設置執行失敗
3811
			#設置執行失敗
3812
			$result["status"]="false";
3812
			$result["status"]="false";
3813
		
3813
 
3814
			#設置執行錯誤訊息
3814
			#設置執行錯誤訊息
3815
			$result["error"][]="\$conf變數須為陣列形態";
3815
			$result["error"][]="\$conf變數須為陣列形態";
3816
		
3816
 
3817
			#如果傳入的參數為 null
3817
			#如果傳入的參數為 null
3818
			if($conf==null){
3818
			if($conf==null){
3819
			
3819
 
3820
				#設置執行錯誤訊息
3820
				#設置執行錯誤訊息
3821
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
3821
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
3822
			
3822
 
3823
				}#if end
3823
				}#if end
3824
 
3824
 
3825
			#回傳結果
3825
			#回傳結果
3826
			return $result;
3826
			return $result;
3827
		
3827
 
3828
			}#if end
3828
			}#if end
3829
			
3829
 
3830
		#函式說明:
3830
		#函式說明:
3831
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
3831
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
3832
		#回傳結果:
3832
		#回傳結果:
3833
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3833
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3834
		#$result["error"],執行不正常結束的錯訊息陣列.
3834
		#$result["error"],執行不正常結束的錯訊息陣列.
Line 3879... Line 3879...
3879
		#array_keys=>http://php.net/manual/en/function.array-keys.php
3879
		#array_keys=>http://php.net/manual/en/function.array-keys.php
3880
		#備註:
3880
		#備註:
3881
		#無.
3881
		#無.
3882
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
3882
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
3883
		unset($conf["variableCheck::checkArguments"]);
3883
		unset($conf["variableCheck::checkArguments"]);
3884
	
3884
 
3885
		#如果執行失敗
3885
		#如果執行失敗
3886
		if($checkArguments["status"]==="false"){
3886
		if($checkArguments["status"]==="false"){
3887
		
3887
 
3888
			#設置執行錯誤識別
3888
			#設置執行錯誤識別
3889
			$result["status"]="false";
3889
			$result["status"]="false";
3890
			
3890
 
3891
			#設置錯誤訊息
3891
			#設置錯誤訊息
3892
			$result["error"]=$checkArguments["error"];
3892
			$result["error"]=$checkArguments["error"];
3893
			
3893
 
3894
			#回傳結果
3894
			#回傳結果
3895
			return $result;
3895
			return $result;
3896
		
3896
 
3897
			}#if end
3897
			}#if end
3898
			
3898
 
3899
		#如果檢查不通過
3899
		#如果檢查不通過
3900
		if($checkArguments["status"]==="false"){
3900
		if($checkArguments["status"]==="false"){
3901
		
3901
 
3902
			#設置執行錯誤識別
3902
			#設置執行錯誤識別
3903
			$result["status"]="false";
3903
			$result["status"]="false";
3904
			
3904
 
3905
			#設置錯誤訊息
3905
			#設置錯誤訊息
3906
			$result["error"]=$checkArguments["error"];
3906
			$result["error"]=$checkArguments["error"];
3907
			
3907
 
3908
			#回傳結果
3908
			#回傳結果
3909
			return $result;
3909
			return $result;
3910
		
3910
 
3911
			}#if end
3911
			}#if end
3912
			
3912
 
3913
		#函式說明:
3913
		#函式說明:
3914
		#連線到 unixDomainSockServer 提供的 unix domain socket.
3914
		#連線到 unixDomainSockServer 提供的 unix domain socket.
3915
		#回傳結果:
3915
		#回傳結果:
3916
		#$result["status"],"true"代表執行正常;"false"代表執行不正常.
3916
		#$result["status"],"true"代表執行正常;"false"代表執行不正常.
3917
		#$result["error"],錯誤訊息陣列.
3917
		#$result["error"],錯誤訊息陣列.
Line 3937... Line 3937...
3937
		#備註:
3937
		#備註:
3938
		#無.
3938
		#無.
3939
		$paramsOfUnixDomainSockClient=$conf["sock::unixDomainSockClient"];
3939
		$paramsOfUnixDomainSockClient=$conf["sock::unixDomainSockClient"];
3940
		$unixDomainSockClient=sock::unixDomainSockClient($conf["sock::unixDomainSockClient"]);
3940
		$unixDomainSockClient=sock::unixDomainSockClient($conf["sock::unixDomainSockClient"]);
3941
		unset($conf["sock::unixDomainSockClient"]);
3941
		unset($conf["sock::unixDomainSockClient"]);
3942
		
3942
 
3943
		#如果執行失敗
3943
		#如果執行失敗
3944
		if($unixDomainSockClient["status"]==="false"){
3944
		if($unixDomainSockClient["status"]==="false"){
3945
		
3945
 
3946
			#設置執行錯誤識別
3946
			#設置執行錯誤識別
3947
			$result["status"]="false";
3947
			$result["status"]="false";
3948
			
3948
 
3949
			#設置錯誤訊息
3949
			#設置錯誤訊息
3950
			$result["error"]=$unixDomainSockClient;
3950
			$result["error"]=$unixDomainSockClient;
3951
			
3951
 
3952
			#回傳結果
3952
			#回傳結果
3953
			return $result;
3953
			return $result;
3954
		
3954
 
3955
			}#if end
3955
			}#if end
3956
		
3956
 
3957
		#取得json回應
3957
		#取得json回應
3958
		$jsonRes=json_decode($unixDomainSockClient["content"]);
3958
		$jsonRes=json_decode($unixDomainSockClient["content"]);
3959
		
3959
 
3960
		#如果執行失敗
3960
		#如果執行失敗
3961
		if($jsonRes===null){
3961
		if($jsonRes===null){
3962
		
3962
 
3963
			#設置執行錯誤識別
3963
			#設置執行錯誤識別
3964
			$result["status"]="false";
3964
			$result["status"]="false";
3965
			
3965
 
3966
			#設置錯誤訊息
3966
			#設置錯誤訊息
3967
			$result["error"]=$unixDomainSockClient;
3967
			$result["error"]=$unixDomainSockClient;
3968
			
3968
 
3969
			#回傳結果
3969
			#回傳結果
3970
			return $result;
3970
			return $result;
3971
		
3971
 
3972
			}#if end
3972
			}#if end
3973
			
3973
 
3974
		#如果沒有產生新id
3974
		#如果沒有產生新id
3975
		if(!isset($jsonRes->id)){
3975
		if(!isset($jsonRes->id)){
3976
		
3976
 
3977
			#設置執行錯誤識別
3977
			#設置執行錯誤識別
3978
			$result["status"]="false";
3978
			$result["status"]="false";
3979
			
3979
 
3980
			#設置錯誤訊息
3980
			#設置錯誤訊息
3981
			$result["error"]=$unixDomainSockClient;
3981
			$result["error"]=$unixDomainSockClient;
3982
			
3982
 
3983
			#回傳結果
3983
			#回傳結果
3984
			return $result;
3984
			return $result;
3985
		
3985
 
3986
			}#if end
3986
			}#if end
3987
			
3987
 
3988
		#用新的id再傳送一次要求給 qbpwcf_usock_path
3988
		#用新的id再傳送一次要求給 qbpwcf_usock_path
3989
		$paramsOfUnixDomainSockClient["id"]=$jsonRes->id;		
3989
		$paramsOfUnixDomainSockClient["id"]=$jsonRes->id;
3990
		$unixDomainSockClient=sock::unixDomainSockClient($paramsOfUnixDomainSockClient);
3990
		$unixDomainSockClient=sock::unixDomainSockClient($paramsOfUnixDomainSockClient);
3991
		unset($paramsOfUnixDomainSockClient);
3991
		unset($paramsOfUnixDomainSockClient);
3992
		
3992
 
3993
		#如果執行失敗
3993
		#如果執行失敗
3994
		if($unixDomainSockClient["status"]==="false"){
3994
		if($unixDomainSockClient["status"]==="false"){
3995
		
3995
 
3996
			#設置執行錯誤識別
3996
			#設置執行錯誤識別
3997
			$result["status"]="false";
3997
			$result["status"]="false";
3998
			
3998
 
3999
			#設置錯誤訊息
3999
			#設置錯誤訊息
4000
			$result["error"]=$unixDomainSockClient;
4000
			$result["error"]=$unixDomainSockClient;
4001
			
4001
 
4002
			#回傳結果
4002
			#回傳結果
4003
			return $result;
4003
			return $result;
4004
		
4004
 
4005
			}#if end
4005
			}#if end
4006
	
4006
 
4007
		#取得回應
4007
		#取得回應
4008
		$result["content"]=$unixDomainSockClient["content"];
4008
		$result["content"]=$unixDomainSockClient["content"];
4009
	
4009
 
4010
		#設置執行正常
4010
		#設置執行正常
4011
		$result["status"]="true";
4011
		$result["status"]="true";
4012
		
4012
 
4013
		#回傳結果
4013
		#回傳結果
4014
		return $result;
4014
		return $result;
4015
		
4015
 
4016
		}#function sendAnyMsgToQBPWCFunixSocket end
4016
		}#function sendAnyMsgToQBPWCFunixSocket end
4017
	
4017
 
4018
	/*
4018
	/*
4019
	#函式說明:
4019
	#函式說明:
4020
	#重複連線到 unixDomainSockServer 提供的 unix domain socket, 避免其 listen timeout, 並清除逾時的連線.
4020
	#重複連線到 unixDomainSockServer 提供的 unix domain socket, 避免其 listen timeout, 並清除逾時的連線.
4021
	#回傳結果:
4021
	#回傳結果:
4022
	#$result["status"],"true"代表執行正常;"false"代表執行不正常.
4022
	#$result["status"],"true"代表執行正常;"false"代表執行不正常.
Line 4031... Line 4031...
4031
	#無.
4031
	#無.
4032
	#備註:
4032
	#備註:
4033
	#無.
4033
	#無.
4034
	*/
4034
	*/
4035
	public static function keepAliveUnixDomainSockConnection(&$conf){
4035
	public static function keepAliveUnixDomainSockConnection(&$conf){
4036
		
4036
 
4037
		#初始化要回傳的結果
4037
		#初始化要回傳的結果
4038
		$result=array();
4038
		$result=array();
4039
 
4039
 
4040
		#取得當前執行的函數名稱
4040
		#取得當前執行的函數名稱
4041
		$result["function"]=__FUNCTION__;
4041
		$result["function"]=__FUNCTION__;
4042
		
4042
 
4043
		#如果沒有參數
4043
		#如果沒有參數
4044
		if(func_num_args()==0){
4044
		if(func_num_args()==0){
4045
			
4045
 
4046
			#設置執行失敗
4046
			#設置執行失敗
4047
			$result["status"]="false";
4047
			$result["status"]="false";
4048
			
4048
 
4049
			#設置執行錯誤訊息
4049
			#設置執行錯誤訊息
4050
			$result["error"]="函數".$result["function"]."需要參數";
4050
			$result["error"]="函數".$result["function"]."需要參數";
4051
			
4051
 
4052
			#回傳結果
4052
			#回傳結果
4053
			return $result;
4053
			return $result;
4054
			
4054
 
4055
			}#if end
4055
			}#if end
4056
 
4056
 
4057
		#涵式說明:
4057
		#涵式說明:
4058
		#判斷當前環境為web還是cmd
4058
		#判斷當前環境為web還是cmd
4059
		#回傳結果:
4059
		#回傳結果:
4060
		#$result,"web"或"cmd"
4060
		#$result,"web"或"cmd"
4061
		if(csInformation::getEnv()==="web"){
4061
		if(csInformation::getEnv()==="web"){
4062
			
4062
 
4063
			#設置執行失敗
4063
			#設置執行失敗
4064
			$result["status"]="false";
4064
			$result["status"]="false";
4065
			
4065
 
4066
			#設置執行錯誤訊息
4066
			#設置執行錯誤訊息
4067
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
4067
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
4068
			
4068
 
4069
			#回傳結果
4069
			#回傳結果
4070
			return $result;
4070
			return $result;
4071
			
4071
 
4072
			}#if end
4072
			}#if end
4073
		
4073
 
4074
		#取得參數
4074
		#取得參數
4075
		$result["argu"]=$conf;
4075
		$result["argu"]=$conf;
4076
 
4076
 
4077
		#如果 $conf 不為陣列
4077
		#如果 $conf 不為陣列
4078
		if(gettype($conf)!="array"){
4078
		if(gettype($conf)!="array"){
4079
		
4079
 
4080
			#設置執行失敗
4080
			#設置執行失敗
4081
			$result["status"]="false";
4081
			$result["status"]="false";
4082
		
4082
 
4083
			#設置執行錯誤訊息
4083
			#設置執行錯誤訊息
4084
			$result["error"][]="\$conf變數須為陣列形態";
4084
			$result["error"][]="\$conf變數須為陣列形態";
4085
		
4085
 
4086
			#如果傳入的參數為 null
4086
			#如果傳入的參數為 null
4087
			if($conf==null){
4087
			if($conf==null){
4088
			
4088
 
4089
				#設置執行錯誤訊息
4089
				#設置執行錯誤訊息
4090
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
4090
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
4091
			
4091
 
4092
				}#if end
4092
				}#if end
4093
 
4093
 
4094
			#回傳結果
4094
			#回傳結果
4095
			return $result;
4095
			return $result;
4096
		
4096
 
4097
			}#if end
4097
			}#if end
4098
			
4098
 
4099
		#檢查參數
4099
		#檢查參數
4100
		#函式說明:
4100
		#函式說明:
4101
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
4101
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
4102
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
4102
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
4103
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
4103
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
Line 4111... Line 4111...
4111
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
4111
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
4112
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
4112
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
4113
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
4113
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
4114
		#必填寫的參數:
4114
		#必填寫的參數:
4115
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
4115
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
4116
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;	
4116
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
4117
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
4117
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
4118
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
4118
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
4119
		#可以省略的參數:
4119
		#可以省略的參數:
4120
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
4120
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
4121
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("sock");
4121
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("sock");
Line 4129... Line 4129...
4129
		#$conf["canBeEmpty"]=array();
4129
		#$conf["canBeEmpty"]=array();
4130
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
4130
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
4131
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("id","cmd","param","clear");
4131
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("id","cmd","param","clear");
4132
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
4132
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
4133
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("id","cmd","param","clear");
4133
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("id","cmd","param","clear");
4134
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
4134
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
4135
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","array","string");
4135
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","array","string");
4136
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
4136
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
4137
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array();
4137
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array();
4138
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
4138
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
4139
		#$conf["disallowAllSkipableVarIsEmpty"]="";
4139
		#$conf["disallowAllSkipableVarIsEmpty"]="";
Line 4143... Line 4143...
4143
		#$conf["arrayCountEqualCheck"][]=array();
4143
		#$conf["arrayCountEqualCheck"][]=array();
4144
		#參考資料來源:
4144
		#參考資料來源:
4145
		#array_keys=>http://php.net/manual/en/function.array-keys.php
4145
		#array_keys=>http://php.net/manual/en/function.array-keys.php
4146
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
4146
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
4147
		unset($conf["variableCheck::checkArguments"]);
4147
		unset($conf["variableCheck::checkArguments"]);
4148
			
4148
 
4149
		#如果檢查參數失敗
4149
		#如果檢查參數失敗
4150
		if($checkArguments["status"]==="false"){
4150
		if($checkArguments["status"]==="false"){
4151
			
4151
 
4152
			#設置執行失敗
4152
			#設置執行失敗
4153
			$result["status"]="false";
4153
			$result["status"]="false";
4154
			
4154
 
4155
			#設置錯誤訊息
4155
			#設置錯誤訊息
4156
			$result["error"]=$checkArguments;
4156
			$result["error"]=$checkArguments;
4157
			
4157
 
4158
			#回傳結果
4158
			#回傳結果
4159
			return $result;
4159
			return $result;
4160
			
4160
 
4161
			}#if end
4161
			}#if end
4162
			
4162
 
4163
		#如果檢查參數不通過
4163
		#如果檢查參數不通過
4164
		if($checkArguments["passed"]==="false"){
4164
		if($checkArguments["passed"]==="false"){
4165
			
4165
 
4166
			#設置執行失敗
4166
			#設置執行失敗
4167
			$result["status"]="false";
4167
			$result["status"]="false";
4168
			
4168
 
4169
			#設置錯誤訊息
4169
			#設置錯誤訊息
4170
			$result["error"]=$checkArguments;
4170
			$result["error"]=$checkArguments;
4171
			
4171
 
4172
			#回傳結果
4172
			#回傳結果
4173
			return $result;
4173
			return $result;
4174
			
4174
 
4175
			}#if end
4175
			}#if end
4176
		
4176
 
4177
		#函式說明:
4177
		#函式說明:
4178
		#連線到 unixDomainSockServer 提供的 unix domain socket.
4178
		#連線到 unixDomainSockServer 提供的 unix domain socket.
4179
		#回傳結果:
4179
		#回傳結果:
4180
		#$result["status"],"true"代表執行正常;"false"代表執行不正常.
4180
		#$result["status"],"true"代表執行正常;"false"代表執行不正常.
4181
		#$result["error"],錯誤訊息陣列.
4181
		#$result["error"],錯誤訊息陣列.
Line 4194... Line 4194...
4194
		#參考資料:
4194
		#參考資料:
4195
		#http://php.net/manual/en/function.stream-socket-client.php
4195
		#http://php.net/manual/en/function.stream-socket-client.php
4196
		#http://php.net/manual/en/function.stream-get-contents.php
4196
		#http://php.net/manual/en/function.stream-get-contents.php
4197
		$unixDomainSockClient=sock::unixDomainSockClient($conf["sock::unixDomainSockClient"]);
4197
		$unixDomainSockClient=sock::unixDomainSockClient($conf["sock::unixDomainSockClient"]);
4198
		unset($conf["sock::unixDomainSockClient"]);
4198
		unset($conf["sock::unixDomainSockClient"]);
4199
		
4199
 
4200
		#建立連線失敗
4200
		#建立連線失敗
4201
		if($unixDomainSockClient["status"]==="false"){
4201
		if($unixDomainSockClient["status"]==="false"){
4202
			
4202
 
4203
			#設置執行失敗
4203
			#設置執行失敗
4204
			$result["status"]="false";
4204
			$result["status"]="false";
4205
			
4205
 
4206
			#設置執行錯誤訊息
4206
			#設置執行錯誤訊息
4207
			$result["error"]=$unixDomainSockClient;
4207
			$result["error"]=$unixDomainSockClient;
4208
			
4208
 
4209
			#回傳結果
4209
			#回傳結果
4210
			return $result;
4210
			return $result;
4211
			
4211
 
4212
			}#if end
4212
			}#if end
4213
			
4213
 
4214
		#取得回應	
4214
		#取得回應
4215
		$res=$unixDomainSockClient["content"];
4215
		$res=$unixDomainSockClient["content"];
4216
		
4216
 
4217
		#解析回應
4217
		#解析回應
4218
		$res=json_decode(trim($res));
4218
		$res=json_decode(trim($res));
4219
		
4219
 
4220
		#如果解析失敗
4220
		#如果解析失敗
4221
		if($res===false){
4221
		if($res===false){
4222
			
4222
 
4223
			#設置執行失敗
4223
			#設置執行失敗
4224
			$result["status"]="false";
4224
			$result["status"]="false";
4225
			
4225
 
4226
			#設置執行錯誤訊息
4226
			#設置執行錯誤訊息
4227
			$result["error"][]="解析回應失敗";
4227
			$result["error"][]="解析回應失敗";
4228
			
4228
 
4229
			#回傳結果
4229
			#回傳結果
4230
			return $result;
4230
			return $result;
4231
			
4231
 
4232
			}#if end
4232
			}#if end
4233
		
4233
 
4234
		#取得id	
4234
		#取得id
4235
		$id=$res->id;
4235
		$id=$res->id;
4236
		
4236
 
4237
		#無窮迴圈
4237
		#無窮迴圈
4238
		while(true){
4238
		while(true){
4239
			
4239
 
4240
			#函式說明:
4240
			#函式說明:
4241
			#連線到 unixDomainSockServer 提供的 unix domain socket.
4241
			#連線到 unixDomainSockServer 提供的 unix domain socket.
4242
			#回傳結果:
4242
			#回傳結果:
4243
			#$result["status"],"true"代表執行正常;"false"代表執行不正常.
4243
			#$result["status"],"true"代表執行正常;"false"代表執行不正常.
4244
			#$result["error"],錯誤訊息陣列.
4244
			#$result["error"],錯誤訊息陣列.
Line 4257... Line 4257...
4257
			#參考資料:
4257
			#參考資料:
4258
			#http://php.net/manual/en/function.stream-socket-client.php
4258
			#http://php.net/manual/en/function.stream-socket-client.php
4259
			#http://php.net/manual/en/function.stream-get-contents.php
4259
			#http://php.net/manual/en/function.stream-get-contents.php
4260
			$unixDomainSockClient=sock::unixDomainSockClient($conf["sock::unixDomainSockClient"]);
4260
			$unixDomainSockClient=sock::unixDomainSockClient($conf["sock::unixDomainSockClient"]);
4261
			unset($conf["sock::unixDomainSockClient"]);
4261
			unset($conf["sock::unixDomainSockClient"]);
4262
			
4262
 
4263
			#建立連線失敗
4263
			#建立連線失敗
4264
			if($unixDomainSockClient["status"]==="false"){
4264
			if($unixDomainSockClient["status"]==="false"){
4265
				
4265
 
4266
				#設置執行失敗
4266
				#設置執行失敗
4267
				$result["status"]="false";
4267
				$result["status"]="false";
4268
				
4268
 
4269
				#設置執行錯誤訊息
4269
				#設置執行錯誤訊息
4270
				$result["error"]=$unixDomainSockClient;
4270
				$result["error"]=$unixDomainSockClient;
4271
				
4271
 
4272
				#回傳結果
4272
				#回傳結果
4273
				return $result;
4273
				return $result;
4274
				
4274
 
4275
				}#if end
4275
				}#if end
4276
				
4276
 
4277
			#取得回應	
4277
			#取得回應
4278
			$res=$unixDomainSockClient["content"];
4278
			$res=$unixDomainSockClient["content"];
4279
			
4279
 
4280
			#解析回應
4280
			#解析回應
4281
			$res=json_decode($res);
4281
			$res=json_decode($res);
4282
			
4282
 
4283
			#如果解析失敗
4283
			#如果解析失敗
4284
			if($res===false){
4284
			if($res===false){
4285
				
4285
 
4286
				#設置執行失敗
4286
				#設置執行失敗
4287
				$result["status"]="false";
4287
				$result["status"]="false";
4288
				
4288
 
4289
				#設置執行錯誤訊息
4289
				#設置執行錯誤訊息
4290
				$result["error"][]="解析回應失敗";
4290
				$result["error"][]="解析回應失敗";
4291
				
4291
 
4292
				#回傳結果
4292
				#回傳結果
4293
				return $result;
4293
				return $result;
4294
				
4294
 
4295
				}#if end
4295
				}#if end
4296
			
4296
 
4297
			#show res
4297
			#show res
4298
			var_dump($res);
4298
			var_dump($res);
4299
				
4299
 
4300
			#停止執行
4300
			#停止執行
4301
			sleep(60);
4301
			sleep(60);
4302
			
4302
 
4303
			}#while end
4303
			}#while end
4304
			
4304
 
4305
		#設置執行不正常
4305
		#設置執行不正常
4306
		$result["status"]="false";
4306
		$result["status"]="false";
4307
		
4307
 
4308
		#設置錯誤訊息
4308
		#設置錯誤訊息
4309
		$result["error"][]="程式不應該中斷";
4309
		$result["error"][]="程式不應該中斷";
4310
		
4310
 
4311
		#回傳結果
4311
		#回傳結果
4312
		return $reuslt;
4312
		return $reuslt;
4313
		
4313
 
4314
		}#function keepAliveUnixDomainSockConnection end
4314
		}#function keepAliveUnixDomainSockConnection end
4315
 
4315
 
4316
	/*
4316
	/*
4317
	#函式說明:
4317
	#函式說明:
4318
	#tcp client
4318
	#tcp client
Line 4339... Line 4339...
4339
	#https://www.php.net/manual/en/function.socket-get-option.php
4339
	#https://www.php.net/manual/en/function.socket-get-option.php
4340
	#備註:
4340
	#備註:
4341
	#無.
4341
	#無.
4342
	*/
4342
	*/
4343
	public static function tcpClient(&$conf){
4343
	public static function tcpClient(&$conf){
4344
	
4344
 
4345
		#初始化要回傳的結果
4345
		#初始化要回傳的結果
4346
		$result=array();
4346
		$result=array();
4347
 
4347
 
4348
		#取得當前執行的函數名稱
4348
		#取得當前執行的函數名稱
4349
		$result["function"]=__FUNCTION__;
4349
		$result["function"]=__FUNCTION__;
4350
		
4350
 
4351
		#如果沒有參數
4351
		#如果沒有參數
4352
		if(func_num_args()==0){
4352
		if(func_num_args()==0){
4353
			
4353
 
4354
			#設置執行失敗
4354
			#設置執行失敗
4355
			$result["status"]="false";
4355
			$result["status"]="false";
4356
			
4356
 
4357
			#設置執行錯誤訊息
4357
			#設置執行錯誤訊息
4358
			$result["error"]="函數".$result["function"]."需要參數";
4358
			$result["error"]="函數".$result["function"]."需要參數";
4359
			
4359
 
4360
			#回傳結果
4360
			#回傳結果
4361
			return $result;
4361
			return $result;
4362
			
4362
 
4363
			}#if end
4363
			}#if end
4364
 
4364
 
4365
		#涵式說明:
4365
		#涵式說明:
4366
		#判斷當前環境為web還是cmd
4366
		#判斷當前環境為web還是cmd
4367
		#回傳結果:
4367
		#回傳結果:
4368
		#$result,"web"或"cmd"
4368
		#$result,"web"或"cmd"
4369
		if(csInformation::getEnv()==="web"){
4369
		if(csInformation::getEnv()==="web"){
4370
			
4370
 
4371
			#設置執行失敗
4371
			#設置執行失敗
4372
			$result["status"]="false";
4372
			$result["status"]="false";
4373
			
4373
 
4374
			#設置執行錯誤訊息
4374
			#設置執行錯誤訊息
4375
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
4375
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
4376
			
4376
 
4377
			#回傳結果
4377
			#回傳結果
4378
			return $result;
4378
			return $result;
4379
			
4379
 
4380
			}#if end
4380
			}#if end
4381
		
4381
 
4382
		#取得參數
4382
		#取得參數
4383
		$result["argu"]=$conf;
4383
		$result["argu"]=$conf;
4384
 
4384
 
4385
		#如果 $conf 不為陣列
4385
		#如果 $conf 不為陣列
4386
		if(gettype($conf)!="array"){
4386
		if(gettype($conf)!="array"){
4387
		
4387
 
4388
			#設置執行失敗
4388
			#設置執行失敗
4389
			$result["status"]="false";
4389
			$result["status"]="false";
4390
		
4390
 
4391
			#設置執行錯誤訊息
4391
			#設置執行錯誤訊息
4392
			$result["error"][]="\$conf變數須為陣列形態";
4392
			$result["error"][]="\$conf變數須為陣列形態";
4393
		
4393
 
4394
			#如果傳入的參數為 null
4394
			#如果傳入的參數為 null
4395
			if($conf==null){
4395
			if($conf==null){
4396
			
4396
 
4397
				#設置執行錯誤訊息
4397
				#設置執行錯誤訊息
4398
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
4398
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
4399
			
4399
 
4400
				}#if end
4400
				}#if end
4401
 
4401
 
4402
			#回傳結果
4402
			#回傳結果
4403
			return $result;
4403
			return $result;
4404
		
4404
 
4405
			}#if end
4405
			}#if end
4406
			
4406
 
4407
		#初始化取得的回應
4407
		#初始化取得的回應
4408
		$result["content"]="";	
4408
		$result["content"]="";
4409
			
4409
 
4410
		#檢查參數
4410
		#檢查參數
4411
		#函式說明:
4411
		#函式說明:
4412
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
4412
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
4413
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
4413
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
4414
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
4414
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
Line 4422... Line 4422...
4422
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
4422
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
4423
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
4423
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
4424
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
4424
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
4425
		#必填寫的參數:
4425
		#必填寫的參數:
4426
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
4426
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
4427
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;	
4427
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
4428
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
4428
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
4429
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
4429
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
4430
		#可以省略的參數:
4430
		#可以省略的參數:
4431
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
4431
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
4432
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("port","dataToSend");
4432
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("port","dataToSend");
Line 4440... Line 4440...
4440
		#$conf["canBeEmpty"]=array();
4440
		#$conf["canBeEmpty"]=array();
4441
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
4441
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
4442
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("ip");
4442
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("ip");
4443
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
4443
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
4444
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("ip","sec","microSec");
4444
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("ip","sec","microSec");
4445
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
4445
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
4446
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","integer","integer");
4446
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","integer","integer");
4447
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
4447
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
4448
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("127.0.0.1",5,0);
4448
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("127.0.0.1",5,0);
4449
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
4449
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
4450
		#$conf["disallowAllSkipableVarIsEmpty"]="";
4450
		#$conf["disallowAllSkipableVarIsEmpty"]="";
Line 4454... Line 4454...
4454
		#$conf["arrayCountEqualCheck"][]=array();
4454
		#$conf["arrayCountEqualCheck"][]=array();
4455
		#參考資料來源:
4455
		#參考資料來源:
4456
		#array_keys=>http://php.net/manual/en/function.array-keys.php
4456
		#array_keys=>http://php.net/manual/en/function.array-keys.php
4457
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
4457
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
4458
		unset($conf["variableCheck::checkArguments"]);
4458
		unset($conf["variableCheck::checkArguments"]);
4459
			
4459
 
4460
		#如果檢查參數失敗
4460
		#如果檢查參數失敗
4461
		if($checkArguments["status"]==="false"){
4461
		if($checkArguments["status"]==="false"){
4462
			
4462
 
4463
			#設置執行失敗
4463
			#設置執行失敗
4464
			$result["status"]="false";
4464
			$result["status"]="false";
4465
			
4465
 
4466
			#設置錯誤訊息
4466
			#設置錯誤訊息
4467
			$result["error"]=$checkArguments;
4467
			$result["error"]=$checkArguments;
4468
			
4468
 
4469
			#回傳結果
4469
			#回傳結果
4470
			return $result;
4470
			return $result;
4471
			
4471
 
4472
			}#if end
4472
			}#if end
4473
			
4473
 
4474
		#如果檢查參數不通過
4474
		#如果檢查參數不通過
4475
		if($checkArguments["passed"]==="false"){
4475
		if($checkArguments["passed"]==="false"){
4476
			
4476
 
4477
			#設置執行失敗
4477
			#設置執行失敗
4478
			$result["status"]="false";
4478
			$result["status"]="false";
4479
			
4479
 
4480
			#設置錯誤訊息
4480
			#設置錯誤訊息
4481
			$result["error"]=$checkArguments;
4481
			$result["error"]=$checkArguments;
4482
			
4482
 
4483
			#回傳結果
4483
			#回傳結果
4484
			return $result;
4484
			return $result;
4485
			
4485
 
4486
			}#if end
4486
			}#if end
4487
		
4487
 
4488
		#建立 tcp socket client	
4488
		#建立 tcp socket client
4489
		$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
4489
		$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
4490
		
4490
 
4491
		#設置接收資料的最長等待時間
4491
		#設置接收資料的最長等待時間
4492
		socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>$conf["sec"],"usec"=>$conf["microSec"]));
4492
		socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>$conf["sec"],"usec"=>$conf["microSec"]));
4493
		
4493
 
4494
		#如果建立 socket 失敗
4494
		#如果建立 socket 失敗
4495
		if ($socket === false) {
4495
		if ($socket === false) {
4496
		
4496
 
4497
			#設置執行失敗
4497
			#設置執行失敗
4498
			$result["status"]="false";
4498
			$result["status"]="false";
4499
			
4499
 
4500
			#設置錯誤訊息
4500
			#設置錯誤訊息
4501
			$result["error"][]="socket_create() failed: reason: " . socket_strerror(socket_last_error());
4501
			$result["error"][]="socket_create() failed: reason: " . socket_strerror(socket_last_error());
4502
			
4502
 
4503
			#回傳結果
4503
			#回傳結果
4504
			return $result;
4504
			return $result;
4505
		
4505
 
4506
			}#if end 
4506
			}#if end
4507
			
4507
 
4508
		#連線到 tcp socket server	
4508
		#連線到 tcp socket server
4509
		$socket_connect = socket_connect($socket, $conf["ip"], $conf["port"]);
4509
		$socket_connect = socket_connect($socket, $conf["ip"], $conf["port"]);
4510
		
4510
 
4511
		#如果連線到 tcp socket server 失敗
4511
		#如果連線到 tcp socket server 失敗
4512
		if ($socket_connect === false) {
4512
		if ($socket_connect === false) {
4513
		
4513
 
4514
			#設置執行失敗
4514
			#設置執行失敗
4515
			$result["status"]="false";
4515
			$result["status"]="false";
4516
				
4516
 
4517
	    		#設置錯誤訊息
4517
	    		#設置錯誤訊息
4518
			$result["error"][]="socket_connect() failed. Reason: ($result) " . socket_strerror(socket_last_error($socket));
4518
			$result["error"][]="socket_connect() failed. Reason: ($result) " . socket_strerror(socket_last_error($socket));
4519
			
4519
 
4520
			#回傳結果
4520
			#回傳結果
4521
			return $result;
4521
			return $result;
4522
			
4522
 
4523
			}#if end
4523
			}#if end
4524
			
4524
 
4525
		#傳送訊息到 tcp server
4525
		#傳送訊息到 tcp server
4526
		socket_write($socket, $conf["dataToSend"].PHP_EOL, strlen($conf["dataToSend"].PHP_EOL));
4526
		socket_write($socket, $conf["dataToSend"].PHP_EOL, strlen($conf["dataToSend"].PHP_EOL));
4527
		
4527
 
4528
		#取得回應
4528
		#取得回應
4529
		while ($out = socket_read($socket, 2048)) {
4529
		while ($out = socket_read($socket, 2048)) {
4530
		
4530
 
4531
			#設置取得的回應
4531
			#設置取得的回應
4532
			$result["content"]=$result["content"].$out;
4532
			$result["content"]=$result["content"].$out;
4533
		
4533
 
4534
			#debug
4534
			#debug
4535
			#echo $result["content"];
4535
			#echo $result["content"];
4536
		
4536
 
4537
			}#while end
4537
			}#while end
4538
 
4538
 
4539
		#關閉socket
4539
		#關閉socket
4540
		socket_close($socket);
4540
		socket_close($socket);
4541
			
4541
 
4542
		#設置處理正常
4542
		#設置處理正常
4543
		$result["status"]="true";
4543
		$result["status"]="true";
4544
		
4544
 
4545
		#回傳結果
4545
		#回傳結果
4546
		return $result;	
4546
		return $result;
4547
			
4547
 
4548
		}#function tcpClient end
4548
		}#function tcpClient end
4549
 
4549
 
4550
	/*
4550
	/*
4551
	#函式說明:
4551
	#函式說明:
4552
	#udp client
4552
	#udp client
Line 4578... Line 4578...
4578
	#https://www.php.net/manual/en/sockets.examples.php
4578
	#https://www.php.net/manual/en/sockets.examples.php
4579
	#備註:
4579
	#備註:
4580
	#無.
4580
	#無.
4581
	*/
4581
	*/
4582
	public static function udpClient(&$conf){
4582
	public static function udpClient(&$conf){
4583
	
4583
 
4584
		#初始化要回傳的結果
4584
		#初始化要回傳的結果
4585
		$result=array();
4585
		$result=array();
4586
 
4586
 
4587
		#取得當前執行的函數名稱
4587
		#取得當前執行的函數名稱
4588
		$result["function"]=__FUNCTION__;
4588
		$result["function"]=__FUNCTION__;
4589
		
4589
 
4590
		#如果沒有參數
4590
		#如果沒有參數
4591
		if(func_num_args()==0){
4591
		if(func_num_args()==0){
4592
			
4592
 
4593
			#設置執行失敗
4593
			#設置執行失敗
4594
			$result["status"]="false";
4594
			$result["status"]="false";
4595
			
4595
 
4596
			#設置執行錯誤訊息
4596
			#設置執行錯誤訊息
4597
			$result["error"]="函數".$result["function"]."需要參數";
4597
			$result["error"]="函數".$result["function"]."需要參數";
4598
			
4598
 
4599
			#回傳結果
4599
			#回傳結果
4600
			return $result;
4600
			return $result;
4601
			
4601
 
4602
			}#if end
4602
			}#if end
4603
 
4603
 
4604
		#涵式說明:
4604
		#涵式說明:
4605
		#判斷當前環境為web還是cmd
4605
		#判斷當前環境為web還是cmd
4606
		#回傳結果:
4606
		#回傳結果:
4607
		#$result,"web"或"cmd"
4607
		#$result,"web"或"cmd"
4608
		if(csInformation::getEnv()==="web"){
4608
		if(csInformation::getEnv()==="web"){
4609
			
4609
 
4610
			#設置執行失敗
4610
			#設置執行失敗
4611
			$result["status"]="false";
4611
			$result["status"]="false";
4612
			
4612
 
4613
			#設置執行錯誤訊息
4613
			#設置執行錯誤訊息
4614
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
4614
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
4615
			
4615
 
4616
			#回傳結果
4616
			#回傳結果
4617
			return $result;
4617
			return $result;
4618
			
4618
 
4619
			}#if end
4619
			}#if end
4620
		
4620
 
4621
		#取得參數
4621
		#取得參數
4622
		$result["argu"]=$conf;
4622
		$result["argu"]=$conf;
4623
 
4623
 
4624
		#如果 $conf 不為陣列
4624
		#如果 $conf 不為陣列
4625
		if(gettype($conf)!="array"){
4625
		if(gettype($conf)!="array"){
4626
		
4626
 
4627
			#設置執行失敗
4627
			#設置執行失敗
4628
			$result["status"]="false";
4628
			$result["status"]="false";
4629
		
4629
 
4630
			#設置執行錯誤訊息
4630
			#設置執行錯誤訊息
4631
			$result["error"][]="\$conf變數須為陣列形態";
4631
			$result["error"][]="\$conf變數須為陣列形態";
4632
		
4632
 
4633
			#如果傳入的參數為 null
4633
			#如果傳入的參數為 null
4634
			if($conf==null){
4634
			if($conf==null){
4635
			
4635
 
4636
				#設置執行錯誤訊息
4636
				#設置執行錯誤訊息
4637
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
4637
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
4638
			
4638
 
4639
				}#if end
4639
				}#if end
4640
 
4640
 
4641
			#回傳結果
4641
			#回傳結果
4642
			return $result;
4642
			return $result;
4643
		
4643
 
4644
			}#if end
4644
			}#if end
4645
			
4645
 
4646
		#初始化取得的回應
4646
		#初始化取得的回應
4647
		$result["content"]="";	
4647
		$result["content"]="";
4648
			
4648
 
4649
		#檢查參數
4649
		#檢查參數
4650
		#函式說明:
4650
		#函式說明:
4651
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
4651
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
4652
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
4652
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
4653
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
4653
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
Line 4661... Line 4661...
4661
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
4661
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
4662
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
4662
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
4663
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
4663
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
4664
		#必填寫的參數:
4664
		#必填寫的參數:
4665
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
4665
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
4666
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;	
4666
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
4667
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
4667
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
4668
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
4668
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
4669
		#可以省略的參數:
4669
		#可以省略的參數:
4670
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
4670
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
4671
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("port","dataToSend");
4671
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("port","dataToSend");
Line 4679... Line 4679...
4679
		#$conf["canBeEmpty"]=array();
4679
		#$conf["canBeEmpty"]=array();
4680
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
4680
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
4681
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("ip","secSleepAfterSend","closeAtEnd","timeout");
4681
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("ip","secSleepAfterSend","closeAtEnd","timeout");
4682
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
4682
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
4683
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("ip","secSleepAfterSend","closeAtEnd","sock","timeout");
4683
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("ip","secSleepAfterSend","closeAtEnd","sock","timeout");
4684
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
4684
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
4685
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","integer","string","object","integer");
4685
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","integer","string","object","integer");
4686
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
4686
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
4687
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("127.0.0.1",1,"false",null,10);
4687
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("127.0.0.1",1,"false",null,10);
4688
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
4688
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
4689
		#$conf["disallowAllSkipableVarIsEmpty"]="";
4689
		#$conf["disallowAllSkipableVarIsEmpty"]="";
Line 4693... Line 4693...
4693
		#$conf["arrayCountEqualCheck"][]=array();
4693
		#$conf["arrayCountEqualCheck"][]=array();
4694
		#參考資料來源:
4694
		#參考資料來源:
4695
		#array_keys=>http://php.net/manual/en/function.array-keys.php
4695
		#array_keys=>http://php.net/manual/en/function.array-keys.php
4696
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
4696
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
4697
		unset($conf["variableCheck::checkArguments"]);
4697
		unset($conf["variableCheck::checkArguments"]);
4698
			
4698
 
4699
		#如果檢查參數失敗
4699
		#如果檢查參數失敗
4700
		if($checkArguments["status"]==="false"){
4700
		if($checkArguments["status"]==="false"){
4701
			
4701
 
4702
			#設置執行失敗
4702
			#設置執行失敗
4703
			$result["status"]="false";
4703
			$result["status"]="false";
4704
			
4704
 
4705
			#設置錯誤訊息
4705
			#設置錯誤訊息
4706
			$result["error"]=$checkArguments;
4706
			$result["error"]=$checkArguments;
4707
			
4707
 
4708
			#回傳結果
4708
			#回傳結果
4709
			return $result;
4709
			return $result;
4710
			
4710
 
4711
			}#if end
4711
			}#if end
4712
			
4712
 
4713
		#如果檢查參數不通過
4713
		#如果檢查參數不通過
4714
		if($checkArguments["passed"]==="false"){
4714
		if($checkArguments["passed"]==="false"){
4715
			
4715
 
4716
			#設置執行失敗
4716
			#設置執行失敗
4717
			$result["status"]="false";
4717
			$result["status"]="false";
4718
			
4718
 
4719
			#設置錯誤訊息
4719
			#設置錯誤訊息
4720
			$result["error"]=$checkArguments;
4720
			$result["error"]=$checkArguments;
4721
			
4721
 
4722
			#回傳結果
4722
			#回傳結果
4723
			return $result;
4723
			return $result;
4724
			
4724
 
4725
			}#if end
4725
			}#if end
4726
		
4726
 
4727
		#如果沒有指定要用既有的 socket 
4727
		#如果沒有指定要用既有的 socket
4728
		if(!isset($conf["sock"])){
4728
		if(!isset($conf["sock"])){
4729
		
4729
 
4730
			#建立 udp socket client	
4730
			#建立 udp socket client
4731
			$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
4731
			$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
4732
		
4732
 
4733
			#設置 timeout 為 $conf["timeout"] 秒
4733
			#設置 timeout 為 $conf["timeout"] 秒
4734
			$timeout = array('sec'=>$conf["timeout"],'usec'=>0);
4734
			$timeout = array('sec'=>$conf["timeout"],'usec'=>0);
4735
 			socket_set_option($socket,SOL_SOCKET,SO_RCVTIMEO,$timeout);
4735
 			socket_set_option($socket,SOL_SOCKET,SO_RCVTIMEO,$timeout);
4736
 			
4736
 
4737
 			#如果建立 socket 失敗
4737
 			#如果建立 socket 失敗
4738
			if ($socket === false) {
4738
			if ($socket === false) {
4739
			
4739
 
4740
				#設置執行失敗
4740
				#設置執行失敗
4741
				$result["status"]="false";
4741
				$result["status"]="false";
4742
				
4742
 
4743
				#設置錯誤訊息
4743
				#設置錯誤訊息
4744
				$result["error"][]="socket_create() failed: reason: " . socket_strerror(socket_last_error());
4744
				$result["error"][]="socket_create() failed: reason: " . socket_strerror(socket_last_error());
4745
				
4745
 
4746
				#回傳結果
4746
				#回傳結果
4747
				return $result;
4747
				return $result;
4748
			
4748
 
4749
				}#if end 
4749
				}#if end
4750
				
4750
 
4751
			#連線到 udp socket server	
4751
			#連線到 udp socket server
4752
			$socket_connect = socket_connect($socket, $conf["ip"], $conf["port"]);
4752
			$socket_connect = socket_connect($socket, $conf["ip"], $conf["port"]);
4753
			
4753
 
4754
			#如果連線到 udp socket server 失敗
4754
			#如果連線到 udp socket server 失敗
4755
			if ($socket_connect === false) {
4755
			if ($socket_connect === false) {
4756
			
4756
 
4757
				#設置執行失敗
4757
				#設置執行失敗
4758
				$result["status"]="false";
4758
				$result["status"]="false";
4759
					
4759
 
4760
				#設置錯誤訊息
4760
				#設置錯誤訊息
4761
				$result["error"][]="socket_connect() failed. Reason: ($result) " . socket_strerror(socket_last_error($socket));
4761
				$result["error"][]="socket_connect() failed. Reason: ($result) " . socket_strerror(socket_last_error($socket));
4762
				
4762
 
4763
				#回傳結果
4763
				#回傳結果
4764
				return $result;
4764
				return $result;
4765
				
4765
 
4766
				}#if end
4766
				}#if end
4767
		
4767
 
4768
			}#if end	
4768
			}#if end
4769
		
4769
 
4770
		#反之
4770
		#反之
4771
		else{
4771
		else{
4772
			#取得要重複使用的socket
4772
			#取得要重複使用的socket
4773
			$socket=&$conf["sock"];
4773
			$socket=&$conf["sock"];
4774
				
4774
 
4775
			}#else end
4775
			}#else end
4776
			
4776
 
4777
		#有幾個訊息就跑幾次
4777
		#有幾個訊息就跑幾次
4778
		for($i=0;$i<count($conf["dataToSend"]);$i++){
4778
		for($i=0;$i<count($conf["dataToSend"]);$i++){
4779
			
4779
 
4780
			#傳送訊息到 tcp server
4780
			#傳送訊息到 tcp server
4781
			socket_write($socket, $conf["dataToSend"][$i], strlen($conf["dataToSend"][$i]));
4781
			socket_write($socket, $conf["dataToSend"][$i], strlen($conf["dataToSend"][$i]));
4782
			
4782
 
4783
			#取得回應
4783
			#取得回應
4784
			while ($out = socket_read($socket, 2048)) {
4784
			while ($out = socket_read($socket, 2048)) {
4785
			
4785
 
4786
				#設置取得的回應,儲存到陣列裡面.
4786
				#設置取得的回應,儲存到陣列裡面.
4787
				$result["contentArray"][]=$out;
4787
				$result["contentArray"][]=$out;
4788
			
4788
 
4789
				#設置取得的回應,儲存成字串,串接在一塊.
4789
				#設置取得的回應,儲存成字串,串接在一塊.
4790
				$result["content"]=$result["content"].$out;
4790
				$result["content"]=$result["content"].$out;
4791
			
4791
 
4792
				}#while end
4792
				}#while end
4793
			
4793
 
4794
			#如果有多個訊息要傳遞,且不是最後一個訊息
4794
			#如果有多個訊息要傳遞,且不是最後一個訊息
4795
			if(count($conf["dataToSend"])>1 && $i!==count($conf["dataToSend"])-1){
4795
			if(count($conf["dataToSend"])>1 && $i!==count($conf["dataToSend"])-1){
4796
			
4796
 
4797
				#休息一下
4797
				#休息一下
4798
				sleep($conf["secSleepAfterSend"]);
4798
				sleep($conf["secSleepAfterSend"]);
4799
			
4799
 
4800
				}#if end
4800
				}#if end
4801
	
4801
 
4802
			}#for end
4802
			}#for end
4803
		
4803
 
4804
		#如果要關閉連線
4804
		#如果要關閉連線
4805
		if($conf["closeAtEnd"]==="true"){
4805
		if($conf["closeAtEnd"]==="true"){
4806
		
4806
 
4807
			#關閉socket
4807
			#關閉socket
4808
			socket_close($socket);
4808
			socket_close($socket);
4809
			
4809
 
4810
			}#if end
4810
			}#if end
4811
			
4811
 
4812
		#取得使用的socket
4812
		#取得使用的socket
4813
		$result["sock"]=$socket;	
4813
		$result["sock"]=$socket;
4814
			
4814
 
4815
		#設置處理正常
4815
		#設置處理正常
4816
		$result["status"]="true";
4816
		$result["status"]="true";
4817
		
4817
 
4818
		#回傳結果
4818
		#回傳結果
4819
		return $result;	
4819
		return $result;
4820
		
4820
 
4821
		}#function udpClient end
4821
		}#function udpClient end
4822
 
4822
 
4823
	/*
4823
	/*
4824
	#函式說明:
4824
	#函式說明:
4825
	#建立tcp server
4825
	#建立tcp server
Line 4849... Line 4849...
4849
		#初始化要回傳的結果
4849
		#初始化要回傳的結果
4850
		$result=array();
4850
		$result=array();
4851
 
4851
 
4852
		#取得當前執行的函數名稱
4852
		#取得當前執行的函數名稱
4853
		$result["function"]=__FUNCTION__;
4853
		$result["function"]=__FUNCTION__;
4854
		
4854
 
4855
		#如果沒有參數
4855
		#如果沒有參數
4856
		if(func_num_args()==0){
4856
		if(func_num_args()==0){
4857
			
4857
 
4858
			#設置執行失敗
4858
			#設置執行失敗
4859
			$result["status"]="false";
4859
			$result["status"]="false";
4860
			
4860
 
4861
			#設置執行錯誤訊息
4861
			#設置執行錯誤訊息
4862
			$result["error"]="函數".$result["function"]."需要參數";
4862
			$result["error"]="函數".$result["function"]."需要參數";
4863
			
4863
 
4864
			#回傳結果
4864
			#回傳結果
4865
			return $result;
4865
			return $result;
4866
			
4866
 
4867
			}#if end
4867
			}#if end
4868
 
4868
 
4869
		#涵式說明:
4869
		#涵式說明:
4870
		#判斷當前環境為web還是cmd
4870
		#判斷當前環境為web還是cmd
4871
		#回傳結果:
4871
		#回傳結果:
4872
		#$result,"web"或"cmd"
4872
		#$result,"web"或"cmd"
4873
		if(csInformation::getEnv()==="web"){
4873
		if(csInformation::getEnv()==="web"){
4874
			
4874
 
4875
			#設置執行失敗
4875
			#設置執行失敗
4876
			$result["status"]="false";
4876
			$result["status"]="false";
4877
			
4877
 
4878
			#設置執行錯誤訊息
4878
			#設置執行錯誤訊息
4879
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
4879
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
4880
			
4880
 
4881
			#回傳結果
4881
			#回傳結果
4882
			return $result;
4882
			return $result;
4883
			
4883
 
4884
			}#if end
4884
			}#if end
4885
		
4885
 
4886
		#取得參數
4886
		#取得參數
4887
		$result["argu"]=$conf;
4887
		$result["argu"]=$conf;
4888
 
4888
 
4889
		#如果 $conf 不為陣列
4889
		#如果 $conf 不為陣列
4890
		if(gettype($conf)!="array"){
4890
		if(gettype($conf)!="array"){
4891
		
4891
 
4892
			#設置執行失敗
4892
			#設置執行失敗
4893
			$result["status"]="false";
4893
			$result["status"]="false";
4894
		
4894
 
4895
			#設置執行錯誤訊息
4895
			#設置執行錯誤訊息
4896
			$result["error"][]="\$conf變數須為陣列形態";
4896
			$result["error"][]="\$conf變數須為陣列形態";
4897
		
4897
 
4898
			#如果傳入的參數為 null
4898
			#如果傳入的參數為 null
4899
			if($conf==null){
4899
			if($conf==null){
4900
			
4900
 
4901
				#設置執行錯誤訊息
4901
				#設置執行錯誤訊息
4902
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
4902
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
4903
			
4903
 
4904
				}#if end
4904
				}#if end
4905
 
4905
 
4906
			#回傳結果
4906
			#回傳結果
4907
			return $result;
4907
			return $result;
4908
		
4908
 
4909
			}#if end
4909
			}#if end
4910
			
4910
 
4911
		#檢查參數
4911
		#檢查參數
4912
		#函式說明:
4912
		#函式說明:
4913
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
4913
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
4914
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
4914
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
4915
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
4915
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
Line 4923... Line 4923...
4923
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
4923
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
4924
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
4924
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
4925
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
4925
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
4926
		#必填寫的參數:
4926
		#必填寫的參數:
4927
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
4927
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
4928
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;	
4928
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
4929
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
4929
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
4930
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
4930
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
4931
		#可以省略的參數:
4931
		#可以省略的參數:
4932
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
4932
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
4933
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("port");
4933
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("port");
Line 4941... Line 4941...
4941
		#$conf["canBeEmpty"]=array();
4941
		#$conf["canBeEmpty"]=array();
4942
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
4942
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
4943
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("ip","welcomeMsg");
4943
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("ip","welcomeMsg");
4944
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
4944
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
4945
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("ip","processFuncs","welcomeMsg","socketSelectTimeountSec","socketSelectTimeountUsec","serverFuncs");
4945
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("ip","processFuncs","welcomeMsg","socketSelectTimeountSec","socketSelectTimeountUsec","serverFuncs");
4946
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
4946
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
4947
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","array","string","integer","integer","array");
4947
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","array","string","integer","integer","array");
4948
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
4948
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
4949
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("0.0.0.0",array(),"true",0,null,null);
4949
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("0.0.0.0",array(),"true",0,null,null);
4950
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
4950
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
4951
		#$conf["disallowAllSkipableVarIsEmpty"]="";
4951
		#$conf["disallowAllSkipableVarIsEmpty"]="";
Line 4955... Line 4955...
4955
		#$conf["arrayCountEqualCheck"][]=array();
4955
		#$conf["arrayCountEqualCheck"][]=array();
4956
		#參考資料來源:
4956
		#參考資料來源:
4957
		#array_keys=>http://php.net/manual/en/function.array-keys.php
4957
		#array_keys=>http://php.net/manual/en/function.array-keys.php
4958
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
4958
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
4959
		unset($conf["variableCheck::checkArguments"]);
4959
		unset($conf["variableCheck::checkArguments"]);
4960
			
4960
 
4961
		#如果檢查參數失敗
4961
		#如果檢查參數失敗
4962
		if($checkArguments["status"]==="false"){
4962
		if($checkArguments["status"]==="false"){
4963
			
4963
 
4964
			#設置執行失敗
4964
			#設置執行失敗
4965
			$result["status"]="false";
4965
			$result["status"]="false";
4966
			
4966
 
4967
			#設置錯誤訊息
4967
			#設置錯誤訊息
4968
			$result["error"]=$checkArguments;
4968
			$result["error"]=$checkArguments;
4969
			
4969
 
4970
			#回傳結果
4970
			#回傳結果
4971
			return $result;
4971
			return $result;
4972
			
4972
 
4973
			}#if end
4973
			}#if end
4974
			
4974
 
4975
		#如果檢查參數不通過
4975
		#如果檢查參數不通過
4976
		if($checkArguments["passed"]==="false"){
4976
		if($checkArguments["passed"]==="false"){
4977
			
4977
 
4978
			#設置執行失敗
4978
			#設置執行失敗
4979
			$result["status"]="false";
4979
			$result["status"]="false";
4980
			
4980
 
4981
			#設置錯誤訊息
4981
			#設置錯誤訊息
4982
			$result["error"]=$checkArguments;
4982
			$result["error"]=$checkArguments;
4983
			
4983
 
4984
			#回傳結果
4984
			#回傳結果
4985
			return $result;
4985
			return $result;
4986
			
4986
 
4987
			}#if end
4987
			}#if end
4988
		
4988
 
4989
		#程式不會 timeout
4989
		#程式不會 timeout
4990
		set_time_limit(0);
4990
		set_time_limit(0);
4991
 
4991
 
4992
		#Turn on implicit output flushing so we see what we're getting as it comes in.
4992
		#Turn on implicit output flushing so we see what we're getting as it comes in.
4993
		ob_implicit_flush();
4993
		ob_implicit_flush();
Line 5025... Line 5025...
5025
 
5025
 
5026
		#無窮迴圈
5026
		#無窮迴圈
5027
		do {
5027
		do {
5028
			#each resource
5028
			#each resource
5029
			foreach($clients as $rk=>$csock){
5029
			foreach($clients as $rk=>$csock){
5030
				
5030
 
5031
				#if not socket resource
5031
				#if not socket resource
5032
				if(get_resource_type($csock)!=="Socket"){
5032
				if(get_resource_type($csock)!=="Socket"){
5033
 
5033
 
5034
					#delete
5034
					#delete
5035
					unset($clients[$rk]);
5035
					unset($clients[$rk]);
5036
 
5036
 
5037
					}#if end
5037
					}#if end
5038
										
5038
 
5039
				}#foreach end
5039
				}#foreach end
5040
 
5040
 
5041
			#found server sock
5041
			#found server sock
5042
			$serverSock=false;
5042
			$serverSock=false;
5043
 
5043
 
5044
			#each resource
5044
			#each resource
5045
			foreach($clients as $rk=>$csock){
5045
			foreach($clients as $rk=>$csock){
5046
				
5046
 
5047
				#if not socket resource
5047
				#if not socket resource
5048
				if($rk==="serverSock"){
5048
				if($rk==="serverSock"){
5049
 
5049
 
5050
					#found server sock
5050
					#found server sock
5051
					$serverSock=true;
5051
					$serverSock=true;
5052
 
5052
 
5053
					}#if end
5053
					}#if end
5054
										
5054
 
5055
				}#if end
5055
				}#if end
5056
			
5056
 
5057
			#not found server sock
5057
			#not found server sock
5058
			if(!$serverSock){
5058
			if(!$serverSock){
5059
				
5059
 
5060
				#end
5060
				#end
5061
				exit;
5061
				exit;
5062
 
5062
 
5063
				}#if end
5063
				}#if end
5064
			
5064
 
5065
			#for socket select
5065
			#for socket select
5066
			$read   = $clients;
5066
			$read   = $clients;
5067
			$write  = NULL;
5067
			$write  = NULL;
5068
			$except = NULL;
5068
			$except = NULL;
5069
 
5069
 
5070
			#如果沒設定微妙
5070
			#如果沒設定微妙
5071
			if(!isset($conf["socketSelectTimeountUsec"])){			
5071
			if(!isset($conf["socketSelectTimeountUsec"])){
5072
 
5072
 
5073
				#get interesting socket	
5073
				#get interesting socket
5074
				$num_changed_sockets = socket_select($read, $write, $except, $conf["socketSelectTimeountSec"]);
5074
				$num_changed_sockets = socket_select($read, $write, $except, $conf["socketSelectTimeountSec"]);
5075
 
5075
 
5076
				}#if end
5076
				}#if end
5077
 
5077
 
5078
			#反之有設定微妙
5078
			#反之有設定微妙
Line 5083... Line 5083...
5083
 
5083
 
5084
				}#else end
5084
				}#else end
5085
 
5085
 
5086
			#socket_select failed
5086
			#socket_select failed
5087
			if ($num_changed_sockets === false) {
5087
			if ($num_changed_sockets === false) {
5088
			
5088
 
5089
				#NOTICE to server
5089
				#NOTICE to server
5090
				echo "socket_select failed".PHP_EOL;
5090
				echo "socket_select failed".PHP_EOL;
5091
 
5091
 
5092
				} 
5092
				}
5093
				
5093
 
5094
			#At least at one of the sockets something interesting happened
5094
			#At least at one of the sockets something interesting happened
5095
			else if ($num_changed_sockets > 0) {
5095
			else if ($num_changed_sockets > 0) {
5096
				
5096
 
5097
				/* debug		
5097
				/* debug
5098
				echo "At least at one of the sockets something interesting happened".PHP_EOL;
5098
				echo "At least at one of the sockets something interesting happened".PHP_EOL;
5099
				echo "\$read:".PHP_EOL;var_dump($read);
5099
				echo "\$read:".PHP_EOL;var_dump($read);
5100
				echo "\$write:".PHP_EOL;var_dump($write);
5100
				echo "\$write:".PHP_EOL;var_dump($write);
5101
				echo "\$except:".PHP_EOL;var_dump($except);
5101
				echo "\$except:".PHP_EOL;var_dump($except);
5102
				*/
5102
				*/
5103
 
5103
 
5104
				// check if there is a client trying to connect
5104
				// check if there is a client trying to connect
5105
				if (in_array($sock, $read)) {
5105
				if (in_array($sock, $read)) {
5106
				    
5106
 
5107
					#accept the client, and add him to the $clients array
5107
					#accept the client, and add him to the $clients array
5108
				   	$clients[] = $newsock = socket_accept($sock);
5108
				   	$clients[] = $newsock = socket_accept($sock);
5109
				   
5109
 
5110
				   	#如果要顯示歡迎訊息
5110
				   	#如果要顯示歡迎訊息
5111
					if($conf["welcomeMsg"]==="true"){
5111
					if($conf["welcomeMsg"]==="true"){
5112
				   
5112
 
5113
				   		#send the client a welcome message
5113
				   		#send the client a welcome message
5114
				   		socket_write($newsock, "Welcome to QBPWCF tcpServer".PHP_EOL.
5114
				   		socket_write($newsock, "Welcome to QBPWCF tcpServer".PHP_EOL.
5115
				   		"There are ".(count($clients) - 1)." client(s) connected to the server".PHP_EOL);
5115
				   		"There are ".(count($clients) - 1)." client(s) connected to the server".PHP_EOL);
5116
				   
5116
 
5117
				   		}#if end
5117
				   		}#if end
5118
				   
5118
 
5119
					#嘗試取得遠端的ip與port
5119
					#嘗試取得遠端的ip與port
5120
					#參考資料:https://www.php.net/manual/en/function.socket-getpeername.php
5120
					#參考資料:https://www.php.net/manual/en/function.socket-getpeername.php
5121
				 	@socket_getpeername($newsock, $ip);
5121
				 	@socket_getpeername($newsock, $ip);
5122
 
5122
 
5123
					#如果有抓到 $ip
5123
					#如果有抓到 $ip
5124
					if(isset($ip)){
5124
					if(isset($ip)){
5125
	
5125
 
5126
						#提示有新的使用者
5126
						#提示有新的使用者
5127
						echo "New client connected: ".$ip.PHP_EOL;
5127
						echo "New client connected: ".$ip.PHP_EOL;
5128
				
5128
 
5129
						}#if end
5129
						}#if end
5130
 
5130
 
5131
					// remove the listening socket from the clients-with-data array
5131
					// remove the listening socket from the clients-with-data array
5132
					$key = array_search($sock, $read);
5132
					$key = array_search($sock, $read);
5133
					unset($read[$key]);
5133
					unset($read[$key]);
5134
					
5134
 
5135
					}
5135
					}
5136
 
5136
 
5137
				#message received
5137
				#message received
5138
				else{
5138
				else{
5139
				
5139
 
5140
					// loop through all the clients that have data to read from
5140
					// loop through all the clients that have data to read from
5141
					foreach ($read as $read_sock) {
5141
					foreach ($read as $read_sock) {
5142
					
5142
 
5143
						// read until newline or 1024 bytes
5143
						// read until newline or 1024 bytes
5144
						// socket_read while show errors when the client is disconnected, so silence the error messages
5144
						// socket_read while show errors when the client is disconnected, so silence the error messages
5145
						$data = @socket_read($read_sock, 1024, PHP_NORMAL_READ);
5145
						$data = @socket_read($read_sock, 1024, PHP_NORMAL_READ);
5146
					
5146
 
5147
						// check if the client is disconnected
5147
						// check if the client is disconnected
5148
						if ($data === false) 
5148
						if ($data === false)
5149
						{
5149
						{
5150
							// remove client for $clients array
5150
							// remove client for $clients array
5151
							$key = array_search($read_sock, $clients);
5151
							$key = array_search($read_sock, $clients);
5152
							unset($clients[$key]);
5152
							unset($clients[$key]);
5153
							echo "client disconnected.".PHP_EOL;
5153
							echo "client disconnected.".PHP_EOL;
5154
						
5154
 
5155
							// continue to the next client to read from, if any
5155
							// continue to the next client to read from, if any
5156
							continue;
5156
							continue;
5157
						}
5157
						}
5158
					
5158
 
5159
						// trim off the trailing/beginning white spaces
5159
						// trim off the trailing/beginning white spaces
5160
						$data = trim($data);
5160
						$data = trim($data);
5161
					
5161
 
5162
						// check if there is any data after trimming off the spaces
5162
						// check if there is any data after trimming off the spaces
5163
						if(!empty($data)){
5163
						if(!empty($data)){
5164
					
5164
 
5165
							// send this to all the clients in the $clients array (except the first one, which is a listening socket)
5165
							// send this to all the clients in the $clients array (except the first one, which is a listening socket)
5166
							foreach ($clients as $send_sock) {
5166
							foreach ($clients as $send_sock) {
5167
					
5167
 
5168
								// if its the listening sock or the client that we got the message from, go to the next one in the list
5168
								// if its the listening sock or the client that we got the message from, go to the next one in the list
5169
															
5169
 
5170
								#如果是Server Socket	
5170
								#如果是Server Socket
5171
								if ($send_sock === $sock){
5171
								if ($send_sock === $sock){
5172
 
5172
 
5173
									#server debug
5173
									#server debug
5174
									echo "reveiced:".$data.PHP_EOL;													
5174
									echo "reveiced:".$data.PHP_EOL;
5175
 
5175
 
5176
									#針對每個用來處理輸入字串的函式
5176
									#針對每個用來處理輸入字串的函式
5177
									foreach($conf["processFuncs"] as $proFunc){
5177
									foreach($conf["processFuncs"] as $proFunc){
5178
 
5178
 
5179
										#呼叫函式,參數為輸入的字串data跟client socket, server socket, 每個 socket
5179
										#呼叫函式,參數為輸入的字串data跟client socket, server socket, 每個 socket
5180
										#https://www.php.net/manual/en/function.call-user-func.php
5180
										#https://www.php.net/manual/en/function.call-user-func.php
5181
										$param=array("data"=>$data,"serverSock"=>$sock,"clientSock"=>$read_sock,"allSockArray"=>$clients);
5181
										$param=array("data"=>$data,"serverSock"=>$sock,"clientSock"=>$read_sock,"allSockArray"=>$clients);
5182
										$params=array();
5182
										$params=array();
5183
										$params[]=&$param;										
5183
										$params[]=&$param;
5184
										$result=call_user_func_array($proFunc,$params);						
5184
										$result=call_user_func_array($proFunc,$params);
5185
	
5185
 
5186
										#如果有回傳結果
5186
										#如果有回傳結果
5187
										if($result!==NULL){
5187
										if($result!==NULL){
5188
 
5188
 
5189
											#如果執行出錯
5189
											#如果執行出錯
5190
											if($result["status"]==="false"){
5190
											if($result["status"]==="false"){
Line 5200... Line 5200...
5200
									}
5200
									}
5201
 
5201
 
5202
								/*
5202
								/*
5203
								#如果是Sender Socket
5203
								#如果是Sender Socket
5204
								else if ($send_sock === $read_sock){
5204
								else if ($send_sock === $read_sock){
5205
		
5205
 
5206
									continue;
5206
									continue;
5207
 
5207
 
5208
									}
5208
									}
5209
								*/						   
5209
								*/
5210
	
5210
 
5211
								/*
5211
								/*
5212
								#msg to others/broadcast
5212
								#msg to others/broadcast
5213
								else{
5213
								else{
5214
 
5214
 
5215
						    			// write the message to the client -- add a newline character to the end of the message
5215
						    			// write the message to the client -- add a newline character to the end of the message
5216
						    			socket_write($send_sock, $data.PHP_EOL);
5216
						    			socket_write($send_sock, $data.PHP_EOL);
5217
									
5217
 
5218
									}//end of broadcast
5218
									}//end of broadcast
5219
								*/						   
5219
								*/
5220
 
5220
 
5221
								} //foreach end
5221
								} //foreach end
5222
					
5222
 
5223
							}#if end
5223
							}#if end
5224
					
5224
 
5225
						} // end of reading foreach
5225
						} // end of reading foreach
5226
	
5226
 
5227
					}#msg received end
5227
					}#msg received end
5228
 
5228
 
5229
				}#something happen end
5229
				}#something happen end
5230
 
5230
 
5231
			#反之沒有用戶插手
5231
			#反之沒有用戶插手
5232
			else{
5232
			else{
5233
				#提示idle
5233
				#提示idle
5234
				#echo "idle:".time().PHP_EOL;
5234
				#echo "idle:".time().PHP_EOL;
5235
				
5235
 
5236
				#如果沒有設置 $conf["serverFuncs"]
5236
				#如果沒有設置 $conf["serverFuncs"]
5237
				if(!isset($conf["serverFuncs"])){
5237
				if(!isset($conf["serverFuncs"])){
5238
					
5238
 
5239
					#設置為空陣列
5239
					#設置為空陣列
5240
					$conf["serverFuncs"]=array();
5240
					$conf["serverFuncs"]=array();
5241
								
5241
 
5242
					}#if end
5242
					}#if end
5243
				
5243
 
5244
				#針對每個用來處理輸入字串的函式
5244
				#針對每個用來處理輸入字串的函式
5245
				foreach($conf["serverFuncs"] as $proFunc){
5245
				foreach($conf["serverFuncs"] as $proFunc){
5246
 
5246
 
5247
					#呼叫函式,參數為輸入的字串data跟client socket, server socket, 每個 socket
5247
					#呼叫函式,參數為輸入的字串data跟client socket, server socket, 每個 socket
5248
					#https://www.php.net/manual/en/function.call-user-func.php
5248
					#https://www.php.net/manual/en/function.call-user-func.php
5249
					$result=call_user_func_array($proFunc,array());						
5249
					$result=call_user_func_array($proFunc,array());
5250
 
5250
 
5251
					#如果有回傳結果
5251
					#如果有回傳結果
5252
					if($result!==NULL){
5252
					if($result!==NULL){
5253
 
5253
 
5254
						#如果執行出錯
5254
						#如果執行出錯
Line 5260... Line 5260...
5260
							}//if end
5260
							}//if end
5261
 
5261
 
5262
						}//if end
5262
						}//if end
5263
 
5263
 
5264
					}//foreach end
5264
					}//foreach end
5265
			
5265
 
5266
				}#else end
5266
				}#else end
5267
 
5267
 
5268
			} while (true);
5268
			} while (true);
5269
 
5269
 
5270
		#關閉listen的socket
5270
		#關閉listen的socket
Line 5300... Line 5300...
5300
		#初始化要回傳的結果
5300
		#初始化要回傳的結果
5301
		$result=array();
5301
		$result=array();
5302
 
5302
 
5303
		#取得當前執行的函數名稱
5303
		#取得當前執行的函數名稱
5304
		$result["function"]=__FUNCTION__;
5304
		$result["function"]=__FUNCTION__;
5305
		
5305
 
5306
		#如果沒有參數
5306
		#如果沒有參數
5307
		if(func_num_args()==0){
5307
		if(func_num_args()==0){
5308
			
5308
 
5309
			#設置執行失敗
5309
			#設置執行失敗
5310
			$result["status"]="false";
5310
			$result["status"]="false";
5311
			
5311
 
5312
			#設置執行錯誤訊息
5312
			#設置執行錯誤訊息
5313
			$result["error"]="函數".$result["function"]."需要參數";
5313
			$result["error"]="函數".$result["function"]."需要參數";
5314
			
5314
 
5315
			#回傳結果
5315
			#回傳結果
5316
			return $result;
5316
			return $result;
5317
			
5317
 
5318
			}#if end
5318
			}#if end
5319
 
5319
 
5320
		#涵式說明:
5320
		#涵式說明:
5321
		#判斷當前環境為web還是cmd
5321
		#判斷當前環境為web還是cmd
5322
		#回傳結果:
5322
		#回傳結果:
5323
		#$result,"web"或"cmd"
5323
		#$result,"web"或"cmd"
5324
		if(csInformation::getEnv()==="web"){
5324
		if(csInformation::getEnv()==="web"){
5325
			
5325
 
5326
			#設置執行失敗
5326
			#設置執行失敗
5327
			$result["status"]="false";
5327
			$result["status"]="false";
5328
			
5328
 
5329
			#設置執行錯誤訊息
5329
			#設置執行錯誤訊息
5330
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
5330
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
5331
			
5331
 
5332
			#回傳結果
5332
			#回傳結果
5333
			return $result;
5333
			return $result;
5334
			
5334
 
5335
			}#if end
5335
			}#if end
5336
		
5336
 
5337
		#取得參數
5337
		#取得參數
5338
		$result["argu"]=$conf;
5338
		$result["argu"]=$conf;
5339
 
5339
 
5340
		#如果 $conf 不為陣列
5340
		#如果 $conf 不為陣列
5341
		if(gettype($conf)!="array"){
5341
		if(gettype($conf)!="array"){
5342
		
5342
 
5343
			#設置執行失敗
5343
			#設置執行失敗
5344
			$result["status"]="false";
5344
			$result["status"]="false";
5345
		
5345
 
5346
			#設置執行錯誤訊息
5346
			#設置執行錯誤訊息
5347
			$result["error"][]="\$conf變數須為陣列形態";
5347
			$result["error"][]="\$conf變數須為陣列形態";
5348
		
5348
 
5349
			#如果傳入的參數為 null
5349
			#如果傳入的參數為 null
5350
			if($conf==null){
5350
			if($conf==null){
5351
			
5351
 
5352
				#設置執行錯誤訊息
5352
				#設置執行錯誤訊息
5353
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
5353
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
5354
			
5354
 
5355
				}#if end
5355
				}#if end
5356
 
5356
 
5357
			#回傳結果
5357
			#回傳結果
5358
			return $result;
5358
			return $result;
5359
		
5359
 
5360
			}#if end
5360
			}#if end
5361
			
5361
 
5362
		#檢查參數
5362
		#檢查參數
5363
		#函式說明:
5363
		#函式說明:
5364
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
5364
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
5365
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
5365
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
5366
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
5366
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
Line 5374... Line 5374...
5374
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
5374
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
5375
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
5375
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
5376
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
5376
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
5377
		#必填寫的參數:
5377
		#必填寫的參數:
5378
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
5378
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
5379
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;	
5379
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
5380
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
5380
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
5381
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
5381
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
5382
		#可以省略的參數:
5382
		#可以省略的參數:
5383
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
5383
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
5384
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("port");
5384
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("port");
Line 5392... Line 5392...
5392
		#$conf["canBeEmpty"]=array();
5392
		#$conf["canBeEmpty"]=array();
5393
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
5393
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
5394
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("ip","welcomeMsg","socketSelectTimeountUsec");
5394
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("ip","welcomeMsg","socketSelectTimeountUsec");
5395
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
5395
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
5396
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("ip","processFuncs","welcomeMsg","socketSelectTimeountSec","socketSelectTimeountUsec");
5396
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("ip","processFuncs","welcomeMsg","socketSelectTimeountSec","socketSelectTimeountUsec");
5397
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
5397
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
5398
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","array","string","integer","integer");
5398
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","array","string","integer","integer");
5399
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
5399
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
5400
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("0.0.0.0",array(),"true",0,null);
5400
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("0.0.0.0",array(),"true",0,null);
5401
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
5401
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
5402
		#$conf["disallowAllSkipableVarIsEmpty"]="";
5402
		#$conf["disallowAllSkipableVarIsEmpty"]="";
Line 5406... Line 5406...
5406
		#$conf["arrayCountEqualCheck"][]=array();
5406
		#$conf["arrayCountEqualCheck"][]=array();
5407
		#參考資料來源:
5407
		#參考資料來源:
5408
		#array_keys=>http://php.net/manual/en/function.array-keys.php
5408
		#array_keys=>http://php.net/manual/en/function.array-keys.php
5409
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
5409
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
5410
		unset($conf["variableCheck::checkArguments"]);
5410
		unset($conf["variableCheck::checkArguments"]);
5411
			
5411
 
5412
		#如果檢查參數失敗
5412
		#如果檢查參數失敗
5413
		if($checkArguments["status"]==="false"){
5413
		if($checkArguments["status"]==="false"){
5414
			
5414
 
5415
			#設置執行失敗
5415
			#設置執行失敗
5416
			$result["status"]="false";
5416
			$result["status"]="false";
5417
			
5417
 
5418
			#設置錯誤訊息
5418
			#設置錯誤訊息
5419
			$result["error"]=$checkArguments;
5419
			$result["error"]=$checkArguments;
5420
			
5420
 
5421
			#回傳結果
5421
			#回傳結果
5422
			return $result;
5422
			return $result;
5423
			
5423
 
5424
			}#if end
5424
			}#if end
5425
			
5425
 
5426
		#如果檢查參數不通過
5426
		#如果檢查參數不通過
5427
		if($checkArguments["passed"]==="false"){
5427
		if($checkArguments["passed"]==="false"){
5428
			
5428
 
5429
			#設置執行失敗
5429
			#設置執行失敗
5430
			$result["status"]="false";
5430
			$result["status"]="false";
5431
			
5431
 
5432
			#設置錯誤訊息
5432
			#設置錯誤訊息
5433
			$result["error"]=$checkArguments;
5433
			$result["error"]=$checkArguments;
5434
			
5434
 
5435
			#回傳結果
5435
			#回傳結果
5436
			return $result;
5436
			return $result;
5437
			
5437
 
5438
			}#if end
5438
			}#if end
5439
		
5439
 
5440
		#Allow the script to hang around waiting for connections.
5440
		#Allow the script to hang around waiting for connections.
5441
		set_time_limit(0);
5441
		set_time_limit(0);
5442
 
5442
 
5443
		#Turn on implicit output flushing so we see what we're getting as it comes in.
5443
		#Turn on implicit output flushing so we see what we're getting as it comes in.
5444
		ob_implicit_flush();
5444
		ob_implicit_flush();
Line 5470... Line 5470...
5470
		#無窮迴圈
5470
		#無窮迴圈
5471
		do {
5471
		do {
5472
			#each resource
5472
			#each resource
5473
			foreach($clients as $rk=>$csock){
5473
			foreach($clients as $rk=>$csock){
5474
 
5474
 
5475
				#if not socket resource				
5475
				#if not socket resource
5476
				if(gettype($csock)==="boolean"){
5476
				if(gettype($csock)==="boolean"){
5477
 
5477
 
5478
					#delete
5478
					#delete
5479
					unset($clients[$rk]);
5479
					unset($clients[$rk]);
5480
 
5480
 
Line 5484... Line 5484...
5484
				else if(get_resource_type($csock)!=="Socket"){
5484
				else if(get_resource_type($csock)!=="Socket"){
5485
 
5485
 
5486
					#delete
5486
					#delete
5487
					unset($clients[$rk]);
5487
					unset($clients[$rk]);
5488
 
5488
 
5489
					}									
5489
					}
5490
				}
5490
				}
5491
 
5491
 
5492
			#found server sock
5492
			#found server sock
5493
			$serverSock=false;
5493
			$serverSock=false;
5494
 
5494
 
5495
			#each resource
5495
			#each resource
5496
			foreach($clients as $rk=>$csock){
5496
			foreach($clients as $rk=>$csock){
5497
				
5497
 
5498
				#if not socket resource
5498
				#if not socket resource
5499
				if($rk==="serverSock"){
5499
				if($rk==="serverSock"){
5500
 
5500
 
5501
					#found server sock
5501
					#found server sock
5502
					$serverSock=true;
5502
					$serverSock=true;
5503
 
5503
 
5504
					}					
5504
					}
5505
				}
5505
				}
5506
			
5506
 
5507
			#not found server sock
5507
			#not found server sock
5508
			if(!$serverSock){
5508
			if(!$serverSock){
5509
				
5509
 
5510
				#end
5510
				#end
5511
				exit;
5511
				exit;
5512
 
5512
 
5513
				}
5513
				}
5514
			
5514
 
5515
			#for socket select
5515
			#for socket select
5516
			$read   = $clients;
5516
			$read   = $clients;
5517
			$write  = NULL;
5517
			$write  = NULL;
5518
			$except = NULL;
5518
			$except = NULL;
5519
 
5519
 
5520
			#如果未設置 $conf["socketSelectTimeountUsec"]
5520
			#如果未設置 $conf["socketSelectTimeountUsec"]
5521
			if(!isset($conf["socketSelectTimeountUsec"])){
5521
			if(!isset($conf["socketSelectTimeountUsec"])){
5522
				
5522
 
5523
				#get interesting socket
5523
				#get interesting socket
5524
				$num_changed_sockets = socket_select($read, $write, $except, $conf["socketSelectTimeountSec"]);
5524
				$num_changed_sockets = socket_select($read, $write, $except, $conf["socketSelectTimeountSec"]);
5525
	
5525
 
5526
				}#if end
5526
				}#if end
5527
 
5527
 
5528
			#反之有設置 $conf["socketSelectTimeountUsec"]
5528
			#反之有設置 $conf["socketSelectTimeountUsec"]
5529
			else{
5529
			else{
5530
 
5530
 
Line 5533... Line 5533...
5533
 
5533
 
5534
				}#else end
5534
				}#else end
5535
 
5535
 
5536
			#socket_select failed
5536
			#socket_select failed
5537
			if ($num_changed_sockets === false) {
5537
			if ($num_changed_sockets === false) {
5538
			
5538
 
5539
				#NOTICE to server
5539
				#NOTICE to server
5540
				echo "socket_select failed".PHP_EOL;
5540
				echo "socket_select failed".PHP_EOL;
5541
 
5541
 
5542
				}#if end
5542
				}#if end
5543
				
5543
 
5544
			#At least at one of the sockets something interesting happened
5544
			#At least at one of the sockets something interesting happened
5545
			else if ($num_changed_sockets > 0) {
5545
			else if ($num_changed_sockets > 0) {
5546
			    	
5546
 
5547
				// check if there is a client trying to connect
5547
				// check if there is a client trying to connect
5548
				if (in_array($sock, $read)) {
5548
				if (in_array($sock, $read)) {
5549
				    
5549
 
5550
					#accept the client, and add him to the $clients array
5550
					#accept the client, and add him to the $clients array
5551
				   	$receivedBytes=socket_recvfrom($sock,$data,1024,0,$remote_ip,$remote_port);	
5551
				   	$receivedBytes=socket_recvfrom($sock,$data,1024,0,$remote_ip,$remote_port);
5552
					$key=$remote_ip.":".$remote_port;
5552
					$key=$remote_ip.":".$remote_port;
5553
					$clients[$key] = $newsock = $sock;
5553
					$clients[$key] = $newsock = $sock;
5554
 
5554
 
5555
					#如果要顯示歡迎訊息
5555
					#如果要顯示歡迎訊息
5556
					if($conf["welcomeMsg"]==="true"){
5556
					if($conf["welcomeMsg"]==="true"){
Line 5562... Line 5562...
5562
 
5562
 
5563
					#debug
5563
					#debug
5564
					echo "client connected:".$key.PHP_EOL;
5564
					echo "client connected:".$key.PHP_EOL;
5565
					echo "client sended:".$data;
5565
					echo "client sended:".$data;
5566
					echo "all client:".PHP_EOL;
5566
					echo "all client:".PHP_EOL;
5567
					var_dump($clients);				
5567
					var_dump($clients);
5568
 
5568
 
5569
					#針對每個用來處理輸入字串的函式
5569
					#針對每個用來處理輸入字串的函式
5570
					foreach($conf["processFuncs"] as $proFunc){
5570
					foreach($conf["processFuncs"] as $proFunc){
5571
 
5571
 
5572
						#呼叫函式,參數為輸入的字串data跟client socket, server socket, 每個 socket
5572
						#呼叫函式,參數為輸入的字串data跟client socket, server socket, 每個 socket
5573
						#https://www.php.net/manual/en/function.call-user-func.php
5573
						#https://www.php.net/manual/en/function.call-user-func.php
5574
						$param=array("data"=>trim($data),"serverSock"=>$sock,"clientKey"=>$key,"allSockArray"=>&$clients);
5574
						$param=array("data"=>trim($data),"serverSock"=>$sock,"clientKey"=>$key,"allSockArray"=>&$clients);
5575
						$params=array();
5575
						$params=array();
5576
						$params[]=&$param;										
5576
						$params[]=&$param;
5577
						$result=call_user_func_array($proFunc,$params);						
5577
						$result=call_user_func_array($proFunc,$params);
5578
 
5578
 
5579
						#如果有回傳結果
5579
						#如果有回傳結果
5580
						if($result!==NULL){
5580
						if($result!==NULL){
5581
 
5581
 
5582
							#如果執行出錯
5582
							#如果執行出錯
Line 5592... Line 5592...
5592
						}
5592
						}
5593
 
5593
 
5594
					#debug
5594
					#debug
5595
					echo "last all client:".PHP_EOL;
5595
					echo "last all client:".PHP_EOL;
5596
					var_dump($clients);
5596
					var_dump($clients);
5597
   
5597
 
5598
					# remove the listening socket from the clients-with-data array
5598
					# remove the listening socket from the clients-with-data array
5599
					$key = array_search($sock, $read);
5599
					$key = array_search($sock, $read);
5600
					unset($read[$key]);
5600
					unset($read[$key]);
5601
					
5601
 
5602
					}#if end
5602
					}#if end
5603
 
5603
 
5604
				}#something happen end
5604
				}#something happen end
5605
 
5605
 
5606
			} while (true);
5606
			} while (true);
Line 5629... Line 5629...
5629
	#無.
5629
	#無.
5630
	#備註:
5630
	#備註:
5631
	#無.
5631
	#無.
5632
	*/
5632
	*/
5633
	public function echoService(&$conf){
5633
	public function echoService(&$conf){
5634
		
5634
 
5635
		#初始化要回傳的結果
5635
		#初始化要回傳的結果
5636
		$result=array();
5636
		$result=array();
5637
 
5637
 
5638
		#取得當前執行的函數名稱
5638
		#取得當前執行的函數名稱
5639
		$result["function"]=__FUNCTION__;
5639
		$result["function"]=__FUNCTION__;
5640
		
5640
 
5641
		#如果沒有參數
5641
		#如果沒有參數
5642
		if(func_num_args()==0){
5642
		if(func_num_args()==0){
5643
			
5643
 
5644
			#設置執行失敗
5644
			#設置執行失敗
5645
			$result["status"]="false";
5645
			$result["status"]="false";
5646
			
5646
 
5647
			#設置執行錯誤訊息
5647
			#設置執行錯誤訊息
5648
			$result["error"]="函數".$result["function"]."需要參數";
5648
			$result["error"]="函數".$result["function"]."需要參數";
5649
			
5649
 
5650
			#回傳結果
5650
			#回傳結果
5651
			return $result;
5651
			return $result;
5652
			
5652
 
5653
			}#if end
5653
			}#if end
5654
 
5654
 
5655
		#涵式說明:
5655
		#涵式說明:
5656
		#判斷當前環境為web還是cmd
5656
		#判斷當前環境為web還是cmd
5657
		#回傳結果:
5657
		#回傳結果:
5658
		#$result,"web"或"cmd"
5658
		#$result,"web"或"cmd"
5659
		if(csInformation::getEnv()==="web"){
5659
		if(csInformation::getEnv()==="web"){
5660
			
5660
 
5661
			#設置執行失敗
5661
			#設置執行失敗
5662
			$result["status"]="false";
5662
			$result["status"]="false";
5663
			
5663
 
5664
			#設置執行錯誤訊息
5664
			#設置執行錯誤訊息
5665
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
5665
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
5666
			
5666
 
5667
			#回傳結果
5667
			#回傳結果
5668
			return $result;
5668
			return $result;
5669
			
5669
 
5670
			}#if end
5670
			}#if end
5671
		
5671
 
5672
		#取得參數
5672
		#取得參數
5673
		$result["argu"]=$conf;
5673
		$result["argu"]=$conf;
5674
 
5674
 
5675
		#如果 $conf 不為陣列
5675
		#如果 $conf 不為陣列
5676
		if(gettype($conf)!="array"){
5676
		if(gettype($conf)!="array"){
5677
		
5677
 
5678
			#設置執行失敗
5678
			#設置執行失敗
5679
			$result["status"]="false";
5679
			$result["status"]="false";
5680
		
5680
 
5681
			#設置執行錯誤訊息
5681
			#設置執行錯誤訊息
5682
			$result["error"][]="\$conf變數須為陣列形態";
5682
			$result["error"][]="\$conf變數須為陣列形態";
5683
		
5683
 
5684
			#如果傳入的參數為 null
5684
			#如果傳入的參數為 null
5685
			if($conf==null){
5685
			if($conf==null){
5686
			
5686
 
5687
				#設置執行錯誤訊息
5687
				#設置執行錯誤訊息
5688
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
5688
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
5689
			
5689
 
5690
				}#if end
5690
				}#if end
5691
 
5691
 
5692
			#回傳結果
5692
			#回傳結果
5693
			return $result;
5693
			return $result;
5694
		
5694
 
5695
			}#if end
5695
			}#if end
5696
			
5696
 
5697
		#檢查參數
5697
		#檢查參數
5698
		#函式說明:
5698
		#函式說明:
5699
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
5699
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
5700
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
5700
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
5701
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
5701
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
Line 5709... Line 5709...
5709
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
5709
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
5710
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
5710
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
5711
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
5711
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
5712
		#必填寫的參數:
5712
		#必填寫的參數:
5713
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
5713
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
5714
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;	
5714
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
5715
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
5715
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
5716
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
5716
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
5717
		#可以省略的參數:
5717
		#可以省略的參數:
5718
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
5718
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
5719
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("data","clientSock","serverSock","allSockArray");
5719
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("data","clientSock","serverSock","allSockArray");
Line 5727... Line 5727...
5727
		#$conf["canBeEmpty"]=array();
5727
		#$conf["canBeEmpty"]=array();
5728
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
5728
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
5729
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("ip");
5729
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("ip");
5730
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
5730
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
5731
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("ip","processFuncs");
5731
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("ip","processFuncs");
5732
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
5732
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
5733
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","array");
5733
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","array");
5734
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
5734
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
5735
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("0.0.0.0",array());
5735
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("0.0.0.0",array());
5736
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
5736
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
5737
		#$conf["disallowAllSkipableVarIsEmpty"]="";
5737
		#$conf["disallowAllSkipableVarIsEmpty"]="";
Line 5741... Line 5741...
5741
		#$conf["arrayCountEqualCheck"][]=array();
5741
		#$conf["arrayCountEqualCheck"][]=array();
5742
		#參考資料來源:
5742
		#參考資料來源:
5743
		#array_keys=>http://php.net/manual/en/function.array-keys.php
5743
		#array_keys=>http://php.net/manual/en/function.array-keys.php
5744
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
5744
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
5745
		unset($conf["variableCheck::checkArguments"]);
5745
		unset($conf["variableCheck::checkArguments"]);
5746
			
5746
 
5747
		#如果檢查參數失敗
5747
		#如果檢查參數失敗
5748
		if($checkArguments["status"]==="false"){
5748
		if($checkArguments["status"]==="false"){
5749
			
5749
 
5750
			#設置執行失敗
5750
			#設置執行失敗
5751
			$result["status"]="false";
5751
			$result["status"]="false";
5752
			
5752
 
5753
			#設置錯誤訊息
5753
			#設置錯誤訊息
5754
			$result["error"]=$checkArguments;
5754
			$result["error"]=$checkArguments;
5755
			
5755
 
5756
			#回傳結果
5756
			#回傳結果
5757
			return $result;
5757
			return $result;
5758
			
5758
 
5759
			}#if end
5759
			}#if end
5760
			
5760
 
5761
		#如果檢查參數不通過
5761
		#如果檢查參數不通過
5762
		if($checkArguments["passed"]==="false"){
5762
		if($checkArguments["passed"]==="false"){
5763
			
5763
 
5764
			#設置執行失敗
5764
			#設置執行失敗
5765
			$result["status"]="false";
5765
			$result["status"]="false";
5766
			
5766
 
5767
			#設置錯誤訊息
5767
			#設置錯誤訊息
5768
			$result["error"]=$checkArguments;
5768
			$result["error"]=$checkArguments;
5769
			
5769
 
5770
			#回傳結果
5770
			#回傳結果
5771
			return $result;
5771
			return $result;
5772
			
5772
 
5773
			}#if end
5773
			}#if end
5774
 
5774
 
5775
		#將內容原封不動還給 client
5775
		#將內容原封不動還給 client
5776
		@socket_write($conf["clientSock"], $conf["data"].PHP_EOL);
5776
		@socket_write($conf["clientSock"], $conf["data"].PHP_EOL);
5777
 
5777
 
Line 5797... Line 5797...
5797
	#無.
5797
	#無.
5798
	#備註:
5798
	#備註:
5799
	#無.
5799
	#無.
5800
	*/
5800
	*/
5801
	public function echoServiceU(&$conf){
5801
	public function echoServiceU(&$conf){
5802
		
5802
 
5803
		#初始化要回傳的結果
5803
		#初始化要回傳的結果
5804
		$result=array();
5804
		$result=array();
5805
 
5805
 
5806
		#取得當前執行的函數名稱
5806
		#取得當前執行的函數名稱
5807
		$result["function"]=__FUNCTION__;
5807
		$result["function"]=__FUNCTION__;
5808
		
5808
 
5809
		#如果沒有參數
5809
		#如果沒有參數
5810
		if(func_num_args()==0){
5810
		if(func_num_args()==0){
5811
			
5811
 
5812
			#設置執行失敗
5812
			#設置執行失敗
5813
			$result["status"]="false";
5813
			$result["status"]="false";
5814
			
5814
 
5815
			#設置執行錯誤訊息
5815
			#設置執行錯誤訊息
5816
			$result["error"]="函數".$result["function"]."需要參數";
5816
			$result["error"]="函數".$result["function"]."需要參數";
5817
			
5817
 
5818
			#回傳結果
5818
			#回傳結果
5819
			return $result;
5819
			return $result;
5820
			
5820
 
5821
			}#if end
5821
			}#if end
5822
 
5822
 
5823
		#涵式說明:
5823
		#涵式說明:
5824
		#判斷當前環境為web還是cmd
5824
		#判斷當前環境為web還是cmd
5825
		#回傳結果:
5825
		#回傳結果:
5826
		#$result,"web"或"cmd"
5826
		#$result,"web"或"cmd"
5827
		if(csInformation::getEnv()==="web"){
5827
		if(csInformation::getEnv()==="web"){
5828
			
5828
 
5829
			#設置執行失敗
5829
			#設置執行失敗
5830
			$result["status"]="false";
5830
			$result["status"]="false";
5831
			
5831
 
5832
			#設置執行錯誤訊息
5832
			#設置執行錯誤訊息
5833
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
5833
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
5834
			
5834
 
5835
			#回傳結果
5835
			#回傳結果
5836
			return $result;
5836
			return $result;
5837
			
5837
 
5838
			}#if end
5838
			}#if end
5839
		
5839
 
5840
		#取得參數
5840
		#取得參數
5841
		$result["argu"]=$conf;
5841
		$result["argu"]=$conf;
5842
 
5842
 
5843
		#如果 $conf 不為陣列
5843
		#如果 $conf 不為陣列
5844
		if(gettype($conf)!="array"){
5844
		if(gettype($conf)!="array"){
5845
		
5845
 
5846
			#設置執行失敗
5846
			#設置執行失敗
5847
			$result["status"]="false";
5847
			$result["status"]="false";
5848
		
5848
 
5849
			#設置執行錯誤訊息
5849
			#設置執行錯誤訊息
5850
			$result["error"][]="\$conf變數須為陣列形態";
5850
			$result["error"][]="\$conf變數須為陣列形態";
5851
		
5851
 
5852
			#如果傳入的參數為 null
5852
			#如果傳入的參數為 null
5853
			if($conf==null){
5853
			if($conf==null){
5854
			
5854
 
5855
				#設置執行錯誤訊息
5855
				#設置執行錯誤訊息
5856
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
5856
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
5857
			
5857
 
5858
				}#if end
5858
				}#if end
5859
 
5859
 
5860
			#回傳結果
5860
			#回傳結果
5861
			return $result;
5861
			return $result;
5862
		
5862
 
5863
			}#if end
5863
			}#if end
5864
			
5864
 
5865
		#檢查參數
5865
		#檢查參數
5866
		#函式說明:
5866
		#函式說明:
5867
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
5867
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
5868
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
5868
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
5869
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
5869
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
Line 5877... Line 5877...
5877
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
5877
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
5878
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
5878
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
5879
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
5879
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
5880
		#必填寫的參數:
5880
		#必填寫的參數:
5881
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
5881
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
5882
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;	
5882
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
5883
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
5883
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
5884
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
5884
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
5885
		#可以省略的參數:
5885
		#可以省略的參數:
5886
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
5886
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
5887
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("data","clientKey","serverSock","allSockArray");
5887
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("data","clientKey","serverSock","allSockArray");
Line 5895... Line 5895...
5895
		#$conf["canBeEmpty"]=array();
5895
		#$conf["canBeEmpty"]=array();
5896
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
5896
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
5897
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("ip");
5897
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("ip");
5898
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
5898
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
5899
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("ip","processFuncs");
5899
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("ip","processFuncs");
5900
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
5900
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
5901
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","array");
5901
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","array");
5902
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
5902
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
5903
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("0.0.0.0",array());
5903
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("0.0.0.0",array());
5904
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
5904
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
5905
		#$conf["disallowAllSkipableVarIsEmpty"]="";
5905
		#$conf["disallowAllSkipableVarIsEmpty"]="";
Line 5909... Line 5909...
5909
		#$conf["arrayCountEqualCheck"][]=array();
5909
		#$conf["arrayCountEqualCheck"][]=array();
5910
		#參考資料來源:
5910
		#參考資料來源:
5911
		#array_keys=>http://php.net/manual/en/function.array-keys.php
5911
		#array_keys=>http://php.net/manual/en/function.array-keys.php
5912
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
5912
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
5913
		unset($conf["variableCheck::checkArguments"]);
5913
		unset($conf["variableCheck::checkArguments"]);
5914
			
5914
 
5915
		#如果檢查參數失敗
5915
		#如果檢查參數失敗
5916
		if($checkArguments["status"]==="false"){
5916
		if($checkArguments["status"]==="false"){
5917
			
5917
 
5918
			#設置執行失敗
5918
			#設置執行失敗
5919
			$result["status"]="false";
5919
			$result["status"]="false";
5920
			
5920
 
5921
			#設置錯誤訊息
5921
			#設置錯誤訊息
5922
			$result["error"]=$checkArguments;
5922
			$result["error"]=$checkArguments;
5923
			
5923
 
5924
			#回傳結果
5924
			#回傳結果
5925
			return $result;
5925
			return $result;
5926
			
5926
 
5927
			}#if end
5927
			}#if end
5928
			
5928
 
5929
		#如果檢查參數不通過
5929
		#如果檢查參數不通過
5930
		if($checkArguments["passed"]==="false"){
5930
		if($checkArguments["passed"]==="false"){
5931
			
5931
 
5932
			#設置執行失敗
5932
			#設置執行失敗
5933
			$result["status"]="false";
5933
			$result["status"]="false";
5934
			
5934
 
5935
			#設置錯誤訊息
5935
			#設置錯誤訊息
5936
			$result["error"]=$checkArguments;
5936
			$result["error"]=$checkArguments;
5937
			
5937
 
5938
			#回傳結果
5938
			#回傳結果
5939
			return $result;
5939
			return $result;
5940
			
5940
 
5941
			}#if end
5941
			}#if end
5942
 
5942
 
5943
		#將內容原封不動還給 client
5943
		#將內容原封不動還給 client
5944
		$strArray=explode(":",$conf["clientKey"]);
5944
		$strArray=explode(":",$conf["clientKey"]);
5945
		$remote_ip=$strArray[0];
5945
		$remote_ip=$strArray[0];
Line 5968... Line 5968...
5968
	#無.
5968
	#無.
5969
	#備註:
5969
	#備註:
5970
	#無.
5970
	#無.
5971
	*/
5971
	*/
5972
	public function endService(&$conf){
5972
	public function endService(&$conf){
5973
		
5973
 
5974
		#初始化要回傳的結果
5974
		#初始化要回傳的結果
5975
		$result=array();
5975
		$result=array();
5976
 
5976
 
5977
		#取得當前執行的函數名稱
5977
		#取得當前執行的函數名稱
5978
		$result["function"]=__FUNCTION__;
5978
		$result["function"]=__FUNCTION__;
5979
		
5979
 
5980
		#如果沒有參數
5980
		#如果沒有參數
5981
		if(func_num_args()==0){
5981
		if(func_num_args()==0){
5982
			
5982
 
5983
			#設置執行失敗
5983
			#設置執行失敗
5984
			$result["status"]="false";
5984
			$result["status"]="false";
5985
			
5985
 
5986
			#設置執行錯誤訊息
5986
			#設置執行錯誤訊息
5987
			$result["error"]="函數".$result["function"]."需要參數";
5987
			$result["error"]="函數".$result["function"]."需要參數";
5988
			
5988
 
5989
			#回傳結果
5989
			#回傳結果
5990
			return $result;
5990
			return $result;
5991
			
5991
 
5992
			}#if end
5992
			}#if end
5993
 
5993
 
5994
		#涵式說明:
5994
		#涵式說明:
5995
		#判斷當前環境為web還是cmd
5995
		#判斷當前環境為web還是cmd
5996
		#回傳結果:
5996
		#回傳結果:
5997
		#$result,"web"或"cmd"
5997
		#$result,"web"或"cmd"
5998
		if(csInformation::getEnv()==="web"){
5998
		if(csInformation::getEnv()==="web"){
5999
			
5999
 
6000
			#設置執行失敗
6000
			#設置執行失敗
6001
			$result["status"]="false";
6001
			$result["status"]="false";
6002
			
6002
 
6003
			#設置執行錯誤訊息
6003
			#設置執行錯誤訊息
6004
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
6004
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
6005
			
6005
 
6006
			#回傳結果
6006
			#回傳結果
6007
			return $result;
6007
			return $result;
6008
			
6008
 
6009
			}#if end
6009
			}#if end
6010
		
6010
 
6011
		#取得參數
6011
		#取得參數
6012
		$result["argu"]=$conf;
6012
		$result["argu"]=$conf;
6013
 
6013
 
6014
		#如果 $conf 不為陣列
6014
		#如果 $conf 不為陣列
6015
		if(gettype($conf)!="array"){
6015
		if(gettype($conf)!="array"){
6016
		
6016
 
6017
			#設置執行失敗
6017
			#設置執行失敗
6018
			$result["status"]="false";
6018
			$result["status"]="false";
6019
		
6019
 
6020
			#設置執行錯誤訊息
6020
			#設置執行錯誤訊息
6021
			$result["error"][]="\$conf變數須為陣列形態";
6021
			$result["error"][]="\$conf變數須為陣列形態";
6022
		
6022
 
6023
			#如果傳入的參數為 null
6023
			#如果傳入的參數為 null
6024
			if($conf==null){
6024
			if($conf==null){
6025
			
6025
 
6026
				#設置執行錯誤訊息
6026
				#設置執行錯誤訊息
6027
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
6027
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
6028
			
6028
 
6029
				}#if end
6029
				}#if end
6030
 
6030
 
6031
			#回傳結果
6031
			#回傳結果
6032
			return $result;
6032
			return $result;
6033
		
6033
 
6034
			}#if end
6034
			}#if end
6035
			
6035
 
6036
		#檢查參數
6036
		#檢查參數
6037
		#函式說明:
6037
		#函式說明:
6038
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
6038
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
6039
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
6039
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
6040
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
6040
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
Line 6048... Line 6048...
6048
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
6048
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
6049
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
6049
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
6050
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
6050
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
6051
		#必填寫的參數:
6051
		#必填寫的參數:
6052
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
6052
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
6053
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;	
6053
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
6054
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
6054
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
6055
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
6055
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
6056
		#可以省略的參數:
6056
		#可以省略的參數:
6057
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
6057
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
6058
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("data","clientSock","serverSock","allSockArray");
6058
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("data","clientSock","serverSock","allSockArray");
Line 6066... Line 6066...
6066
		#$conf["canBeEmpty"]=array();
6066
		#$conf["canBeEmpty"]=array();
6067
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
6067
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
6068
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("ip");
6068
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("ip");
6069
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
6069
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
6070
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("ip","processFuncs");
6070
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("ip","processFuncs");
6071
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
6071
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
6072
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","array");
6072
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","array");
6073
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
6073
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
6074
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("0.0.0.0",array());
6074
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("0.0.0.0",array());
6075
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
6075
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
6076
		#$conf["disallowAllSkipableVarIsEmpty"]="";
6076
		#$conf["disallowAllSkipableVarIsEmpty"]="";
Line 6080... Line 6080...
6080
		#$conf["arrayCountEqualCheck"][]=array();
6080
		#$conf["arrayCountEqualCheck"][]=array();
6081
		#參考資料來源:
6081
		#參考資料來源:
6082
		#array_keys=>http://php.net/manual/en/function.array-keys.php
6082
		#array_keys=>http://php.net/manual/en/function.array-keys.php
6083
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
6083
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
6084
		unset($conf["variableCheck::checkArguments"]);
6084
		unset($conf["variableCheck::checkArguments"]);
6085
			
6085
 
6086
		#如果檢查參數失敗
6086
		#如果檢查參數失敗
6087
		if($checkArguments["status"]==="false"){
6087
		if($checkArguments["status"]==="false"){
6088
			
6088
 
6089
			#設置執行失敗
6089
			#設置執行失敗
6090
			$result["status"]="false";
6090
			$result["status"]="false";
6091
			
6091
 
6092
			#設置錯誤訊息
6092
			#設置錯誤訊息
6093
			$result["error"]=$checkArguments;
6093
			$result["error"]=$checkArguments;
6094
			
6094
 
6095
			#回傳結果
6095
			#回傳結果
6096
			return $result;
6096
			return $result;
6097
			
6097
 
6098
			}#if end
6098
			}#if end
6099
			
6099
 
6100
		#如果檢查參數不通過
6100
		#如果檢查參數不通過
6101
		if($checkArguments["passed"]==="false"){
6101
		if($checkArguments["passed"]==="false"){
6102
			
6102
 
6103
			#設置執行失敗
6103
			#設置執行失敗
6104
			$result["status"]="false";
6104
			$result["status"]="false";
6105
			
6105
 
6106
			#設置錯誤訊息
6106
			#設置錯誤訊息
6107
			$result["error"]=$checkArguments;
6107
			$result["error"]=$checkArguments;
6108
			
6108
 
6109
			#回傳結果
6109
			#回傳結果
6110
			return $result;
6110
			return $result;
6111
			
6111
 
6112
			}#if end
6112
			}#if end
6113
 
6113
 
6114
		#針對輸入的內容
6114
		#針對輸入的內容
6115
		switch($conf["data"]){
6115
		switch($conf["data"]){
6116
 
6116
 
Line 6156... Line 6156...
6156
	#無.
6156
	#無.
6157
	#備註:
6157
	#備註:
6158
	#無.
6158
	#無.
6159
	*/
6159
	*/
6160
	public function endServiceU(&$conf){
6160
	public function endServiceU(&$conf){
6161
		
6161
 
6162
		#初始化要回傳的結果
6162
		#初始化要回傳的結果
6163
		$result=array();
6163
		$result=array();
6164
 
6164
 
6165
		#取得當前執行的函數名稱
6165
		#取得當前執行的函數名稱
6166
		$result["function"]=__FUNCTION__;
6166
		$result["function"]=__FUNCTION__;
6167
		
6167
 
6168
		#如果沒有參數
6168
		#如果沒有參數
6169
		if(func_num_args()==0){
6169
		if(func_num_args()==0){
6170
			
6170
 
6171
			#設置執行失敗
6171
			#設置執行失敗
6172
			$result["status"]="false";
6172
			$result["status"]="false";
6173
			
6173
 
6174
			#設置執行錯誤訊息
6174
			#設置執行錯誤訊息
6175
			$result["error"]="函數".$result["function"]."需要參數";
6175
			$result["error"]="函數".$result["function"]."需要參數";
6176
			
6176
 
6177
			#回傳結果
6177
			#回傳結果
6178
			return $result;
6178
			return $result;
6179
			
6179
 
6180
			}#if end
6180
			}#if end
6181
 
6181
 
6182
		#涵式說明:
6182
		#涵式說明:
6183
		#判斷當前環境為web還是cmd
6183
		#判斷當前環境為web還是cmd
6184
		#回傳結果:
6184
		#回傳結果:
6185
		#$result,"web"或"cmd"
6185
		#$result,"web"或"cmd"
6186
		if(csInformation::getEnv()==="web"){
6186
		if(csInformation::getEnv()==="web"){
6187
			
6187
 
6188
			#設置執行失敗
6188
			#設置執行失敗
6189
			$result["status"]="false";
6189
			$result["status"]="false";
6190
			
6190
 
6191
			#設置執行錯誤訊息
6191
			#設置執行錯誤訊息
6192
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
6192
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
6193
			
6193
 
6194
			#回傳結果
6194
			#回傳結果
6195
			return $result;
6195
			return $result;
6196
			
6196
 
6197
			}#if end
6197
			}#if end
6198
		
6198
 
6199
		#取得參數
6199
		#取得參數
6200
		$result["argu"]=$conf;
6200
		$result["argu"]=$conf;
6201
 
6201
 
6202
		#如果 $conf 不為陣列
6202
		#如果 $conf 不為陣列
6203
		if(gettype($conf)!="array"){
6203
		if(gettype($conf)!="array"){
6204
		
6204
 
6205
			#設置執行失敗
6205
			#設置執行失敗
6206
			$result["status"]="false";
6206
			$result["status"]="false";
6207
		
6207
 
6208
			#設置執行錯誤訊息
6208
			#設置執行錯誤訊息
6209
			$result["error"][]="\$conf變數須為陣列形態";
6209
			$result["error"][]="\$conf變數須為陣列形態";
6210
		
6210
 
6211
			#如果傳入的參數為 null
6211
			#如果傳入的參數為 null
6212
			if($conf==null){
6212
			if($conf==null){
6213
			
6213
 
6214
				#設置執行錯誤訊息
6214
				#設置執行錯誤訊息
6215
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
6215
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
6216
			
6216
 
6217
				}#if end
6217
				}#if end
6218
 
6218
 
6219
			#回傳結果
6219
			#回傳結果
6220
			return $result;
6220
			return $result;
6221
		
6221
 
6222
			}#if end
6222
			}#if end
6223
			
6223
 
6224
		#檢查參數
6224
		#檢查參數
6225
		#函式說明:
6225
		#函式說明:
6226
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
6226
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
6227
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
6227
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
6228
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
6228
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
Line 6236... Line 6236...
6236
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
6236
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
6237
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
6237
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
6238
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
6238
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
6239
		#必填寫的參數:
6239
		#必填寫的參數:
6240
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
6240
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
6241
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;	
6241
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
6242
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
6242
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
6243
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
6243
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
6244
		#可以省略的參數:
6244
		#可以省略的參數:
6245
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
6245
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
6246
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("data","clientKey","serverSock","allSockArray");
6246
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("data","clientKey","serverSock","allSockArray");
Line 6254... Line 6254...
6254
		#$conf["canBeEmpty"]=array();
6254
		#$conf["canBeEmpty"]=array();
6255
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
6255
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
6256
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("ip");
6256
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("ip");
6257
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
6257
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
6258
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("ip","processFuncs");
6258
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("ip","processFuncs");
6259
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
6259
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
6260
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","array");
6260
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","array");
6261
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
6261
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
6262
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("0.0.0.0",array());
6262
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("0.0.0.0",array());
6263
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
6263
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
6264
		#$conf["disallowAllSkipableVarIsEmpty"]="";
6264
		#$conf["disallowAllSkipableVarIsEmpty"]="";
Line 6268... Line 6268...
6268
		#$conf["arrayCountEqualCheck"][]=array();
6268
		#$conf["arrayCountEqualCheck"][]=array();
6269
		#參考資料來源:
6269
		#參考資料來源:
6270
		#array_keys=>http://php.net/manual/en/function.array-keys.php
6270
		#array_keys=>http://php.net/manual/en/function.array-keys.php
6271
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
6271
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
6272
		unset($conf["variableCheck::checkArguments"]);
6272
		unset($conf["variableCheck::checkArguments"]);
6273
			
6273
 
6274
		#如果檢查參數失敗
6274
		#如果檢查參數失敗
6275
		if($checkArguments["status"]==="false"){
6275
		if($checkArguments["status"]==="false"){
6276
			
6276
 
6277
			#設置執行失敗
6277
			#設置執行失敗
6278
			$result["status"]="false";
6278
			$result["status"]="false";
6279
			
6279
 
6280
			#設置錯誤訊息
6280
			#設置錯誤訊息
6281
			$result["error"]=$checkArguments;
6281
			$result["error"]=$checkArguments;
6282
			
6282
 
6283
			#回傳結果
6283
			#回傳結果
6284
			return $result;
6284
			return $result;
6285
			
6285
 
6286
			}#if end
6286
			}#if end
6287
			
6287
 
6288
		#如果檢查參數不通過
6288
		#如果檢查參數不通過
6289
		if($checkArguments["passed"]==="false"){
6289
		if($checkArguments["passed"]==="false"){
6290
			
6290
 
6291
			#設置執行失敗
6291
			#設置執行失敗
6292
			$result["status"]="false";
6292
			$result["status"]="false";
6293
			
6293
 
6294
			#設置錯誤訊息
6294
			#設置錯誤訊息
6295
			$result["error"]=$checkArguments;
6295
			$result["error"]=$checkArguments;
6296
			
6296
 
6297
			#回傳結果
6297
			#回傳結果
6298
			return $result;
6298
			return $result;
6299
			
6299
 
6300
			}#if end
6300
			}#if end
6301
 
6301
 
6302
		#針對輸入的內容
6302
		#針對輸入的內容
6303
		switch($conf["data"]){
6303
		switch($conf["data"]){
6304
 
6304
 
Line 6326... Line 6326...
6326
			default:
6326
			default:
6327
 
6327
 
6328
			}#switch end
6328
			}#switch end
6329
 
6329
 
6330
		}#function endServiceU end
6330
		}#function endServiceU end
6331
		
6331
 
6332
	/*
6332
	/*
6333
	#函式說明:
6333
	#函式說明:
6334
	#給予unixDomainSockServer函式的addOnProcessFunc參數用的函式,在背景執行指令.
6334
	#給予unixDomainSockServer函式的addOnProcessFunc參數用的函式,在背景執行指令.
6335
	#回傳結果:
6335
	#回傳結果:
6336
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
6336
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
Line 6351... Line 6351...
6351
	#無.
6351
	#無.
6352
	#備註:
6352
	#備註:
6353
	#無.
6353
	#無.
6354
	*/
6354
	*/
6355
	public static function addOnProcessFuncForUnixDomainSockServerInRunWithAutoAddMemoryDaemon(&$conf=array()){
6355
	public static function addOnProcessFuncForUnixDomainSockServerInRunWithAutoAddMemoryDaemon(&$conf=array()){
6356
	
6356
 
6357
		#初始化要回傳的結果
6357
		#初始化要回傳的結果
6358
		$result=array();
6358
		$result=array();
6359
 
6359
 
6360
		#取得當前執行的函數名稱
6360
		#取得當前執行的函數名稱
6361
		$result["function"]=__FUNCTION__;
6361
		$result["function"]=__FUNCTION__;
6362
		
6362
 
6363
		#取得參數
6363
		#取得參數
6364
		$result["argu"]=$conf;
6364
		$result["argu"]=$conf;
6365
		
6365
 
6366
		#允許後面的函式繼續執行
6366
		#允許後面的函式繼續執行
6367
		$result["continue"]="true";
6367
		$result["continue"]="true";
6368
 
6368
 
6369
		#如果 $conf 不為陣列
6369
		#如果 $conf 不為陣列
6370
		if(gettype($conf)!="array"){
6370
		if(gettype($conf)!="array"){
Line 6385... Line 6385...
6385
 
6385
 
6386
			#回傳結果
6386
			#回傳結果
6387
			return $result;
6387
			return $result;
6388
 
6388
 
6389
			}#if end
6389
			}#if end
6390
			
6390
 
6391
		#函式說明:
6391
		#函式說明:
6392
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
6392
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
6393
		#回傳結果:
6393
		#回傳結果:
6394
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
6394
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
6395
		#$result["error"],執行不正常結束的錯訊息陣列.
6395
		#$result["error"],執行不正常結束的錯訊息陣列.
Line 6438... Line 6438...
6438
		#array_keys=>http://php.net/manual/en/function.array-keys.php
6438
		#array_keys=>http://php.net/manual/en/function.array-keys.php
6439
		#備註:
6439
		#備註:
6440
		#無.
6440
		#無.
6441
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
6441
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
6442
		unset($conf["variableCheck::checkArguments"]);
6442
		unset($conf["variableCheck::checkArguments"]);
6443
		
6443
 
6444
		#debug
6444
		#debug
6445
		#var_dump(__LINE__,$checkArguments);
6445
		#var_dump(__LINE__,$checkArguments);
6446
		
6446
 
6447
		#如果執行失敗
6447
		#如果執行失敗
6448
		if($checkArguments["status"]==="false"){
6448
		if($checkArguments["status"]==="false"){
6449
		
6449
 
6450
			#設置執行失敗
6450
			#設置執行失敗
6451
			$result["status"]="false";
6451
			$result["status"]="false";
6452
 
6452
 
6453
			#設置執行錯誤訊息
6453
			#設置執行錯誤訊息
6454
			$result["error"]=$checkArguments;
6454
			$result["error"]=$checkArguments;
6455
			
6455
 
6456
			#回傳結果
6456
			#回傳結果
6457
			return $result;
6457
			return $result;
6458
		
6458
 
6459
			}#if end
6459
			}#if end
6460
			
6460
 
6461
		#如果檢查不通過
6461
		#如果檢查不通過
6462
		if($checkArguments["passed"]==="false"){
6462
		if($checkArguments["passed"]==="false"){
6463
		
6463
 
6464
			#設置執行失敗
6464
			#設置執行失敗
6465
			$result["status"]="false";
6465
			$result["status"]="false";
6466
 
6466
 
6467
			#設置執行錯誤訊息
6467
			#設置執行錯誤訊息
6468
			$result["error"]=$checkArguments;
6468
			$result["error"]=$checkArguments;
6469
			
6469
 
6470
			#回傳結果
6470
			#回傳結果
6471
			return $result;
6471
			return $result;
6472
		
6472
 
6473
			}#if end	
6473
			}#if end
6474
		
6474
 
6475
		#將需求變成陣列
6475
		#將需求變成陣列
6476
		$request=(array)json_decode($conf["request"]);
6476
		$request=(array)json_decode($conf["request"]);
6477
	
6477
 
6478
		#函式說明:
6478
		#函式說明:
6479
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
6479
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
6480
		#回傳結果:
6480
		#回傳結果:
6481
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
6481
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
6482
		#$result["error"],執行不正常結束的錯訊息陣列.
6482
		#$result["error"],執行不正常結束的錯訊息陣列.
Line 6525... Line 6525...
6525
		#array_keys=>http://php.net/manual/en/function.array-keys.php
6525
		#array_keys=>http://php.net/manual/en/function.array-keys.php
6526
		#備註:
6526
		#備註:
6527
		#無.
6527
		#無.
6528
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
6528
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
6529
		unset($conf["variableCheck::checkArguments"]);
6529
		unset($conf["variableCheck::checkArguments"]);
6530
		
6530
 
6531
		#debug
6531
		#debug
6532
		#var_dump(__LINE__,$checkArguments);
6532
		#var_dump(__LINE__,$checkArguments);
6533
		
6533
 
6534
		#如果執行失敗
6534
		#如果執行失敗
6535
		if($checkArguments["status"]==="false"){
6535
		if($checkArguments["status"]==="false"){
6536
		
6536
 
6537
			#設置執行失敗
6537
			#設置執行失敗
6538
			$result["status"]="false";
6538
			$result["status"]="false";
6539
 
6539
 
6540
			#設置執行錯誤訊息
6540
			#設置執行錯誤訊息
6541
			$result["error"]=$checkArguments;
6541
			$result["error"]=$checkArguments;
6542
			
6542
 
6543
			#回傳結果
6543
			#回傳結果
6544
			return $result;
6544
			return $result;
6545
		
6545
 
6546
			}#if end
6546
			}#if end
6547
			
6547
 
6548
		#如果檢查不通過
6548
		#如果檢查不通過
6549
		if($checkArguments["passed"]==="false"){
6549
		if($checkArguments["passed"]==="false"){
6550
		
6550
 
6551
			#設置執行失敗
6551
			#設置執行失敗
6552
			$result["status"]="false";
6552
			$result["status"]="false";
6553
 
6553
 
6554
			#設置執行錯誤訊息
6554
			#設置執行錯誤訊息
6555
			$result["error"]=$checkArguments;
6555
			$result["error"]=$checkArguments;
6556
			
6556
 
6557
			#回傳結果
6557
			#回傳結果
6558
			return $result;
6558
			return $result;
6559
		
6559
 
6560
			}#if end
6560
			}#if end
6561
		
6561
 
6562
		#函式說明:
6562
		#函式說明:
6563
		#呼叫shell執行系統命令,並取得回傳的內容.
6563
		#呼叫shell執行系統命令,並取得回傳的內容.
6564
		#回傳結果:
6564
		#回傳結果:
6565
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
6565
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
6566
		#$result["error"],錯誤訊息陣列.
6566
		#$result["error"],錯誤訊息陣列.
Line 6616... Line 6616...
6616
		#備註:
6616
		#備註:
6617
		#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
6617
		#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
6618
		#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
6618
		#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
6619
		$callShell=external::callShell($conf["external::callShell"]);
6619
		$callShell=external::callShell($conf["external::callShell"]);
6620
		unset($conf["external::callShell"]);
6620
		unset($conf["external::callShell"]);
6621
		
6621
 
6622
		#如果執行失敗
6622
		#如果執行失敗
6623
		if($callShell["status"]==="false"){
6623
		if($callShell["status"]==="false"){
6624
		
6624
 
6625
			#設置執行失敗
6625
			#設置執行失敗
6626
			$result["status"]="false";
6626
			$result["status"]="false";
6627
		
6627
 
6628
			#設置執行錯誤訊息
6628
			#設置執行錯誤訊息
6629
			$result["error"]=$callShell;
6629
			$result["error"]=$callShell;
6630
			
6630
 
6631
			#回傳結果
6631
			#回傳結果
6632
			return $result;
6632
			return $result;
6633
		
6633
 
6634
			}#if end
6634
			}#if end
6635
		
6635
 
6636
		#函式說明:
6636
		#函式說明:
6637
		#將一維陣列轉換為用特定符號間隔的字串,ex:array("1","2","3") to "a;b;c;".
6637
		#將一維陣列轉換為用特定符號間隔的字串,ex:array("1","2","3") to "a;b;c;".
6638
		#回傳的結果:
6638
		#回傳的結果:
6639
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
6639
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
6640
		#$result["function"],當前執行的function名稱
6640
		#$result["function"],當前執行的function名稱
Line 6653... Line 6653...
6653
		#無.
6653
		#無.
6654
		#備註:
6654
		#備註:
6655
		#無.
6655
		#無.
6656
		$arrayToString=arrays::arrayToString($conf["arrays::arrayToString"]);
6656
		$arrayToString=arrays::arrayToString($conf["arrays::arrayToString"]);
6657
		unset($conf["arrays::arrayToString"]);
6657
		unset($conf["arrays::arrayToString"]);
6658
		
6658
 
6659
		#如果執行失敗
6659
		#如果執行失敗
6660
		if($arrayToString["status"]==="false"){
6660
		if($arrayToString["status"]==="false"){
6661
		
6661
 
6662
			#設置執行失敗
6662
			#設置執行失敗
6663
			$result["status"]="false";
6663
			$result["status"]="false";
6664
		
6664
 
6665
			#設置執行錯誤訊息
6665
			#設置執行錯誤訊息
6666
			$result["error"]=$arrayToString;
6666
			$result["error"]=$arrayToString;
6667
			
6667
 
6668
			#回傳結果
6668
			#回傳結果
6669
			return $result;
6669
			return $result;
6670
		
6670
 
6671
			}#if end
6671
			}#if end
6672
		
6672
 
6673
		#函式說明:
6673
		#函式說明:
6674
		#透過proc來多執行序運作.
6674
		#透過proc來多執行序運作.
6675
		#回傳結果:
6675
		#回傳結果:
6676
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
6676
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
6677
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
6677
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
Line 6695... Line 6695...
6695
		#https://www.php.net/manual/en/function.proc-get-status.php
6695
		#https://www.php.net/manual/en/function.proc-get-status.php
6696
		#備註:
6696
		#備註:
6697
		#無.
6697
		#無.
6698
		$proc=threads::proc($conf["threads::proc"]);
6698
		$proc=threads::proc($conf["threads::proc"]);
6699
		unset($conf["threads::proc"]);
6699
		unset($conf["threads::proc"]);
6700
		
6700
 
6701
		/* debug
6701
		/* debug
6702
		
6702
 
6703
		#函式說明:
6703
		#函式說明:
6704
		#撰寫log
6704
		#撰寫log
6705
		#回傳結果:
6705
		#回傳結果:
6706
		#$result["status"],狀態,"true"或"false".
6706
		#$result["status"],狀態,"true"或"false".
6707
		#$result["error"],錯誤訊息陣列.
6707
		#$result["error"],錯誤訊息陣列.
Line 6724... Line 6724...
6724
		#無.
6724
		#無.
6725
		#備註:
6725
		#備註:
6726
		#無.
6726
		#無.
6727
		$record=logs::record($conf["logs::record"]);
6727
		$record=logs::record($conf["logs::record"]);
6728
		unset($conf["logs::record"]);
6728
		unset($conf["logs::record"]);
6729
											
6729
 
6730
		#如果執行失敗
6730
		#如果執行失敗
6731
		if($record["status"]==="false"){
6731
		if($record["status"]==="false"){
6732
		
6732
 
6733
			#設置執行錯誤識別
6733
			#設置執行錯誤識別
6734
			$result["status"]="false";
6734
			$result["status"]="false";
6735
		
6735
 
6736
			#設置執行錯誤
6736
			#設置執行錯誤
6737
			$result["error"]=$record;
6737
			$result["error"]=$record;
6738
		
6738
 
6739
			#回傳結果
6739
			#回傳結果
6740
			return $result;
6740
			return $result;
6741
		
6741
 
6742
			}#if end
6742
			}#if end
6743
		
6743
 
6744
		*/
6744
		*/
6745
		
6745
 
6746
		#設置要暫存在server端的內容
6746
		#設置要暫存在server端的內容
6747
		$result["cache"]=&$proc;
6747
		$result["cache"]=&$proc;
6748
		
6748
 
6749
		#如果執行失敗
6749
		#如果執行失敗
6750
		if($proc["status"]==="false"){
6750
		if($proc["status"]==="false"){
6751
		
6751
 
6752
			#設置執行失敗
6752
			#設置執行失敗
6753
			$result["status"]="false";
6753
			$result["status"]="false";
6754
		
6754
 
6755
			#設置執行錯誤訊息
6755
			#設置執行錯誤訊息
6756
			$result["error"]=$proc;
6756
			$result["error"]=$proc;
6757
			
6757
 
6758
			#回傳結果
6758
			#回傳結果
6759
			return $result;
6759
			return $result;
6760
		
6760
 
6761
			}#if end
6761
			}#if end
6762
	
6762
 
6763
		#設置執行正常
6763
		#設置執行正常
6764
		$result["status"]="true";
6764
		$result["status"]="true";
6765
		
6765
 
6766
		#後面的程式不要執行
6766
		#後面的程式不要執行
6767
		$result["continue"]="false";
6767
		$result["continue"]="false";
6768
	
6768
 
6769
		#回傳結果
6769
		#回傳結果
6770
		return $result;
6770
		return $result;
6771
	
6771
 
6772
		}#function addOnProcessFuncForUnixDomainSockServerInRunWithAutoAddMemoryDaemon end
6772
		}#function addOnProcessFuncForUnixDomainSockServerInRunWithAutoAddMemoryDaemon end
6773
		
6773
 
6774
	/*
6774
	/*
6775
	#函式說明:
6775
	#函式說明:
6776
	#執行程式時,依照需要增加記憶體的上限.
6776
	#執行程式時,依照需要增加記憶體的上限.
6777
	#回傳結果:
6777
	#回傳結果:
6778
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
6778
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
Line 6794... Line 6794...
6794
	#https://www.php.net/manual/en/function.stream-get-meta-data.php
6794
	#https://www.php.net/manual/en/function.stream-get-meta-data.php
6795
	#備註:
6795
	#備註:
6796
	#無.
6796
	#無.
6797
	*/
6797
	*/
6798
	public static function runWithAutoAddMemoryDaemon(&$conf=array()){
6798
	public static function runWithAutoAddMemoryDaemon(&$conf=array()){
6799
	
6799
 
6800
		#初始化要回傳的結果
6800
		#初始化要回傳的結果
6801
		$result=array();
6801
		$result=array();
6802
 
6802
 
6803
		#取得當前執行的函數名稱
6803
		#取得當前執行的函數名稱
6804
		$result["function"]=__FUNCTION__;
6804
		$result["function"]=__FUNCTION__;
6805
		
6805
 
6806
		#取得參數
6806
		#取得參數
6807
		$result["argu"]=$conf;
6807
		$result["argu"]=$conf;
6808
 
6808
 
6809
		#如果 $conf 不為陣列
6809
		#如果 $conf 不為陣列
6810
		if(gettype($conf)!="array"){
6810
		if(gettype($conf)!="array"){
Line 6825... Line 6825...
6825
 
6825
 
6826
			#回傳結果
6826
			#回傳結果
6827
			return $result;
6827
			return $result;
6828
 
6828
 
6829
			}#if end
6829
			}#if end
6830
		
6830
 
6831
		#檢查參數
6831
		#檢查參數
6832
		#函式說明:
6832
		#函式說明:
6833
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
6833
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
6834
		#回傳結果:
6834
		#回傳結果:
6835
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
6835
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
Line 6881... Line 6881...
6881
		#array_keys=>http://php.net/manual/en/function.array-keys.php
6881
		#array_keys=>http://php.net/manual/en/function.array-keys.php
6882
		#備註:
6882
		#備註:
6883
		#無.
6883
		#無.
6884
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
6884
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
6885
		unset($conf["variableCheck::checkArguments"]);
6885
		unset($conf["variableCheck::checkArguments"]);
6886
		
6886
 
6887
		#如果執行失敗
6887
		#如果執行失敗
6888
		if($checkArguments["status"]==="false"){
6888
		if($checkArguments["status"]==="false"){
6889
		
6889
 
6890
			#設置執行失敗
6890
			#設置執行失敗
6891
			$result["status"]="false";
6891
			$result["status"]="false";
6892
			
6892
 
6893
			#設置錯誤資訊
6893
			#設置錯誤資訊
6894
			$result["error"]=$checkArguments;
6894
			$result["error"]=$checkArguments;
6895
		
6895
 
6896
			#回傳結果
6896
			#回傳結果
6897
			return $result;
6897
			return $result;
6898
		
6898
 
6899
			}#if end
6899
			}#if end
6900
			
6900
 
6901
		#如果檢查不通過
6901
		#如果檢查不通過
6902
		if($checkArguments["passed"]==="false"){
6902
		if($checkArguments["passed"]==="false"){
6903
		
6903
 
6904
			#設置執行失敗
6904
			#設置執行失敗
6905
			$result["status"]="false";
6905
			$result["status"]="false";
6906
			
6906
 
6907
			#設置錯誤資訊
6907
			#設置錯誤資訊
6908
			$result["error"]=$checkArguments;
6908
			$result["error"]=$checkArguments;
6909
		
6909
 
6910
			#回傳結果
6910
			#回傳結果
6911
			return $result;
6911
			return $result;
6912
		
6912
 
6913
			}#if end
6913
			}#if end
6914
		
6914
 
6915
		/*
6915
		/*
6916
		#函式說明:
6916
		#函式說明:
6917
		#於 ./tmp 底下建立暫存目錄與回傳暫存檔案名稱路徑 
6917
		#於 ./tmp 底下建立暫存目錄與回傳暫存檔案名稱路徑
6918
		#回傳結果:
6918
		#回傳結果:
6919
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
6919
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
6920
		#$result["error"],錯誤訊息.
6920
		#$result["error"],錯誤訊息.
6921
		#$result["function"],當前執行的函數名稱.
6921
		#$result["function"],當前執行的函數名稱.
6922
		#$result["content"],暫存檔案的路徑與名稱.
6922
		#$result["content"],暫存檔案的路徑與名稱.
Line 6930... Line 6930...
6930
		#無.
6930
		#無.
6931
		*/
6931
		*/
6932
		$conf["fileAccess::createTempFile"]=array();
6932
		$conf["fileAccess::createTempFile"]=array();
6933
		$createTempFile=fileAccess::createTempFile($conf["fileAccess::createTempFile"]);
6933
		$createTempFile=fileAccess::createTempFile($conf["fileAccess::createTempFile"]);
6934
		unset($conf["fileAccess::createTempFile"]);
6934
		unset($conf["fileAccess::createTempFile"]);
6935
		
6935
 
6936
		#如果執行失敗
6936
		#如果執行失敗
6937
		if($createTempFile["status"]==="false"){
6937
		if($createTempFile["status"]==="false"){
6938
		
6938
 
6939
			#設置執行失敗
6939
			#設置執行失敗
6940
			$result["status"]="false";
6940
			$result["status"]="false";
6941
 
6941
 
6942
			#設置執行錯誤訊息
6942
			#設置執行錯誤訊息
6943
			$result["error"]=$createTempFile;
6943
			$result["error"]=$createTempFile;
6944
			
6944
 
6945
			#回傳結果
6945
			#回傳結果
6946
			return $result;
6946
			return $result;
6947
		
6947
 
6948
			}#if end
6948
			}#if end
6949
		
6949
 
6950
		#取得暫存的 unix domain socket 檔案
6950
		#取得暫存的 unix domain socket 檔案
6951
		$tmpUnixDomainSock=$createTempFile["content"];
6951
		$tmpUnixDomainSock=$createTempFile["content"];
6952
			
6952
 
6953
		#初始化用來運行  unixDomainSockServer.php 的參數
6953
		#初始化用來運行  unixDomainSockServer.php 的參數
6954
		$argu=array();
6954
		$argu=array();
6955
	
6955
 
6956
		#設置參數
6956
		#設置參數
6957
		$argu[]="--sock";
6957
		$argu[]="--sock";
6958
		
6958
 
6959
		#設置參數
6959
		#設置參數
6960
		$argu[]=$tmpUnixDomainSock;
6960
		$argu[]=$tmpUnixDomainSock;
6961
		
6961
 
6962
		#設置參數
6962
		#設置參數
6963
		$argu[]="--addOnProcessFunc";
6963
		$argu[]="--addOnProcessFunc";
6964
		
6964
 
6965
		#設置參數
6965
		#設置參數
6966
		$argu[]="\qbpwcf\sock::addOnProcessFuncForUnixDomainSockServerInRunWithAutoAddMemoryDaemon";
6966
		$argu[]="\qbpwcf\sock::addOnProcessFuncForUnixDomainSockServerInRunWithAutoAddMemoryDaemon";
6967
			
6967
 
6968
		#設置參數
6968
		#設置參數
6969
		$argu[]="--funcToRunWhenIdle";
6969
		$argu[]="--funcToRunWhenIdle";
6970
		
6970
 
6971
		#設置參數
6971
		#設置參數
6972
		$argu[]="\qbpwcf\config::autoAddMemory";
6972
		$argu[]="\qbpwcf\config::autoAddMemory";
6973
		
6973
 
6974
		#設置參數
6974
		#設置參數
6975
		$argu[]="--onlyOutputCache";
6975
		$argu[]="--onlyOutputCache";
6976
		
6976
 
6977
		#設置參數
6977
		#設置參數
6978
		$argu[]="true";
6978
		$argu[]="true";
6979
		
6979
 
6980
		#設置參數
6980
		#設置參數
6981
		$argu[]="--cacheLayer";
6981
		$argu[]="--cacheLayer";
6982
		
6982
 
6983
		#設置參數
6983
		#設置參數
6984
		$argu[]="serverCache";
6984
		$argu[]="serverCache";
6985
		
6985
 
6986
		#設置參數
6986
		#設置參數
6987
		$argu[]="--cacheLayer";
6987
		$argu[]="--cacheLayer";
6988
		
6988
 
6989
		#設置參數
6989
		#設置參數
6990
		$argu[]="serverSide";
6990
		$argu[]="serverSide";
6991
		
6991
 
6992
		#設置參數
6992
		#設置參數
6993
		$argu[]="--cacheLayer";
6993
		$argu[]="--cacheLayer";
6994
		
6994
 
6995
		#設置參數
6995
		#設置參數
6996
		$argu[]="funcToRunWhenIdle";
6996
		$argu[]="funcToRunWhenIdle";
6997
		
6997
 
6998
		#設置參數
6998
		#設置參數
6999
		$argu[]="--cacheLayer";
6999
		$argu[]="--cacheLayer";
7000
		
7000
 
7001
		#設置參數
7001
		#設置參數
7002
		$argu[]="\qbpwcf\config::autoAddMemory";
7002
		$argu[]="\qbpwcf\config::autoAddMemory";
7003
		
7003
 
7004
		#設置參數
7004
		#設置參數
7005
		$argu[]="--cacheLayer";
7005
		$argu[]="--cacheLayer";
7006
		
7006
 
7007
		#設置參數
7007
		#設置參數
7008
		$argu[]="cache";
7008
		$argu[]="cache";
7009
		
7009
 
7010
		#設置參數
7010
		#設置參數
7011
		$argu[]="--cacheLayer";
7011
		$argu[]="--cacheLayer";
7012
		
7012
 
7013
		#設置參數
7013
		#設置參數
7014
		$argu[]="stdout";
7014
		$argu[]="stdout";
7015
		
7015
 
7016
		#函式說明:
7016
		#函式說明:
7017
		#呼叫shell執行系統命令,並取得回傳的內容.
7017
		#呼叫shell執行系統命令,並取得回傳的內容.
7018
		#回傳結果:
7018
		#回傳結果:
7019
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
7019
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
7020
		#$result["error"],錯誤訊息陣列.
7020
		#$result["error"],錯誤訊息陣列.
Line 7070... Line 7070...
7070
		#備註:
7070
		#備註:
7071
		#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
7071
		#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
7072
		#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
7072
		#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
7073
		$callShell=external::callShell($conf["external::callShell"]);
7073
		$callShell=external::callShell($conf["external::callShell"]);
7074
		unset($conf["external::callShell"]);
7074
		unset($conf["external::callShell"]);
7075
		
7075
 
7076
		#debug
7076
		#debug
7077
		#var_dump(__LINE__,$callShell);exit;
7077
		#var_dump(__LINE__,$callShell);exit;
7078
		
7078
 
7079
		#如果執行失敗
7079
		#如果執行失敗
7080
		if($callShell["status"]==="false"){
7080
		if($callShell["status"]==="false"){
7081
		
7081
 
7082
			#如果socket存在
7082
			#如果socket存在
7083
			if(file_exists($tmpUnixDomainSock)){
7083
			if(file_exists($tmpUnixDomainSock)){
7084
			
7084
 
7085
				#移除之
7085
				#移除之
7086
				unlink($tmpUnixDomainSock);
7086
				unlink($tmpUnixDomainSock);
7087
			
7087
 
7088
				}#if end
7088
				}#if end
7089
		
7089
 
7090
			#設置執行失敗
7090
			#設置執行失敗
7091
			$result["status"]="false";
7091
			$result["status"]="false";
7092
 
7092
 
7093
			#設置執行錯誤訊息
7093
			#設置執行錯誤訊息
7094
			$result["error"]=$callShell;
7094
			$result["error"]=$callShell;
7095
			
7095
 
7096
			#回傳結果
7096
			#回傳結果
7097
			return $result;
7097
			return $result;
7098
		
7098
 
7099
			}#if end
7099
			}#if end
7100
		
7100
 
7101
		#函式說明:
7101
		#函式說明:
7102
		#將一維陣列轉換為用特定符號間隔的字串,ex:array("1","2","3") to "a;b;c;".
7102
		#將一維陣列轉換為用特定符號間隔的字串,ex:array("1","2","3") to "a;b;c;".
7103
		#回傳的結果:
7103
		#回傳的結果:
7104
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
7104
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
7105
		#$result["function"],當前執行的function名稱
7105
		#$result["function"],當前執行的function名稱
Line 7118... Line 7118...
7118
		#無.
7118
		#無.
7119
		#備註:
7119
		#備註:
7120
		#無.
7120
		#無.
7121
		$arrayToString=arrays::arrayToString($conf["arrays::arrayToString"]);
7121
		$arrayToString=arrays::arrayToString($conf["arrays::arrayToString"]);
7122
		unset($conf["arrays::arrayToString"]);
7122
		unset($conf["arrays::arrayToString"]);
7123
		
7123
 
7124
		#如果執行失敗
7124
		#如果執行失敗
7125
		if($arrayToString["status"]==="false"){
7125
		if($arrayToString["status"]==="false"){
7126
		
7126
 
7127
			#如果socket存在
7127
			#如果socket存在
7128
			if(file_exists($tmpUnixDomainSock)){
7128
			if(file_exists($tmpUnixDomainSock)){
7129
			
7129
 
7130
				#移除之
7130
				#移除之
7131
				unlink($tmpUnixDomainSock);
7131
				unlink($tmpUnixDomainSock);
7132
			
7132
 
7133
				}#if end
7133
				}#if end
7134
		
7134
 
7135
			#設置執行失敗
7135
			#設置執行失敗
7136
			$result["status"]="false";
7136
			$result["status"]="false";
7137
 
7137
 
7138
			#設置執行錯誤訊息
7138
			#設置執行錯誤訊息
7139
			$result["error"]=$arrayToString;
7139
			$result["error"]=$arrayToString;
7140
			
7140
 
7141
			#回傳結果
7141
			#回傳結果
7142
			return $result;
7142
			return $result;
7143
		
7143
 
7144
			}#if end
7144
			}#if end
7145
		
7145
 
7146
		#函式說明:
7146
		#函式說明:
7147
		#透過proc來多執行序運作.
7147
		#透過proc來多執行序運作.
7148
		#回傳結果:
7148
		#回傳結果:
7149
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
7149
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
7150
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
7150
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
Line 7166... Line 7166...
7166
		#參考資料:
7166
		#參考資料:
7167
		#https://www.php.net/manual/en/function.proc-open.php
7167
		#https://www.php.net/manual/en/function.proc-open.php
7168
		#https://www.php.net/manual/en/function.proc-get-status.php
7168
		#https://www.php.net/manual/en/function.proc-get-status.php
7169
		#備註:
7169
		#備註:
7170
		#無.
7170
		#無.
7171
		$procForUnixDoaminSocket=threads::proc($conf["threads::proc"]);	
7171
		$procForUnixDoaminSocket=threads::proc($conf["threads::proc"]);
7172
		unset($conf["threads::proc"]);	
7172
		unset($conf["threads::proc"]);
7173
		
7173
 
7174
		#如果執行失敗
7174
		#如果執行失敗
7175
		if($procForUnixDoaminSocket["status"]==="false"){
7175
		if($procForUnixDoaminSocket["status"]==="false"){
7176
		
7176
 
7177
			#如果socket存在
7177
			#如果socket存在
7178
			if(file_exists($tmpUnixDomainSock)){
7178
			if(file_exists($tmpUnixDomainSock)){
7179
			
7179
 
7180
				#移除之
7180
				#移除之
7181
				unlink($tmpUnixDomainSock);
7181
				unlink($tmpUnixDomainSock);
7182
			
7182
 
7183
				}#if end
7183
				}#if end
7184
		
7184
 
7185
			#設置執行失敗
7185
			#設置執行失敗
7186
			$result["status"]="false";
7186
			$result["status"]="false";
7187
 
7187
 
7188
			#設置執行錯誤訊息
7188
			#設置執行錯誤訊息
7189
			$result["error"]=$procForUnixDoaminSocket;
7189
			$result["error"]=$procForUnixDoaminSocket;
7190
			
7190
 
7191
			#回傳結果
7191
			#回傳結果
7192
			return $result;
7192
			return $result;
7193
		
7193
 
7194
			}#if end
7194
			}#if end
7195
		
7195
 
7196
		#var_dump($procForUnixDoaminSocket);exit;
7196
		#var_dump($procForUnixDoaminSocket);exit;
7197
		
7197
 
7198
		#如果 unix doamin socket server 沒有在運行
7198
		#如果 unix doamin socket server 沒有在運行
7199
		if($procForUnixDoaminSocket["content"][0]["proc_get_status"]["running"]===false){
7199
		if($procForUnixDoaminSocket["content"][0]["proc_get_status"]["running"]===false){
7200
		
7200
 
7201
			#如果socket存在
7201
			#如果socket存在
7202
			if(file_exists($tmpUnixDomainSock)){
7202
			if(file_exists($tmpUnixDomainSock)){
7203
			
7203
 
7204
				#移除之
7204
				#移除之
7205
				unlink($tmpUnixDomainSock);
7205
				unlink($tmpUnixDomainSock);
7206
			
7206
 
7207
				}#if end
7207
				}#if end
7208
		
7208
 
7209
			#設置執行失敗
7209
			#設置執行失敗
7210
			$result["status"]="false";
7210
			$result["status"]="false";
7211
 
7211
 
7212
			#設置執行錯誤訊息
7212
			#設置執行錯誤訊息
7213
			$result["error"]=$procForUnixDoaminSocket;
7213
			$result["error"]=$procForUnixDoaminSocket;
7214
			
7214
 
7215
			#回傳結果
7215
			#回傳結果
7216
			return $result;
7216
			return $result;
7217
				
7217
 
7218
			}#if end
7218
			}#if end
7219
			
7219
 
7220
		#如果當下 unix doamin socket server 沒有在運行
7220
		#如果當下 unix doamin socket server 沒有在運行
7221
		if(proc_get_status($procForUnixDoaminSocket["content"][0]["process"])["running"]===false){
7221
		if(proc_get_status($procForUnixDoaminSocket["content"][0]["process"])["running"]===false){
7222
		
7222
 
7223
			#如果socket存在
7223
			#如果socket存在
7224
			if(file_exists($tmpUnixDomainSock)){
7224
			if(file_exists($tmpUnixDomainSock)){
7225
			
7225
 
7226
				#移除之
7226
				#移除之
7227
				unlink($tmpUnixDomainSock);
7227
				unlink($tmpUnixDomainSock);
7228
			
7228
 
7229
				}#if end
7229
				}#if end
7230
		
7230
 
7231
			#設置執行失敗
7231
			#設置執行失敗
7232
			$result["status"]="false";
7232
			$result["status"]="false";
7233
 
7233
 
7234
			#設置執行錯誤訊息
7234
			#設置執行錯誤訊息
7235
			$result["error"]=$procForUnixDoaminSocket;
7235
			$result["error"]=$procForUnixDoaminSocket;
7236
			
7236
 
7237
			#回傳結果
7237
			#回傳結果
7238
			return $result;
7238
			return $result;
7239
		
7239
 
7240
			}#if end
7240
			}#if end
7241
		
7241
 
7242
		#debug
7242
		#debug
7243
		#var_dump(__LINE__,"before send msg");
7243
		#var_dump(__LINE__,"before send msg");
7244
		
7244
 
7245
		#初始化要求執行程式的訊息
7245
		#初始化要求執行程式的訊息
7246
		$msg=array();
7246
		$msg=array();
7247
		
7247
 
7248
		#設置執行的指令
7248
		#設置執行的指令
7249
		$msg["cmd2run"]=$conf["cmd"];
7249
		$msg["cmd2run"]=$conf["cmd"];
7250
		
7250
 
7251
		#如果有參數
7251
		#如果有參數
7252
		if(isset($conf["params"])){
7252
		if(isset($conf["params"])){
7253
		
7253
 
7254
			#設置參數
7254
			#設置參數
7255
			$msg["params"]=$conf["params"];
7255
			$msg["params"]=$conf["params"];
7256
		
7256
 
7257
			}#if end
7257
			}#if end
7258
		
7258
 
7259
		#初始化儲存等待了幾秒
7259
		#初始化儲存等待了幾秒
7260
		$waitSec=0;
7260
		$waitSec=0;
7261
		
7261
 
7262
		#無窮迴圈
7262
		#無窮迴圈
7263
		while(true){
7263
		while(true){
7264
			
7264
 
7265
			#函式說明:
7265
			#函式說明:
7266
			#連線到 unixDomainSockServer 提供的 unix domain socket.
7266
			#連線到 unixDomainSockServer 提供的 unix domain socket.
7267
			#回傳結果:
7267
			#回傳結果:
7268
			#$result["status"],"true"代表執行正常;"false"代表執行不正常.
7268
			#$result["status"],"true"代表執行正常;"false"代表執行不正常.
7269
			#$result["error"],錯誤訊息陣列.
7269
			#$result["error"],錯誤訊息陣列.
Line 7289... Line 7289...
7289
			#備註:
7289
			#備註:
7290
			#無.
7290
			#無.
7291
			$paramsOfUnixDomainSockClient=$conf["sock::unixDomainSockClient"];
7291
			$paramsOfUnixDomainSockClient=$conf["sock::unixDomainSockClient"];
7292
			$unixDomainSockClient=sock::unixDomainSockClient($paramsOfUnixDomainSockClient);
7292
			$unixDomainSockClient=sock::unixDomainSockClient($paramsOfUnixDomainSockClient);
7293
			unset($paramsOfUnixDomainSockClient);
7293
			unset($paramsOfUnixDomainSockClient);
7294
			
7294
 
7295
			#如果執行成功
7295
			#如果執行成功
7296
			if($unixDomainSockClient["status"]==="true"){
7296
			if($unixDomainSockClient["status"]==="true"){
7297
			
7297
 
7298
				#debug
7298
				#debug
7299
				#var_dump(__LINE__,"before parse id");
7299
				#var_dump(__LINE__,"before parse id");
7300
			
7300
 
7301
				#跳出while
7301
				#跳出while
7302
				break;
7302
				break;
7303
			
7303
 
7304
				}#if end
7304
				}#if end
7305
			
7305
 
7306
			#提示錯誤
7306
			#提示錯誤
7307
			else{
7307
			else{
7308
			
7308
 
7309
				#debug
7309
				#debug
7310
				#var_dump(__LINE__,$unixDomainSockClient);
7310
				#var_dump(__LINE__,$unixDomainSockClient);
7311
			
7311
 
7312
				}#else end
7312
				}#else end
7313
			
7313
 
7314
			#如果當下 unix doamin socket server 沒有在運行
7314
			#如果當下 unix doamin socket server 沒有在運行
7315
			if(proc_get_status($procForUnixDoaminSocket["content"][0]["process"])["running"]===false){
7315
			if(proc_get_status($procForUnixDoaminSocket["content"][0]["process"])["running"]===false){
7316
			
7316
 
7317
				#如果socket存在
7317
				#如果socket存在
7318
				if(file_exists($tmpUnixDomainSock)){
7318
				if(file_exists($tmpUnixDomainSock)){
7319
				
7319
 
7320
					#移除之
7320
					#移除之
7321
					unlink($tmpUnixDomainSock);
7321
					unlink($tmpUnixDomainSock);
7322
				
7322
 
7323
					}#if end
7323
					}#if end
7324
			
7324
 
7325
				#設置執行失敗
7325
				#設置執行失敗
7326
				$result["status"]="false";
7326
				$result["status"]="false";
7327
 
7327
 
7328
				#設置執行錯誤訊息
7328
				#設置執行錯誤訊息
7329
				$result["error"][]="client取得回應前server就意外結束了";
7329
				$result["error"][]="client取得回應前server就意外結束了";
7330
 
7330
 
7331
				#設置執行錯誤訊息
7331
				#設置執行錯誤訊息
7332
				$result["error"][]=$procForUnixDoaminSocket;
7332
				$result["error"][]=$procForUnixDoaminSocket;
7333
				
7333
 
7334
				#回傳結果
7334
				#回傳結果
7335
				return $result;
7335
				return $result;
7336
			
7336
 
7337
				}#if end
7337
				}#if end
7338
			
7338
 
7339
			#等後1秒,擔心unix domain socket server 尚未跑起來.
7339
			#等後1秒,擔心unix domain socket server 尚未跑起來.
7340
			sleep(1);
7340
			sleep(1);
7341
			
7341
 
7342
			#已等待時間加1秒
7342
			#已等待時間加1秒
7343
			$waitSec=$waitSec+1;
7343
			$waitSec=$waitSec+1;
7344
			
7344
 
7345
			}#while end
7345
			}#while end
7346
		
7346
 
7347
		#debug
7347
		#debug
7348
		#var_dump(__LINE__,"json string got:".$unixDomainSockClient["content"]);
7348
		#var_dump(__LINE__,"json string got:".$unixDomainSockClient["content"]);
7349
		
7349
 
7350
		#取得json回應
7350
		#取得json回應
7351
		$jsonRes=json_decode($unixDomainSockClient["content"]);
7351
		$jsonRes=json_decode($unixDomainSockClient["content"]);
7352
		
7352
 
7353
		#如果執行失敗
7353
		#如果執行失敗
7354
		if($jsonRes===null){
7354
		if($jsonRes===null){
7355
		
7355
 
7356
			#如果socket存在
7356
			#如果socket存在
7357
			if(file_exists($tmpUnixDomainSock)){
7357
			if(file_exists($tmpUnixDomainSock)){
7358
			
7358
 
7359
				#移除之
7359
				#移除之
7360
				unlink($tmpUnixDomainSock);
7360
				unlink($tmpUnixDomainSock);
7361
			
7361
 
7362
				}#if end
7362
				}#if end
7363
		
7363
 
7364
			#設置執行錯誤識別
7364
			#設置執行錯誤識別
7365
			$result["status"]="false";
7365
			$result["status"]="false";
7366
			
7366
 
7367
			#設置錯誤訊息
7367
			#設置錯誤訊息
7368
			$result["error"]=$unixDomainSockClient;
7368
			$result["error"]=$unixDomainSockClient;
7369
			
7369
 
7370
			#回傳結果
7370
			#回傳結果
7371
			return $result;
7371
			return $result;
7372
		
7372
 
7373
			}#if end
7373
			}#if end
7374
			
7374
 
7375
		#如果沒有產生新id
7375
		#如果沒有產生新id
7376
		if(!isset($jsonRes->id)){
7376
		if(!isset($jsonRes->id)){
7377
		
7377
 
7378
			#如果socket存在
7378
			#如果socket存在
7379
			if(file_exists($tmpUnixDomainSock)){
7379
			if(file_exists($tmpUnixDomainSock)){
7380
			
7380
 
7381
				#移除之
7381
				#移除之
7382
				unlink($tmpUnixDomainSock);
7382
				unlink($tmpUnixDomainSock);
7383
			
7383
 
7384
				}#if end
7384
				}#if end
7385
		
7385
 
7386
			#設置執行錯誤識別
7386
			#設置執行錯誤識別
7387
			$result["status"]="false";
7387
			$result["status"]="false";
7388
			
7388
 
7389
			#設置錯誤訊息
7389
			#設置錯誤訊息
7390
			$result["error"]=$unixDomainSockClient;
7390
			$result["error"]=$unixDomainSockClient;
7391
			
7391
 
7392
			#回傳結果
7392
			#回傳結果
7393
			return $result;
7393
			return $result;
7394
		
7394
 
7395
			}#if end
7395
			}#if end
7396
		
7396
 
7397
		#debug
7397
		#debug
7398
		#var_dump(__LINE__,"got id:".$jsonRes->id);
7398
		#var_dump(__LINE__,"got id:".$jsonRes->id);
7399
		
7399
 
7400
		#debug
7400
		#debug
7401
		#while(true){};
7401
		#while(true){};
7402
		
7402
 
7403
		#用新的id再傳送一次要求給 qbpwcf_usock_path
7403
		#用新的id再傳送一次要求給 qbpwcf_usock_path
7404
		$paramsOfUnixDomainSockClient=array();
7404
		$paramsOfUnixDomainSockClient=array();
7405
		$paramsOfUnixDomainSockClient["sock"]=$tmpUnixDomainSock;
7405
		$paramsOfUnixDomainSockClient["sock"]=$tmpUnixDomainSock;
7406
		$paramsOfUnixDomainSockClient["id"]=$jsonRes->id;
7406
		$paramsOfUnixDomainSockClient["id"]=$jsonRes->id;
7407
		$paramsOfUnixDomainSockClient["custom"]=$msg;
7407
		$paramsOfUnixDomainSockClient["custom"]=$msg;
7408
		$unixDomainSockClient=sock::unixDomainSockClient($paramsOfUnixDomainSockClient);
7408
		$unixDomainSockClient=sock::unixDomainSockClient($paramsOfUnixDomainSockClient);
7409
		unset($paramsOfUnixDomainSockClient);
7409
		unset($paramsOfUnixDomainSockClient);
7410
		
7410
 
7411
		#debug
7411
		#debug
7412
		#var_dump(__LINE__,$unixDomainSockClient);
7412
		#var_dump(__LINE__,$unixDomainSockClient);
7413
		
7413
 
7414
		#如果執行失敗
7414
		#如果執行失敗
7415
		if($unixDomainSockClient["status"]==="false"){
7415
		if($unixDomainSockClient["status"]==="false"){
7416
		
7416
 
7417
			#如果socket存在
7417
			#如果socket存在
7418
			if(file_exists($tmpUnixDomainSock)){
7418
			if(file_exists($tmpUnixDomainSock)){
7419
			
7419
 
7420
				#移除之
7420
				#移除之
7421
				unlink($tmpUnixDomainSock);
7421
				unlink($tmpUnixDomainSock);
7422
			
7422
 
7423
				}#if end
7423
				}#if end
7424
		
7424
 
7425
			#設置執行錯誤識別
7425
			#設置執行錯誤識別
7426
			$result["status"]="false";
7426
			$result["status"]="false";
7427
			
7427
 
7428
			#設置錯誤訊息
7428
			#設置錯誤訊息
7429
			$result["error"]=$unixDomainSockClient;
7429
			$result["error"]=$unixDomainSockClient;
7430
			
7430
 
7431
			#回傳結果
7431
			#回傳結果
7432
			return $result;
7432
			return $result;
7433
		
7433
 
7434
			}#if end
7434
			}#if end
7435
	
7435
 
7436
		#debug
7436
		#debug
7437
		#var_dump(__LINE__,$unixDomainSockClient);
7437
		#var_dump(__LINE__,$unixDomainSockClient);
7438
	
7438
 
7439
		#如果有回應的內容
7439
		#如果有回應的內容
7440
		if(!empty($unixDomainSockClient["content"])){
7440
		if(!empty($unixDomainSockClient["content"])){
7441
		
7441
 
7442
			#取得json回應
7442
			#取得json回應
7443
			$jsonRes=(array)json_decode($unixDomainSockClient["content"]);
7443
			$jsonRes=(array)json_decode($unixDomainSockClient["content"]);
7444
		
7444
 
7445
			#如果執行失敗
7445
			#如果執行失敗
7446
			if($jsonRes===null){
7446
			if($jsonRes===null){
7447
			
7447
 
7448
				#如果socket存在
7448
				#如果socket存在
7449
				if(file_exists($tmpUnixDomainSock)){
7449
				if(file_exists($tmpUnixDomainSock)){
7450
				
7450
 
7451
					#移除之
7451
					#移除之
7452
					unlink($tmpUnixDomainSock);
7452
					unlink($tmpUnixDomainSock);
7453
				
7453
 
7454
					}#if end
7454
					}#if end
7455
			
7455
 
7456
				#設置執行錯誤識別
7456
				#設置執行錯誤識別
7457
				$result["status"]="false";
7457
				$result["status"]="false";
7458
				
7458
 
7459
				#設置錯誤訊息
7459
				#設置錯誤訊息
7460
				$result["error"]=$unixDomainSockClient;
7460
				$result["error"]=$unixDomainSockClient;
7461
				
7461
 
7462
				#回傳結果
7462
				#回傳結果
7463
				return $result;
7463
				return $result;
7464
			
7464
 
7465
				}#if end
7465
				}#if end
7466
			
7466
 
7467
			#如果執行指令失敗
7467
			#如果執行指令失敗
7468
			if($jsonRes["status"]==="false"){
7468
			if($jsonRes["status"]==="false"){
7469
			
7469
 
7470
				#如果socket存在
7470
				#如果socket存在
7471
				if(file_exists($tmpUnixDomainSock)){
7471
				if(file_exists($tmpUnixDomainSock)){
7472
				
7472
 
7473
					#移除之
7473
					#移除之
7474
					unlink($tmpUnixDomainSock);
7474
					unlink($tmpUnixDomainSock);
7475
				
7475
 
7476
					}#if end
7476
					}#if end
7477
			
7477
 
7478
				#設置執行錯誤識別
7478
				#設置執行錯誤識別
7479
				$result["status"]="false";
7479
				$result["status"]="false";
7480
				
7480
 
7481
				#設置錯誤訊息
7481
				#設置錯誤訊息
7482
				$result["error"]=$jsonRes["error"];
7482
				$result["error"]=$jsonRes["error"];
7483
				
7483
 
7484
				#回傳結果
7484
				#回傳結果
7485
				return $result;
7485
				return $result;
7486
			
7486
 
7487
				}#if end
7487
				}#if end
7488
			
7488
 
7489
			#印出client收到的結果
7489
			#印出client收到的結果
7490
			#var_dump($jsonRes);
7490
			#var_dump($jsonRes);
7491
		
7491
 
7492
			}#if end
7492
			}#if end
7493
		
7493
 
7494
		#debug
7494
		#debug
7495
		#var_dump(__LINE__,$procForUnixDoaminSocket);
7495
		#var_dump(__LINE__,$procForUnixDoaminSocket);
7496
		
7496
 
7497
		#初始化儲存標準輸出
7497
		#初始化儲存標準輸出
7498
		$result["content"]["stdout"]="";
7498
		$result["content"]["stdout"]="";
7499
		
7499
 
7500
		#初始化儲存非標準輸出
7500
		#初始化儲存非標準輸出
7501
		$result["content"]["stderr"]="";
7501
		$result["content"]["stderr"]="";
7502
		
7502
 
7503
		#等待 unixDomainSockServer 結束執行
7503
		#等待 unixDomainSockServer 結束執行
7504
		while(true){
7504
		while(true){
7505
			
7505
 
7506
			#取得程序狀態
7506
			#取得程序狀態
7507
			$proc_get_status=proc_get_status($procForUnixDoaminSocket["content"][0]["process"]);
7507
			$proc_get_status=proc_get_status($procForUnixDoaminSocket["content"][0]["process"]);
7508
			
7508
 
7509
			/* debug
7509
			/* debug
7510
			
7510
 
7511
			#函式說明:
7511
			#函式說明:
7512
			#撰寫log
7512
			#撰寫log
7513
			#回傳結果:
7513
			#回傳結果:
7514
			#$result["status"],狀態,"true"或"false".
7514
			#$result["status"],狀態,"true"或"false".
7515
			#$result["error"],錯誤訊息陣列.
7515
			#$result["error"],錯誤訊息陣列.
Line 7532... Line 7532...
7532
			#無.
7532
			#無.
7533
			#備註:
7533
			#備註:
7534
			#無.
7534
			#無.
7535
			$record=logs::record($conf["logs::record"]);
7535
			$record=logs::record($conf["logs::record"]);
7536
			unset($conf["logs::record"]);
7536
			unset($conf["logs::record"]);
7537
												
7537
 
7538
			#如果執行失敗
7538
			#如果執行失敗
7539
			if($record["status"]==="false"){
7539
			if($record["status"]==="false"){
7540
			
7540
 
7541
				#設置執行錯誤識別
7541
				#設置執行錯誤識別
7542
				$result["status"]="false";
7542
				$result["status"]="false";
7543
			
7543
 
7544
				#設置執行錯誤
7544
				#設置執行錯誤
7545
				$result["error"]=$record;
7545
				$result["error"]=$record;
7546
			
7546
 
7547
				#回傳結果
7547
				#回傳結果
7548
				return $result;
7548
				return $result;
7549
			
7549
 
7550
				}#if end
7550
				}#if end
7551
			
7551
 
7552
			*/
7552
			*/
7553
			
7553
 
7554
			#確認process是否存在
7554
			#確認process是否存在
7555
			#ps auxwf | grep sshd | grep -v 'grep' | wc -l
7555
			#ps auxwf | grep sshd | grep -v 'grep' | wc -l
7556
			#函式說明:
7556
			#函式說明:
7557
			#呼叫shell執行系統命令,並取得回傳的內容.
7557
			#呼叫shell執行系統命令,並取得回傳的內容.
7558
			#回傳結果:
7558
			#回傳結果:
Line 7610... Line 7610...
7610
			#備註:
7610
			#備註:
7611
			#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
7611
			#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
7612
			#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
7612
			#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
7613
			$callShell=external::callShell($conf["external::callShell"]);
7613
			$callShell=external::callShell($conf["external::callShell"]);
7614
			unset($conf["external::callShell"]);
7614
			unset($conf["external::callShell"]);
7615
			
7615
 
7616
			#如果執行失敗
7616
			#如果執行失敗
7617
			if($callShell["status"]==="false"){
7617
			if($callShell["status"]==="false"){
7618
			
7618
 
7619
				#設置執行失敗
7619
				#設置執行失敗
7620
				$result["status"]="false";
7620
				$result["status"]="false";
7621
 
7621
 
7622
				#設置執行錯誤訊息
7622
				#設置執行錯誤訊息
7623
				$result["error"]=$callShell;
7623
				$result["error"]=$callShell;
7624
 
7624
 
7625
				#回傳結果
7625
				#回傳結果
7626
				return $result;
7626
				return $result;
7627
			
7627
 
7628
				}#if end
7628
				}#if end
7629
			
7629
 
7630
			#如果沒有輸出結果
7630
			#如果沒有輸出結果
7631
			if(!isset($callShell["output"][0])){
7631
			if(!isset($callShell["output"][0])){
7632
			
7632
 
7633
				#設置執行失敗
7633
				#設置執行失敗
7634
				$result["status"]="false";
7634
				$result["status"]="false";
7635
 
7635
 
7636
				#設置執行錯誤訊息
7636
				#設置執行錯誤訊息
7637
				$result["error"]=$callShell;
7637
				$result["error"]=$callShell;
7638
 
7638
 
7639
				#回傳結果
7639
				#回傳結果
7640
				return $result;
7640
				return $result;
7641
						
7641
 
7642
				}#if end
7642
				}#if end
7643
			
7643
 
7644
			#如果執行結束了
7644
			#如果執行結束了
7645
			if( $proc_get_status["running"]===false || $callShell["output"][0]==="0" ){
7645
			if( $proc_get_status["running"]===false || $callShell["output"][0]==="0" ){
7646
				
7646
 
7647
				#取得程式執行過程產生的標準輸出
7647
				#取得程式執行過程產生的標準輸出
7648
				$result["content"]["stdout"]=$procForUnixDoaminSocket["content"][0]["content"];
7648
				$result["content"]["stdout"]=$procForUnixDoaminSocket["content"][0]["content"];
7649
				
7649
 
7650
				#如果是resource
7650
				#如果是resource
7651
				if(gettype($result["content"]["stdout"])==="resource"){
7651
				if(gettype($result["content"]["stdout"])==="resource"){
7652
				
7652
 
7653
					#讀取內容
7653
					#讀取內容
7654
					$result["content"]["stdout"]=stream_get_contents($result["content"]["stdout"]);
7654
					$result["content"]["stdout"]=stream_get_contents($result["content"]["stdout"]);
7655
					
7655
 
7656
					}#if end
7656
					}#if end
7657
				
7657
 
7658
				#取得程式執行過程產生的非標準輸出
7658
				#取得程式執行過程產生的非標準輸出
7659
				$result["content"]["stderr"]=$procForUnixDoaminSocket["content"][0]["error"];
7659
				$result["content"]["stderr"]=$procForUnixDoaminSocket["content"][0]["error"];
7660
							
7660
 
7661
				#如果是resource
7661
				#如果是resource
7662
				if(gettype($result["content"]["stderr"])==="resource"){
7662
				if(gettype($result["content"]["stderr"])==="resource"){
7663
				
7663
 
7664
					#讀取內容
7664
					#讀取內容
7665
					$result["content"]["stderr"]=stream_get_contents($result["content"]["stderr"]);
7665
					$result["content"]["stderr"]=stream_get_contents($result["content"]["stderr"]);
7666
					
7666
 
7667
					}#if end
7667
					}#if end
7668
			
7668
 
7669
				#跳出 while
7669
				#跳出 while
7670
				break;
7670
				break;
7671
			
7671
 
7672
				}#if end
7672
				}#if end
7673
			
7673
 
7674
			#休息1秒
7674
			#休息1秒
7675
			sleep(1);
7675
			sleep(1);
7676
			
7676
 
7677
			}#while end
7677
			}#while end
7678
		
7678
 
7679
		#如果socket存在
7679
		#如果socket存在
7680
		if(file_exists($tmpUnixDomainSock)){
7680
		if(file_exists($tmpUnixDomainSock)){
7681
		
7681
 
7682
			#移除之
7682
			#移除之
7683
			unlink($tmpUnixDomainSock);
7683
			unlink($tmpUnixDomainSock);
7684
		
7684
 
7685
			}#if end
7685
			}#if end
7686
		
7686
 
7687
		#設置執行正常
7687
		#設置執行正常
7688
		$result["status"]="true";
7688
		$result["status"]="true";
7689
		
7689
 
7690
		#回傳結果
7690
		#回傳結果
7691
		return $result;
7691
		return $result;
7692
		
7692
 
7693
		}#function runWithAutoAddMemoryDaemon end
7693
		}#function runWithAutoAddMemoryDaemon end
7694
	
7694
 
7695
	/*
7695
	/*
7696
	#函式說明:
7696
	#函式說明:
7697
	#用fwrite寫入到resource,可以指定每個寫入字串的結尾方式.
7697
	#用fwrite寫入到resource,可以指定每個寫入字串的結尾方式.
7698
	#回傳結果:
7698
	#回傳結果:
7699
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
7699
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
Line 7719... Line 7719...
7719
	#https://www.php.net/manual/en/function.fopen.php
7719
	#https://www.php.net/manual/en/function.fopen.php
7720
	#備註:
7720
	#備註:
7721
	#無.
7721
	#無.
7722
	*/
7722
	*/
7723
	public static function fwrite(&$conf=array()){
7723
	public static function fwrite(&$conf=array()){
7724
	
7724
 
7725
		#初始化要回傳的結果
7725
		#初始化要回傳的結果
7726
		$result=array();
7726
		$result=array();
7727
 
7727
 
7728
		#取得當前執行的函數名稱
7728
		#取得當前執行的函數名稱
7729
		$result["function"]=__FUNCTION__;
7729
		$result["function"]=__FUNCTION__;
7730
		
7730
 
7731
		#取得參數
7731
		#取得參數
7732
		$result["argu"]=$conf;
7732
		$result["argu"]=$conf;
7733
 
7733
 
7734
		#如果 $conf 不為陣列
7734
		#如果 $conf 不為陣列
7735
		if(gettype($conf)!="array"){
7735
		if(gettype($conf)!="array"){
Line 7750... Line 7750...
7750
 
7750
 
7751
			#回傳結果
7751
			#回傳結果
7752
			return $result;
7752
			return $result;
7753
 
7753
 
7754
			}#if end
7754
			}#if end
7755
		
7755
 
7756
		#檢查參數
7756
		#檢查參數
7757
		#函式說明:
7757
		#函式說明:
7758
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
7758
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
7759
		#回傳結果:
7759
		#回傳結果:
7760
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
7760
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
Line 7806... Line 7806...
7806
		#array_keys=>http://php.net/manual/en/function.array-keys.php
7806
		#array_keys=>http://php.net/manual/en/function.array-keys.php
7807
		#備註:
7807
		#備註:
7808
		#無.
7808
		#無.
7809
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
7809
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
7810
		unset($conf["variableCheck::checkArguments"]);
7810
		unset($conf["variableCheck::checkArguments"]);
7811
		
7811
 
7812
		#如果執行失敗
7812
		#如果執行失敗
7813
		if($checkArguments["status"]==="false"){
7813
		if($checkArguments["status"]==="false"){
7814
		
7814
 
7815
			#設置執行失敗
7815
			#設置執行失敗
7816
			$result["status"]="false";
7816
			$result["status"]="false";
7817
			
7817
 
7818
			#設置錯誤資訊
7818
			#設置錯誤資訊
7819
			$result["error"]=$checkArguments;
7819
			$result["error"]=$checkArguments;
7820
		
7820
 
7821
			#回傳結果
7821
			#回傳結果
7822
			return $result;
7822
			return $result;
7823
		
7823
 
7824
			}#if end
7824
			}#if end
7825
			
7825
 
7826
		#如果檢查不通過
7826
		#如果檢查不通過
7827
		if($checkArguments["passed"]==="false"){
7827
		if($checkArguments["passed"]==="false"){
7828
		
7828
 
7829
			#設置執行失敗
7829
			#設置執行失敗
7830
			$result["status"]="false";
7830
			$result["status"]="false";
7831
			
7831
 
7832
			#設置錯誤資訊
7832
			#設置錯誤資訊
7833
			$result["error"]=$checkArguments;
7833
			$result["error"]=$checkArguments;
7834
		
7834
 
7835
			#回傳結果
7835
			#回傳結果
7836
			return $result;
7836
			return $result;
7837
		
7837
 
7838
			}#if end
7838
			}#if end
7839
	
7839
 
7840
		#debug
7840
		#debug
7841
		#var_dump(__LINE__,$conf["stream"]);
7841
		#var_dump(__LINE__,$conf["stream"]);
7842
		
7842
 
7843
		/*
7843
		/*
7844
		
7844
 
7845
		#函式說明:
7845
		#函式說明:
7846
		#處理各種錯誤與例外.
7846
		#處理各種錯誤與例外.
7847
		#回傳結果:
7847
		#回傳結果:
7848
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
7848
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
7849
		#$result["passed"],檢查是否通過,"true"代表通過,"false"代表不通過.
7849
		#$result["passed"],檢查是否通過,"true"代表通過,"false"代表不通過.
Line 7863... Line 7863...
7863
		#無.
7863
		#無.
7864
		#備註:
7864
		#備註:
7865
		#無.
7865
		#無.
7866
		$setErrorHandler=variableCheck::setErrorHandler($conf["variableCheck::setErrorHandler"]);
7866
		$setErrorHandler=variableCheck::setErrorHandler($conf["variableCheck::setErrorHandler"]);
7867
		unset($conf["variableCheck::setErrorHandler"]);
7867
		unset($conf["variableCheck::setErrorHandler"]);
7868
		
7868
 
7869
		#如果有回傳內容
7869
		#如果有回傳內容
7870
		if($setErrorHandler!==null){
7870
		if($setErrorHandler!==null){
7871
		
7871
 
7872
			#設置執行失敗
7872
			#設置執行失敗
7873
			$result["status"]="false";
7873
			$result["status"]="false";
7874
			
7874
 
7875
			#設置錯誤資訊
7875
			#設置錯誤資訊
7876
			$result["error"]=$setErrorHandler;
7876
			$result["error"]=$setErrorHandler;
7877
		
7877
 
7878
			#回傳結果
7878
			#回傳結果
7879
			return $result;
7879
			return $result;
7880
		
7880
 
7881
			}#if end
7881
			}#if end
7882
		
7882
 
7883
		*/
7883
		*/
7884
	
7884
 
7885
		#取得 stream 狀態
7885
		#取得 stream 狀態
7886
		$stream_get_meta_data=stream_get_meta_data($conf["stream"]);
7886
		$stream_get_meta_data=stream_get_meta_data($conf["stream"]);
7887
		
7887
 
7888
		#debug
7888
		#debug
7889
		#var_dump(__LINE__,$stream_get_meta_data);
7889
		#var_dump(__LINE__,$stream_get_meta_data);
7890
		
7890
 
7891
		#如果存在 uri
7891
		#如果存在 uri
7892
		if(isset($stream_get_meta_data["uri"])){
7892
		if(isset($stream_get_meta_data["uri"])){
7893
		
7893
 
7894
			#取得能否寫入
7894
			#取得能否寫入
7895
			$is_writable=is_writable($stream_get_meta_data["uri"]);
7895
			$is_writable=is_writable($stream_get_meta_data["uri"]);
7896
		
7896
 
7897
			}#if end
7897
			}#if end
7898
			
7898
 
7899
		#反之用 mode 來判斷
7899
		#反之用 mode 來判斷
7900
		else if(isset($stream_get_meta_data["mode"])){
7900
		else if(isset($stream_get_meta_data["mode"])){
7901
		
7901
 
7902
			#函式說明:
7902
			#函式說明:
7903
			#檢查一個字串裡面是否有多個關鍵字
7903
			#檢查一個字串裡面是否有多個關鍵字
7904
			#回傳結果:
7904
			#回傳結果:
7905
			#$result["status"],"true"代表執行成功,"false"代表執行失敗.
7905
			#$result["status"],"true"代表執行成功,"false"代表執行失敗.
7906
			#$result["error"],錯誤訊息.
7906
			#$result["error"],錯誤訊息.
Line 7921... Line 7921...
7921
			#無.
7921
			#無.
7922
			#備註:
7922
			#備註:
7923
			#無.
7923
			#無.
7924
			$findManyKeyWords=search::findManyKeyWords($conf["search::findManyKeyWords"]);
7924
			$findManyKeyWords=search::findManyKeyWords($conf["search::findManyKeyWords"]);
7925
			unset($conf["search::findManyKeyWords"]);
7925
			unset($conf["search::findManyKeyWords"]);
7926
		
7926
 
7927
			#如果執行失敗
7927
			#如果執行失敗
7928
			if($findManyKeyWords["status"]==="false"){
7928
			if($findManyKeyWords["status"]==="false"){
7929
			
7929
 
7930
				#設置執行失敗
7930
				#設置執行失敗
7931
				$result["status"]="false";
7931
				$result["status"]="false";
7932
				
7932
 
7933
				#設置錯誤資訊
7933
				#設置錯誤資訊
7934
				$result["error"]=$findManyKeyWords;
7934
				$result["error"]=$findManyKeyWords;
7935
			
7935
 
7936
				#回傳結果
7936
				#回傳結果
7937
				return $result;
7937
				return $result;
7938
			
7938
 
7939
				}#if end
7939
				}#if end
7940
				
7940
 
7941
			#如果模式含有寫入的屬性
7941
			#如果模式含有寫入的屬性
7942
			if($findManyKeyWords["founded"]==="true"){
7942
			if($findManyKeyWords["founded"]==="true"){
7943
			
7943
 
7944
				#設置可以寫入
7944
				#設置可以寫入
7945
				$is_writable=true;
7945
				$is_writable=true;
7946
			
7946
 
7947
				}#if end
7947
				}#if end
7948
				
7948
 
7949
			}#else 
7949
			}#else
7950
		
7950
 
7951
		#反之需要其他判斷方式
7951
		#反之需要其他判斷方式
7952
		else{
7952
		else{
7953
		
7953
 
7954
			#設置警示訊息
7954
			#設置警示訊息
7955
			$result["warning"][]="無法判別 resource 能否寫入";
7955
			$result["warning"][]="無法判別 resource 能否寫入";
7956
			
7956
 
7957
			#設置警示訊息
7957
			#設置警示訊息
7958
			$result["warning"][]=$stream_get_meta_data;
7958
			$result["warning"][]=$stream_get_meta_data;
7959
		
7959
 
7960
			#直接放行
7960
			#直接放行
7961
			$is_writable=true;
7961
			$is_writable=true;
7962
			
7962
 
7963
			}#else end
7963
			}#else end
7964
			
7964
 
7965
		#如果不可寫入
7965
		#如果不可寫入
7966
		if($is_writable!==true){
7966
		if($is_writable!==true){
7967
		
7967
 
7968
			#設置執行失敗
7968
			#設置執行失敗
7969
			$result["status"]="false";
7969
			$result["status"]="false";
7970
			
7970
 
7971
			#設置錯誤資訊
7971
			#設置錯誤資訊
7972
			$result["error"][]="resource 無法寫入";
7972
			$result["error"][]="resource 無法寫入";
7973
			
7973
 
7974
			#設置錯誤資訊
7974
			#設置錯誤資訊
7975
			$result["error"][]=$stream_get_meta_data;
7975
			$result["error"][]=$stream_get_meta_data;
7976
			
7976
 
7977
			#設置resource不可寫入
7977
			#設置resource不可寫入
7978
			$result["is_writable"]="false";
7978
			$result["is_writable"]="false";
7979
		
7979
 
7980
			#回傳結果
7980
			#回傳結果
7981
			return $result;
7981
			return $result;
7982
		
7982
 
7983
			}#if end
7983
			}#if end
7984
		
7984
 
7985
		#設置resource可寫入
7985
		#設置resource可寫入
7986
		$result["is_writable"]="true";
7986
		$result["is_writable"]="true";
7987
		
7987
 
7988
		#判斷訊息結尾的格式
7988
		#判斷訊息結尾的格式
7989
		switch($conf["msgEndType"]){
7989
		switch($conf["msgEndType"]){
7990
		
7990
 
7991
			#如果是 "none"
7991
			#如果是 "none"
7992
			case "none":
7992
			case "none":
7993
			
7993
 
7994
				#要寫入的每個字串
7994
				#要寫入的每個字串
7995
				foreach($conf["data"] as $msg){
7995
				foreach($conf["data"] as $msg){
7996
				
7996
 
7997
					#寫入內容
7997
					#寫入內容
7998
					fwrite($conf["stream"],$msg);
7998
					fwrite($conf["stream"],$msg);
7999
					
7999
 
8000
					}#foreach end
8000
					}#foreach end
8001
			
8001
 
8002
				break;
8002
				break;
8003
				
8003
 
8004
			#如果是 "EOL"
8004
			#如果是 "EOL"
8005
			case "EOL":
8005
			case "EOL":
8006
			
8006
 
8007
				#要寫入的每個字串
8007
				#要寫入的每個字串
8008
				foreach($conf["data"] as $msg){
8008
				foreach($conf["data"] as $msg){
8009
				
8009
 
8010
					#寫入內容,用PHP_EOL結尾.
8010
					#寫入內容,用PHP_EOL結尾.
8011
					fwrite($conf["stream"],$msg.PHP_EOL);
8011
					fwrite($conf["stream"],$msg.PHP_EOL);
8012
					
8012
 
8013
					}#foreach end
8013
					}#foreach end
8014
			
8014
 
8015
				break;
8015
				break;
8016
		
8016
 
8017
			#如果是 "HTTP/1.1"
8017
			#如果是 "HTTP/1.1"
8018
			case "HTTP/1.1":
8018
			case "HTTP/1.1":
8019
			
8019
 
8020
				#如果要寫入的字串大於2段
8020
				#如果要寫入的字串大於2段
8021
				if(count($conf["data"])>2){
8021
				if(count($conf["data"])>2){
8022
				
8022
 
8023
					#設置執行失敗
8023
					#設置執行失敗
8024
					$result["status"]="false";
8024
					$result["status"]="false";
8025
					
8025
 
8026
					#設置錯誤資訊
8026
					#設置錯誤資訊
8027
					$result["error"][]="當參數 msgEndType 為 ".$conf["msgEndType"]." 時,參數 data 的數量不得超過2個.";
8027
					$result["error"][]="當參數 msgEndType 為 ".$conf["msgEndType"]." 時,參數 data 的數量不得超過2個.";
8028
					
8028
 
8029
					#設置resource不可寫入
8029
					#設置resource不可寫入
8030
					$result["is_writable"]="false";
8030
					$result["is_writable"]="false";
8031
				
8031
 
8032
					#回傳結果
8032
					#回傳結果
8033
					return $result;
8033
					return $result;
8034
				
8034
 
8035
					}#if end
8035
					}#if end
8036
			
8036
 
8037
				#要寫入的每個字串
8037
				#要寫入的每個字串
8038
				foreach($conf["data"] as $msg){
8038
				foreach($conf["data"] as $msg){
8039
				
8039
 
8040
					#寫入 header/body
8040
					#寫入 header/body
8041
					fwrite($conf["stream"],$msg.PHP_EOL.PHP_EOL);
8041
					fwrite($conf["stream"],$msg.PHP_EOL.PHP_EOL);
8042
					
8042
 
8043
					}#foreach end
8043
					}#foreach end
8044
			
8044
 
8045
				#跳出switch
8045
				#跳出switch
8046
				break;
8046
				break;
8047
				
8047
 
8048
			#非預期的類型
8048
			#非預期的類型
8049
			default:
8049
			default:
8050
			
8050
 
8051
				#設置執行失敗
8051
				#設置執行失敗
8052
				$result["status"]="false";
8052
				$result["status"]="false";
8053
					
8053
 
8054
				#設置錯誤資訊
8054
				#設置錯誤資訊
8055
				$result["error"][]="unsupported msgEndType ".$conf["msgEndType"];
8055
				$result["error"][]="unsupported msgEndType ".$conf["msgEndType"];
8056
				
8056
 
8057
				#回傳結果
8057
				#回傳結果
8058
				return $result;
8058
				return $result;
8059
				
8059
 
8060
			}#switch end
8060
			}#switch end
8061
			
8061
 
8062
		#若要關閉resource
8062
		#若要關閉resource
8063
		if($conf["autoClose"]==="true"){
8063
		if($conf["autoClose"]==="true"){
8064
		
8064
 
8065
			#關閉resouce.
8065
			#關閉resouce.
8066
			fclose($conf["stream"]);
8066
			fclose($conf["stream"]);
8067
		
8067
 
8068
			}#if end
8068
			}#if end
8069
			
8069
 
8070
		#設置執行正常
8070
		#設置執行正常
8071
		$result["status"]="true";
8071
		$result["status"]="true";
8072
		
8072
 
8073
		#回傳結果
8073
		#回傳結果
8074
		return $result;
8074
		return $result;
8075
	
8075
 
8076
		}#function fwrite end
8076
		}#function fwrite end
8077
	
8077
 
8078
	}#class sock end
8078
	}#class sock end
8079
 
8079
 
8080
?>
8080
?>