Subversion Repositories php-qbpwcf

Rev

Rev 341 | Rev 368 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
306 liveuser 1
<?php
2
 
3
/*
4
 
5
	QBPWCF, Quick Build PHP website Component base on Fedora Linux.
6
    Copyright (C) 2014~2026 MIN ZHI, CHEN
7
 
8
    This file is part of QBPWCF.
9
 
10
    QBPWCF is free software: you can redistribute it and/or modify
11
    it under the terms of the GNU General Public License as published by
12
    the Free Software Foundation, either version 3 of the License, or
13
    (at your option) any later version.
14
 
15
    QBPWCF is distributed in the hope that it will be useful,
16
    but WITHOUT ANY WARRANTY; without even the implied warranty of
17
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
    GNU General Public License for more details.
19
 
20
    You should have received a copy of the GNU General Public License
21
    along with QBPWCF.  If not, see <http://www.gnu.org/licenses/>.
22
 
23
*/
24
namespace qbpwcf;
25
 
327 liveuser 26
/*
27
類別說明:
28
提供資料與具備揮發性的物件、資源管理,讓不同程序與程式甚至不同語言都能夠共享資源.
29
備註:
30
無.
31
*/
306 liveuser 32
class resource{
33
 
34
	/*
35
	#函式說明:
36
	#當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.
37
	#回傳結果:
38
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
39
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
40
	#$result["function"],當前執行的函式名稱.
41
	#必填參數:
42
	#$method,物件,為物件實體或類別名稱,會自動置入該參數.
43
	#$arguments,陣列,為呼叫方法時所用的參數.
44
	#可省略參數:
45
	#無.
46
	#參考資料:
47
	#__call=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic
48
	#備註:
327 liveuser 49
	#無.
306 liveuser 50
	*/
51
	public function __call($method,$arguments){
52
 
53
		#取得當前執行的函式
54
		$result["function"]=__FUNCTION__;
55
 
56
		#設置執行不正常
57
		$result["status"]="false";
58
 
59
		#設置執行錯誤
60
		$result["error"][]=__NAMESPACE__ ."/".$method."() 不存在!";
61
 
62
		#設置所丟入的參數
63
		$result["error"][]=$arguments;
64
 
65
		#回傳結果
66
		return $result;
67
 
68
		}#function __call end
69
 
70
	/*
71
	#函式說明:
72
	#當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.
73
	#回傳結果:
74
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
75
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
76
	#$result["function"],當前執行的函式名稱.
77
	#必填參數:
78
	#$method,物件,為物件實體或類別名稱,會自動置入該參數.
79
	#$arguments,陣列,為呼叫方法時所用的參數.
80
	#可省略參數:
81
	#無.
82
	#參考資料:
83
	#__callStatic=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic
84
	#備註:
327 liveuser 85
	#無.
306 liveuser 86
	*/
87
	public static function __callStatic($method,$arguments){
88
 
89
		#取得當前執行的函式
90
		$result["function"]=__FUNCTION__;
91
 
92
		#設置執行不正常
93
		$result["status"]="false";
94
 
95
		#設置執行錯誤
96
		$result["error"][]="欲呼叫的". __NAMESPACE__ ."/".$method."() 不存在!";
97
 
98
		#設置所丟入的參數
99
		$result["error"][]=$arguments;
100
 
101
		#回傳結果
102
		return $result;
103
 
104
		}#function __callStatic end
105
 
106
	/*
107
	#函式說明:
327 liveuser 108
	#建立快取服務.實質上為unix domain socket server.
109
	#回傳結果:
110
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
111
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
112
	#$result["function"],當前執行的函式名稱.
113
	#$result["argu"],所使用的參數.
306 liveuser 114
	#必填參數:
327 liveuser 115
	#無.
116
	#可省略參數:
117
	#$conf["sock"],字串,unix domain socket的路徑與名稱,預設為相對於當前套件的 var/qbpwcf/resource.sock
118
	#$conf["sock"]="";
119
	#$conf["debug"],字串,"true"代表要啟用debug模式;反之預設為"false"不啟用.
120
	#$conf["debug"]="";
339 liveuser 121
	#$conf["addOnProcessFunc"],陣列,收到訊息後,要依順執行的函式,預設為array("\qbpwcf\resource::addOnProcessFunc").
327 liveuser 122
	#$conf["addOnProcessFunc"]=array();
339 liveuser 123
	#$conf["funcToRunWhenIdle"],陣列,閒置時要依序執行的函式,預設為array("/qbpwcf/resource::funcToRunWhenIdle");
327 liveuser 124
	#$conf["funcToRunWhenIdle"]=array();
339 liveuser 125
	#$conf["deafaultLifeTime"],字串,資源沒被使用時,預設的存留時間秒數,預設為"300".
126
	#$conf["deafaultLifeTime"]="300";
306 liveuser 127
	#參考資料:
327 liveuser 128
	#無.
306 liveuser 129
	#備註:
327 liveuser 130
	#僅能在命令列環境下運行.
306 liveuser 131
	*/
132
	public static function server(&$conf){
133
 
134
		#初始化要回傳的結果
135
		$result=array();
136
 
137
		#取得當前執行的函數名稱
138
		$result["function"]=__FUNCTION__;
139
 
140
		#如果沒有參數
141
		if(func_num_args()==0){
142
 
143
			#設置執行失敗
144
			$result["status"]="false";
145
 
146
			#設置執行錯誤訊息
147
			$result["error"]="函數".$result["function"]."需要參數";
148
 
149
			#回傳結果
150
			return $result;
151
 
152
			}#if end
153
 
154
		#涵式說明:
155
		#判斷當前環境為web還是cmd
156
		#回傳結果:
157
		#$result,"web"或"cmd"
158
		if(csInformation::getEnv()==="web"){
159
 
160
			#設置執行失敗
161
			$result["status"]="false";
162
 
163
			#設置執行錯誤訊息
164
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
165
 
166
			#回傳結果
167
			return $result;
168
 
169
			}#if end
327 liveuser 170
 
306 liveuser 171
		#取得參數
172
		$result["argu"]=$conf;
173
 
174
		#如果 $conf 不為陣列
175
		if(gettype($conf)!=="array"){
176
 
177
			#設置執行失敗
178
			$result["status"]="false";
179
 
180
			#設置執行錯誤訊息
181
			$result["error"][]="\$conf變數須為陣列形態";
182
 
183
			#如果傳入的參數為 null
184
			if(is_null($conf)){
185
 
186
				#設置執行錯誤訊息
187
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
188
 
189
				}#if end
190
 
191
			#回傳結果
192
			return $result;
193
 
194
			}#if end
327 liveuser 195
 
306 liveuser 196
		#預設的 unix domain socket addr
327 liveuser 197
		$sock=pathinfo(__FILE__)["dirname"]."/../../var/qbpwcf/resource.sock";
198
 
306 liveuser 199
		#檢查參數
200
		#函式說明:
201
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
202
		#回傳結果:
203
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
204
		#$result["error"],執行不正常結束的錯訊息陣列.
205
		#$result["simpleError"],簡單表示的錯誤訊息.
206
		#$result["function"],當前執行的函式名稱.
207
		#$result["argu"],設置給予的參數.
208
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
209
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
210
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
211
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
212
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
213
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
214
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
215
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
216
		#必填參數:
217
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
218
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
219
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
339 liveuser 220
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
306 liveuser 221
		#可省略參數:
222
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
327 liveuser 223
		#$conf["mustBeFilledVariableName"]=array();
306 liveuser 224
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".
327 liveuser 225
		#$conf["mustBeFilledVariableType"]=array();
306 liveuser 226
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
227
		#$conf["canBeEmptyString"]="false";
228
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
229
		#$conf["canNotBeEmpty"]=array();
230
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
231
		#$conf["canBeEmpty"]=array();
232
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
339 liveuser 233
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("sock","deafaultLifeTime");
306 liveuser 234
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
339 liveuser 235
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("sock","deafaultLifeTime");
306 liveuser 236
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
339 liveuser 237
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string");
306 liveuser 238
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
339 liveuser 239
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array($sock,"300");
306 liveuser 240
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
241
		#$conf["disallowAllSkipableVarIsEmpty"]="";
242
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
243
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
244
		#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
327 liveuser 245
		#$conf["disallowAllSkipableVarNotExist"]="";
306 liveuser 246
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
247
		#$conf["arrayCountEqualCheck"][]=array();
248
		#參考資料:
249
		#array_keys=>http://php.net/manual/en/function.array-keys.php
250
		#備註:
251
		#無.
252
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
253
		unset($conf["variableCheck::checkArguments"]);
327 liveuser 254
 
306 liveuser 255
		#如果執行異常
256
		if($checkArguments["status"]==="false"){
327 liveuser 257
 
258
			#設置執行異常識別
259
			$result["status"]="false";
260
 
261
			#設置執行錯誤
262
			$result["error"]=$checkArguments;
263
 
264
			#回傳結果
265
			return $result;
266
 
267
			}#if end
268
 
269
		#初始化要儲存快取資料的變數
270
		$resource=array();
339 liveuser 271
 
272
		/*
273
		$resource 結構
274
		$resource[$uuid]["value"],資源的內容.
275
		$resource[$uuid]["type"],資源的類型,有php_variable跟proc.
276
		$resource[$uuid]["life"],資源的壽命,單位為秒數.
277
		*/
327 liveuser 278
 
279
		#函式說明:
280
		#建立 unix domain socket server, 僅提供具備檔案存取權限的用戶使用,預設提供可以下達任何指令的功能.
281
		#回傳結果:
282
		#$result["status"],"true"代表執行正常;"false"代表執行不正常.
283
		#$result["error"],錯誤訊息陣列.
284
		#$result["function"],當前執行的函式名稱.
285
		#$result["serverCache"],函式結束前,儲存在serverCache的內容,若有元素"exit"存在則代表是正常結束.
286
		#$result["serverCache"]["serverSide"],server side 的 cache.
287
		#$result["serverCache"]["serverSide"]["procs"], server side 的 procs cache,儲存執行的子程序資訊.
288
		#$result["serverCache"]["clientSide"],client site 的 cache.
289
		#必填參數:
290
		#$conf["sock"],字串,socket檔案要放在哪邊,名稱為何.
291
		$conf["sock::unixDomainSockServer"]["sock"]=$conf["sock"];
292
		#$conf["fileArgu"],字串,變數__FILE__的內容.
293
		$conf["sock::unixDomainSockServer"]["fileArgu"]=__FILE__;
294
		#可省略參數:
295
		#$conf["changeOwner"],字串,要將socket檔案的擁有着權限進行修改."user.group"代表擁有者帳號為user,群組為group.
296
		#$conf["changeOwner"]="";
297
		#$conf["changePermission"],字串,要將socket檔案的權限設為多少.ex: "0666"(所有帳戶都有存取的權限) 或 "0660"(僅有擁有者與群組帳戶有存取的權限) 或 "0600"(只有擁有者有權限執行).
298
		#$conf["changePermission"]="";
299
		#$conf["sessionTimeout"],字串,當連線結束後於下一次連線間隔多久就算session timeout,server端會將記錄移除,client端需要重新拿取id,預設為300秒.
300
		#$conf["sessionTimeout"]="300";
301
		#$conf["addOnProcessFunc"],字串陣列,增加用於處理 json request 的函式名稱,給予的參數為array("request"=>收到的json訊息,"sock"=>用戶的socket,"clientCache"=>給予所有用戶的cache),若收到的不是json而是"quit"則代表用戶要結束連線;若收到的是$shutdownStr則代表要結束本函式.回傳的內容必須為陣列,例如 $res["continue"]="true"代表要繼續執行下一個addOnProcessFunc;"false"代表代表到此為止. $res["content"]="replaced content";代表要將收到的訊息取代成"replaced content". 最少要有回傳 $res["status"]數值"true"代表執行正常;"false"代表執行不正常.
302
		$conf["sock::unixDomainSockServer"]["addOnProcessFunc"]=array("\qbpwcf\\resource::addOnProcessFunc");
303
		#$conf["funcToRunWhenIdle"],字串陣列,當沒有事件產生時,要執行的函式名稱,給予參數為array("client"=>所有用戶,"clientCache"=>$result["serverCache"]["clientSide"]["addOnProcessFunc"][$funcToRunWhenIdle],"serverCache"=>$result["serverCache"]["serverSide"]["funcToRunWhenIdle"][$funcToRunWhenIdle]).
304
		$conf["sock::unixDomainSockServer"]["funcToRunWhenIdle"]=array("\qbpwcf\\resource::funcToRunWhenIdle");
305
		#$conf["paramsForFuncToRunWhenIdle"],2維陣列,每個元素代表指定給予funcToRunWhenIdle參數中的指定元素的參數.
306
		#$conf["paramsForFuncToRunWhenIdle"]=array();
307
		#$conf["infoToFunction"],陣列,需要增加給addOnProcessFunc跟funcToRunWhenIdle函式的資訊,在函式中其參數的info鍵值.
339 liveuser 308
		$conf["sock::unixDomainSockServer"]["infoToFunction"]=array("resource"=>$resource,"defaultLifeTime"=>$conf["deafaultLifeTime"]);
327 liveuser 309
		#$conf["shutdownStrAddr"],字串,儲存收到用戶傳什麼樣的字串會結束本函式的檔案位置與名稱,預設為 $conf["sock"].".shutdown".
310
		#$conf["shutdownStrAddr"]="";
339 liveuser 311
		#$conf["shutdownCallback"],字串,當收到 shutdownStrAddr 參數的字串後,會先執行該函式,傳遞的參數為一陣列,key值有clientCache、serverCache、info,再結束執行,預設不使用.
312
		$conf["sock::unixDomainSockServer"]["shutdownCallback"]="\qbpwcf\\resource::closeAllResurce";
327 liveuser 313
		#參考資料:
314
		#http://php.net/manual/en/function.stream-socket-server.php
315
		#備註:
316
		#無.
317
		$unixDomainSockServer=sock::unixDomainSockServer($conf["sock::unixDomainSockServer"]);
318
		unset($conf["sock::unixDomainSockServer"]);
319
 
320
		#如果異常
321
		if($unixDomainSockServer["status"]==="false"){
322
 
323
			#設置執行異常
324
			$result["status"]="false";
325
 
326
			#設置執行錯誤訊息
327
			$result["error"]=$unixDomainSockServer;
328
 
329
			#回傳結果
330
			return $result;
331
 
332
			}#if end
333
 
334
		#設置執行正常
335
		$result["status"]="true";
336
 
337
		#回傳結果
338
		return $result;
339
 
340
		}#function server end
306 liveuser 341
 
327 liveuser 342
	/*
343
	#函式說明:
344
	#用於 server 的 addOnProcessFunc,亦即收到用戶訊息要做什麼事情.
345
	#回傳結果:
346
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
347
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
348
	#$result["function"],當前執行的函式名稱.
349
	#必填參數:
350
	#$conf["info"],陣列,資料庫資訊.
351
	$conf["info"]=array();
341 liveuser 352
	#$conf["request"],字串,收到的json訊息,其元素key值有"action"、"condition"、"value"、"type". "action"的數值有read(讀取資源)跟write(寫入資源);"condition"的數值為一陣列,若為空陣列則代表沒有條件,通常是為新增資源,元素的key為"id"者代表目標資源的id;元素的key為"value"者代表目標資源是否相等於"value",且"type"為"php_variable";元素的key為"pid"者代表運行的資源程序pid,且"type"為"proc";"value"為資源,為任意php變數;"type"有php_variable(任何php變數)跟proc(透過指令啟動,透過unix domain socket互動).
327 liveuser 353
	$conf["request"]="";
354
	#$conf["sock"],object,用戶的socket.
355
	$conf["sock"]=$object;
356
	#$conf["clientCache"],陣列,給予所有用戶的cache.
357
	$conf["clientCache"]=array();
358
	#可省略參數:
359
	#無.
360
	#參考資料:
361
	#無.
362
	#備註:
363
	#無.
364
	*/
365
	public static function addOnProcessFunc(&$conf){
366
 
367
		#初始化要回傳的結果
368
		$result=array();
369
 
370
		#取得當前執行的函數名稱
371
		$result["function"]=__FUNCTION__;
372
 
373
		#如果沒有參數
374
		if(func_num_args()==0){
375
 
306 liveuser 376
			#設置執行失敗
377
			$result["status"]="false";
378
 
379
			#設置執行錯誤訊息
327 liveuser 380
			$result["error"]="函數".$result["function"]."需要參數";
306 liveuser 381
 
382
			#回傳結果
383
			return $result;
384
 
385
			}#if end
386
 
327 liveuser 387
		#涵式說明:
388
		#判斷當前環境為web還是cmd
389
		#回傳結果:
390
		#$result,"web"或"cmd"
391
		if(csInformation::getEnv()==="web"){
392
 
306 liveuser 393
			#設置執行失敗
394
			$result["status"]="false";
395
 
396
			#設置執行錯誤訊息
327 liveuser 397
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
306 liveuser 398
 
399
			#回傳結果
400
			return $result;
401
 
402
			}#if end
403
 
327 liveuser 404
		#取得參數
405
		$result["argu"]=$conf;
406
 
407
		#如果 $conf 不為陣列
408
		if(gettype($conf)!=="array"){
409
 
410
			#設置執行失敗
411
			$result["status"]="false";
412
 
413
			#設置執行錯誤訊息
414
			$result["error"][]="\$conf變數須為陣列形態";
415
 
416
			#如果傳入的參數為 null
417
			if(is_null($conf)){
418
 
419
				#設置執行錯誤訊息
420
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
421
 
422
				}#if end
423
 
424
			#回傳結果
425
			return $result;
426
 
427
			}#if end
428
 
429
		#檢查參數
430
		#函式說明:
431
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
432
		#回傳結果:
433
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
434
		#$result["error"],執行不正常結束的錯訊息陣列.
435
		#$result["simpleError"],簡單表示的錯誤訊息.
436
		#$result["function"],當前執行的函式名稱.
437
		#$result["argu"],設置給予的參數.
438
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
439
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
440
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
441
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
442
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
443
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
444
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
445
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
446
		#必填參數:
447
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
448
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
449
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
339 liveuser 450
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
327 liveuser 451
		#可省略參數:
452
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
453
		#$conf["mustBeFilledVariableName"]=array();
454
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".
455
		#$conf["mustBeFilledVariableType"]=array();
456
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
457
		#$conf["canBeEmptyString"]="false";
458
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
459
		#$conf["canNotBeEmpty"]=array();
460
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
461
		#$conf["canBeEmpty"]=array();
462
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
463
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("info","request","sock","clientCache");
464
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
465
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("info","request","sock","clientCache");
466
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
467
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("array","object","object","array");
468
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
469
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array($sock);
470
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
471
		#$conf["disallowAllSkipableVarIsEmpty"]="";
472
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
473
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
474
		#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
475
		#$conf["disallowAllSkipableVarNotExist"]="";
476
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
477
		#$conf["arrayCountEqualCheck"][]=array();
478
		#參考資料:
479
		#array_keys=>http://php.net/manual/en/function.array-keys.php
480
		#備註:
481
		#無.
482
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
483
		unset($conf["variableCheck::checkArguments"]);
484
 
485
		#如果執行異常
486
		if($checkArguments["status"]==="false"){
487
 
488
			#設置執行異常識別
489
			$result["status"]="false";
490
 
491
			#設置執行錯誤
492
			$result["error"]=$checkArguments;
493
 
494
			#回傳結果
495
			return $result;
496
 
497
			}#if end
498
 
499
		#如果檢查不通過
500
		if($checkArguments["passed"]==="false"){
501
 
502
			#設置執行異常識別
503
			$result["status"]="false";
504
 
505
			#設置執行錯誤
506
			$result["error"]=$checkArguments;
507
 
508
			#回傳結果
509
			return $result;
510
 
511
			}#if end
339 liveuser 512
 
513
		#轉換成陣列
514
		$conf["request"]=(array)($conf["request"]);
515
 
327 liveuser 516
		#檢查參數
517
		#函式說明:
518
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
519
		#回傳結果:
520
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
521
		#$result["error"],執行不正常結束的錯訊息陣列.
522
		#$result["simpleError"],簡單表示的錯誤訊息.
523
		#$result["function"],當前執行的函式名稱.
524
		#$result["argu"],設置給予的參數.
525
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
526
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
527
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
528
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
529
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
530
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
531
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
532
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
533
		#必填參數:
534
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
339 liveuser 535
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf["request"];
327 liveuser 536
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
339 liveuser 537
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
327 liveuser 538
		#可省略參數:
539
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
540
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("action");
541
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".
542
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
543
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
544
		#$conf["canBeEmptyString"]="false";
545
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
546
		#$conf["canNotBeEmpty"]=array();
547
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
548
		#$conf["canBeEmpty"]=array();
549
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
550
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("action");
551
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
552
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("condition","value","type");
553
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
554
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("array",null,"string");
555
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
556
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(array(),null,null);
557
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
558
		#$conf["disallowAllSkipableVarIsEmpty"]="";
559
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
560
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
561
		#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
562
		#$conf["disallowAllSkipableVarNotExist"]="";
563
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
564
		#$conf["arrayCountEqualCheck"][]=array();
565
		#參考資料:
566
		#array_keys=>http://php.net/manual/en/function.array-keys.php
567
		#備註:
568
		#無.
569
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
570
		unset($conf["variableCheck::checkArguments"]);
571
 
572
		#如果執行異常
573
		if($checkArguments["status"]==="false"){
574
 
575
			#設置執行異常識別
576
			$result["status"]="false";
577
 
578
			#設置執行錯誤
579
			$result["error"]=$checkArguments;
580
 
581
			#回傳結果
582
			return $result;
583
 
584
			}#if end
585
 
586
		#如果檢查不通過
587
		if($checkArguments["passed"]==="false"){
588
 
589
			#設置執行異常識別
590
			$result["status"]="false";
591
 
592
			#設置執行錯誤
593
			$result["error"]=$checkArguments;
594
 
595
			#回傳結果
596
			return $result;
597
 
598
			}#if end
599
 
600
		#判斷 action
601
		switch($conf["request"]["action"]){
602
 
603
			#如果是要寫入
604
			case "write":
605
 
606
				#如果是空的,亦即沒有條件
607
				if(empty($conf["request"]["condition"])){
608
 
609
					#代表要新增資料
610
 
611
					#判斷類型
612
					switch($conf["request"]["type"]){
613
 
614
						#如果是 php 變數
615
						case "php_variable":
616
 
617
							#產生id
618
							#函式說明:
619
							#使用 linux 的 uuid 指令來產生 uuid 字串
620
							#回傳結果:
621
							#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
622
							#$result["error"],錯誤訊息.
623
							#$result["function"],當前執行的函式名稱.
624
							#$result["content"],uuid.
625
							#必填參數:
626
							#無.
627
							#可省略參數:
628
							#無.
629
							#參考資料:
630
							#無.
631
							#備註:
632
							#無.
633
							$uuid=cmd::uuid();
634
 
635
							#如果執行異常
636
							if($uuid["status"]==="false"){
637
 
638
								#設置執行異常識別
639
								$result["status"]="false";
640
 
641
								#設置執行錯誤
642
								$result["error"]=$uuid;
643
 
644
								#回傳結果
645
								return $result;
646
 
647
								}#if end
648
 
649
							#取得uuid
650
							$uuid=$uuid["content"];
651
 
652
							#初始化要設置的列
653
							$row=array();
654
 
655
							#設置存放的數值
656
							$row["value"]=$conf["request"]["value"];
657
 
658
							#設置形態
659
							$row["type"]=$conf["request"]["type"];
660
 
339 liveuser 661
							#若無設定 life
662
							if(!isset($conf["request"]["life"])){
663
 
664
								#設置預設的life
665
								$row["life"]=time()+$conf["info"]["defaultLifeTime"];
666
 
667
								}#if end
668
 
327 liveuser 669
							#新增資料並指定 id
670
							$conf["info"]["resource"][$uuid]=$row;
671
 
672
							#設置新增的資料
673
							$result["content"]=array("id"=>$uuid,"info"=>$row);
674
 
675
							#設置執行正常
676
							$result["status"]="true";
677
 
678
							#回傳結果
679
							return $result;
680
 
681
							#跳出 switch
682
							break 2;
683
 
684
						#若是 proc
685
						case "proc":
686
 
687
							#取得要運行的程式與參數
688
							$cmdAndArgu=$conf["request"]["value"];
689
 
690
							#函式說明:
691
							#透過proc來多執行序運作.
692
							#回傳結果:
693
							#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
694
							#$reuslt["error"],執行不正常結束的錯訊息陣列.
695
							#$result["function"],當前執行的函式名稱.
696
							#$result["argu"],使用的參數.
697
							#$result["content"],陣列,每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值,若為"?"則代表程序尚未結束,若為整數0,則代表順利執行結束,可透過proc_update函式進行資訊的更新與取得;key為"content"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.
698
							#必填參數:
699
							#$conf["cmds"],字串陣列,每個元素代表單一程序要執行的指令與參數.
700
							$conf["threads::proc"]["cmds"]=array($cmdAndArgu);
701
							#可省略參數:
702
							#$conf["wait"],字串,是否需要等待所有程序結束,預設為"true"要等待;反之為"false"不要等待.
703
							$conf["threads::proc"]["wait"]="false";
704
							#$conf["timeout"],字串陣列,每個元素代表單一程序執行的最大等待秒數,超過後將會強迫停止執行,僅當wait參數為"true"時生效.
705
							#$conf["timeout"]=array("10");
706
							#$conf["workingDir"],字串陣列,個別程式執行時的家目錄,預設不指定.
707
							#$conf["workingDir"]=array("path");
708
							#$conf["envs"],2維字串陣列,每個元素代表個別程式執行時的指定環境變數,key變數名稱;value為變數內容.預設為array("QBPWCF" => "Quick Build PHP Website Componment base on Fedora Linux");
709
							#$conf["envs"]=array(array("key"=>"value"));
710
							#$conf["executeBy"],字串陣列,每個元素代表個別指令要用什麼程式執行,預設為"bash".
711
							#$conf["executeBy"]=array("bash");
712
							#參考資料:
713
							#https://www.php.net/manual/en/function.proc-open.php
714
							#https://www.php.net/manual/en/function.proc-get-status.php
715
							#https://www.php.net/manual/en/function.proc-terminate.php
716
							#備註:
717
							#當wait參數為"true"時,會自動解析stdout與stderr,因此不用再透過 self::proc_update 來更新.
718
							#當wait參數不為"true"時,若需要取得當下的執行狀況,請使用 self::proc_update 來更新.
719
							$proc=threads::proc($conf["threads::proc"]);
720
							unset($conf["threads::proc"]);
721
 
722
							#如果執行異常
723
							if($proc["status"]==="false"){
724
 
725
								#設置跳過,不適用
726
								$result["status"]="continue";
727
 
728
								#回傳結果
729
								return $result;
730
 
731
								}#if end
732
 
733
							#函式說明:
734
							#更新透過proc執行的多程序資訊.
735
							#回傳結果:
736
							#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
737
							#$reuslt["error"],執行不正常結束的錯訊息陣列.
738
							#$result["function"],當前執行的函式名稱.
739
							#$result["argu"],使用的參數.
740
							#$result["content"],陣列,每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值,若為"?"則代表程序尚未結束,可透過proc_update函式進行資訊的更新與取得;key為"output"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.
741
							#必填參數:
742
							#$conf["procs"],陣列,運行self::proc後回傳的content.
743
							$conf["threads::proc_update"]["procs"]=$procs["content"];
744
							#可省略參數:
745
							#無.
746
							#參考資料:
747
							#無.
748
							#備註:
749
							#無.
750
							$proc_update=threads::proc_update($conf["threads::proc_update"]);
751
							unset($conf["threads::proc_update"]);
752
 
753
							#如果執行異常
754
							if($proc_update["status"]==="false"){
755
 
756
								#設置跳過,不適用
757
								$result["status"]="continue";
758
 
759
								#回傳結果
760
								return $result;
761
 
762
								}#if end
763
 
764
							#如果proc裡面的程式執行異常
765
							if($proc_update["content"]["status"]==="false"){
766
 
767
								#設置跳過,不適用
768
								$result["status"]="continue";
769
 
770
								#回傳結果
771
								return $result;
772
 
773
								}#if end
774
 
775
							#取得要儲存的php變數
339 liveuser 776
							$value=$proc_update["content"][0];
327 liveuser 777
 
778
							#產生id
779
							#函式說明:
780
							#使用 linux 的 uuid 指令來產生 uuid 字串
781
							#回傳結果:
782
							#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
783
							#$result["error"],錯誤訊息.
784
							#$result["function"],當前執行的函式名稱.
785
							#$result["content"],uuid.
786
							#必填參數:
787
							#無.
788
							#可省略參數:
789
							#無.
790
							#參考資料:
791
							#無.
792
							#備註:
793
							#無.
794
							$uuid=cmd::uuid();
795
 
796
							#如果執行異常
797
							if($uuid["status"]==="false"){
798
 
799
								#設置執行異常識別
800
								$result["status"]="false";
801
 
802
								#設置執行錯誤
803
								$result["error"]=$uuid;
804
 
805
								#回傳結果
806
								return $result;
807
 
808
								}#if end
809
 
810
							#取得uuid
811
							$uuid=$uuid["content"];
812
 
813
							#初始化要設置的列
814
							$row=array();
815
 
816
							#設置存放的數值
817
							$row["value"]=$value;
818
 
819
							#設置形態
820
							$row["type"]=$conf["request"]["type"];
821
 
822
							#新增資料並指定 id
823
							$conf["info"]["resource"][$uuid]=$row;
824
 
339 liveuser 825
							#若無設定 life
826
							if(!isset($conf["request"]["life"])){
827
 
828
								#設置預設的life
829
								$row["life"]=time()+$conf["info"]["defaultLifeTime"];
830
 
831
								}#if end
832
 
327 liveuser 833
							#設置新增的資料
834
							$result["content"]=array("id"=>$uuid,"info"=>$row);
835
 
836
							#設置執行正常
837
							$result["status"]="true";
838
 
839
							#回傳結果
840
							return $result;
841
 
842
							#跳出 switch
843
							break 2;
844
 
845
						#其他類型
846
						default: 
847
 
848
							#設置錯誤訊息
849
							$result["error"][]="unsupported type:".$conf["request"]["type"];
850
 
851
							#設置執行異常
852
							$result["status"]="false";
853
 
854
							#回傳結果
855
							return $result;
856
 
857
						}#switch end
858
 
859
					}#if end
860
 
861
				#反之有條件
862
				else{
863
 
864
					#針對每個條件
865
					foreach($conf["request"]["condition"] as $key => $val){
866
 
867
						#判斷 $key
868
						switch($key){
869
 
870
							#如果條件欄位是 id
871
							case "id":
872
 
873
								#針對每筆記錄
874
								foreach($conf["info"]["resource"] as $idInM => $valInM){
875
 
876
									#如果找到符合id的資料
877
									if($idInM===$val){
878
 
339 liveuser 879
										#取得現有資源類型
880
										$currentType=$conf["info"]["resource"][$idInM]["type"];
881
 
882
										#如果沒有指定新 type
883
										if(!isset($conf["request"]["type"])){
884
 
885
											#視為跟現有資源類型一樣
886
											$conf["request"]["type"]=$currentType;
887
 
888
											}#if end
889
 
890
										#判斷新資源類型
891
										switch($conf["request"]["type"]){
892
 
893
											#如果為 "php_variable"
894
											case "php_variable":
895
 
896
												#如果既有資源的類型為 "proc"
897
												if($currentType==="proc"){
898
 
899
													#pid
900
													#$valInM["proc_get_status"]["pid"];
901
 
902
													#關閉程序
903
													proc_close($valInM["process"]);
904
 
905
													}#if end
906
 
907
												#初始化要設置的列
908
												$row=array();
909
 
910
												#設置存放的數值
911
												$row["value"]=$conf["request"]["value"];
912
 
913
												#設置形態
914
												$row["type"]=$conf["request"]["type"];
915
 
916
												#若無設定 life
917
												if(!isset($conf["request"]["life"])){
918
 
919
													#設置預設的life
920
													$row["life"]=time()+$conf["info"]["defaultLifeTime"];
921
 
922
													}#if end
923
 
924
												#寫入資源
925
												$conf["info"]["resource"][$idInM]=$row;
926
 
927
												#跳出 switch
928
												break;
929
 
930
											#如果為 "proc"
931
											case "proc":
932
 
933
												#如果既有資源的類型為 "proc"
934
												if($currentType==="proc"){
935
 
936
													#pid
937
													#$valInM["proc_get_status"]["pid"];
938
 
939
													#關閉程序
940
													proc_close($valInM["process"]);
941
 
942
													}#if end
943
 
944
												#取得要運行的程式與參數
945
												$cmdAndArgu=$conf["request"]["value"];
946
 
947
												#函式說明:
948
												#透過proc來多執行序運作.
949
												#回傳結果:
950
												#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
951
												#$reuslt["error"],執行不正常結束的錯訊息陣列.
952
												#$result["function"],當前執行的函式名稱.
953
												#$result["argu"],使用的參數.
954
												#$result["content"],陣列,每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值,若為"?"則代表程序尚未結束,若為整數0,則代表順利執行結束,可透過proc_update函式進行資訊的更新與取得;key為"content"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.
955
												#必填參數:
956
												#$conf["cmds"],字串陣列,每個元素代表單一程序要執行的指令與參數.
957
												$conf["threads::proc"]["cmds"]=array($cmdAndArgu);
958
												#可省略參數:
959
												#$conf["wait"],字串,是否需要等待所有程序結束,預設為"true"要等待;反之為"false"不要等待.
960
												$conf["threads::proc"]["wait"]="false";
961
												#$conf["timeout"],字串陣列,每個元素代表單一程序執行的最大等待秒數,超過後將會強迫停止執行,僅當wait參數為"true"時生效.
962
												#$conf["timeout"]=array("10");
963
												#$conf["workingDir"],字串陣列,個別程式執行時的家目錄,預設不指定.
964
												#$conf["workingDir"]=array("path");
965
												#$conf["envs"],2維字串陣列,每個元素代表個別程式執行時的指定環境變數,key變數名稱;value為變數內容.預設為array("QBPWCF" => "Quick Build PHP Website Componment base on Fedora Linux");
966
												#$conf["envs"]=array(array("key"=>"value"));
967
												#$conf["executeBy"],字串陣列,每個元素代表個別指令要用什麼程式執行,預設為"bash".
968
												#$conf["executeBy"]=array("bash");
969
												#參考資料:
970
												#https://www.php.net/manual/en/function.proc-open.php
971
												#https://www.php.net/manual/en/function.proc-get-status.php
972
												#https://www.php.net/manual/en/function.proc-terminate.php
973
												#備註:
974
												#當wait參數為"true"時,會自動解析stdout與stderr,因此不用再透過 self::proc_update 來更新.
975
												#當wait參數不為"true"時,若需要取得當下的執行狀況,請使用 self::proc_update 來更新.
976
												$proc=threads::proc($conf["threads::proc"]);
977
												unset($conf["threads::proc"]);
978
 
979
												#如果執行異常
980
												if($proc["status"]==="false"){
981
 
982
													#設置跳過,不適用
983
													$result["status"]="continue";
984
 
985
													#回傳結果
986
													return $result;
987
 
988
													}#if end
989
 
990
												#函式說明:
991
												#更新透過proc執行的多程序資訊.
992
												#回傳結果:
993
												#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
994
												#$reuslt["error"],執行不正常結束的錯訊息陣列.
995
												#$result["function"],當前執行的函式名稱.
996
												#$result["argu"],使用的參數.
997
												#$result["content"],陣列,每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值,若為"?"則代表程序尚未結束,可透過proc_update函式進行資訊的更新與取得;key為"output"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.
998
												#必填參數:
999
												#$conf["procs"],陣列,運行self::proc後回傳的content.
1000
												$conf["threads::proc_update"]["procs"]=$procs["content"];
1001
												#可省略參數:
1002
												#無.
1003
												#參考資料:
1004
												#無.
1005
												#備註:
1006
												#無.
1007
												$proc_update=threads::proc_update($conf["threads::proc_update"]);
1008
												unset($conf["threads::proc_update"]);
1009
 
1010
												#如果執行異常
1011
												if($proc_update["status"]==="false"){
1012
 
1013
													#設置跳過,不適用
1014
													$result["status"]="continue";
1015
 
1016
													#回傳結果
1017
													return $result;
1018
 
1019
													}#if end
1020
 
1021
												#如果proc裡面的程式執行異常
1022
												if($proc_update["content"]["status"]==="false"){
1023
 
1024
													#設置跳過,不適用
1025
													$result["status"]="continue";
1026
 
1027
													#回傳結果
1028
													return $result;
1029
 
1030
													}#if end
1031
 
1032
												#取得要儲存的php變數
1033
												$value=$proc_update["content"][0];
1034
 
1035
												#初始化要設置的列
1036
												$row=array();
1037
 
1038
												#設置存放的數值
1039
												$row["value"]=$value;
1040
 
1041
												#設置形態
1042
												$row["type"]=$conf["request"]["type"];
1043
 
1044
												#若無設定 life
1045
												if(!isset($conf["request"]["life"])){
1046
 
1047
													#設置預設的life
1048
													$row["life"]=time()+$conf["info"]["defaultLifeTime"];
1049
 
1050
													}#if end
1051
 
1052
												#寫入資源
1053
												$conf["info"]["resource"][$idInM]=$row;
1054
 
1055
												#跳出 switch
1056
												break;
1057
 
1058
											#其他 type
1059
											default:
1060
 
1061
												#設置錯誤訊息
1062
												$result["error"][]="unsupported type:".$conf["request"]["type"];
1063
 
1064
												#設置執行異常
1065
												$result["status"]="false";
1066
 
1067
												#回傳結果
1068
												return $result;
1069
 
1070
											}#switch end
1071
 
327 liveuser 1072
										#設置結果
339 liveuser 1073
										$result["content"]=array("id"=>$idInM,"value"=>$conf["info"]["resource"][$valInM]);
327 liveuser 1074
 
1075
										#設置執行正常
1076
										$result["status"]="true";
1077
 
1078
										#回傳結果
1079
										return $result;
1080
 
1081
										}#if end
1082
 
1083
									}#foreach end
1084
 
1085
								#執行到這邊代表沒有符合條件的記錄
1086
 
1087
								#設置結果為null
1088
								$result["content"]=null;
1089
 
1090
								#設置執行正常
1091
								$result["status"]="true";
1092
 
1093
								#回傳結果
1094
								return $result;
1095
 
1096
								#跳出 switch
1097
								break;
1098
 
1099
							#如果條件欄位是 value
1100
							case "value":
1101
 
339 liveuser 1102
								#針對每筆記錄
327 liveuser 1103
								foreach($conf["info"]["resource"] as $idInM => $valInM){
1104
 
1105
									#如果不是 php_variable
1106
									if($valInM["type"]!=="php_variable"){
1107
 
1108
										#跳過之
1109
										continue;
1110
 
1111
										}#if end
1112
 
1113
									#如果找到符合value的資料
1114
									if($valInM===$val){
1115
 
339 liveuser 1116
										#如果沒有指定新 type
1117
										if(!isset($conf["request"]["type"])){
327 liveuser 1118
 
339 liveuser 1119
											#視為跟現有資源類型一樣
1120
											$conf["request"]["type"]=$currentType;
327 liveuser 1121
 
339 liveuser 1122
											}#if end
327 liveuser 1123
 
339 liveuser 1124
										#判斷新資源類型
1125
										switch($conf["request"]["type"]){
1126
 
1127
											#如果為 "php_variable"
1128
											case "php_variable":
1129
 
1130
												#如果既有資源的類型為 "proc"
1131
												if($currentType==="proc"){
1132
 
1133
													#pid
1134
													#$valInM["proc_get_status"]["pid"];
1135
 
1136
													#關閉程序
1137
													proc_close($valInM["process"]);
1138
 
1139
													}#if end
1140
 
1141
												#初始化要設置的列
1142
												$row=array();
1143
 
1144
												#設置存放的數值
1145
												$row["value"]=$conf["request"]["value"];
1146
 
1147
												#設置形態
1148
												$row["type"]=$conf["request"]["type"];
1149
 
1150
												#若無設定 life
1151
												if(!isset($conf["request"]["life"])){
1152
 
1153
													#設置預設的life
1154
													$row["life"]=time()+$conf["info"]["defaultLifeTime"];
1155
 
1156
													}#if end
1157
 
1158
												#寫入資源
1159
												$conf["info"]["resource"][$idInM]=$row;
1160
 
1161
												#跳出 switch
1162
												break;
1163
 
1164
											#如果為 "proc"
1165
											case "proc":
1166
 
1167
												#如果既有資源的類型為 "proc"
1168
												if($currentType==="proc"){
1169
 
1170
													#pid
1171
													#$valInM["proc_get_status"]["pid"];
1172
 
1173
													#關閉程序
1174
													proc_close($valInM["process"]);
1175
 
1176
													}#if end
1177
 
1178
												#取得要運行的程式與參數
1179
												$cmdAndArgu=$conf["request"]["value"];
1180
 
1181
												#函式說明:
1182
												#透過proc來多執行序運作.
1183
												#回傳結果:
1184
												#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1185
												#$reuslt["error"],執行不正常結束的錯訊息陣列.
1186
												#$result["function"],當前執行的函式名稱.
1187
												#$result["argu"],使用的參數.
1188
												#$result["content"],陣列,每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值,若為"?"則代表程序尚未結束,若為整數0,則代表順利執行結束,可透過proc_update函式進行資訊的更新與取得;key為"content"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.
1189
												#必填參數:
1190
												#$conf["cmds"],字串陣列,每個元素代表單一程序要執行的指令與參數.
1191
												$conf["threads::proc"]["cmds"]=array($cmdAndArgu);
1192
												#可省略參數:
1193
												#$conf["wait"],字串,是否需要等待所有程序結束,預設為"true"要等待;反之為"false"不要等待.
1194
												$conf["threads::proc"]["wait"]="false";
1195
												#$conf["timeout"],字串陣列,每個元素代表單一程序執行的最大等待秒數,超過後將會強迫停止執行,僅當wait參數為"true"時生效.
1196
												#$conf["timeout"]=array("10");
1197
												#$conf["workingDir"],字串陣列,個別程式執行時的家目錄,預設不指定.
1198
												#$conf["workingDir"]=array("path");
1199
												#$conf["envs"],2維字串陣列,每個元素代表個別程式執行時的指定環境變數,key變數名稱;value為變數內容.預設為array("QBPWCF" => "Quick Build PHP Website Componment base on Fedora Linux");
1200
												#$conf["envs"]=array(array("key"=>"value"));
1201
												#$conf["executeBy"],字串陣列,每個元素代表個別指令要用什麼程式執行,預設為"bash".
1202
												#$conf["executeBy"]=array("bash");
1203
												#參考資料:
1204
												#https://www.php.net/manual/en/function.proc-open.php
1205
												#https://www.php.net/manual/en/function.proc-get-status.php
1206
												#https://www.php.net/manual/en/function.proc-terminate.php
1207
												#備註:
1208
												#當wait參數為"true"時,會自動解析stdout與stderr,因此不用再透過 self::proc_update 來更新.
1209
												#當wait參數不為"true"時,若需要取得當下的執行狀況,請使用 self::proc_update 來更新.
1210
												$proc=threads::proc($conf["threads::proc"]);
1211
												unset($conf["threads::proc"]);
1212
 
1213
												#如果執行異常
1214
												if($proc["status"]==="false"){
1215
 
1216
													#設置跳過,不適用
1217
													$result["status"]="continue";
1218
 
1219
													#回傳結果
1220
													return $result;
1221
 
1222
													}#if end
1223
 
1224
												#函式說明:
1225
												#更新透過proc執行的多程序資訊.
1226
												#回傳結果:
1227
												#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1228
												#$reuslt["error"],執行不正常結束的錯訊息陣列.
1229
												#$result["function"],當前執行的函式名稱.
1230
												#$result["argu"],使用的參數.
1231
												#$result["content"],陣列,每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值,若為"?"則代表程序尚未結束,可透過proc_update函式進行資訊的更新與取得;key為"output"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.
1232
												#必填參數:
1233
												#$conf["procs"],陣列,運行self::proc後回傳的content.
1234
												$conf["threads::proc_update"]["procs"]=$procs["content"];
1235
												#可省略參數:
1236
												#無.
1237
												#參考資料:
1238
												#無.
1239
												#備註:
1240
												#無.
1241
												$proc_update=threads::proc_update($conf["threads::proc_update"]);
1242
												unset($conf["threads::proc_update"]);
1243
 
1244
												#如果執行異常
1245
												if($proc_update["status"]==="false"){
1246
 
1247
													#設置跳過,不適用
1248
													$result["status"]="continue";
1249
 
1250
													#回傳結果
1251
													return $result;
1252
 
1253
													}#if end
1254
 
1255
												#如果proc裡面的程式執行異常
1256
												if($proc_update["content"]["status"]==="false"){
1257
 
1258
													#設置跳過,不適用
1259
													$result["status"]="continue";
1260
 
1261
													#回傳結果
1262
													return $result;
1263
 
1264
													}#if end
1265
 
1266
												#取得要儲存的php變數
1267
												$value=$proc_update["content"][0];
1268
 
1269
												#初始化要設置的列
1270
												$row=array();
1271
 
1272
												#設置存放的數值
1273
												$row["value"]=$value;
1274
 
1275
												#設置形態
1276
												$row["type"]=$conf["request"]["type"];
1277
 
1278
												#若無設定 life
1279
												if(!isset($conf["request"]["life"])){
1280
 
1281
													#設置預設的life
1282
													$row["life"]=time()+$conf["info"]["defaultLifeTime"];
1283
 
1284
													}#if end
1285
 
1286
												#寫入資源
1287
												$conf["info"]["resource"][$idInM]=$row;
1288
 
1289
												#跳出 switch
1290
												break;
1291
 
1292
											#其他 type
1293
											default:
1294
 
1295
												#設置錯誤訊息
1296
												$result["error"][]="unsupported type:".$conf["request"]["type"];
1297
 
1298
												#設置執行異常
1299
												$result["status"]="false";
1300
 
1301
												#回傳結果
1302
												return $result;
1303
 
1304
											}#switch end
1305
 
327 liveuser 1306
										}#if end
1307
 
1308
									}#foreach end
1309
 
1310
								#執行到這邊代表沒有符合條件的記錄
1311
 
1312
								#設置結果為null
1313
								$result["content"]=null;
1314
 
1315
								#設置執行正常
1316
								$result["status"]="true";
1317
 
1318
								#回傳結果
1319
								return $result;
1320
 
1321
								#跳出 switch
1322
								break;
1323
 
1324
							#如果條件欄位是 pid
1325
							case "pid":
1326
 
339 liveuser 1327
								#針對每筆記錄
327 liveuser 1328
								foreach($conf["info"]["resource"] as $idInM => $valInM){
1329
 
1330
									#如果不是 proc
1331
									if($valInM["type"]!=="proc"){
1332
 
1333
										#跳過之
1334
										continue;
1335
 
1336
										}#if end
1337
 
1338
									#取得 proc 的 pid
339 liveuser 1339
									$pidInM=$valInM["proc_get_status"]["pid"];
327 liveuser 1340
 
1341
									#如果找到符合value的資料
1342
									if($pidInM===$val){
1343
 
339 liveuser 1344
										#如果沒有指定新 type
1345
										if(!isset($conf["request"]["type"])){
327 liveuser 1346
 
339 liveuser 1347
											#視為跟現有資源類型一樣
1348
											$conf["request"]["type"]=$currentType;
327 liveuser 1349
 
339 liveuser 1350
											}#if end
327 liveuser 1351
 
339 liveuser 1352
										#判斷新資源類型
1353
										switch($conf["request"]["type"]){
1354
 
1355
											#如果為 "php_variable"
1356
											case "php_variable":
1357
 
1358
												#如果既有資源的類型為 "proc"
1359
												if($currentType==="proc"){
1360
 
1361
													#pid
1362
													#$valInM["proc_get_status"]["pid"];
1363
 
1364
													#關閉程序
1365
													proc_close($valInM["process"]);
1366
 
1367
													}#if end
1368
 
1369
												#初始化要設置的列
1370
												$row=array();
1371
 
1372
												#設置存放的數值
1373
												$row["value"]=$conf["request"]["value"];
1374
 
1375
												#設置形態
1376
												$row["type"]=$conf["request"]["type"];
1377
 
1378
												#若無設定 life
1379
												if(!isset($conf["request"]["life"])){
1380
 
1381
													#設置預設的life
1382
													$row["life"]=time()+$conf["info"]["defaultLifeTime"];
1383
 
1384
													}#if end
1385
 
1386
												#寫入資源
1387
												$conf["info"]["resource"][$idInM]=$row;
1388
 
1389
												#跳出 switch
1390
												break;
1391
 
1392
											#如果為 "proc"
1393
											case "proc":
1394
 
1395
												#如果既有資源的類型為 "proc"
1396
												if($currentType==="proc"){
1397
 
1398
													#pid
1399
													#$valInM["proc_get_status"]["pid"];
1400
 
1401
													#關閉程序
1402
													proc_close($valInM["process"]);
1403
 
1404
													}#if end
1405
 
1406
												#取得要運行的程式與參數
1407
												$cmdAndArgu=$conf["request"]["value"];
1408
 
1409
												#函式說明:
1410
												#透過proc來多執行序運作.
1411
												#回傳結果:
1412
												#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1413
												#$reuslt["error"],執行不正常結束的錯訊息陣列.
1414
												#$result["function"],當前執行的函式名稱.
1415
												#$result["argu"],使用的參數.
1416
												#$result["content"],陣列,每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值,若為"?"則代表程序尚未結束,若為整數0,則代表順利執行結束,可透過proc_update函式進行資訊的更新與取得;key為"content"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.
1417
												#必填參數:
1418
												#$conf["cmds"],字串陣列,每個元素代表單一程序要執行的指令與參數.
1419
												$conf["threads::proc"]["cmds"]=array($cmdAndArgu);
1420
												#可省略參數:
1421
												#$conf["wait"],字串,是否需要等待所有程序結束,預設為"true"要等待;反之為"false"不要等待.
1422
												$conf["threads::proc"]["wait"]="false";
1423
												#$conf["timeout"],字串陣列,每個元素代表單一程序執行的最大等待秒數,超過後將會強迫停止執行,僅當wait參數為"true"時生效.
1424
												#$conf["timeout"]=array("10");
1425
												#$conf["workingDir"],字串陣列,個別程式執行時的家目錄,預設不指定.
1426
												#$conf["workingDir"]=array("path");
1427
												#$conf["envs"],2維字串陣列,每個元素代表個別程式執行時的指定環境變數,key變數名稱;value為變數內容.預設為array("QBPWCF" => "Quick Build PHP Website Componment base on Fedora Linux");
1428
												#$conf["envs"]=array(array("key"=>"value"));
1429
												#$conf["executeBy"],字串陣列,每個元素代表個別指令要用什麼程式執行,預設為"bash".
1430
												#$conf["executeBy"]=array("bash");
1431
												#參考資料:
1432
												#https://www.php.net/manual/en/function.proc-open.php
1433
												#https://www.php.net/manual/en/function.proc-get-status.php
1434
												#https://www.php.net/manual/en/function.proc-terminate.php
1435
												#備註:
1436
												#當wait參數為"true"時,會自動解析stdout與stderr,因此不用再透過 self::proc_update 來更新.
1437
												#當wait參數不為"true"時,若需要取得當下的執行狀況,請使用 self::proc_update 來更新.
1438
												$proc=threads::proc($conf["threads::proc"]);
1439
												unset($conf["threads::proc"]);
1440
 
1441
												#如果執行異常
1442
												if($proc["status"]==="false"){
1443
 
1444
													#設置跳過,不適用
1445
													$result["status"]="continue";
1446
 
1447
													#回傳結果
1448
													return $result;
1449
 
1450
													}#if end
1451
 
1452
												#函式說明:
1453
												#更新透過proc執行的多程序資訊.
1454
												#回傳結果:
1455
												#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1456
												#$reuslt["error"],執行不正常結束的錯訊息陣列.
1457
												#$result["function"],當前執行的函式名稱.
1458
												#$result["argu"],使用的參數.
1459
												#$result["content"],陣列,每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值,若為"?"則代表程序尚未結束,可透過proc_update函式進行資訊的更新與取得;key為"output"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.
1460
												#必填參數:
1461
												#$conf["procs"],陣列,運行self::proc後回傳的content.
1462
												$conf["threads::proc_update"]["procs"]=$procs["content"];
1463
												#可省略參數:
1464
												#無.
1465
												#參考資料:
1466
												#無.
1467
												#備註:
1468
												#無.
1469
												$proc_update=threads::proc_update($conf["threads::proc_update"]);
1470
												unset($conf["threads::proc_update"]);
1471
 
1472
												#如果執行異常
1473
												if($proc_update["status"]==="false"){
1474
 
1475
													#設置跳過,不適用
1476
													$result["status"]="continue";
1477
 
1478
													#回傳結果
1479
													return $result;
1480
 
1481
													}#if end
1482
 
1483
												#如果proc裡面的程式執行異常
1484
												if($proc_update["content"][0]["status"]==="false"){
1485
 
1486
													#設置跳過,不適用
1487
													$result["status"]="continue";
1488
 
1489
													#回傳結果
1490
													return $result;
1491
 
1492
													}#if end
1493
 
1494
												#取得要儲存的php變數
1495
												$value=$proc_update["content"][0];
1496
 
1497
												#初始化要設置的列
1498
												$row=array();
1499
 
1500
												#設置存放的數值
1501
												$row["value"]=$value;
1502
 
1503
												#設置形態
1504
												$row["type"]=$conf["request"]["type"];
1505
 
1506
												#若無設定 life
1507
												if(!isset($conf["request"]["life"])){
1508
 
1509
													#設置預設的life
1510
													$row["life"]=time()+$conf["info"]["defaultLifeTime"];
1511
 
1512
													}#if end
1513
 
1514
												#寫入資源
1515
												$conf["info"]["resource"][$idInM]=$row;
1516
 
1517
												#跳出 switch
1518
												break;
1519
 
1520
											#其他 type
1521
											default:
1522
 
1523
												#設置錯誤訊息
1524
												$result["error"][]="unsupported type:".$conf["request"]["type"];
1525
 
1526
												#設置執行異常
1527
												$result["status"]="false";
1528
 
1529
												#回傳結果
1530
												return $result;
1531
 
1532
											}#switch end
1533
 
327 liveuser 1534
										}#if end
1535
 
1536
									}#foreach end
1537
 
1538
								#執行到這邊代表沒有符合條件的記錄
1539
 
1540
								#設置結果為null
1541
								$result["content"]=null;
1542
 
1543
								#設置執行正常
1544
								$result["status"]="true";
1545
 
1546
								#回傳結果
1547
								return $result;
1548
 
1549
								#跳出 switch
1550
								break;
1551
 
1552
							#其他欄位
1553
							default:
1554
 
1555
								#設置錯誤訊息
1556
								$result["error"][]="unsupported column:".$key;
1557
 
1558
								#設置執行異常
1559
								$result["status"]="false";
1560
 
1561
								#回傳結果
1562
								return $result;
1563
 
1564
							}#switch end
339 liveuser 1565
 
327 liveuser 1566
						}#foreach end
1567
 
1568
					}#else end
1569
 
1570
				#結束switch
1571
				break;
1572
 
1573
			#如果是 read
1574
			case "read":
1575
 
1576
				#如果是空的,亦即沒有條件,代表要取得全部.
1577
				if(empty($conf["request"]["condition"])){
1578
 
1579
					#針對每筆記錄
1580
					foreach($conf["info"]["resource"] as $idInM => $valInM){
1581
 
1582
						#設置要取得的內容
339 liveuser 1583
						$result["content"][]=array("id"=>$idInM,"value"=>$valInM);
327 liveuser 1584
 
1585
						}#foreach end
1586
 
1587
					#設置執行正常
1588
					$result["status"]="true";
1589
 
1590
					#回傳結果
1591
					return $result;
1592
 
1593
					}#if end
1594
 
1595
				#反之有條件
1596
				else{
1597
 
1598
					#針對每個條件
1599
					foreach($conf["request"]["condition"] as $key => $val){
1600
 
1601
						#判斷 $key
1602
						switch($key){
1603
 
1604
							#如果條件欄位是 id
1605
							case "id":
1606
 
1607
								#針對每筆記錄
1608
								foreach($conf["info"]["resource"] as $idInM => $valInM){
1609
 
1610
									#如果找到符合id的資料
1611
									if($idInM===$val){
1612
 
1613
										#設置結果
339 liveuser 1614
										$result["content"][]=array("id"=>$idInM,"value"=>$valInM);
327 liveuser 1615
 
1616
										#設置執行正常
1617
										$result["status"]="true";
1618
 
1619
										#回傳結果
1620
										return $result;
1621
 
1622
										}#if end
1623
 
1624
									}#foreach end
1625
 
1626
								#執行到這邊代表沒有符合條件的記錄
1627
 
1628
								#設置結果為null
1629
								$result["content"]=null;
1630
 
1631
								#設置執行正常
1632
								$result["status"]="true";
1633
 
1634
								#回傳結果
1635
								return $result;
1636
 
1637
								#跳出 switch
1638
								break;
1639
 
1640
							#如果條件欄位是 value
1641
							case "value":
1642
 
339 liveuser 1643
								#針對每筆記錄
327 liveuser 1644
								foreach($conf["info"]["resource"] as $idInM => $valInM){
1645
 
1646
									#如果不是 php_variable
1647
									if($valInM["type"]!=="php_variable"){
1648
 
1649
										#跳過之
1650
										continue;
1651
 
1652
										}#if end
1653
 
1654
									#如果找到符合value的資料
1655
									if($valInM===$val){
1656
 
1657
										#設置結果
339 liveuser 1658
										$result["content"]=array("id"=>$idInM,"value"=>$valInM);
327 liveuser 1659
 
1660
										#設置執行結果
1661
										$result["status"]="true";
1662
 
1663
										#回傳結果
1664
										return $result;
1665
 
1666
										}#if end
1667
 
1668
									}#foreach end
1669
 
1670
								#執行到這邊代表沒有符合條件的記錄
1671
 
1672
								#設置結果為null
1673
								$result["content"]=null;
1674
 
1675
								#設置執行正常
1676
								$result["status"]="true";
1677
 
1678
								#回傳結果
1679
								return $result;
1680
 
1681
								#跳出 switch
1682
								break;
1683
 
1684
							#如果條件欄位是 pid
1685
							case "pid":
1686
 
339 liveuser 1687
								#針對每筆記錄
327 liveuser 1688
								foreach($conf["info"]["resource"] as $idInM => $valInM){
1689
 
1690
									#如果不是 proc
1691
									if($valInM["type"]!=="proc"){
1692
 
1693
										#跳過之
1694
										continue;
1695
 
1696
										}#if end
1697
 
1698
									#取得 proc 的 pid
339 liveuser 1699
									$pidInM=$valInM["proc_get_status"]["pid"];
327 liveuser 1700
 
1701
									#如果找到符合value的資料
1702
									if($pidInM===$val){
1703
 
1704
										#設置結果
339 liveuser 1705
										$result["content"]=array("id"=>$idInM,"value"=>$valInM);
327 liveuser 1706
 
1707
										#設置執行結果
1708
										$result["status"]="true";
1709
 
1710
										#回傳結果
1711
										return $result;
1712
 
1713
										}#if end
1714
 
1715
									}#foreach end
1716
 
1717
								#執行到這邊代表沒有符合條件的記錄
1718
 
1719
								#設置結果為null
1720
								$result["content"]=null;
1721
 
1722
								#設置執行正常
1723
								$result["status"]="true";
1724
 
1725
								#回傳結果
1726
								return $result;
1727
 
1728
								#跳出 switch
1729
								break;
1730
 
1731
							#其他欄位
1732
							default:
1733
 
1734
								#設置錯誤訊息
1735
								$result["error"][]="unsupported column:".$key;
1736
 
1737
								#設置執行異常
1738
								$result["status"]="false";
1739
 
1740
								#回傳結果
1741
								return $result;
1742
 
1743
							}#switch end
1744
 
1745
						}#foreach end
1746
 
1747
					}#else end
1748
 
1749
				#結束switch
1750
				break;
1751
 
1752
			#其他 action
1753
			default:
1754
 
1755
				#設置錯誤訊息
1756
				$result["error"][]="unsupported action:".$conf["request"]["action"];
1757
 
1758
				#設置執行異常
1759
				$result["status"]="false";
1760
 
1761
				#回傳結果
1762
				return $result;
1763
 
1764
			}#switch end
1765
 
1766
		#執行到這邊代表不適用
1767
 
1768
		#設置不適用,可跳過
1769
		$result["status"]="continue";
306 liveuser 1770
 
327 liveuser 1771
		#回傳結果
1772
		return $result;
1773
 
1774
		}#function addOnProcessFunc end
306 liveuser 1775
 
327 liveuser 1776
	/*
1777
	#函式說明:
1778
	#用於 server 的 funcToRunWhenIdle,亦即沒有收到訊息閒置時要做什麼事情.
1779
	#回傳結果:
1780
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1781
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
1782
	#$result["function"],當前執行的函式名稱.
1783
	#必填參數:
1784
	#$conf["info"],陣列,資料庫資訊.
1785
	$conf["info"]=array();
339 liveuser 1786
	#$conf["client"],陣列,每個用戶的socket.
1787
	$conf["client"]="";
1788
	#$conf["serverCache"],陣列,只有server可以看到的cache.
1789
	$conf["serverCache"]=array();
327 liveuser 1790
	#$conf["clientCache"],陣列,給予所有用戶的cache.
1791
	$conf["clientCache"]=array();
1792
	#可省略參數:
1793
	#無.
1794
	#參考資料:
1795
	#無.
1796
	#備註:
1797
	#無.
1798
	*/
1799
	public static function funcToRunWhenIdle(&$conf){
1800
 
339 liveuser 1801
		#初始化要回傳的結果
1802
		$result=array();
1803
 
1804
		#取得當前執行的函數名稱
1805
		$result["function"]=__FUNCTION__;
1806
 
1807
		#如果沒有參數
1808
		if(func_num_args()==0){
1809
 
1810
			#設置執行失敗
1811
			$result["status"]="false";
1812
 
1813
			#設置執行錯誤訊息
1814
			$result["error"]="函數".$result["function"]."需要參數";
1815
 
1816
			#回傳結果
1817
			return $result;
1818
 
1819
			}#if end
1820
 
1821
		#涵式說明:
1822
		#判斷當前環境為web還是cmd
1823
		#回傳結果:
1824
		#$result,"web"或"cmd"
1825
		if(csInformation::getEnv()==="web"){
1826
 
1827
			#設置執行失敗
1828
			$result["status"]="false";
1829
 
1830
			#設置執行錯誤訊息
1831
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
1832
 
1833
			#回傳結果
1834
			return $result;
1835
 
1836
			}#if end
327 liveuser 1837
 
339 liveuser 1838
		#取得參數
1839
		$result["argu"]=$conf;
1840
 
1841
		#如果 $conf 不為陣列
1842
		if(gettype($conf)!=="array"){
1843
 
1844
			#設置執行失敗
1845
			$result["status"]="false";
1846
 
1847
			#設置執行錯誤訊息
1848
			$result["error"][]="\$conf變數須為陣列形態";
1849
 
1850
			#如果傳入的參數為 null
1851
			if(is_null($conf)){
1852
 
1853
				#設置執行錯誤訊息
1854
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
1855
 
1856
				}#if end
1857
 
1858
			#回傳結果
1859
			return $result;
1860
 
1861
			}#if end
1862
 
1863
		#檢查參數
1864
		#函式說明:
1865
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
1866
		#回傳結果:
1867
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1868
		#$result["error"],執行不正常結束的錯訊息陣列.
1869
		#$result["simpleError"],簡單表示的錯誤訊息.
1870
		#$result["function"],當前執行的函式名稱.
1871
		#$result["argu"],設置給予的參數.
1872
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
1873
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
1874
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
1875
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
1876
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
1877
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
1878
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
1879
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
1880
		#必填參數:
1881
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
1882
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
1883
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
1884
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
1885
		#可省略參數:
1886
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
1887
		#$conf["mustBeFilledVariableName"]=array();
1888
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".
1889
		#$conf["mustBeFilledVariableType"]=array();
1890
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
1891
		#$conf["canBeEmptyString"]="false";
1892
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
1893
		#$conf["canNotBeEmpty"]=array();
1894
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
1895
		#$conf["canBeEmpty"]=array();
1896
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
340 liveuser 1897
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("info","serverCache","clientCache");
339 liveuser 1898
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
1899
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("info","client","serverCache","clientCache");
1900
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
1901
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("info","client","serverCache","clientCache");
1902
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
1903
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array($sock);
1904
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
1905
		#$conf["disallowAllSkipableVarIsEmpty"]="";
1906
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
1907
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
1908
		#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
1909
		#$conf["disallowAllSkipableVarNotExist"]="";
1910
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
1911
		#$conf["arrayCountEqualCheck"][]=array();
1912
		#參考資料:
1913
		#array_keys=>http://php.net/manual/en/function.array-keys.php
1914
		#備註:
1915
		#無.
1916
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
1917
		unset($conf["variableCheck::checkArguments"]);
1918
 
1919
		#如果執行異常
1920
		if($checkArguments["status"]==="false"){
1921
 
1922
			#設置執行異常識別
1923
			$result["status"]="false";
1924
 
1925
			#設置執行錯誤
1926
			$result["error"]=$checkArguments;
1927
 
1928
			#回傳結果
1929
			return $result;
1930
 
1931
			}#if end
1932
 
1933
		#如果檢查不通過
1934
		if($checkArguments["passed"]==="false"){
1935
 
1936
			#設置執行異常識別
1937
			$result["status"]="false";
1938
 
1939
			#設置執行錯誤
1940
			$result["error"]=$checkArguments;
1941
 
1942
			#回傳結果
1943
			return $result;
1944
 
1945
			}#if end
1946
 
1947
		#取得resouce的參考
1948
		$resource=&$conf["info"]["resource"];
1949
 
1950
		#針對每個資源
1951
		foreach($resource as $rid => $info){
1952
 
1953
			#檢查參數
1954
			#函式說明:
1955
			#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
1956
			#回傳結果:
1957
			#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1958
			#$result["error"],執行不正常結束的錯訊息陣列.
1959
			#$result["simpleError"],簡單表示的錯誤訊息.
1960
			#$result["function"],當前執行的函式名稱.
1961
			#$result["argu"],設置給予的參數.
1962
			#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
1963
			#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
1964
			#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
1965
			#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
1966
			#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
1967
			#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
1968
			#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
1969
			#$result["notNeedVar"],字串陣列,多餘的參數名稱.
1970
			#必填參數:
1971
			#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
1972
			$conf["variableCheck::checkArguments"]["varInput"]=$info;
1973
			#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
1974
			$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
1975
			#可省略參數:
1976
			#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
1977
			$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("value","type","life");
1978
			#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".
1979
			$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array(null,"string",integer);
1980
			#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
1981
			#$conf["canBeEmptyString"]="false";
1982
			#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
1983
			#$conf["canNotBeEmpty"]=array();
1984
			#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
1985
			#$conf["canBeEmpty"]=array();
1986
			#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
1987
			#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("action");
1988
			#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
1989
			#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("condition","value","type");
1990
			#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
1991
			#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("array",null,"string");
1992
			#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
1993
			#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(array(),null,null);
1994
			#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
1995
			#$conf["disallowAllSkipableVarIsEmpty"]="";
1996
			#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
1997
			#$conf["disallowAllSkipableVarIsEmptyArray"]="";
1998
			#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
1999
			#$conf["disallowAllSkipableVarNotExist"]="";
2000
			#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
2001
			#$conf["arrayCountEqualCheck"][]=array();
2002
			#參考資料:
2003
			#array_keys=>http://php.net/manual/en/function.array-keys.php
2004
			#備註:
2005
			#無.
2006
			$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
2007
			unset($conf["variableCheck::checkArguments"]);
2008
 
2009
			#如果執行異常
2010
			if($checkArguments["status"]==="false"){
2011
 
2012
				#設置執行異常識別
2013
				$result["status"]="false";
2014
 
2015
				#設置執行錯誤
2016
				$result["error"]=$checkArguments;
2017
 
2018
				#回傳結果
2019
				return $result;
2020
 
2021
				}#if end
2022
 
2023
			#如果檢查不通過
2024
			if($checkArguments["passed"]==="false"){
2025
 
2026
				#設置執行異常識別
2027
				$result["status"]="false";
2028
 
2029
				#設置執行錯誤
2030
				$result["error"]=$checkArguments;
2031
 
2032
				#回傳結果
2033
				return $result;
2034
 
2035
				}#if end
2036
 
2037
			#如果 life 過期
2038
			if(time()>$info["life"]){
2039
 
2040
				#如果是 php_variable 的資源
2041
				if($info["type"]==="php_variable"){
2042
 
2043
					#移除之
2044
					unset($resource[$rid]);
2045
 
2046
					}#if end
2047
 
2048
				#反之如果是 proc 的自選
2049
				else if($info["type"]==="proc"){
2050
 
2051
					#關閉之
2052
					proc_close($info["value"]);
2053
 
2054
					#移除之
2055
					unset($resource[$rid]);
2056
 
2057
					}#if end
2058
 
2059
				#反之為不應該有的類型
2060
				else{
2061
 
2062
					#設置執行異常識別
2063
					$result["status"]="false";
2064
 
2065
					#設置執行錯誤
2066
					$result["error"][]="invalid resource type:".$info["type"];
2067
 
2068
					#設置執行錯誤
2069
					$result["error"][]=$info;
2070
 
2071
					#回傳結果
2072
					return $result;
2073
 
2074
					}#else end
2075
 
2076
				}#if end
2077
 
2078
			}#foreach end
2079
 
2080
		#設置執行正常
2081
		$result["status"]="true";
327 liveuser 2082
 
339 liveuser 2083
		#回傳結果
2084
		return $result;
2085
 
2086
		}#function funcToRunWhenIdle end
2087
 
2088
	/*
2089
	#函式說明:
2090
	#給 server 結束前呼叫的 callback 函式.
2091
	#回傳結果:
2092
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2093
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
2094
	#$result["function"],當前執行的函式名稱.
2095
	#必填參數:
2096
	#$conf["info"],陣列,資料庫資訊.
2097
	$conf["info"]=array();
2098
	#$conf["serverCache"],陣列,只有server可以看到的cache.
2099
	$conf["serverCache"]=array();
2100
	#$conf["clientCache"],陣列,給予所有用戶的cache.
2101
	$conf["clientCache"]=array();
2102
	#可省略參數:
2103
	#無.
2104
	#參考資料:
2105
	#無.
2106
	#備註:
2107
	#無.
2108
	*/
2109
	public static function closeAllResurce(&$conf){
2110
 
2111
		#初始化要回傳的結果
2112
		$result=array();
327 liveuser 2113
 
339 liveuser 2114
		#取得當前執行的函數名稱
2115
		$result["function"]=__FUNCTION__;
2116
 
2117
		#如果沒有參數
2118
		if(func_num_args()==0){
2119
 
2120
			#設置執行失敗
2121
			$result["status"]="false";
2122
 
2123
			#設置執行錯誤訊息
2124
			$result["error"]="函數".$result["function"]."需要參數";
2125
 
2126
			#回傳結果
2127
			return $result;
2128
 
2129
			}#if end
2130
 
2131
		#涵式說明:
2132
		#判斷當前環境為web還是cmd
2133
		#回傳結果:
2134
		#$result,"web"或"cmd"
2135
		if(csInformation::getEnv()==="web"){
2136
 
2137
			#設置執行失敗
2138
			$result["status"]="false";
2139
 
2140
			#設置執行錯誤訊息
2141
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
2142
 
2143
			#回傳結果
2144
			return $result;
2145
 
2146
			}#if end
2147
 
2148
		#取得參數
2149
		$result["argu"]=$conf;
2150
 
2151
		#如果 $conf 不為陣列
2152
		if(gettype($conf)!=="array"){
2153
 
2154
			#設置執行失敗
2155
			$result["status"]="false";
2156
 
2157
			#設置執行錯誤訊息
2158
			$result["error"][]="\$conf變數須為陣列形態";
2159
 
2160
			#如果傳入的參數為 null
2161
			if(is_null($conf)){
2162
 
2163
				#設置執行錯誤訊息
2164
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
2165
 
2166
				}#if end
2167
 
2168
			#回傳結果
2169
			return $result;
2170
 
2171
			}#if end
2172
 
2173
		#檢查參數
2174
		#函式說明:
2175
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
2176
		#回傳結果:
2177
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2178
		#$result["error"],執行不正常結束的錯訊息陣列.
2179
		#$result["simpleError"],簡單表示的錯誤訊息.
2180
		#$result["function"],當前執行的函式名稱.
2181
		#$result["argu"],設置給予的參數.
2182
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
2183
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
2184
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
2185
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
2186
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
2187
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
2188
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
2189
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
2190
		#必填參數:
2191
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
2192
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
2193
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
2194
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
2195
		#可省略參數:
2196
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
2197
		#$conf["mustBeFilledVariableName"]=array();
2198
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".
2199
		#$conf["mustBeFilledVariableType"]=array();
2200
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
2201
		#$conf["canBeEmptyString"]="false";
2202
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
2203
		#$conf["canNotBeEmpty"]=array();
2204
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
2205
		#$conf["canBeEmpty"]=array();
2206
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
2207
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("serverCache","clientCache");
2208
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
2209
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("info","serverCache","clientCache");
2210
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
2211
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("array","array","array");
2212
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
2213
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array($sock);
2214
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
2215
		#$conf["disallowAllSkipableVarIsEmpty"]="";
2216
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
2217
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
2218
		#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
2219
		#$conf["disallowAllSkipableVarNotExist"]="";
2220
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
2221
		#$conf["arrayCountEqualCheck"][]=array();
2222
		#參考資料:
2223
		#array_keys=>http://php.net/manual/en/function.array-keys.php
2224
		#備註:
2225
		#無.
2226
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
2227
		unset($conf["variableCheck::checkArguments"]);
2228
 
2229
		#如果執行異常
2230
		if($checkArguments["status"]==="false"){
2231
 
2232
			#設置執行異常識別
2233
			$result["status"]="false";
2234
 
2235
			#設置執行錯誤
2236
			$result["error"]=$checkArguments;
2237
 
2238
			#回傳結果
2239
			return $result;
2240
 
2241
			}#if end
2242
 
2243
		#如果檢查不通過
2244
		if($checkArguments["passed"]==="false"){
2245
 
2246
			#設置執行異常識別
2247
			$result["status"]="false";
2248
 
2249
			#設置執行錯誤
2250
			$result["error"]=$checkArguments;
2251
 
2252
			#回傳結果
2253
			return $result;
2254
 
2255
			}#if end
2256
 
2257
		#針對每個資源
2258
		foreach($conf["info"]["resouce"] as $id => $resource){
2259
 
2260
			#如果是 proc 類型
2261
			if($resource["type"]==="proc"){
2262
 
2263
				#proc_close資源,避免系統出錯
2264
				proc_close($resource["value"]);
2265
 
2266
				}#if end
2267
 
2268
			}#foreach end
2269
 
2270
		}#function closeAllResurce end
341 liveuser 2271
 
2272
	/*
2273
	#函式說明:
2274
	#存取快取服務.
2275
	#回傳結果:
2276
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2277
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
2278
	#$result["function"],當前執行的函式名稱.
2279
	#$result["argu"],所使用的參數.
2280
	#$result["content"],得到的回應字串.
2281
	#必填參數:
2282
	#$conf["action"],字串,"read":代表要讀取資料;"write":代表要寫入資料.
2283
	#$conf["action"]="";
2284
	#$conf["type"],字串,"php_variable":php的變數;"proc",透過proc運行的程序,可透過標準輸入進行操作.
2285
	#$conf["type"]="";
2286
	#可省略參數:
2287
	#$conf["value"],null,"action"參數為write時,資源的內容,形態不固定.
2288
	#$conf["value"]=null;
2289
	#$conf["sock"],字串,unix domain socket的路徑與名稱,預設為相對於當前套件的 var/qbpwcf/resource.sock
2290
	#$conf["sock"]="";
2291
	#$conf["condition"],陣列,條件,預設為空陣列,代表沒有條件,通常是為新增資源,元素的key為"id"者代表目標資源的id;元素的key為"value"者代表目標資源是否相等於"value",且"type"為"php_variable";元素的key為"pid"者代表運行的資源程序pid,且"type"為"proc"
2292
	#$conf["condition"]=array();
2293
	#參考資料:
2294
	#無.
2295
	#備註:
2296
	#僅能在命令列環境下運行.
2297
	*/
2298
	public static function client(&$conf){
2299
 
2300
		#初始化要回傳的結果
2301
		$result=array();
339 liveuser 2302
 
341 liveuser 2303
		#取得當前執行的函數名稱
2304
		$result["function"]=__FUNCTION__;
2305
 
2306
		#如果沒有參數
2307
		if(func_num_args()==0){
2308
 
2309
			#設置執行失敗
2310
			$result["status"]="false";
2311
 
2312
			#設置執行錯誤訊息
2313
			$result["error"]="函數".$result["function"]."需要參數";
2314
 
2315
			#回傳結果
2316
			return $result;
2317
 
2318
			}#if end
2319
 
2320
		#涵式說明:
2321
		#判斷當前環境為web還是cmd
2322
		#回傳結果:
2323
		#$result,"web"或"cmd"
2324
		if(csInformation::getEnv()==="web"){
2325
 
2326
			#設置執行失敗
2327
			$result["status"]="false";
2328
 
2329
			#設置執行錯誤訊息
2330
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
2331
 
2332
			#回傳結果
2333
			return $result;
2334
 
2335
			}#if end
2336
 
2337
		#取得參數
2338
		$result["argu"]=$conf;
2339
 
2340
		#如果 $conf 不為陣列
2341
		if(gettype($conf)!=="array"){
2342
 
2343
			#設置執行失敗
2344
			$result["status"]="false";
2345
 
2346
			#設置執行錯誤訊息
2347
			$result["error"][]="\$conf變數須為陣列形態";
2348
 
2349
			#如果傳入的參數為 null
2350
			if(is_null($conf)){
2351
 
2352
				#設置執行錯誤訊息
2353
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
2354
 
2355
				}#if end
2356
 
2357
			#回傳結果
2358
			return $result;
2359
 
2360
			}#if end
2361
 
2362
		#預設的 unix domain socket addr
2363
		$sock=pathinfo(__FILE__)["dirname"]."/../../var/qbpwcf/resource.sock";
2364
 
2365
		#檢查參數
2366
		#函式說明:
2367
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
2368
		#回傳結果:
2369
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2370
		#$result["error"],執行不正常結束的錯訊息陣列.
2371
		#$result["simpleError"],簡單表示的錯誤訊息.
2372
		#$result["function"],當前執行的函式名稱.
2373
		#$result["argu"],設置給予的參數.
2374
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
2375
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
2376
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
2377
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
2378
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
2379
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
2380
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
2381
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
2382
		#必填參數:
2383
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
2384
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
2385
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
2386
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
2387
		#可省略參數:
2388
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
2389
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("action","type");
2390
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".
2391
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string");
2392
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
2393
		#$conf["canBeEmptyString"]="false";
2394
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
2395
		#$conf["canNotBeEmpty"]=array();
2396
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
2397
		#$conf["canBeEmpty"]=array();
2398
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
2399
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("sock");
2400
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
2401
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("value","sock","condition");
2402
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
2403
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array(null,"string","array");
2404
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
2405
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null,$sock,array());
2406
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
2407
		#$conf["disallowAllSkipableVarIsEmpty"]="";
2408
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
2409
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
2410
		#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
2411
		#$conf["disallowAllSkipableVarNotExist"]="";
2412
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
2413
		#$conf["arrayCountEqualCheck"][]=array();
2414
		#參考資料:
2415
		#array_keys=>http://php.net/manual/en/function.array-keys.php
2416
		#備註:
2417
		#無.
2418
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
2419
		unset($conf["variableCheck::checkArguments"]);
2420
 
2421
		#如果執行異常
2422
		if($checkArguments["status"]==="false"){
2423
 
2424
			#設置執行異常識別
2425
			$result["status"]="false";
2426
 
2427
			#設置執行錯誤
2428
			$result["error"]=$checkArguments;
2429
 
2430
			#回傳結果
2431
			return $result;
2432
 
2433
			}#if end
2434
 
2435
		#如果檢查不通過
2436
		if($checkArguments["passed"]==="false"){
2437
 
2438
			#設置執行異常識別
2439
			$result["status"]="false";
2440
 
2441
			#設置執行錯誤
2442
			$result["error"]=$checkArguments;
2443
 
2444
			#回傳結果
2445
			return $result;
2446
 
2447
			}#if end
2448
 
2449
		#初始化要傳遞的內容
2450
		$request=array();
2451
 
2452
		#設置action
2453
		$request["action"]=$conf["action"];
2454
 
2455
		#設置type
2456
		$request["type"]=$conf["type"];
2457
 
2458
		#如果有 $conf["value"] 參數
2459
		if(isset($conf["value"])){
2460
 
2461
			#設置value
2462
			$request["value"]=$conf["value"];
2463
 
2464
			}#if end
2465
 
2466
		#設置 condition
2467
		$request["condition"]=$conf["condition"];
2468
 
2469
		#連線到 unix domain socket,傳遞訊息,取得回應.
2470
		#連線到 sock::unixDomainSocketServer 產生的  unix domain socket,傳送指定的訊息.
2471
		#回傳結果:
2472
		#$result["status"],"true"代表執行正常;"false"代表執行不正常.
2473
		#$result["error"],錯誤訊息陣列.
2474
		#$result["function"],當前執行的函式名稱.
2475
		#$result["argu"],使用的參數.
2476
		#$result["content"],得到的回應.
2477
		#必填參數:
2478
		#$conf["msg"],陣列,要傳送的訊息,其主$conf["msg"]["id"],是無法指定的.
2479
		$conf["sock::sendAnyMsgToQBPWCFunixSocket"]["msg"]=$request;
2480
		#可省略參數:
2481
		#$conf["sock"],字串,要連線的 usr/bin/qbpwcf-sock.php 所產生的 unix domain socket 路徑與名稱,預設為 qbpwcf_usock_path.
2482
		$conf["sock::sendAnyMsgToQBPWCFunixSocket"]["sock"]=$conf["sock"];
2483
		#參考資料:
2484
		#無.
2485
		#備註:
2486
		#無.
2487
		$sendAnyMsgToQBPWCFunixSocket=sock::sendAnyMsgToQBPWCFunixSocket($conf["sock::sendAnyMsgToQBPWCFunixSocket"]);
2488
		unset($conf["sock::sendAnyMsgToQBPWCFunixSocket"]);
2489
 
2490
		#如果執行異常
2491
		if($sendAnyMsgToQBPWCFunixSocket["status"]==="false"){
2492
 
2493
			#設置執行異常識別
2494
			$result["status"]="false";
2495
 
2496
			#設置執行錯誤
2497
			$result["error"]=$sendAnyMsgToQBPWCFunixSocket;
2498
 
2499
			#回傳結果
2500
			return $result;
2501
 
2502
			}#if end
2503
 
2504
		#設置得到的回應
2505
		$result["content"]=$sendAnyMsgToQBPWCFunixSocket["content"];
2506
 
2507
		#設置執行正常
2508
		$result["status"]="true";
2509
 
2510
		#回傳結果
2511
		return $result;
2512
 
2513
		}#function client end
2514
 
327 liveuser 2515
	}#classs refedosource end