Subversion Repositories php-qbpwcf

Rev

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