Subversion Repositories php-qbpwcf

Rev

Rev 226 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
3 liveuser 1
<?php
2
 
3
/*
4
 
5
	QBPWCF, Quick Build PHP website Component base on Fedora Linux.
6
    Copyright (C) 2015~2025 Min-Jhin,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
 
26
/*
27
類別說明:
28
用於改變php執行環境的類別.
29
備註:
30
無.
31
*/
32
class config{
33
 
34
	/*
35
	#函式說明:
36
	#當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.
37
	#回傳結果:
38
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
39
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
40
	#$result["function"],當前執行的函式名稱.
41
	#必填參數:
42
	#$method,物件,為物件實體或類別名稱,會自動置入該參數.
43
	#$arguments,陣列,為呼叫方法時所用的參數.
44
	#參考資料:
45
	#__call=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic
46
	*/
47
	public function __call($method,$arguments){
48
 
49
		#取得當前執行的函式
50
		$result["function"]=__FUNCTION__;
51
 
52
		#設置執行不正常
53
		$result["status"]="false";
54
 
55
		#設置執行錯誤
56
		$result["error"][]=__NAMESPACE__ ."/".$method."() 不存在!";
57
 
58
		#設置所丟入的參數
59
		$result["error"][]=$arguments;
60
 
61
		#回傳結果
62
		return $result;
63
 
64
		}#function __call end
65
 
66
	/*
67
	#函式說明:
68
	#當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.
69
	#回傳結果:
70
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
71
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
72
	#$result["function"],當前執行的函式名稱.
73
	#必填參數:
74
	#$method,物件,為物件實體或類別名稱,會自動置入該參數.
75
	#$arguments,陣列,為呼叫方法時所用的參數.
76
	#參考資料:
77
	#__call=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic
78
	*/
79
	public static function __callStatic($method,$arguments){
80
 
81
		#取得當前執行的函式
82
		$result["function"]=__FUNCTION__;
83
 
84
		#設置執行不正常
85
		$result["status"]="false";
86
 
87
		#設置執行錯誤
88
		$result["error"][]="欲呼叫的". __NAMESPACE__ ."/".$method."() 不存在!";
89
 
90
		#設置所丟入的參數
91
		$result["error"][]=$arguments;
92
 
93
		#回傳結果
94
		return $result;
95
 
96
		}#function __callStatic end
97
 
98
	/*
99
	#函式說明:
100
	#延長php的執行時間,每呼叫一次會初始化執行時間爲0,然後設定下次可以執行多久.
101
	#回傳結果:
102
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
103
	#$result["error"],錯誤訊息陣列.
104
	#$result["function"],當前執行的函數名稱.
105
	#必填參數:
106
	#$conf["sec"],整數,要延長多少執行時間,單位爲秒
107
	$conf["sec"]=30;
108
	#可省略參數:
109
	#無.
110
	#備註:
111
	#無.
112
	#參考資料:
113
	#http://php.net/manual/en/function.set-time-limit.php
114
	*/
115
	public static function delayRunTimeExectionMax(&$conf){
116
 
117
		#初始化要回傳的內容
118
		$result=array();
119
 
120
		#記錄當前執行的函數名稱
121
		$result["function"]=__FUNCTION__;
122
 
123
		#如果 $conf 不為陣列
124
		if(gettype($conf)!="array"){
125
 
126
			#設置執行失敗
127
			$result["status"]="false";
128
 
129
			#設置執行錯誤訊息
130
			$result["error"][]="\$conf變數須為陣列形態";
131
 
132
			#如果傳入的參數為 null
133
			if($conf==null){
134
 
135
				#設置執行錯誤訊息
136
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
137
 
138
				}#if end
139
 
140
			#回傳結果
141
			return $result;
142
 
143
			}#if end
144
 
145
		#檢查參數
146
		#函式說明:
147
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
148
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
149
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
150
		#$result["function"],當前執行的函式名稱.
151
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
152
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
153
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
154
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
155
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
156
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
157
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
158
		#必填寫的參數:
159
		#$conf["variableCheck::checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
160
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
161
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
162
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("sec");
163
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); 
164
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("integer");
165
		#$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
166
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
167
		#可以省略的參數:
168
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
169
		$conf["variableCheck::checkArguments"]["variableCheck::checkArguments"]["canBeEmptyString"]="false";
170
		#$conf["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
171
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("asc");
172
		#$conf["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
173
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
174
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
175
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("false");
176
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
177
		#$conf["arrayCountEqualCheck"][]=array();
178
		#參考資料來源:
179
		#array_keys=>http://php.net/manual/en/function.array-keys.php
180
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
181
		unset($conf["variableCheck::checkArguments"]);
182
 
183
		#如果檢查參數失敗
184
		if($checkArguments["status"]=="false"){
185
 
186
			#設置執行失敗
187
			$result["status"]="false";
188
 
189
			#設置執行錯誤訊息
190
			$result["error"]=$checkArguments;
191
 
192
			#回傳結果
193
			return $result;
194
 
195
			}#if end
196
 
197
		#如果檢查不通過
198
		if($checkArguments["passed"]=="false"){
199
 
200
			#設置執行失敗
201
			$result["status"]="false";
202
 
203
			#設置執行錯誤訊息
204
			$result["error"]=$checkArguments;
205
 
206
			#回傳結果
207
			return $result;
208
 
209
			}#if end
210
 
211
		#初始化執行時間爲0,然後再延長$conf["sec"] 秒
212
		$setupResult=set_time_limit($conf["sec"]);
213
 
214
		#如果爲 FALSE
215
		if($setupResult==FALSE){
216
 
217
			#設置執行不正常
218
			$result["status"]="false";
219
 
220
			#設置執行錯誤訊息
221
			$result["error"]="初始與重置執行時間上限失敗";
222
 
223
			#回傳結果
224
			return $result;
225
 
226
			}#if end
227
 
228
		#執行到這邊代表執行正常
229
		$result["status"]="true";
230
 
231
		#回傳結果
232
		return $result;
233
 
234
		}#function delayRunTimeExectionMax end
235
 
236
	/*
237
	#函式說明:
238
	#顯示目前的php設定值
239
	#回傳的結果:
240
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
241
	#$result["error"],錯誤訊息陣列.
242
	#$result["function"],當前執行的函數名稱.
243
	#$result["content"],常用的設定值的內容、也可指定想要看的設定值內容.
244
	#必填參數:
245
	#無.
246
	#可省略參數:
247
	#$conf["settingsName"],字串陣列,自己想要看的設定值內容,預設為array("display_errors","upload_max_filesize","post_max_size","output_buffering","session.auto_start","memory_limit").
248
	#$conf["settingsName"]=array();
249
	#$conf["showAll"],字串,是否要取得所有設定,"true"代表要,會覆寫$conf["settingsName"]的設定,"false"代表不要,預設為"fale".
250
	#$conf["showAll"]="";
251
	#參考資料:
252
	#http://www.php.net/manual/en/function.ini-get.php
253
	#http://www.php.net/manual/en/function.ini-get-all.php
254
	#備註:
255
	#無.
256
	*/
257
	public static function showSettings(&$conf){
258
 
259
		#初始化要回傳的內容
260
		$result=array();
261
 
262
		#記錄當前執行的函數名稱
263
		$result["function"]=__FUNCTION__;
264
 
265
		#如果 $conf 不為陣列
266
		if(gettype($conf)!="array"){
267
 
268
			#設置執行失敗
269
			$result["status"]="false";
270
 
271
			#設置執行錯誤訊息
272
			$result["error"][]="\$conf變數須為陣列形態";
273
 
274
			#如果傳入的參數為 null
275
			if($conf==null){
276
 
277
				#設置執行錯誤訊息
278
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
279
 
280
				}#if end
281
 
282
			#回傳結果
283
			return $result;
284
 
285
			}#if end
286
 
287
		#檢查參數
288
		#函式說明:
289
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
290
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
291
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
292
		#$result["function"],當前執行的函式名稱.
293
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
294
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
295
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
296
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
297
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
298
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
299
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
300
		#必填寫的參數:
301
		#$conf["variableCheck::checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
302
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
303
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
304
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("default");
305
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); 
306
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
307
		#$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
308
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
309
		#可以省略的參數:
310
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
311
		$conf["variableCheck::checkArguments"]["variableCheck::checkArguments"]["canBeEmptyString"]="false";
312
		#$conf["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
313
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("settingsName","showAll");
314
		#$conf["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
315
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("array","string");
316
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
317
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(array("display_errors","upload_max_filesize","post_max_size","output_buffering","session.auto_start","memory_limit"),"false");
318
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
319
		#$conf["arrayCountEqualCheck"][]=array();
320
		#參考資料來源:
321
		#array_keys=>http://php.net/manual/en/function.array-keys.php
322
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
323
		unset($conf["variableCheck::checkArguments"]);
324
 
325
		#如果檢查參數失敗
326
		if($checkArguments["status"]=="false"){
327
 
328
			#設置執行失敗
329
			$result["status"]="false";
330
 
331
			#設置執行錯誤訊息
332
			$result["error"]=$checkArguments;
333
 
334
			#回傳結果
335
			return $result;
336
 
337
			}#if end
338
 
339
		#如果檢查不通過
340
		if($checkArguments["passed"]=="false"){
341
 
342
			#設置執行失敗
343
			$result["status"]="false";
344
 
345
			#設置執行錯誤訊息
346
			$result["error"]=$checkArguments;
347
 
348
			#回傳結果
349
			return $result;
350
 
351
			}#if end
352
 
353
		#如果要顯示所有設定
354
		if($conf["showAll"]==="true"){
355
 
356
			#取得設定值
357
			$config=ini_get_all();
358
 
359
			#如果取得設定值失敗
360
			if($config==FALSE){
361
 
362
				#設置執行不正常
363
				$result["status"]="true";
364
 
365
				#設置錯誤訊息
366
				$result["error"][]="取得所有設定值失敗";		
367
 
368
				#回傳結果
369
				return $result;
370
 
371
				}#if end
372
 
373
			#反之
374
			else{
375
 
376
				#取得設定值
377
				$result["content"]=&$config;
378
 
379
				}#else end									
380
 
381
			}#if end
382
 
383
		#反之
384
		else{
385
 
386
			#針對每個要顯示的設定值
387
			foreach($conf["settingsName"] as $key=>$value){
388
 
389
				#檢查設定值
390
				$config=ini_get($value);
391
 
392
				#如果取得設定值失敗
393
				if($config==FALSE){
394
 
395
					#設置執行不正常
396
					$result["status"]="true";
397
 
398
					#設置錯誤訊息
399
					$result["error"][]="參數「".$value."」不存在";		
400
 
401
					#回傳結果
402
					return $result;
403
 
404
					}#if end
405
 
406
				#反之
407
				else{
408
 
409
					#取得設定值
410
					$result["content"][$value]=$config;
411
 
412
					}#else end
413
 
414
				}#foreach end
415
 
416
			}#else 
417
 
418
		#設置執行正常
419
		$result["status"]="true";
420
 
421
		#回傳結果
422
		return $result;
423
 
424
		}#function showSettings end
425
 
426
	/*	
427
	#函式說明:
428
	#將php設定檔常用的設定進行調整使之變成適用於開發模式、釋出模式、或自訂要調整哪些設定值
429
	#回傳結果:
430
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
431
	#$result["error"],錯誤訊息陣列.
432
	#$result["function"],當前執行的函數名稱.
433
	#必填參數:
434
	#$conf["mode"],參數設定的模式,"release"代表是指共一般使用所需;"develop"代表是在開發狀態下所需;"custom"代表自訂參數設定內容
435
	$conf["mode"]="release";
436
	#可省略參數:
437
	#$conf["customSettings"],要自訂的參數與其數值,例如array("display_errors=On").
438
	#$conf["customSettings"]=array();
439
	#參考資料:
440
	#ini_set=>http://www.php.net/manual/en/function.ini-set.php
441
	#各個參數適用的修改方式=>http://www.php.net/manual/en/ini.list.php
442
	#各個參數適用的修改方式的解說=>http://hi.baidu.com/richardali/item/d28104083c70c638a2332a60
443
	#備註:
444
	#使用該函式後,網頁會無法顯示。
445
	*/
446
	public static function changeSettings(&$conf){
447
 
448
		#初始化要回傳的結果
449
		$result=array();
450
 
451
		#儲存當前執行的函數
452
		$result["function"]=__FUNCTION__;
453
 
454
		#如果 $conf 不為陣列
455
		if(gettype($conf)!="array"){
456
 
457
			#設置執行失敗
458
			$result["status"]="false";
459
 
460
			#設置執行錯誤訊息
461
			$result["error"][]="\$conf變數須為陣列形態";
462
 
463
			#如果傳入的參數為 null
464
			if($conf==null){
465
 
466
				#設置執行錯誤訊息
467
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
468
 
469
				}#if end
470
 
471
			#回傳結果
472
			return $result;
473
 
474
			}#if end
475
 
476
		#檢查參數
477
		#函式說明:
478
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
479
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
480
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
481
		#$result["function"],當前執行的函式名稱.
482
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
483
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
484
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
485
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
486
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
487
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
488
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
489
		#必填寫的參數:
490
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
491
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
492
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
493
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("mode");
494
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); 
495
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
496
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
497
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
498
		#可以省略的參數:
499
		#$conf["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
500
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
501
		#$conf["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
502
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("customSettings");
503
		#$conf["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
504
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("array");
505
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
506
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null);
507
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
508
		#$conf["arrayCountEqualCheck"][]=array();
509
		#參考資料來源:
510
		#array_keys=>http://php.net/manual/en/function.array-keys.php
511
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
512
		unset($conf["variableCheck::checkArguments"]);
513
 
514
		#如果檢查失敗
515
		if($checkArguments["status"]=="false"){
516
 
517
			#設置錯誤識別
518
			$result["status"]="false";
519
 
520
			#設置錯誤訊息
521
			$result["error"]=$checkArguments;
522
 
523
			#回傳結果
524
			return $result;
525
 
526
			}#if end
527
 
528
		#如果檢查不通過
529
		if($checkArguments["passed"]=="false"){
530
 
531
			#設置錯誤識別
532
			$result["status"]="false";
533
 
534
			#設置錯誤訊息
535
			$result["error"]=$checkArguments;
536
 
537
			#回傳結果
538
			return $result;
539
 
540
			}#if end
541
 
542
		#依據模式來進行設定
543
		switch($conf["mode"]){
544
 
545
			#如果是給大家正式使用的狀況
546
			case "release":
547
 
548
				#設置設定值
549
 
550
				#關閉顯示錯誤訊息
551
				$conf["customSettings"][]="display_errors=Off";
552
 
553
				#初始化計數為0
554
				$count=0;
555
 
556
				#針對每個 $conf["customSettings"]
557
				foreach($conf["customSettings"] as $configStr){
558
 
559
					#用 "=" 分割設定字串
560
					#函式說明:
561
					#將固定格式的字串分開,並回傳分開的結果。
562
					#回傳的參數:
563
					#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
564
					#$result["error"],錯誤訊息陣列
565
					#$result["function"],當前執行的函數名稱.
566
					#$result["oriStr"],要分割的原始字串內容
567
					#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。
568
					#$result["dataCounts"],爲總共分成幾段
569
					#必填參數:
570
					$conf["stringProcess::spiltString"]["stringIn"]=$configStr;#要處理的字串。
571
					$conf["stringProcess::spiltString"]["spiltSymbol"]="=";#爲以哪個符號作爲分割
572
					#備註:
573
					#建議新增如果透過" "分割後的內容含有""的元素,將其移除,並將後面有內容的元素補上,key也重新排序。
574
					$spiltString=stringProcess::spiltString($conf["stringProcess::spiltString"]);
575
					unset($conf["stringProcess::spiltString"]);
576
 
577
					#如果分割設定值字串失敗
578
					if($spiltString["status"]=="false"){
579
 
580
						#設置錯誤識別
581
						$result["status"]="false";
582
 
583
						#設置錯誤訊息
584
						$result["error"]=$spiltString;
585
 
586
						#回傳結果
587
						return $result;
588
 
589
						}#if end
590
 
591
					#如果只有一段內容
592
					if($spiltString["dataCounts"]=="1"){
593
 
594
						#設置錯誤識別
595
						$result["status"]="false";
596
 
597
						#設置錯誤訊息
598
						$result["error"][]="設定值字串「".$configStr."」必須要用「=」來間隔設定屬性與其數值";
599
 
600
						#回傳結果
601
						return $result;
602
 
603
						}#if end
604
 
605
					#設定暫時的設定值
606
					$oldConfigValue=ini_set($spiltString["dataArray"][0],$spiltString["dataArray"][1]);
607
 
608
					#如果設定失敗
609
					if($oldConfigValue===false){
610
 
611
						#設置錯誤識別
612
						$result["status"]="false";
613
 
614
						#設置錯誤訊息
615
						$result["error"][]="將屬性「".$spiltString["dataArray"][0]."」設定為「".$spiltString["dataArray"][1]."」失敗";
616
 
617
						#回傳結果
618
						return $result;
619
 
620
						}#if end
621
 
622
					#反之儲存舊的永久設地數值
623
					else{
624
 
625
						#取得舊的設定值
626
						$result["config"][$count]["oldValue"]=$spiltString["dataArray"][0]."=".$oldConfigValue;
627
						$result["config"][$spiltString["dataArray"][0]]["oldValue"]=$spiltString["dataArray"][0]."=".$oldConfigValue;
628
 
629
						#取得新的設定值
630
						$result["config"][$count]["newValue"]=$spiltString["dataArray"][0]."=".$spiltString["dataArray"][1];
631
						$result["config"][$spiltString["dataArray"][0]]["newValue"]=$spiltString["dataArray"][0]."=".$spiltString["dataArray"][1];
632
 
633
						#計數加1
634
						$count++;
635
 
636
						}#else end
637
 
638
					}#foreach end
639
 
640
				#跳出switch
641
				break;
642
 
643
			#如果是開發狀態下
644
			case "develop";
645
 
646
				#設置設定值
647
 
648
				#開啟顯示錯誤訊息
649
				$conf["customSettings"][]="display_errors=On";
650
 
651
				#關閉使用記憶體的上限
652
				$conf["customSettings"][]="memory_limit=-1";
653
 
654
				#關閉php script執行的時間上限
655
				$conf["customSettings"][]="max_execution_time=0";
656
 
657
				#初始化計數為0
658
				$count=0;
659
 
660
				#針對每個 $conf["customSettings"]
661
				foreach($conf["customSettings"] as $configStr){
662
 
663
					#用 "=" 分割設定字串
664
					#函式說明:
665
					#將固定格式的字串分開,並回傳分開的結果。
666
					#回傳的參數:
667
					#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
668
					#$result["error"],錯誤訊息陣列
669
					#$result["function"],當前執行的函數名稱.
670
					#$result["oriStr"],要分割的原始字串內容
671
					#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。
672
					#$result["dataCounts"],爲總共分成幾段
673
					#必填參數:
674
					$conf["stringProcess::spiltString"]["stringIn"]=$configStr;#要處理的字串。
675
					$conf["stringProcess::spiltString"]["spiltSymbol"]="=";#爲以哪個符號作爲分割
676
					#備註:
677
					#建議新增如果透過" "分割後的內容含有""的元素,將其移除,並將後面有內容的元素補上,key也重新排序。
678
					$spiltString=stringProcess::spiltString($conf["stringProcess::spiltString"]);
679
					unset($conf["stringProcess::spiltString"]);
680
 
681
					#如果分割設定值字串失敗
682
					if($spiltString["status"]=="false"){
683
 
684
						#設置錯誤識別
685
						$result["status"]="false";
686
 
687
						#設置錯誤訊息
688
						$result["error"]=$spiltString;
689
 
690
						#回傳結果
691
						return $result;
692
 
693
						}#if end
694
 
695
					#如果只有一段內容
696
					if($spiltString["dataCounts"]=="1"){
697
 
698
						#設置錯誤識別
699
						$result["status"]="false";
700
 
701
						#設置錯誤訊息
702
						$result["error"][]="設定值字串「".$configStr."」必須要用「=」來間隔設定屬性與其數值";
703
 
704
						#回傳結果
705
						return $result;
706
 
707
						}#if end
708
 
709
					#設定暫時的設定值
710
					$oldConfigValue=ini_set($spiltString["dataArray"][0],$spiltString["dataArray"][1]);
711
 
712
					#如果設定失敗
713
					if($oldConfigValue===false){
714
 
715
						#設置錯誤識別
716
						$result["status"]="false";
717
 
718
						#設置錯誤訊息
719
						$result["error"][]="將屬性「".$spiltString["dataArray"][0]."」設定為「".$spiltString["dataArray"][1]."」失敗";
720
 
721
						#回傳結果
722
						return $result;
723
 
724
						}#if end
725
 
726
					#反之儲存舊的永久設地數值
727
					else{
728
 
729
						#取得舊的設定值
730
						$result["config"][$count]["oldValue"]=$spiltString["dataArray"][0]."=".$oldConfigValue;
731
						$result["config"][$spiltString["dataArray"][0]]["oldValue"]=$spiltString["dataArray"][0]."=".$oldConfigValue;
732
 
733
						#取得新的設定值
734
						$result["config"][$count]["newValue"]=$spiltString["dataArray"][0]."=".$spiltString["dataArray"][1];
735
						$result["config"][$spiltString["dataArray"][0]]["newValue"]=$spiltString["dataArray"][0]."=".$spiltString["dataArray"][1];
736
 
737
						#計數加1
738
						$count++;
739
 
740
						}#else end
741
 
742
					}#foreach end		
743
 
744
				#跳出switch
745
				break;
746
 
747
			#如果是自訂設定值的狀態
748
			case "custom":
749
 
750
				#初始化計數為0
751
				$count=0;
752
 
753
				#針對每個 $conf["customSettings"]
754
				foreach($conf["customSettings"] as $configStr){
755
 
756
					#用 "=" 分割設定字串
757
					#函式說明:
758
					#將固定格式的字串分開,並回傳分開的結果。
759
					#回傳的參數:
760
					#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
761
					#$result["error"],錯誤訊息陣列
762
					#$result["function"],當前執行的函數名稱.
763
					#$result["oriStr"],要分割的原始字串內容
764
					#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。
765
					#$result["dataCounts"],爲總共分成幾段
766
					#必填參數:
767
					$conf["stringProcess::spiltString"]["stringIn"]=$configStr;#要處理的字串。
768
					$conf["stringProcess::spiltString"]["spiltSymbol"]="=";#爲以哪個符號作爲分割
769
					#備註:
770
					#建議新增如果透過" "分割後的內容含有""的元素,將其移除,並將後面有內容的元素補上,key也重新排序。
771
					$spiltString=stringProcess::spiltString($conf["stringProcess::spiltString"]);
772
					unset($conf["stringProcess::spiltString"]);
773
 
774
					#如果分割設定值字串失敗
775
					if($spiltString["status"]=="false"){
776
 
777
						#設置錯誤識別
778
						$result["status"]="false";
779
 
780
						#設置錯誤訊息
781
						$result["error"]=$spiltString;
782
 
783
						#回傳結果
784
						return $result;
785
 
786
						}#if end
787
 
788
					#如果只有一段內容
789
					if($spiltString["dataCounts"]=="1"){
790
 
791
						#設置錯誤識別
792
						$result["status"]="false";
793
 
794
						#設置錯誤訊息
795
						$result["error"][]="設定值字串「".$configStr."」必須要用「=」來間隔設定屬性與其數值";
796
 
797
						#回傳結果
798
						return $result;
799
 
800
						}#if end
801
 
802
					#設定暫時的設定值
803
					$oldConfigValue=ini_set($spiltString["dataArray"][0],$spiltString["dataArray"][1]);
804
 
805
					#如果設定失敗
806
					if($oldConfigValue===false){
807
 
808
						#設置錯誤識別
809
						$result["status"]="false";
810
 
811
						#設置錯誤訊息
812
						$result["error"][]="將屬性「".$spiltString["dataArray"][0]."」設定為「".$spiltString["dataArray"][1]."」失敗";
813
 
814
						#回傳結果
815
						return $result;
816
 
817
						}#if end
818
 
819
					#反之儲存舊的永久設地數值
820
					else{
821
 
822
						#取得舊的設定值
823
						$result["config"][$count]["oldValue"]=$spiltString["dataArray"][0]."=".$oldConfigValue;
824
						$result["config"][$spiltString["dataArray"][0]]["oldValue"]=$spiltString["dataArray"][0]."=".$oldConfigValue;
825
 
826
						#取得新的設定值
827
						$result["config"][$count]["newValue"]=$spiltString["dataArray"][0]."=".$spiltString["dataArray"][1];
828
						$result["config"][$spiltString["dataArray"][0]]["newValue"]=$spiltString["dataArray"][0]."=".$spiltString["dataArray"][1];
829
 
830
						#計數加1
831
						$count++;
832
 
833
						}#else end
834
 
835
					}#foreach end
836
 
837
				#跳出switch
838
				break;
839
 
840
			#如果不是以上狀況,那就是參數錯誤	
841
			default :
842
 
843
				#設置錯誤訊息
844
				$result["error"][]="\$conf[\"mode\"]模式設定錯誤";
845
 
846
				#設置執行失敗
847
				$result["status"]="false";
848
 
849
				#回傳結果
850
				return $result;
851
 
852
			}#switch end
853
 
854
		#設置執行正常
855
		$result["status"]="true";
856
 
857
		#回傳結果
858
		return $result;
859
 
860
		}#funciton changeSettings end
861
 
862
	/*
863
	#函式說明:
864
	#依照條件增加記憶體的上限.
865
	#回傳結果:
866
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
867
	#$result["error"],錯誤訊息陣列.
868
	#$result["function"],當前執行的函數名稱.
869
	#$result["argu"],使用的參數.
870
	#$result["content"],提示訊息.
871
	#$result["stdout"],若有serverCache參數,則會回傳該項目,代表執行程式過程中的標準輸出.
872
	#$result["stderr"],若有serverCache參數,則會回傳該項目,代表執行程式過程中的非標準輸出.
873
	#$result["cache"],若有serverCache參數,則會回傳該項目,代表執行本函式程式的回傳結果.
874
	#必填參數:
875
	#無.
876
	#可省略參數:
877
	#$conf["stepAmount"],一次要增加多少上限,預設為當前環境的上限,單位位M(Mega Bytes).
878
	#$conf["stepAmount"]="";
879
	#$conf["whenAviMemLessThan"],字串整數,什麼時候要增加記憶體,預設為可用的記憶體不超過10%時,亦即10;範圍為1~50,亦即範圍為1~50%.
880
	#$conf["whenAviMemLessThan"]="10"
881
	#$conf["client"],陣列,若本函式作為 sock::unixDomainSockServer 的 funcToRunWhenIdle 參數,則此為所有用戶的資訊.
882
	#$conf["client"]=;
883
	#$conf["serverCache"],陣列,若本函式作為 sock::unixDomainSockServer 的 funcToRunWhenIdle 參數,則此為
884
	#$conf["serverCache"]=;
885
	#參考資料:
886
	#https://www.php.net/manual/en/function.memory-get-usage.php
887
	#https://www.php.net/manual/en/ini.core.php#ini.memory-limit
888
	#https://www.php.net/manual/en/function.ini-set.php
889
	#備註:
890
	#無.
891
	*/
892
	public static function autoAddMemory(&$conf=array()){
893
 
894
		#初始化要回傳的結果
895
		$result=array();
896
 
897
		#取得當前執行的函數名稱
898
		$result["function"]=__FUNCTION__;
899
 
900
		#取得參數
901
		$result["argu"]=$conf;
902
 
903
		#如果 $conf 不為陣列
904
		if(gettype($conf)!="array"){
905
 
906
			#設置執行失敗
907
			$result["status"]="false";
908
 
909
			#設置執行錯誤訊息
910
			$result["error"][]="\$conf變數須為陣列形態";
911
 
912
			#如果傳入的參數為 null
913
			if(is_null($conf)){
914
 
915
				#設置執行錯誤訊息
916
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
917
 
918
				}#if end
919
 
920
			#回傳結果
921
			return $result;
922
 
923
			}#if end
924
 
925
		#函式說明:
926
		#顯示目前的php設定值
927
		#回傳的結果:
928
		#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
929
		#$result["error"],錯誤訊息陣列.
930
		#$result["function"],當前執行的函數名稱.
931
		#$result["content"],常用的設定值的內容、也可指定想要看的設定值內容.
932
		#必填參數:
933
		#無.
934
		#可省略參數:
935
		#$conf["settingsName"],字串陣列,自己想要看的設定值內容,預設為array("display_errors","upload_max_filesize","post_max_size","output_buffering","session.auto_start","memory_limit").
936
		$conf["config::showSettings"]["settingsName"]=array("memory_limit");
937
		#$conf["showAll"],字串,是否要取得所有設定,"true"代表要,會覆寫$conf["settingsName"]的設定,"false"代表不要,預設為"fale".
938
		#$conf["showAll"]="";
939
		#參考資料:
940
		#http://www.php.net/manual/en/function.ini-get.php
941
		#http://www.php.net/manual/en/function.ini-get-all.php
942
		#備註:
943
		#無.
944
		$showSettings=config::showSettings($conf["config::showSettings"]);
945
		unset($conf["config::showSettings"]);
946
 
947
		#如果執行失敗
948
		if($showSettings["status"]==="false"){
949
 
950
			#設置執行失敗
951
			$result["status"]="false";
952
 
953
			#設置錯誤資訊
954
			$result["error"]=$showSettings;
955
 
956
			#回傳結果
957
			return $result;
958
 
959
			}#if end
960
 
961
		#取得系統設定的php記憶體上限
962
		$phpMaxMemInConfig=$showSettings["content"]["memory_limit"];
963
 
964
		#如果單位是M
965
		#函式說明:
966
		#取得符合特定字首與字尾的字串
967
		#回傳結果:
968
		#$result["status"],若爲"true"則代表執行正常;若爲"false"則代表執行失敗。
969
		#$result["function"],當前執行的函數名稱.
970
		#$result["error"],錯誤訊息陣列.
971
		#$result["founded"],若為"true"則代表有找到符合字首條件的結果;若爲"false"則代表沒有找到。
972
		#$result["content"],符合條件的字串,去掉字首字尾後的結果.
973
		#$result["returnString"],爲符合字首字、尾條件的字串內容。
974
		#$result["argu"],使用的參數.
975
		#必填參數:
976
		#$conf["checkString"],字串,要檢查的字串.
977
		$conf["stringProcess::getMeetConditionsString"]["checkString"]=$phpMaxMemInConfig;
978
		#可省略參數:
979
		#$conf["frontWord"],字串,用來檢查字首應該要有什麼字串,預設不指定.
980
		#$conf["stringProcess::getMeetConditionsString"]["frontWord"]="";
981
		#$conf["tailWord"],字串,用來檢查字尾應該要有什麼字串,預設不指定.
982
		$conf["stringProcess::getMeetConditionsString"]["tailWord"]="M";
983
		#參考資料:
984
		#str_spilt(),可以將字串依照字母分割成一個個陣列字串。
985
		#備註:
986
		#無.
987
		$getMeetConditionsString=search::getMeetConditionsString($conf["stringProcess::getMeetConditionsString"]);
988
		unset($conf["stringProcess::getMeetConditionsString"]);
989
 
990
		#如果執行失敗
991
		if($getMeetConditionsString["status"]==="false"){
992
 
993
			#設置執行失敗
994
			$result["status"]="false";
995
 
996
			#設置錯誤資訊
997
			$result["error"]=$getMeetConditionsString;
998
 
999
			#回傳結果
1000
			return $result;
1001
 
1002
			}#if end
1003
 
1004
		#如果是M結尾
1005
		if($getMeetConditionsString["founded"]==="true"){
1006
 
1007
			#轉換為bytes
1008
			$phpMaxMemInConfig=$getMeetConditionsString["content"]*1024*1024;
1009
 
1010
			}#if end
1011
 
1012
		#函式說明:
1013
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
1014
		#回傳結果:
1015
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1016
		#$result["error"],執行不正常結束的錯訊息陣列.
1017
		#$result["simpleError"],簡單表示的錯誤訊息.
1018
		#$result["function"],當前執行的函式名稱.
1019
		#$result["argu"],設置給予的參數.
1020
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
1021
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
1022
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
1023
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
1024
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
1025
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
1026
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
1027
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
1028
		#必填參數:
1029
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
1030
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
1031
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
1032
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
1033
		#可省略參數:
1034
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
1035
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("stepAmount");
1036
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
1037
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
1038
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
1039
		#$conf["canBeEmptyString"]="false";
1040
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
1041
		#$conf["canNotBeEmpty"]=array();
1042
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
1043
		#$conf["canBeEmpty"]=array();
1044
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
1045
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("stepAmount","whenAviMemLessThan");
1046
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
1047
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("stepAmount","whenAviMemLessThan","client","serverCache");
1048
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
1049
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","array","array");
1050
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
1051
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array($phpMaxMemInConfig,"10",null,null);
1052
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
1053
		#$conf["disallowAllSkipableVarIsEmpty"]="";
1054
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
1055
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
1056
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
1057
		#$conf["arrayCountEqualCheck"][]=array();
1058
		#參考資料:
1059
		#array_keys=>http://php.net/manual/en/function.array-keys.php
1060
		#備註:
1061
		#無.
1062
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
1063
		unset($conf["variableCheck::checkArguments"]);
1064
 
1065
		#如果執行失敗
1066
		if($checkArguments["status"]==="false"){
1067
 
1068
			#設置執行失敗
1069
			$result["status"]="false";
1070
 
1071
			#設置執行錯誤訊息
1072
			$result["error"]=$checkArguments;
1073
 
1074
			#回傳結果
1075
			return $result;
1076
 
1077
			}#if end
1078
 
1079
		#如果檢查不通過
1080
		if($checkArguments["passed"]==="false"){
1081
 
1082
			#設置執行失敗
1083
			$result["status"]="false";
1084
 
1085
			#設置執行錯誤訊息
1086
			$result["error"]=$checkArguments;
1087
 
1088
			#回傳結果
1089
			return $result;
1090
 
1091
			}#if end
1092
 
1093
		#如果有 serverCache
1094
		if(isset($conf["serverCache"])){
1095
 
1096
			/* debug
1097
 
1098
			#函式說明:
1099
			#撰寫log
1100
			#回傳結果:
1101
			#$result["status"],狀態,"true"或"false".
1102
			#$result["error"],錯誤訊息陣列.
1103
			#$result["function"],當前函式的名稱.
1104
			#$result["argu"],使用的參數.
1105
			#$result["content"],要寫入log的內容字串.
1106
			#必填參數:
1107
			#$conf["path"],字串,log檔案的路徑與名稱.
1108
			$conf["logs::record"]["path"]="/tmp/config::autoAddMemory.log";
1109
			#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.
1110
			$conf["logs::record"]["content"]=$conf["serverCache"];
1111
			#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑
1112
			$conf["logs::record"]["fileArgu"]=__FILE__;
1113
			#可省略參數:
1114
			#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.
1115
			#$conf["rewrite"]="false";
1116
			#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.
1117
			#$conf["returnOnly"]="true";
1118
			#參考資料:
1119
			#無.
1120
			#備註:
1121
			#無.
1122
			$record=logs::record($conf["logs::record"]);
1123
			unset($conf["logs::record"]);
1124
 
1125
			#如果執行失敗
1126
			if($record["status"]==="false"){
1127
 
1128
				#設置執行錯誤識別
1129
				$result["status"]="false";
1130
 
1131
				#設置執行錯誤
1132
				$result["error"]=$record;
1133
 
1134
				#回傳結果
1135
				return $result;
1136
 
1137
				}#if end
1138
 
1139
			*/
1140
 
1141
			#記錄回傳的參考
1142
			#$result["cache"]=&$result;
1143
 
1144
			#如果有 clientSide
1145
			if(isset($conf["serverCache"]["clientSide"])){
1146
 
1147
				#如果有 addOnProcessFunc
1148
				if(isset($conf["serverCache"]["clientSide"]["addOnProcessFunc"])){
1149
 
1150
					#如果有 addOnProcessFuncForUnixDomainSockServerInRunWithAutoAddMemoryDaemon
1151
					if(isset($conf["serverCache"]["clientSide"]["addOnProcessFunc"]["\qbpwcf\sock::addOnProcessFuncForUnixDomainSockServerInRunWithAutoAddMemoryDaemon"])){
1152
 
1153
						/* debug
1154
 
1155
						#函式說明:
1156
						#撰寫log
1157
						#回傳結果:
1158
						#$result["status"],狀態,"true"或"false".
1159
						#$result["error"],錯誤訊息陣列.
1160
						#$result["function"],當前函式的名稱.
1161
						#$result["argu"],使用的參數.
1162
						#$result["content"],要寫入log的內容字串.
1163
						#必填參數:
1164
						#$conf["path"],字串,log檔案的路徑與名稱.
1165
						$conf["logs::record"]["path"]="/tmp/config::autoAddMemory.log";
1166
						#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.
1167
						$conf["logs::record"]["content"]=$conf["serverCache"]["clientSide"]["addOnProcessFunc"]["\qbpwcf\sock::addOnProcessFuncForUnixDomainSockServerInRunWithAutoAddMemoryDaemon"];
1168
						#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑
1169
						$conf["logs::record"]["fileArgu"]=__FILE__;
1170
						#可省略參數:
1171
						#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.
1172
						#$conf["rewrite"]="false";
1173
						#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.
1174
						#$conf["returnOnly"]="true";
1175
						#參考資料:
1176
						#無.
1177
						#備註:
1178
						#無.
1179
						$record=logs::record($conf["logs::record"]);
1180
						unset($conf["logs::record"]);
1181
 
1182
						#如果執行失敗
1183
						if($record["status"]==="false"){
1184
 
1185
							#設置執行錯誤識別
1186
							$result["status"]="false";
1187
 
1188
							#設置執行錯誤
1189
							$result["error"]=$record;
1190
 
1191
							#回傳結果
1192
							return $result;
1193
 
1194
							}#if end
1195
 
1196
						*/
1197
 
1198
						#如果有程式在背景執行
1199
						if(isset($conf["serverCache"]["clientSide"]["addOnProcessFunc"]["\qbpwcf\sock::addOnProcessFuncForUnixDomainSockServerInRunWithAutoAddMemoryDaemon"]["content"])){
1200
 
1201
							#如果該程序資訊存在
1202
							if(isset($conf["serverCache"]["clientSide"]["addOnProcessFunc"]["\qbpwcf\sock::addOnProcessFuncForUnixDomainSockServerInRunWithAutoAddMemoryDaemon"]["content"][0])){
1203
 
1204
								#另存程序變數參考
1205
								$process=&$conf["serverCache"]["clientSide"]["addOnProcessFunc"]["\qbpwcf\sock::addOnProcessFuncForUnixDomainSockServerInRunWithAutoAddMemoryDaemon"]["content"][0];
1206
 
1207
								/* debug
1208
 
1209
								#函式說明:
1210
								#撰寫log
1211
								#回傳結果:
1212
								#$result["status"],狀態,"true"或"false".
1213
								#$result["error"],錯誤訊息陣列.
1214
								#$result["function"],當前函式的名稱.
1215
								#$result["argu"],使用的參數.
1216
								#$result["content"],要寫入log的內容字串.
1217
								#必填參數:
1218
								#$conf["path"],字串,log檔案的路徑與名稱.
1219
								$conf["logs::record"]["path"]="/tmp/config::autoAddMemory.log";
1220
								#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.
1221
								$conf["logs::record"]["content"]=$process;
1222
								#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑
1223
								$conf["logs::record"]["fileArgu"]=__FILE__;
1224
								#可省略參數:
1225
								#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.
1226
								#$conf["rewrite"]="false";
1227
								#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.
1228
								#$conf["returnOnly"]="true";
1229
								#參考資料:
1230
								#無.
1231
								#備註:
1232
								#無.
1233
								$record=logs::record($conf["logs::record"]);
1234
								unset($conf["logs::record"]);
1235
 
1236
								#如果執行失敗
1237
								if($record["status"]==="false"){
1238
 
1239
									#設置執行錯誤識別
1240
									$result["status"]="false";
1241
 
1242
									#設置執行錯誤
1243
									$result["error"]=$record;
1244
 
1245
									#回傳結果
1246
									return $result;
1247
 
1248
									}#if end
1249
 
1250
								*/
1251
 
1252
								#取得標準輸出
1253
								$result["stdout"]=$process["content"];
1254
 
1255
								#取得非標準輸出
1256
								$result["error"]=$process["error"];
1257
 
1258
								#如果標準輸出是 reource
1259
								if(gettype($process["content"])==="resource"){
1260
 
1261
									#取得程式執行過程產生的標準輸出
1262
									$result["stdout"]=stream_get_contents($process["content"]);
1263
 
1264
									}#if end
1265
 
1266
								#如果非標準輸出是 reource
1267
								if(gettype($process["error"])==="resource"){
1268
 
1269
									#取得程式執行過程產生的標準輸出
1270
									$result["error"]=stream_get_contents($process["error"]);
1271
 
1272
									}#if end
1273
 
1274
								#如果記錄上顯示該程序尚在執行中
1275
								if($process["proc_get_status"]["running"]===true){
1276
 
1277
									#嘗試取得該程序的狀態
1278
									$proc_get_status=proc_get_status($process["process"]);
1279
 
1280
									#如果已經結束執行
1281
									if($proc_get_status["running"]===false){
1282
 
1283
										#設置要結束執行unix domain server
1284
										$result["exit"]="true";
1285
 
1286
										#設置執行正常
1287
										$result["status"]="true";
1288
 
1289
										}#if end
1290
 
1291
									}#if end
1292
 
1293
								#反之代表程序已經結束
1294
								else{
1295
 
1296
									#設置要結束執行unix domain server
1297
									$result["exit"]="true";
1298
 
1299
									#設置執行正常
1300
									$result["status"]="true";
1301
 
1302
									}#else end
1303
 
1304
								/* debug
1305
 
1306
								#函式說明:
1307
								#撰寫log
1308
								#回傳結果:
1309
								#$result["status"],狀態,"true"或"false".
1310
								#$result["error"],錯誤訊息陣列.
1311
								#$result["function"],當前函式的名稱.
1312
								#$result["argu"],使用的參數.
1313
								#$result["content"],要寫入log的內容字串.
1314
								#必填參數:
1315
								#$conf["path"],字串,log檔案的路徑與名稱.
1316
								$conf["logs::record"]["path"]="/tmp/config::autoAddMemory.log";
1317
								#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.
1318
								$conf["logs::record"]["content"]=$result;
1319
								#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑
1320
								$conf["logs::record"]["fileArgu"]=__FILE__;
1321
								#可省略參數:
1322
								#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.
1323
								#$conf["rewrite"]="false";
1324
								#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.
1325
								#$conf["returnOnly"]="true";
1326
								#參考資料:
1327
								#無.
1328
								#備註:
1329
								#無.
1330
								$record=logs::record($conf["logs::record"]);
1331
								unset($conf["logs::record"]);
1332
 
1333
								#如果執行失敗
1334
								if($record["status"]==="false"){
1335
 
1336
									#設置執行錯誤識別
1337
									$result["status"]="false";
1338
 
1339
									#設置執行錯誤
1340
									$result["error"]=$record;
1341
 
1342
									#回傳結果
1343
									return $result;
1344
 
1345
									}#if end
1346
 
1347
								*/
1348
 
1349
								}#if end
1350
 
1351
							}#if end
1352
 
1353
						}#if end
1354
 
1355
					}#if end
1356
 
1357
				}#if end
1358
 
1359
			}#if end
1360
 
1361
		#如果參數 whenAviMemLessThan 不為 
1362
		$whenAviMemLessThan=(int)($conf["whenAviMemLessThan"]);
1363
 
1364
		#如果小於1
1365
		if($whenAviMemLessThan<1){
1366
 
1367
			#設置為1
1368
			$whenAviMemLessThan=1;
1369
 
1370
			}#if end
1371
 
1372
		#如果大於50
1373
		else if($whenAviMemLessThan>50){
1374
 
1375
			#設置為50
1376
			$whenAviMemLessThan=50;
1377
 
1378
			}#if end
1379
 
1380
		#計算需要增加記憶體的門檻
1381
		$condition=$phpMaxMemInConfig*$whenAviMemLessThan/100;
1382
 
1383
		#get memeory usage
1384
		$memUsedInBytes=\memory_get_usage();
1385
 
1386
		#如果使用的記憶體已經達到門檻
1387
		if($memUsedInBytes>=$condition){
1388
 
1389
			#計算新的記憶體上限
1390
			$newMemoryLimit=$phpMaxMemInConfig+$stepAmount;
1391
 
1392
			#依照 stepAmount 來增加可用記憶體的上限
1393
			$return=\ini_set("memory_limit",$stepAmount);
1394
 
1395
			#如果設置失敗
1396
			if($return===false){
1397
 
1398
				#設置執行失敗
1399
				$result["status"]="false";
1400
 
1401
				#設置執行錯誤訊息
1402
				$result["error"][]="加大記憶體上限失敗";
1403
 
1404
				#cache
1405
				$result["cache"]=&$result;
1406
 
1407
				#回傳結果
1408
				return $result;
1409
 
1410
				}#if end
1411
 
1412
			#設置正常訊息
1413
			$result["content"]="memeory_limit changed from ".$return." to ".$newMemoryLimit;
1414
 
1415
			}#if end
1416
 
1417
		#提示未改變
1418
		$result["content"]="memeory_limit not changed";	
1419
 
1420
		#設置執行正常
1421
		$result["status"]="true";
1422
 
1423
		#cache
1424
		$result["cache"]=&$result;
1425
 
1426
		#回傳結果
1427
		return $result;
1428
 
1429
		}#function autoAddMemory end
1430
 
1431
	/*
1432
	#函式說明:
1433
	#建立供 apache 讀取的設定檔案.
1434
	#回傳結果:
1435
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
1436
	#$result["error"],錯誤訊息陣列.
1437
	#$result["function"],當前執行的函數名稱.
1438
	#$result["content"],定義對應的內容.
1439
	#必填參數:
1440
	#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑
1441
	$conf["fileArgu"]=__FILE__;
1442
	#$conf["configFileAddr"],字串,定義檔位置與名稱
1443
	$conf["configFileAddr"]="";
1444
	#$conf["content"],陣列,要儲存的key -> value 陣列.
1445
	$conf["content"]=array("169.254.1.1"=>array("groupName"=>"local"));
1446
	#可省略參數:
1447
	#$conf["web"],是要取得網路上的檔案則為"true";反之則為"false",預設為後者.
1448
	#$conf["web"]="false";
1449
	#參考資料:
1450
	#無.
1451
	#備註:
1452
	#檔案內容的格式為多行json編碼然後url編碼然後base64編碼後的內容,每行代表一組定義.每組定義的json格式為php多維陣列所組成.
1453
	*/
1454
	public static function create(&$conf=array()){
1455
 
1456
		#初始化要回傳的結果
1457
		$result=array();
1458
 
1459
		#儲存當前執行的函數
1460
		$result["function"]=__FUNCTION__;
1461
 
1462
		#如果 $conf 不為陣列
1463
		if(gettype($conf)!="array"){
1464
 
1465
			#設置執行失敗
1466
			$result["status"]="false";
1467
 
1468
			#設置執行錯誤訊息
1469
			$result["error"][]="\$conf變數須為陣列形態";
1470
 
1471
			#如果傳入的參數為 null
1472
			if($conf==null){
1473
 
1474
				#設置執行錯誤訊息
1475
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
1476
 
1477
				}#if end
1478
 
1479
			#回傳結果
1480
			return $result;
1481
 
1482
			}#if end
1483
 
1484
		#檢查參數
1485
		#函式說明:
1486
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
1487
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1488
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
1489
		#$result["function"],當前執行的函式名稱.
1490
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
1491
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
1492
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
1493
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
1494
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
1495
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
1496
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
1497
		#必填寫的參數:
1498
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
1499
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
1500
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
1501
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("fileArgu","configFileAddr","content");
1502
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); 
1503
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string","array");
1504
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
1505
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
1506
		#可以省略的參數:
1507
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
1508
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
1509
		#$conf["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
1510
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("web");
1511
		#$conf["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
1512
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
1513
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
1514
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("false");
1515
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
1516
		#$conf["arrayCountEqualCheck"][]=array();
1517
		#參考資料來源:
1518
		#array_keys=>http://php.net/manual/en/function.array-keys.php
1519
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
1520
		unset($conf["variableCheck::checkArguments"]);
1521
 
1522
		#如果檢查失敗
1523
		if($checkArguments["status"]=="false"){
1524
 
1525
			#設置錯誤識別
1526
			$result["status"]="false";
1527
 
1528
			#設置錯誤訊息
1529
			$result["error"]=$checkArguments;
1530
 
1531
			#回傳結果
1532
			return $result;
1533
 
1534
			}#if end
1535
 
1536
		#如果檢查不通過
1537
		if($checkArguments["passed"]=="false"){
1538
 
1539
			#設置錯誤識別
1540
			$result["status"]="false";
1541
 
1542
			#設置錯誤訊息
1543
			$result["error"]=$checkArguments;
1544
 
1545
			#回傳結果
1546
			return $result;
1547
 
1548
			}#if end
1549
 
1550
		#debug
1551
		#var_dump($conf["content"]);exit;	
1552
 
1553
		#函式說明:
1554
		#將字串寫入到檔案
1555
		#回傳結果:
1556
		#$result["status"],"true"表示檔案寫入成功,"false"表示檔案寫入失敗.
1557
		#$result["error"],錯誤訊息陣列.
1558
		#$result["function"],當前執行的函數名稱.
1559
		#$result["fileInfo"],實際上寫入的檔案資訊陣列.
1560
		#$result["fileInfo"]["createdFileName"],建立好的檔案名稱.
1561
		#$result["fileInfo"]["createdFilePath"],檔案建立的路徑.
1562
		#$result["fileInfo"]["createdFilePathAndName"].建立好的檔案名稱與路徑.
1563
		#$result["argu"],使用的參數.
1564
		#必填參數:
1565
		#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑
1566
		$conf["fileAccess::writeTextIntoFile"]["fileArgu"]=$conf["fileArgu"];
1567
		#可省略參數:
1568
		#$conf["fileName"],字串,爲要編輯的檔案名稱,預設為隨機產生的檔案名稱.
1569
		$conf["fileAccess::writeTextIntoFile"]["fileName"]=$conf["configFileAddr"];
1570
		#$conf["inputString"],字串,爲要寫入到裏面的內容,若要每筆資料寫入後換行,則可以在字串內容後面加上 \r\n 即可,預設為"".
1571
		$conf["fileAccess::writeTextIntoFile"]["inputString"]=base64_encode(urlencode(json_encode($conf["content"])));
1572
		#$conf["writeMethod"],字串,爲檔案撰寫的方式,可省略,是複寫'a'還是,重新寫入'w',預設爲'w',重新寫入.
1573
		#$conf["writeMethod"]="a";
1574
		#$conf["checkRepeat"],字串,"true"代表建立檔案之前要先檢查檔案是否存在,若存在則在原名稱後面加上從(1)開始的編號.
1575
		#$conf["checkRepeat"]="";
1576
		#$conf["filenameExtensionStartPoint"],字串,檔案的副檔名是從倒數第幾個小數點(dot)開始,預設為"1",最後一個小數點,必須與$conf["checkRepeat"]搭配才會生效.
1577
		#$conf["filenameExtensionStartPoint"]="";
1578
		#$conf["repeatNameRule"],字串,遇到相同名稱的檔案要如何加上識別的編號,編號用「\$i」表示,預設為"(\$i)",必須與$conf["checkRepeat"]搭配才會生效.
1579
		#$conf["repeatNameRule"]="";
1580
		#$conf["web"],檔案是否位於網站上"true",若是在檔案系統則為"false",預設為"true".
1581
		$conf["fileAccess::writeTextIntoFile"]["web"]="false";
1582
		#參考資料:
1583
		#無.
1584
		#備註:
1585
		#無.
1586
		$writeTextIntoFile=fileAccess::writeTextIntoFile($conf["fileAccess::writeTextIntoFile"]);
1587
		unset($conf["fileAccess::writeTextIntoFile"]);
1588
 
1589
		#如果執行敗
1590
		if($writeTextIntoFile["status"]=="false"){
1591
 
1592
			#設置錯誤識別
1593
			$result["status"]="false";
1594
 
1595
			#設置錯誤訊息
1596
			$result["error"]=$writeTextIntoFile;
1597
 
1598
			#回傳結果
1599
			return $result;
1600
 
1601
			}#if end
1602
 
1603
		#設置定義正常
1604
		$result["status"]="true";
1605
 
1606
		#回傳結果
1607
		return $result;
1608
 
1609
		}#function create end
1610
 
1611
	/*
1612
	#函式說明:
1613
	#提供post的變數查尋定義檔,給予回應.
1614
	#回傳結果:
1615
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
1616
	#$result["error"],錯誤訊息陣列.
1617
	#$result["function"],當前執行的函數名稱.
1618
	#$result["argu"],使用的參數陣列.
1619
	#$result["founded"],"true"代表有找到定義,"false"代表沒有找到定義.
1620
	#$result["content"],定義對應的內容.
1621
	#必填參數:
1622
	#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑
1623
	$conf["fileArgu"]=__FILE__;
1624
	#$conf["configFileAddr"],字串/陣列,若為字串則為定義檔位置與名稱;若為陣列則為實際的定義檔案內容(每個元素代表一個設定對應的內容).
1625
	$conf["configFileAddr"]="";
1626
	#可省略參數:
1627
	#$conf["web"],是要取得網路上的檔案則為"true";反之則為"false",預設為後者.
1628
	#$conf["web"]="false";
1629
	#參考資料:
1630
	#無.
1631
	#備註:
1632
	#檔案內容的格式為多行json編碼然後url編碼然後base64編碼後的內容,每行代表一組定義.每組定義的json格式為php多維陣列所組成.
1633
	*/
1634
	public static function server(&$conf=array()){
1635
 
1636
		#初始化要回傳的結果
1637
		$result=array();
1638
 
1639
		#儲存當前執行的函數
1640
		$result["function"]=__FUNCTION__;
1641
 
1642
		#如果 $conf 不為陣列
1643
		if(gettype($conf)!="array"){
1644
 
1645
			#設置執行失敗
1646
			$result["status"]="false";
1647
 
1648
			#設置執行錯誤訊息
1649
			$result["error"][]="\$conf變數須為陣列形態";
1650
 
1651
			#如果傳入的參數為 null
1652
			if($conf==null){
1653
 
1654
				#設置執行錯誤訊息
1655
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
1656
 
1657
				}#if end
1658
 
1659
			#回傳結果
1660
			return $result;
1661
 
1662
			}#if end
1663
 
1664
		#記錄所使用的參數
1665
		$result["argu"]=$conf;
1666
 
1667
		#檢查參數
1668
		#函式說明:
1669
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
1670
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1671
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
1672
		#$result["function"],當前執行的函式名稱.
1673
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
1674
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
1675
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
1676
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
1677
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
1678
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
1679
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
1680
		#必填寫的參數:
1681
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
1682
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
1683
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
1684
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("fileArgu","configFileAddr");
1685
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); 
1686
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string",null);
1687
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
1688
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
1689
		#可以省略的參數:
1690
		#$conf["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
1691
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
1692
		#$conf["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
1693
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("web");
1694
		#$conf["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
1695
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
1696
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
1697
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("false");
1698
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
1699
		#$conf["arrayCountEqualCheck"][]=array();
1700
		#參考資料來源:
1701
		#array_keys=>http://php.net/manual/en/function.array-keys.php
1702
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
1703
		unset($conf["variableCheck::checkArguments"]);
1704
 
1705
		#如果檢查失敗
1706
		if($checkArguments["status"]=="false"){
1707
 
1708
			#設置錯誤識別
1709
			$result["status"]="false";
1710
 
1711
			#設置錯誤訊息
1712
			$result["error"]=$checkArguments;
1713
 
1714
			#回傳結果
1715
			return $result;
1716
 
1717
			}#if end
1718
 
1719
		#如果檢查不通過
1720
		if($checkArguments["passed"]=="false"){
1721
 
1722
			#設置錯誤識別
1723
			$result["status"]="false";
1724
 
1725
			#設置錯誤訊息
1726
			$result["error"]=$checkArguments;
1727
 
1728
			#回傳結果
1729
			return $result;
1730
 
1731
			}#if end
1732
 
1733
		#debug
1734
		#var_dump($checkArguments);exit;
1735
 
1736
		#儲存key的結構
1737
		$keys=array();
1738
 
1739
		#如果沒有 post 變數存在
1740
		if(count($_POST)<1){
1741
 
1742
			#設置錯誤識別
1743
			$result["status"]="false";
1744
 
1745
			#設置錯誤訊息
1746
			$result["error"][]="沒有post變數";
1747
 
1748
			#回傳結果
1749
			return $result;
1750
 
1751
			}#if end
1752
 
1753
		#debug
1754
		#var_dump($_POST);exit;
1755
 
1756
		#取得第一層key
1757
		$layer=array_keys($_POST)[0];
1758
 
1759
		#取得數值內容
1760
		$values=$_POST[$layer];
1761
 
1762
		#如果該層級內容形態是陣列
1763
		while(gettype($values)==="array"){
1764
 
1765
			#抓取查尋的key結構
1766
			$keys[]=$layer;
1767
 
1768
			#取得新層級的key
1769
			$layer=array_keys($values)[0];
1770
 
1771
			#取得新的內容
1772
			$values=$values[$layer];
1773
 
1774
			}#while end
1775
 
1776
		#取得最後一層的key
1777
		$keys[]=$layer;
1778
 
1779
		#debug
1780
		#var_dump($keys);exit;
1781
 
1782
		#設置預設的定義內容
1783
		$result["content"]="undefined";
1784
 
1785
		#如果configFileAddr是字串
1786
		if(gettype($conf["configFileAddr"])==="string"){
1787
 
1788
			#代表為檔案位置
1789
 
1790
			#函式說明:
1791
			#依據行號分隔抓取檔案的內容,結果會回傳一個陣列
1792
			#回傳的變數說明:
1793
			#$result["status"],執行是否成功,"true"代表成功;"fasle"代表失敗.
1794
			#$result["error"],錯誤訊息提示.
1795
			#$result["warning"],警告訊息.
1796
			#$result["function"],當前執行的函數名稱.
1797
			#$result["fileContent"],爲檔案的內容陣列.
1798
			#$result["lineCount"],爲檔案內容總共的行數.
1799
			#$result["fullContent"],為檔案的完整內容.
1800
			#$result["base64data"],為檔案的base64內容.
1801
			#$result["mimeType"],為檔案的mime type.
1802
			#必填的參數:
1803
			#$conf["filePositionAndName"],字串,爲檔案的位置以及名稱.
1804
			$conf["fileAccess::getFileContent"]["filePositionAndName"]=$conf["configFileAddr"];
1805
			#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑
1806
			$conf["fileAccess::getFileContent"]["fileArgu"]=$conf["fileArgu"];
1807
			#可省略參數:
1808
			#$conf["web"],是要取得網路上的檔案則為"true";反之則為"false".
1809
			$conf["fileAccess::getFileContent"]["web"]=$conf["web"];
1810
			#參考資料:
1811
			#file(),取得檔案內容的行數.
1812
			#file=>http:#php.net/manual/en/function.file.php
1813
			#rtrim(),剔除透過file()取得每行內容結尾的換行符號.
1814
			#filesize=>http://php.net/manual/en/function.filesize.php
1815
			$getFileContent=fileAccess::getFileContent($conf["fileAccess::getFileContent"]);
1816
			unset($conf["fileAccess::getFileContent"]);
1817
 
1818
			#如果讀取檔案失敗
1819
			if($getFileContent["status"]==="false"){
1820
 
1821
				#設置錯誤識別
1822
				$result["status"]="false";
1823
 
1824
				#設置錯誤訊息
1825
				$result["error"]=$getFileContent;
1826
 
1827
				#回傳結果
1828
				return $result;
1829
 
1830
				}#if end
1831
 
1832
			#debug
1833
			#var_dump($getFileContent);
1834
			#var_dump(base64_decode($getFileContent));
1835
			#var_dump(urldecode(base64_decode($getFileContent)));
1836
			#var_dump(json_decode(urldecode(base64_decode($getFileContent))));
1837
			#exit;
1838
 
1839
			#針對每行
1840
			foreach($getFileContent["fileContent"] as $line){
1841
 
1842
				#解析內容
1843
				$def=(array)json_decode(urldecode(base64_decode($line)));
1844
 
1845
				#debug
1846
				#var_dump($def);exit;
1847
				#var_dump($keys[$i]);exit;
1848
 
1849
				#初始化要找到的層級
1850
				$i=0;
1851
 
1852
				#如果有所屬的層級
1853
				while(isset($def[$keys[$i]])){
1854
 
1855
					#取得層級所屬的內容
1856
					$def=(array)$def[$keys[$i]];
1857
 
1858
					#debug
1859
					#var_dump($def);exit;
1860
 
1861
					#如果還不是最後一個key層級
1862
					if(isset($keys[$i+1])){
1863
 
1864
						#層級加一
1865
						$i++;
1866
 
1867
						}#if end
1868
 
1869
					#反之是最後一個key的層級了
1870
					else{
1871
 
1872
						#設置定義的內容
1873
						$result["content"]=$def;
1874
 
1875
						#設置有找到定義
1876
						$result["founded"]="true";
1877
 
1878
						#設置定義正常
1879
						$result["status"]="true";
1880
 
1881
						#回傳結果
1882
						return $result;
1883
 
1884
						}#else end
1885
 
1886
					}#while end
1887
 
1888
				#到這邊代表沒有符合的元素
1889
 
1890
				}#foreach end
1891
 
1892
			}#if end
1893
 
1894
		#反之如果為array
1895
		else if(gettype($conf["configFileAddr"])==="array"){
1896
 
1897
			#針對每行
1898
			foreach($conf["configFileAddr"] as $configName=>$def){
1899
 
1900
				#debug
1901
				#var_dump($def);exit;
1902
				#var_dump($keys[$i]);exit;
1903
 
1904
				#初始化要找到的層級
1905
				$i=0;
1906
 
1907
				#如果有所屬的層級
1908
				while(isset($def[$keys[$i]])){
1909
 
1910
					#取得層級所屬的內容
1911
					$def=(array)$def[$keys[$i]];
1912
 
1913
					#debug
1914
					#var_dump($def);exit;
1915
 
1916
					#如果還不是最後一個key層級
1917
					if(isset($keys[$i+1])){
1918
 
1919
						#層級加一
1920
						$i++;
1921
 
1922
						}#if end
1923
 
1924
					#反之是最後一個key的層級了
1925
					else{
1926
 
1927
						#設置定義的內容
1928
						$result["content"]=$def;
1929
 
1930
						#設置有找到定義
1931
						$result["founded"]="true";
1932
 
1933
						#設置定義正常
1934
						$result["status"]="true";
1935
 
1936
						#回傳結果
1937
						return $result;
1938
 
1939
						}#else end
1940
 
1941
					}#while end
1942
 
1943
				#到這邊代表沒有符合的元素
1944
 
1945
				}#foreach end
1946
 
1947
			}#if end
1948
 
1949
		#反之如果為其他形態
1950
		else{
1951
 
1952
			#設置錯誤識別
1953
			$result["status"]="false";
1954
 
1955
			#設置錯誤訊息
1956
			$result["error"][]="configFileAddr的形態只能為string或array";
1957
 
1958
			#回傳結果
1959
			return $result;
1960
 
1961
			}#else end
1962
 
1963
		#設置定義正常
1964
		$result["status"]="true";
1965
 
1966
		#設置沒有找到定義
1967
		$result["founded"]="false";
1968
 
1969
		#回傳結果
1970
		return $result;
1971
 
1972
		}#function server end
1973
 
1974
	/*
1975
	#函式說明:
1976
	#查尋有使用 server 函式提供組態設定檔的服務,取得key的value.
1977
	#回傳結果:
1978
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
1979
	#$result["argu"],使用的參數.
1980
	#$result["error"],錯誤訊息陣列.
1981
	#$result["function"],當前執行的函數名稱.
1982
	#$result["rawContent"],得到的原始訊息.
1983
	#$result["content"],用json_decode後的結果;若"inBg"為"true",則其每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值;key為"output"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.
1984
	#必填參數:
1985
	#$conf["server"],字串,組態服務設定服務的網址
1986
	$conf["server"]="";
1987
	#$conf["postName"],字串,POST變數的名稱,亦即要查尋的定義名稱.
1988
	$conf["postName"]="";
1989
	#$conf["fileArgu"],字串,變數__FILE__的內容.
1990
	$conf["fileArgu"]=__FILE__;
1991
	#可省略參數:
1992
	#$conf["cache"],字串,預設為"true",代表會啟用cache服務;反之為"false".
1993
	#$conf["cache"]="false";
1994
	#$conf["clientCacheDaemonSock"],字串,提供cache服務的 unix domain socket 檔案位置,預設為套件根目錄底下的"var/config::client/clientCacheDaemon.sock";.
1995
	#$conf["clientCacheDaemonSock"]="";
1996
	#$conf["inBg"],字串,預設為"false",代表在前景執行;反之為"true"代表在背景中執行,會強制將"cache"參數設為"false".
1997
	#$conf["inBg"]="true";
1998
	#參考資料:
1999
	#無.
2000
	#備註:
2001
	#目前僅能跟server函式提供的服務對接.
2002
	*/
2003
	public static function client(&$conf=array()){
2004
 
2005
		#初始化要回傳的結果
2006
		$result=array();
2007
 
2008
		#儲存當前執行的函數
2009
		$result["function"]=__FUNCTION__;
2010
 
2011
		#取得參數
2012
		$result["argu"]=$conf;
2013
 
2014
		#如果 $conf 不為陣列
2015
		if(gettype($conf)!="array"){
2016
 
2017
			#設置執行失敗
2018
			$result["status"]="false";
2019
 
2020
			#設置執行錯誤訊息
2021
			$result["error"][]="\$conf變數須為陣列形態";
2022
 
2023
			#如果傳入的參數為 null
2024
			if($conf==null){
2025
 
2026
				#設置執行錯誤訊息
2027
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
2028
 
2029
				}#if end
2030
 
2031
			#回傳結果
2032
			return $result;
2033
 
2034
			}#if end
2035
 
2036
		#檢查參數
2037
		#函式說明:
2038
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
2039
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2040
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
2041
		#$result["function"],當前執行的函式名稱.
2042
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
2043
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
2044
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
2045
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
2046
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
2047
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
2048
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
2049
		#必填寫的參數:
2050
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
2051
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
2052
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
2053
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("server","postName","fileArgu");
2054
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); 
2055
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string","string");
2056
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
2057
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
2058
		#可以省略的參數:
2059
		#$conf["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
2060
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
2061
		#$conf["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
2062
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("cache","clientCacheDaemonSock","inBg");
2063
		#$conf["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
2064
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string");
2065
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
2066
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("true",null,"false");
2067
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
2068
		#$conf["arrayCountEqualCheck"][]=array();
2069
		#參考資料來源:
2070
		#array_keys=>http://php.net/manual/en/function.array-keys.php
2071
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
2072
		unset($conf["variableCheck::checkArguments"]);
2073
 
2074
		#如果檢查失敗
2075
		if($checkArguments["status"]=="false"){
2076
 
2077
			#設置錯誤識別
2078
			$result["status"]="false";
2079
 
2080
			#設置錯誤訊息
2081
			$result["error"]=$checkArguments;
2082
 
2083
			#回傳結果
2084
			return $result;
2085
 
2086
			}#if end
2087
 
2088
		#如果檢查不通過
2089
		if($checkArguments["passed"]=="false"){
2090
 
2091
			#設置錯誤識別
2092
			$result["status"]="false";
2093
 
2094
			#設置錯誤訊息
2095
			$result["error"]=$checkArguments;
2096
 
2097
			#回傳結果
2098
			return $result;
2099
 
2100
			}#if end
2101
 
2102
		#如果要在背景執行
2103
		if($conf["inBg"]==="true"){
2104
 
2105
			#函式說明:
2106
			#運行curl cmd
2107
			#回傳結果:
2108
			#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2109
			#$result["error"],錯誤訊息陣列.
2110
			#$result["function"],當前執行的函式名稱.
2111
			#$result["founded"],識別網址找不找得到.
2112
			#$result["content"],取得的回應內容陣列;若$conf["bgInProc"]為"true",則每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值;key為"output"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.
2113
			#$result["fullContent"],取得回應的完整字串內容.
2114
			#$result["cookie"],cookie檔案的位置與名稱.
2115
			#$result["cmd"],執行的command.
2116
			#$result["argu],使用的參數.
2117
			#必填參數:
2118
			#$conf["url"],字串,目標url.
2119
			$conf["cmd::curlCmd"]["url"]=$conf["server"];
2120
			#$conf["fileArgu"],字串,變數__FILE__的內容.
2121
			$conf["cmd::curlCmd"]["fileArgu"]=$conf["fileArgu"];
2122
			#可省略參數:
2123
			#$conf["header"],字串陣列,要傳送的header.
2124
			#$conf["header"]=array();
2125
			#$conf["allowAnySSLcertificate"],字串,是否允許不可信任的SSL憑證,預設為"true".
2126
			#$conf["allowAnySSLcertificate"]="";
2127
			#$conf["postVar"],字串陣列,每個要傳送的post變數名稱(陣列的key值)與數值.
2128
			$conf["cmd::curlCmd"]["postVar"]=array($conf["postName"]=>"");
2129
			#$conf["rawPost"]="字串",要傳送的raw post內容.
2130
			#$conf["rawPost"]="";
2131
			#$conf["urlEncode"],字串,post的內容是否要url_encode,"true"代表要,預設為"false"代表不要.
2132
			#$conf["urlEncode"]="false";
2133
			#$conf["agent"],字串,user agent的名稱.
2134
			#$conf["agent"]="";
2135
			#$conf["cookie"],字串,cookie位置與檔案位置.
2136
			#$conf["cookie"]="";
2137
			#$conf["forceNewCookie"],字串,是否要重置cookie,"true"代表要,"false"代表不要,預設為"false".
2138
			#$conf["forceNewCookie"]="";
2139
			#$conf["inBg"],字串,"true"代表要在背景中執行;反之則為"false".
2140
			#$conf["inBg"]="true";
2141
			#$conf["bgInPorc"],字串,若跟inBg一樣為"true",則會透過proc放在背景執行且回傳proc資訊,以便監控執行狀況.預設為"false",不使用proc.
2142
			$conf["catchWebContent::curlCmd"]["bgInProc"]="true";
2143
			#參考資料:
2144
			#無.
2145
			#備註:
2146
			#無.
2147
			$curlCmd=catchWebContent::curlCmd($conf["catchWebContent::curlCmd"]);
2148
			unset($conf["catchWebContent::curlCmd"]);
2149
 
2150
			#如果執行失敗
2151
			if($curlCmd["status"]==="false"){
2152
 
2153
				#設置錯誤識別
2154
				$result["status"]="false";
2155
 
2156
				#設置錯誤訊息
2157
				$result["error"]=$curlCmd;
2158
 
2159
				#回傳結果
2160
				return $result;
2161
 
2162
				}#if end
2163
 
2164
			#設置proc資訊
2165
			$result["content"]=$curlCmd["content"];
2166
 
2167
			#設置執行正常
2168
			$result["status"]="true";
2169
 
2170
			#回傳結果
2171
			return $result;
2172
 
2173
			}#if end
2174
 
2175
		#如果沒有設置 cacheFile
2176
		if(!isset($conf["cacheFile"])){
2177
 
2178
			#取得以該檔案為准的實際位置 lib path
2179
			exec("cd ".pathinfo(__FILE__)["dirname"].";pwd;",$output,$status);
2180
 
2181
			#初始化之
2182
			$conf["clientCacheDaemonSock"]=$output[0]."/var/config::client/clientCacheDaemon.sock";
2183
 
2184
			}#if end
2185
 
2186
		#如果有要使用cache
2187
		if($conf["cache"]==="true"){
2188
 
2189
			#查詢 cahce 內容
2190
			#連線到 sock::unixDomainSocketServer 產生的  unix domain socket,傳送指定的訊息.
2191
			#回傳結果:
2192
			#$result["status"],"true"代表執行正常;"false"代表執行不正常.
2193
			#$result["error"],錯誤訊息陣列.
2194
			#$result["function"],當前執行的函式名稱.
2195
			#$result["argu"],使用的參數.
2196
			#$result["content"],得到的回應.
2197
			#必填參數:
2198
			#$conf["msg"],陣列,要傳送的訊息,其主$conf["msg"]["id"],是無法指定的.
2199
			$conf["sock::sendAnyMsgToQBPWCFunixSocket"]["msg"]=array("postName"=>$conf["postName"],"server"=>$conf["server"]);
2200
			#可省略參數:
2201
			#$conf["sock"],字串,要連線的 usr/bin/qbpwcf-sock.php 所產生的 unix domain socket 路徑與名稱,預設為 qbpwcf_usock_path.
2202
			$conf["sock::sendAnyMsgToQBPWCFunixSocket"]["sock"]=$conf["clientCacheDaemonSock"];
2203
			#參考資料:
2204
			#無.
2205
			#備註:
2206
			#無.
2207
			$sendAnyMsgToQBPWCFunixSocket=sock::sendAnyMsgToQBPWCFunixSocket($conf["sock::sendAnyMsgToQBPWCFunixSocket"]);
2208
			unset($conf["sock::sendAnyMsgToQBPWCFunixSocket"]);
2209
 
2210
			#如果執行失敗
2211
			if($sendAnyMsgToQBPWCFunixSocket["status"]=="false"){
2212
 
2213
				#設置錯誤識別
2214
				$result["status"]="false";
2215
 
2216
				#設置錯誤訊息
2217
				$result["error"]=$sendAnyMsgToQBPWCFunixSocket;
2218
 
2219
				#回傳結果
2220
				return $result;
2221
 
2222
				}#if end
2223
 
2224
			#如果執行失敗
2225
			if($sendAnyMsgToQBPWCFunixSocket["status"]==="false"){
2226
 
2227
				#設置錯誤識別
2228
				$result["status"]="false";
2229
 
2230
				#設置錯誤訊息
2231
				$result["error"]=$sendAnyMsgToQBPWCFunixSocket;
2232
 
2233
				#回傳結果
2234
				return $result;
2235
 
2236
				}#if end
2237
 
2238
			#debug
2239
			#var_dump(__LINE__,$sendAnyMsgToQBPWCFunixSocket);
2240
 
2241
			#設置回應的內容
2242
			$result["rawContent"]=$sendAnyMsgToQBPWCFunixSocket["content"];
2243
 
2244
			#設置解析好的json回應內容
2245
			$result["content"]=json_decode($sendAnyMsgToQBPWCFunixSocket["content"]);
2246
 
2247
			#設置執行正常
2248
			$result["status"]="true";
2249
 
2250
			#回傳結果
2251
			return $result;
2252
 
2253
			}#if end
2254
 
2255
		#函式說明:
2256
		#運行curl cmd
2257
		#回傳結果:
2258
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2259
		#$result["error"],錯誤訊息陣列.
2260
		#$result["function"],當前執行的函式名稱.
2261
		#$result["content"],取得的回應內容陣列.
2262
		#$result["fullContent"],取得回應的完整字串內容.
2263
		#$result["cookie"],cookie檔案的位置與名稱.
2264
		#$result["cmd"],執行的command.
2265
		#$result["argu],使用的參數.
2266
		#必填參數:
2267
		#$conf["url"],字串,目標url.
2268
		$conf["cmd::curlCmd"]["url"]=$conf["server"];
2269
		#$conf["fileArgu"],字串,變數__FILE__的內容.
2270
		$conf["cmd::curlCmd"]["fileArgu"]=$conf["fileArgu"];
2271
		#可省略參數:
2272
		#$conf["header"],字串陣列,要傳送的header.
2273
		#$conf["header"]=array();
2274
		#$conf["allowAnySSLcertificate"],字串,是否允許不可信任的SSL憑證,預設為"true".
2275
		#$conf["allowAnySSLcertificate"]="";
2276
		#$conf["postVar"],字串陣列,每個要傳送的post變數名稱(陣列的key值)與數值.
2277
		$conf["cmd::curlCmd"]["postVar"]=array($conf["postName"]=>"");
2278
		#$conf["rawPost"]="字串",要傳送的raw post內容.
2279
		#$conf["rawPost"]="";
2280
		#$conf["urlEncode"],字串,post的內容是否要url_encode,"true"代表要,預設為"false"代表不要.
2281
		#$conf["urlEncode"]="false";
2282
		#$conf["agent"],字串,user agent的名稱.
2283
		#$conf["agent"]="";
2284
		#$conf["cookie"],字串,cookie位置與檔案位置.
2285
		#$conf["cookie"]="";
2286
		#$conf["forceNewCookie"],字串,是否要重置cookie,"true"代表要,"false"代表不要,預設為"false".
2287
		#$conf["forceNewCookie"]="";
2288
		#$conf["inBg"],字串,"true"代表要在背景中執行;反之則為"false".
2289
		#$conf["inBg"]="true";
2290
		#備註:
2291
		#無.
2292
		$curlCmd=catchWebContent::curlCmd($conf["cmd::curlCmd"]);
2293
		unset($conf["cmd::curlCmd"]);
2294
 
2295
		#如果執行失敗
2296
		if($curlCmd["status"]==="false"){
2297
 
2298
			#設置錯誤識別
2299
			$result["status"]="false";
2300
 
2301
			#設置錯誤訊息
2302
			$result["error"]=$curlCmd;
2303
 
2304
			#回傳結果
2305
			return $result;
2306
 
2307
			}#if end
2308
 
2309
		#設置執行正常
2310
		$result["status"]="true";
2311
 
2312
		#設置回應的內容
2313
		$result["rawContent"]=$curlCmd["fullContent"];
2314
 
2315
		#設置解析好的json回應內容
2316
		$result["content"]=json_decode($curlCmd["fullContent"]);
2317
 
2318
		#回傳結果
2319
		return $result;
2320
 
2321
		}#function client end
2322
 
2323
	/*
2324
	#函式說明:
2325
	#給clientCacheDaemon用的addOnProcessFunc,處理來自config::client有使用cache的要求.
2326
	#回傳結果:
2327
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
2328
	#$result["error"],錯誤訊息陣列.
2329
	#$result["function"],當前執行的函數名稱.
2330
	#$result["warning"],警告訊息陣列.
2331
	#必填參數:
2332
	#$conf["request"],陣列,收到的訊息.
2333
	#$conf["request"]=array();
2334
	#$conf["request"]["postName"],字串,要查詢的索引.
2335
	#$conf["request"]["postName"]="";
2336
	#$conf["request"]["server"],字串,要去哪個config server查詢.
2337
	#$conf["request"]["server"]="";
2338
	#$conf["request"]["id"],字串,用來識別用戶的uuid.
2339
	#$conf["request"]["id"]="";
2340
	#$conf["socket"],client的socket
2341
	#$conf["socket"]=;
2342
	#$conf["info"],陣列,sock跟cache file path資訊.
2343
	#$conf["info"]=array();
2344
	#$conf["info"]["sock"],字串,unix domain socket addr.
2345
	#$conf["info"]["sock"]=;
2346
	#$conf["info"]["cacheFilePath"],字串,cache file path.
2347
	#$conf["info"]["cacheFilePath"]=;
2348
	#$conf["info"]["checkVersionInterval"],字串,距離最後一次取得資料的時間多久就要檢查是否有新資料,預設為60秒.
2349
	#$conf["info"]["checkVersionInterval"]="60";
2350
	#$conf["clientCache"],陣列.存放跟取得快取的陣列.
2351
	#$conf["clientCache"]=array();
2352
	#$conf["last_req_time"],字串,存放上次執行的unixtime.
2353
	#$conf["last_req_time"]="";
2354
	#可省略參數:
2355
	#無.
2356
	#參考資料:
2357
	#無.
2358
	#備註:
2359
	#無,
2360
	*/
2361
	public static function addOnProcessFuncForClientCacheDaemon(&$conf){
2362
 
2363
		#debug
2364
		#var_dump(__LINE__,"into function ".__FUNCTION__);
2365
 
2366
		#初始化結果
2367
		$result=array();
2368
 
2369
		#取得當前執行的函數名稱
2370
		$result["function"]=__FUNCTION__;
2371
 
2372
		#取得參數
2373
		$result["argu"]=$conf;
2374
 
2375
		#如果 $conf 不為陣列
2376
		if(gettype($conf)!=="array"){
2377
 
2378
			#設置執行失敗
2379
			$result["status"]="false";
2380
 
2381
			#設置執行錯誤訊息
2382
			$result["error"][]="\$conf變數須為陣列形態";
2383
 
2384
			#如果傳入的參數為 null
2385
			if(is_null($conf)){
2386
 
2387
				#設置執行錯誤訊息
2388
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
2389
 
2390
				}#if end
2391
 
2392
			#回傳給用戶 - start
2393
 
2394
			#寫入回應的內容
2395
			fwrite($conf["socket"],json_encode($result).PHP_EOL);
2396
 
2397
			#結束回應
2398
			fwrite($conf["socket"],PHP_EOL.PHP_EOL);
2399
 
2400
			#關閉socket連線,將回應輸出.
2401
			fclose($conf["socket"]);
2402
 
2403
			#回傳給用戶 - end
2404
 
2405
			#回傳結果
2406
			return $result;
2407
 
2408
			}#if end
2409
 
2410
		#debug
2411
		#var_dump(__LINE__,"檢查 參數");
2412
 
2413
		#函式說明:
2414
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
2415
		#回傳結果:
2416
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2417
		#$result["error"],執行不正常結束的錯訊息陣列.
2418
		#$result["simpleError"],簡單表示的錯誤訊息.
2419
		#$result["function"],當前執行的函式名稱.
2420
		#$result["argu"],設置給予的參數.
2421
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
2422
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
2423
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
2424
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
2425
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
2426
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
2427
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
2428
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
2429
		#必填參數:
2430
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
2431
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
2432
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
2433
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
2434
		#可省略參數:
2435
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
2436
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("socket","request","info","clientCache","last_req_time");
2437
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
2438
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("resource","array","array","array","integer");
2439
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
2440
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
2441
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
2442
		$conf["variableCheck::checkArguments"]["canNotBeEmpty"]=array("socket","info");
2443
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
2444
		#$conf["canBeEmpty"]=array();
2445
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
2446
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("sock");
2447
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
2448
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("sock","request");
2449
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
2450
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("resource","array");
2451
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
2452
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null,null,"60");
2453
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
2454
		#$conf["disallowAllSkipableVarIsEmpty"]="";
2455
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
2456
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
2457
		#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
2458
		#$conf["disallowAllSkipableVarNotExist"]="";
2459
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
2460
		#$conf["arrayCountEqualCheck"][]=array();
2461
		#參考資料:
2462
		#array_keys=>http://php.net/manual/en/function.array-keys.php
2463
		#備註:
2464
		#無.
2465
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
2466
		unset($conf["variableCheck::checkArguments"]);
2467
 
2468
		#如果執行失敗
2469
		if($checkArguments["status"]==="false"){
2470
 
2471
			#設置錯誤識別
2472
			$result["status"]="false";
2473
 
2474
			#設置錯誤訊息
2475
			$result["error"]=$checkArguments;
2476
 
2477
			#回傳給用戶 - start
2478
 
2479
			#寫入回應的內容
2480
			fwrite($conf["socket"],json_encode($result).PHP_EOL);
2481
 
2482
			#結束回應
2483
			fwrite($conf["socket"],PHP_EOL.PHP_EOL);
2484
 
2485
			#關閉socket連線,將回應輸出.
2486
			fclose($conf["socket"]);
2487
 
2488
			#回傳給用戶 - end
2489
 
2490
			#回傳結果
2491
			return $result;
2492
 
2493
			}#if end
2494
 
2495
		#如果檢查不通過
2496
		if($checkArguments["passed"]==="false"){
2497
 
2498
			#設置錯誤識別
2499
			$result["status"]="false";
2500
 
2501
			#設置錯誤訊息
2502
			$result["error"]=$checkArguments;
2503
 
2504
			#回傳給用戶 - start
2505
 
2506
			#寫入回應的內容
2507
			fwrite($conf["socket"],json_encode($result).PHP_EOL);
2508
 
2509
			#結束回應
2510
			fwrite($conf["socket"],PHP_EOL.PHP_EOL);
2511
 
2512
			#關閉socket連線,將回應輸出.
2513
			fclose($conf["socket"]);
2514
 
2515
			#回傳給用戶 - end
2516
 
2517
			#回傳結果
2518
			return $result;
2519
 
2520
			}#if end
2521
 
2522
		#debug
2523
		#var_dump(__LINE__,"檢查  request 參數");
2524
 
2525
		#函式說明:
2526
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
2527
		#回傳結果:
2528
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2529
		#$result["error"],執行不正常結束的錯訊息陣列.
2530
		#$result["simpleError"],簡單表示的錯誤訊息.
2531
		#$result["function"],當前執行的函式名稱.
2532
		#$result["argu"],設置給予的參數.
2533
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
2534
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
2535
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
2536
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
2537
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
2538
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
2539
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
2540
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
2541
		#必填參數:
2542
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
2543
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf["request"];
2544
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
2545
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
2546
		#可省略參數:
2547
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
2548
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("id","postName","server");
2549
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
2550
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string","string");
2551
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
2552
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
2553
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
2554
		#$conf["variableCheck::checkArguments"]["canNotBeEmpty"]=array("sock");
2555
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
2556
		#$conf["canBeEmpty"]=array();
2557
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
2558
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("sock");
2559
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
2560
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("sock","request");
2561
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
2562
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("resource","array");
2563
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
2564
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null,null,"60");
2565
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
2566
		#$conf["disallowAllSkipableVarIsEmpty"]="";
2567
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
2568
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
2569
		#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
2570
		#$conf["disallowAllSkipableVarNotExist"]="";
2571
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
2572
		#$conf["arrayCountEqualCheck"][]=array();
2573
		#參考資料:
2574
		#array_keys=>http://php.net/manual/en/function.array-keys.php
2575
		#備註:
2576
		#無.
2577
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
2578
		unset($conf["variableCheck::checkArguments"]);
2579
 
2580
		#如果執行失敗
2581
		if($checkArguments["status"]==="false"){
2582
 
2583
			#設置錯誤識別
2584
			$result["status"]="false";
2585
 
2586
			#設置錯誤訊息
2587
			$result["error"]=$checkArguments;
2588
 
2589
			#回傳給用戶 - start
2590
 
2591
			#寫入回應的內容
2592
			fwrite($conf["socket"],json_encode($result).PHP_EOL);
2593
 
2594
			#結束回應
2595
			fwrite($conf["socket"],PHP_EOL.PHP_EOL);
2596
 
2597
			#關閉socket連線,將回應輸出.
2598
			fclose($conf["socket"]);
2599
 
2600
			#回傳給用戶 - end
2601
 
2602
			#回傳結果
2603
			return $result;
2604
 
2605
			}#if end
2606
 
2607
		#如果檢查不通過
2608
		if($checkArguments["passed"]==="false"){
2609
 
2610
			#設置錯誤識別
2611
			$result["status"]="false";
2612
 
2613
			#設置錯誤訊息
2614
			$result["error"]=$checkArguments;
2615
 
2616
			#回傳給用戶 - start
2617
 
2618
			#寫入回應的內容
2619
			fwrite($conf["socket"],json_encode($result).PHP_EOL);
2620
 
2621
			#結束回應
2622
			fwrite($conf["socket"],PHP_EOL.PHP_EOL);
2623
 
2624
			#關閉socket連線,將回應輸出.
2625
			fclose($conf["socket"]);
2626
 
2627
			#回傳給用戶 - end
2628
 
2629
			#回傳結果
2630
			return $result;
2631
 
2632
			}#if end
2633
 
2634
		#函式說明:
2635
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
2636
		#回傳結果:
2637
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2638
		#$result["error"],執行不正常結束的錯訊息陣列.
2639
		#$result["simpleError"],簡單表示的錯誤訊息.
2640
		#$result["function"],當前執行的函式名稱.
2641
		#$result["argu"],設置給予的參數.
2642
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
2643
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
2644
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
2645
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
2646
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
2647
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
2648
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
2649
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
2650
		#必填參數:
2651
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
2652
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf["info"];
2653
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
2654
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
2655
		#可省略參數:
2656
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
2657
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("sock","cacheFilePath","checkVersionInterval");
2658
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
2659
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string","string");
2660
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
2661
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
2662
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
2663
		#$conf["variableCheck::checkArguments"]["canNotBeEmpty"]=array("sock");
2664
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
2665
		#$conf["canBeEmpty"]=array();
2666
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
2667
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("sock");
2668
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
2669
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("sock","request");
2670
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
2671
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("resource","array");
2672
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
2673
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null,null,"60");
2674
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
2675
		#$conf["disallowAllSkipableVarIsEmpty"]="";
2676
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
2677
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
2678
		#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
2679
		#$conf["disallowAllSkipableVarNotExist"]="";
2680
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
2681
		#$conf["arrayCountEqualCheck"][]=array();
2682
		#參考資料:
2683
		#array_keys=>http://php.net/manual/en/function.array-keys.php
2684
		#備註:
2685
		#無.
2686
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
2687
		unset($conf["variableCheck::checkArguments"]);
2688
 
2689
		#如果執行失敗
2690
		if($checkArguments["status"]==="false"){
2691
 
2692
			#設置錯誤識別
2693
			$result["status"]="false";
2694
 
2695
			#設置錯誤訊息
2696
			$result["error"]=$checkArguments;
2697
 
2698
			#回傳給用戶 - start
2699
 
2700
			#寫入回應的內容
2701
			fwrite($conf["socket"],json_encode($result).PHP_EOL);
2702
 
2703
			#結束回應
2704
			fwrite($conf["socket"],PHP_EOL.PHP_EOL);
2705
 
2706
			#關閉socket連線,將回應輸出.
2707
			fclose($conf["socket"]);
2708
 
2709
			#回傳給用戶 - end
2710
 
2711
			#回傳結果
2712
			return $result;
2713
 
2714
			}#if end
2715
 
2716
		#如果檢查不通過
2717
		if($checkArguments["passed"]==="false"){
2718
 
2719
			#設置錯誤識別
2720
			$result["status"]="false";
2721
 
2722
			#設置錯誤訊息
2723
			$result["error"]=$checkArguments;
2724
 
2725
			#回傳給用戶 - start
2726
 
2727
			#寫入回應的內容
2728
			fwrite($conf["socket"],json_encode($result).PHP_EOL);
2729
 
2730
			#結束回應
2731
			fwrite($conf["socket"],PHP_EOL.PHP_EOL);
2732
 
2733
			#關閉socket連線,將回應輸出.
2734
			fclose($conf["socket"]);
2735
 
2736
			#回傳給用戶 - end
2737
 
2738
			#回傳結果
2739
			return $result;
2740
 
2741
			}#if end
2742
 
2743
		#判斷 client cahce 有無指定來源的資料
2744
 
2745
		#debug
2746
		#var_dump(__LINE__,"判斷 client cahce 有無指定來源的資料");
2747
 
2748
		#來源
2749
		#$conf["request"]["server"];
2750
 
2751
		#debug
2752
		#var_dump(__LINE__,$conf["request"]["server"]);
2753
 
2754
		#索引
2755
		#$conf["request"]["postName"];
2756
 
2757
		#debug
2758
		#var_dump(__LINE__,$conf["request"]["postName"]);
2759
 
2760
		#如果存在
2761
		if(isset($conf["clientCache"]["share"]["configs"])){
2762
 
2763
			#debug
2764
			#var_dump(__LINE__,$conf["clientCache"]["share"]["configs"]);
2765
 
2766
			#如果有對應來源的資料
2767
			if(isset($conf["clientCache"]["share"]["configs"][$conf["request"]["server"]])){
2768
 
2769
				#如果有該索引的資料
2770
				if(isset($conf["clientCache"]["share"]["configs"][$conf["request"]["server"]][$conf["request"]["postName"]])){
2771
 
2772
					#如果存在 content 跟 time
2773
					if( isset($conf["clientCache"]["share"]["configs"][$conf["request"]["server"]][$conf["request"]["postName"]]["content"]) && isset($conf["clientCache"]["share"]["configs"][$conf["request"]["server"]][$conf["request"]["postName"]]["time"]) ){
2774
 
2775
						#取得 content
2776
						$result["content"]=json_decode($conf["clientCache"]["share"]["configs"][$conf["request"]["server"]][$conf["request"]["postName"]]["content"]);
2777
 
2778
						#記錄多少秒未更新
2779
						$secsNoUpdate=time()-$conf["clientCache"]["share"]["configs"][$conf["request"]["server"]][$conf["request"]["postName"]]["time"];
2780
 
2781
						#記錄資料過期多少秒
2782
						$secsExpired=$secsNoUpdate-$conf["info"]["checkVersionInterval"];
2783
 
2784
						#提示資料超過期限未更新
2785
						if($secsNoUpdate>$conf["info"]["checkVersionInterval"]){
2786
 
2787
							#設置警告訊息
2788
							$result["warning"][]="data expired for ".$secsExpired." secs";
2789
 
2790
							}#if end 
2791
 
2792
						#設置執行正常
2793
						$result["status"]="true";
2794
 
2795
						#debug
2796
						#var_dump(__LINE__,$result,json_encode($result));
2797
 
2798
						#回傳給用戶 - start
2799
 
2800
						#初始化要回傳的訊息
2801
						$msg=array();
2802
 
2803
						#設置回傳的內容
2804
						$msg["content"]=$result["content"];
2805
 
2806
						#設置回傳的狀態
2807
						$msg["status"]=$result["status"];
2808
 
2809
						#寫入回應的內容
2810
						fwrite($conf["socket"],json_encode($msg).PHP_EOL);
2811
 
2812
						#結束回應
2813
						fwrite($conf["socket"],PHP_EOL.PHP_EOL);
2814
 
2815
						#關閉socket連線,將回應輸出.
2816
						fclose($conf["socket"]);
2817
 
2818
						#回傳給用戶 - end
2819
 
2820
						#回傳結果
2821
						return $result;
2822
 
2823
						}#if end
2824
 
2825
					}#if end
2826
 
2827
				}#if end
2828
 
2829
			}#if end
2830
 
2831
		#執行到這邊代表沒有資料
2832
 
2833
		#函式說明:
2834
		#查尋有使用 server 函式提供組態設定檔的服務,取得key的value.
2835
		#回傳結果:
2836
		#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
2837
		#$result["error"],錯誤訊息陣列.
2838
		#$result["function"],當前執行的函數名稱.
2839
		#$result["rawContent"],得到的原始訊息.
2840
		#$result["content"],用json_decode後的結果.
2841
		#必填參數:
2842
		#$conf["server"],字串,組態服務設定服務的網址
2843
		$conf["config::client"]["server"]=$conf["request"]["server"];
2844
		#$conf["postName"],字串,POST變數的名稱,亦即要查尋的定義名稱.
2845
		$conf["config::client"]["postName"]=$conf["request"]["postName"];
2846
		#$conf["fileArgu"],字串,變數__FILE__的內容.
2847
		$conf["config::client"]["fileArgu"]=__FILE__;
2848
		#可省略參數:
2849
		#$conf["cache"],字串,預設為"true",代表會啟用cache服務;反之為"false".
2850
		$conf["config::client"]["cache"]="false";
2851
		#$conf["clientCacheDaemonSock"],字串,提供cache服務的 unix domain socket 檔案位置,預設為套件根目錄底下的"var/config::client/clientCacheDaemon.sock";.
2852
		#$conf["clientCacheDaemonSock"]="";
2853
		#參考資料:
2854
		#無.
2855
		#備註:
2856
		#目前僅能跟server函式提供的服務對接.
2857
		$client=config::client($conf["config::client"]);
2858
		unset($conf["config::client"]);
2859
 
2860
		#debug
2861
		#var_dump(__LINE__,$client);
2862
 
2863
		/*
2864
 
2865
		#debug
2866
		#函式說明:
2867
		#撰寫log
2868
		#回傳結果:
2869
		#$result["status"],狀態,"true"或"false".
2870
		#$result["error"],錯誤訊息陣列.
2871
		#$result["function"],當前函式的名稱.
2872
		#$result["argu"],使用的參數.
2873
		#$result["content"],要寫入log的內容字串.
2874
		#必填參數:
2875
		#$conf["path"],字串,log檔案的路徑與名稱.
2876
		$conf["config::record"]["path"]="/tmp/test.log";
2877
		#$conf["content"],any,要寫的內容,若內容不為字串則會用var_dump的格式寫入.
2878
		$conf["config::record"]["content"]=$client;
2879
		#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑
2880
		$conf["config::record"]["fileArgu"]=__FILE__;
2881
		#可省略參數:
2882
		#$conf["rewrite"],預設為"false",接續寫入;反之"true"代表重新寫入.
2883
		#$conf["rewrite"]="false";
2884
		#$conf["returnOnly"],預設為"false",會寫入到log檔案.若為"true"則不會寫入log.
2885
		#$conf["returnOnly"]="true";
2886
		#參考資料:
2887
		#無.
2888
		#備註:
2889
		#無.
2890
		config::record($conf["config::record"]);
2891
		unset($conf["config::record"]);
2892
 
2893
		*/
2894
 
2895
		#如果執行失敗
2896
		if($client["status"]==="false"){
2897
 
2898
			#設置錯誤識別
2899
			$result["status"]="false";
2900
 
2901
			#設置錯誤訊息
2902
			$result["error"]=$client;
2903
 
2904
			#回傳給用戶 - start
2905
 
2906
			#寫入回應的內容
2907
			fwrite($conf["socket"],json_encode($result).PHP_EOL);
2908
 
2909
			#結束回應
2910
			fwrite($conf["socket"],PHP_EOL.PHP_EOL);
2911
 
2912
			#關閉socket連線,將回應輸出.
2913
			fclose($conf["socket"]);
2914
 
2915
			#回傳給用戶 - end
2916
 
2917
			#回傳結果
2918
			return $result;
2919
 
2920
			}#if end
2921
 
2922
		#新增 client cache 內容
2923
		$conf["clientCache"]["share"]["configs"][$conf["request"]["server"]][$conf["request"]["postName"]]["content"]=$client["rawContent"];
2924
 
2925
		#更新 client cache 的最後更新時間
2926
		$conf["clientCache"]["share"]["configs"][$conf["request"]["server"]][$conf["request"]["postName"]]["time"]=time();
2927
 
2928
		#debug
2929
		#var_dump(__LINE__,$conf["clientCache"]["share"]["configs"]);
2930
 
2931
		#初始化要傳遞的訊息
2932
		$msg=array();
2933
 
2934
		#設置 msg content
2935
		$msg["content"]=$client["rawContent"];
2936
 
2937
		#設置 msg status
2938
		$msg["status"]="true";
2939
 
2940
		#設置執行正常
2941
		$result["status"]="true";
2942
 
2943
		#回傳給用戶 - start
2944
 
2945
		#寫入回應的內容
2946
		fwrite($conf["socket"],json_encode($msg).PHP_EOL);
2947
 
2948
		#結束回應
2949
		fwrite($conf["socket"],PHP_EOL.PHP_EOL);
2950
 
2951
		#關閉socket連線,將回應輸出.
2952
		fclose($conf["socket"]);
2953
 
2954
		#回傳給用戶 - end
2955
 
2956
		#回傳結果
2957
		return $result;
2958
 
2959
		}#function addOnProcessFuncForClientCacheDaemon end
2960
 
2961
	/*
2962
	#函式說明:
2963
	#給clientCacheDaemon用的funcToRunWhenIdle,處理來自config::client產生的cache內容,若過期就更新,若跟cache檔案不同就更新檔案,若有cache檔案但尚未cache住就cache之.
2964
	#回傳結果:
2965
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
2966
	#$result["error"],錯誤訊息陣列.
2967
	#$result["function"],當前執行的函數名稱.
2968
	#$result["warning"],警告訊息陣列.
2969
	#必填參數:
2970
	#$conf["client"],陣列,用戶的socket.
2971
	#$conf["client"]=array();
2972
	#$conf["info"],陣列,sock跟cache file path資訊.
2973
	#$conf["info"]=array();
2974
	#$conf["info"]["sock"],字串,unix domain socket addr.
2975
	#$conf["info"]["sock"]=;
2976
	#$conf["info"]["cacheFilePath"],字串,cache file path.
2977
	#$conf["info"]["cacheFilePath"]=;
2978
	#$conf["info"]["checkVersionInterval"],字串,距離最後一次取得資料的時間多久就要檢查是否有新資料,預設為60秒.
2979
	#$conf["info"]["checkVersionInterval"]="60";
2980
	#$conf["serverCache"],陣列.存放跟取得快取的陣列.
2981
	#$conf["serverCache"]=array();
2982
	#可省略參數:
2983
	#無.
2984
	#參考資料:
2985
	#無.
2986
	#備註:
2987
	#無,
2988
	*/
2989
	public static function funcToRunWhenIdleForClientCacheDaemon(&$conf){
2990
 
2991
		$result=array();
2992
 
2993
		#取得當前執行的函數名稱
2994
		$result["function"]=__FUNCTION__;
2995
 
2996
		#取得參數
2997
		$result["argu"]=$conf;
2998
 
2999
		#如果 $conf 不為陣列
3000
		if(gettype($conf)!="array"){
3001
 
3002
			#設置執行失敗
3003
			$result["status"]="false";
3004
 
3005
			#設置執行錯誤訊息
3006
			$result["error"][]="\$conf變數須為陣列形態";
3007
 
3008
			#如果傳入的參數為 null
3009
			if(is_null($conf)){
3010
 
3011
				#設置執行錯誤訊息
3012
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
3013
 
3014
				}#if end
3015
 
3016
			#回傳結果
3017
			return $result;
3018
 
3019
			}#if end
3020
 
3021
		#函式說明:
3022
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
3023
		#回傳結果:
3024
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3025
		#$result["error"],執行不正常結束的錯訊息陣列.
3026
		#$result["simpleError"],簡單表示的錯誤訊息.
3027
		#$result["function"],當前執行的函式名稱.
3028
		#$result["argu"],設置給予的參數.
3029
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
3030
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
3031
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
3032
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
3033
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
3034
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
3035
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
3036
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
3037
		#必填參數:
3038
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
3039
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
3040
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
3041
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
3042
		#可省略參數:
3043
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
3044
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("client","info","serverCache");
3045
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
3046
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("array","array","array");
3047
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
3048
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
3049
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
3050
		$conf["variableCheck::checkArguments"]["canNotBeEmpty"]=array("info");
3051
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
3052
		#$conf["canBeEmpty"]=array();
3053
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
3054
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("sock");
3055
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
3056
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("sock","request");
3057
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
3058
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("resource","array");
3059
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
3060
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null,null,"60");
3061
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
3062
		#$conf["disallowAllSkipableVarIsEmpty"]="";
3063
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
3064
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
3065
		#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
3066
		#$conf["disallowAllSkipableVarNotExist"]="";
3067
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
3068
		#$conf["arrayCountEqualCheck"][]=array();
3069
		#參考資料:
3070
		#array_keys=>http://php.net/manual/en/function.array-keys.php
3071
		#備註:
3072
		#無.
3073
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
3074
		unset($conf["variableCheck::checkArguments"]);
3075
 
3076
		#如果執行失敗
3077
		if($checkArguments["status"]==="false"){
3078
 
3079
			#設置錯誤識別
3080
			$result["status"]="false";
3081
 
3082
			#設置錯誤訊息
3083
			$result["error"]=$checkArguments;
3084
 
3085
			#回傳結果
3086
			return $result;
3087
 
3088
			}#if end
3089
 
3090
		#如果檢查不通過
3091
		if($checkArguments["passed"]==="false"){
3092
 
3093
			#設置錯誤識別
3094
			$result["status"]="false";
3095
 
3096
			#設置錯誤訊息
3097
			$result["error"]=$checkArguments;
3098
 
3099
			#回傳結果
3100
			return $result;
3101
 
3102
			}#if end
3103
 
3104
		#debug
3105
		#var_dump(__LINE__,$conf);
3106
 
3107
		#函式說明:
3108
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
3109
		#回傳結果:
3110
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3111
		#$result["error"],執行不正常結束的錯訊息陣列.
3112
		#$result["simpleError"],簡單表示的錯誤訊息.
3113
		#$result["function"],當前執行的函式名稱.
3114
		#$result["argu"],設置給予的參數.
3115
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
3116
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
3117
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
3118
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
3119
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
3120
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
3121
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
3122
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
3123
		#必填參數:
3124
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
3125
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf["info"];
3126
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
3127
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
3128
		#可省略參數:
3129
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
3130
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("sock","cacheFilePath","checkVersionInterval");
3131
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
3132
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string","string");
3133
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
3134
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
3135
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
3136
		#$conf["variableCheck::checkArguments"]["canNotBeEmpty"]=array("sock");
3137
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
3138
		#$conf["canBeEmpty"]=array();
3139
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
3140
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("sock");
3141
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
3142
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("sock","request");
3143
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
3144
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("resource","array");
3145
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
3146
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null,null,"60");
3147
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
3148
		#$conf["disallowAllSkipableVarIsEmpty"]="";
3149
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
3150
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
3151
		#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
3152
		#$conf["disallowAllSkipableVarNotExist"]="";
3153
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
3154
		#$conf["arrayCountEqualCheck"][]=array();
3155
		#參考資料:
3156
		#array_keys=>http://php.net/manual/en/function.array-keys.php
3157
		#備註:
3158
		#無.
3159
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
3160
		unset($conf["variableCheck::checkArguments"]);
3161
 
3162
		#如果執行失敗
3163
		if($checkArguments["status"]==="false"){
3164
 
3165
			#設置錯誤識別
3166
			$result["status"]="false";
3167
 
3168
			#設置錯誤訊息
3169
			$result["error"]=$checkArguments;
3170
 
3171
			#回傳結果
3172
			return $result;
3173
 
3174
			}#if end
3175
 
3176
		#如果檢查不通過
3177
		if($checkArguments["passed"]==="false"){
3178
 
3179
			#設置錯誤識別
3180
			$result["status"]="false";
3181
 
3182
			#設置錯誤訊息
3183
			$result["error"]=$checkArguments;
3184
 
3185
			#回傳結果
3186
			return $result;
3187
 
3188
			}#if end
3189
 
3190
		#另存 cacheFilePath
3191
		$cacheFilePath=$conf["info"]["cacheFilePath"];
3192
 
3193
		#另存 checkVersionInterval
3194
		$checkVersionInterval=$conf["info"]["checkVersionInterval"];
3195
 
3196
		#檢查之前執行的 config:client - start
3197
 
3198
		#如果有儲存之前執行的 config:client
3199
		if(isset($conf["serverCache"]["serverSide"]["config::funcToRunWhenIdleForClientCacheDaemon"]["procs"])){
3200
 
3201
			#針對每個 proc 
3202
			foreach($conf["serverCache"]["serverSide"]["config::funcToRunWhenIdleForClientCacheDaemon"]["procs"] as $index => $porc){
3203
 
3204
				#如果程序已經結束
3205
				if($porc["proc_get_status"]["running"]===false){
3206
 
3207
					#如果程序正常結束
3208
					if($porc["proc_get_status"]["exitcode"]===0){
3209
 
3210
						#取得輸出
3211
						$clientConfigRes=stream_get_contents($porc["content"]);
3212
 
3213
						#set json string content
3214
						$conf["serverCache"]["clientSide"]["share"]["configs"][$porc["server"]][$proc["postName"]]["content"]=$clientConfigRes;
3215
 
3216
						}#if end
3217
 
3218
					#移除之
3219
					unset($conf["serverCache"]["serverSide"]["config::funcToRunWhenIdleForClientCacheDaemon"]["procs"][$index]);
3220
 
3221
					}#if end
3222
 
3223
				#反之
3224
				else {
3225
 
3226
					#更新 proc_get_status
3227
					$conf["serverCache"]["serverSide"]["config::funcToRunWhenIdleForClientCacheDaemon"]["procs"][$index]["proc_get_status"]=proc_get_status($porc["process"]);
3228
 
3229
					}#else end
3230
 
3231
				}#foreach end
3232
 
3233
			#儲存 procs 的元素數量
3234
			$procsCount=count($conf["serverCache"]["serverSide"]["config::funcToRunWhenIdleForClientCacheDaemon"]["procs"]);
3235
 
3236
			#如果有proc尚未結束
3237
			if($procsCount>0){
3238
 
3239
				#提示之
3240
				echo "尚有 ".$procsCount." 個取得 config 的程序執行中".PHP_EOL;
3241
 
3242
				#設置執行正常
3243
				$result["status"]="true";
3244
 
3245
				#回傳結果
3246
				return $result;
3247
 
3248
				}#if end
3249
 
3250
			}#if end
3251
 
3252
		#檢查之前執行的 config:client - end
3253
 
3254
		#檢查有每個 cache 檔案,若沒有對應的 clientCache,則 cache 之. - start
3255
 
3256
		#函式說明:
3257
		#取得目錄底下的詳細資訊.
3258
		#回傳結果:
3259
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3260
		#$result["error"],錯誤訊息.
3261
		#$result["function"],當前執行的函數名稱.
3262
		#$result["size"],該清單的大小,單位為bytes.
3263
		#$result["dataCount"],該清單的長度.
3264
		#$result["content"],指定目錄底下的所有檔案資訊.
3265
		#$result["content"][$i]["nType&permission"],第$i個節點類型、權限.
3266
		#$result["content"][$i]["nType"],第$i個節點類型.
3267
		#$result["content"][$i]["permission"],第$i個節點權限.
3268
		#$result["content"][$i]["ownByUser"],第$i個節點擁有者賬號.
3269
		#$result["content"][$i]["ownByGroup"],第$i個節點擁有者群組.
3270
		#$result["content"][$i]["bytes"],第$i個節點大小.
3271
		#$result["content"][$i]["date"],第$i個節點最後變更日期.
3272
		#$result["content"][$i]["time"],第$i個節點最後異動時間.
3273
		#$result["content"][$i]["timeDetail"],第$i個節點最後異動詳細時間.
3274
		#$result["content"][$i]["timezone"],第$i個節點的時區.
3275
		#$result["content"][$i]["name"],第$i個節點的名稱.
3276
		#必填參數:
3277
		#$conf["path"],字串,要檢視的路徑.
3278
		$conf["fileAccess::ls"]["path"]=$cacheFilePath;
3279
		#可省略參數:
3280
		#無.
3281
		#參考資料:
3282
		#https://www.businessweekly.com.tw/careers/Blog/14307
3283
		#備註:
3284
		#清單要不包含 "."開頭 跟 "~" 開頭
3285
		$ls=fileAccess::ls($conf["fileAccess::ls"]);
3286
		unset($conf["fileAccess::ls"]);
3287
 
3288
		#如果執行失敗
3289
		if($ls["status"]==="false"){
3290
 
3291
			#設置錯誤識別
3292
			$result["status"]="false";
3293
 
3294
			#設置錯誤訊息
3295
			$result["error"]=$ls;
3296
 
3297
			#debug
3298
			var_dump(__LINE__,$result);
3299
 
3300
			#回傳結果
3301
			return $result;
3302
 
3303
			}#if end
3304
 
3305
		#針對每個節點
3306
		foreach($ls["content"] as $nodeInfo){
3307
 
3308
			#檔案名稱
3309
			#$nodeInfo["name"]
3310
 
3311
			#已經chche後的檔案陣列
3312
			#$conf["serverCache"]["serverSide"]["config::funcToRunWhenIdleForClientCacheDaemon"]["cachedFile"]
3313
 
3314
			#如果沒有已經cache的項目
3315
			if(!isset($conf["serverCache"]["serverSide"]["config::funcToRunWhenIdleForClientCacheDaemon"])){
3316
 
3317
				#初始化之
3318
				$conf["serverCache"]["serverSide"]["config::funcToRunWhenIdleForClientCacheDaemon"]["cachedFile"]=array();
3319
 
3320
				}#if end
3321
 
3322
			#函式說明:
3323
			#檢查一個數值是否與陣列裏面的元素相同,找到一個相符合的元素後就會停止搜尋.
3324
			#回傳結果:
3325
			#$result["status"],"true"表示執行正確,"false"表示執行錯誤.
3326
			#$result["founded"],"true"表示有找到相同的,"false"表示沒有找到相同的.
3327
			#$result["error"],錯誤訊息
3328
			#$result["function"],當前執行的函數名稱
3329
			#$result["argv"],使用的參數
3330
			#$result["equalVarName"],相等的變數名稱或key.
3331
			#$result["equalVarValue"],相等的變數數值內容.
3332
			#必填參數:
3333
			#$conf["conditionElement"],字串,條件元素,要等於的元素內容.
3334
			$conf["search::getEqualVar"]["conditionElement"]=$nodeInfo["name"];
3335
			#$conf["compareElements"],字串陣列,要比對的陣列變數內容.
3336
			$conf["search::getEqualVar"]["compareElements"]=$conf["serverCache"]["serverSide"]["config::funcToRunWhenIdleForClientCacheDaemon"]["cachedFile"];
3337
			#可省略參數:
3338
			#無.
3339
			#參考資料:
3340
			#無.
3341
			#備註:
3342
			#無.
3343
			$getEqualVar=search::getEqualVar($conf["search::getEqualVar"]);
3344
			unset($conf["search::getEqualVar"]);
3345
 
3346
			#debug
3347
			#var_dump(__LINE__,$getEqualVar);
3348
 
3349
			#如果執行失敗
3350
			if($getEqualVar["status"]==="false"){
3351
 
3352
				#設置錯誤識別
3353
				$result["status"]="false";
3354
 
3355
				#設置錯誤訊息
3356
				$result["error"]=$getEqualVar;
3357
 
3358
				#debug
3359
				var_dump(__LINE__,$result);
3360
 
3361
				#回傳結果
3362
				return $result;
3363
 
3364
				}#if end
3365
 
3366
			#如果已經cache過
3367
			if($getEqualVar["founded"]==="true"){
3368
 
3369
				#換下個檔案
3370
				continue;
3371
 
3372
				}#if end
3373
 
3374
			#debug
3375
			#var_dump(__LINE__,$getEqualVar);
3376
 
3377
			#如果是檔案
3378
			if($nodeInfo["nType"]==="-"){
3379
 
3380
				#debug
3381
				#var_dump(__LINE__,"檢測尚未cache的檔案",$nodeInfo);
3382
 
3383
				#判斷是否為cache檔案,範例:"client::config-cache-".urlencode($conf["request"]["postName"])." from ".urlencode($conf["request"]["server"]).".json";
3384
				#函式說明:
3385
				#檢查字串是否符合指定格式
3386
				#回傳結果:
3387
				#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3388
				#$result["passed"],檢查是否通過,"true"代表通過,"false"代表不通過.
3389
				#$result["content"],詳細結果訊息陣列,若passed為"false"則會有該內容.
3390
				#$result["newInputArgu"],剩下尚未檢驗格式的input.
3391
				#$result["function"],當前執行的函數.
3392
				#$result["error"],涵式錯誤訊息陣列.
3393
				#必填參數:
3394
				#$conf["input"],字串,要檢查格式的字串.
3395
				$conf["variableCheck::checkStringFormat"]["input"]=$nodeInfo["name"];
3396
				#可省略參數:
3397
				#$conf["equalWith"],字串,輸入字串是否等於該參數內容.
3398
				#$conf["variableCheck::checkStringFormat"]["equalWith"]=".json";
3399
				#$conf["startWith"],字串,開頭要是什麼字串內容.
3400
				$conf["variableCheck::checkStringFormat"]["startWith"]="client::config-cache-";
3401
				#$conf["endWith"],字串,結尾要是什麼字串內容.
3402
				$conf["variableCheck::checkStringFormat"]["endWith"]=".json";
3403
				#$conf["centerWith"],字串,非開頭(預設無,若有指定startWith參數,則為該參數內容)跟結尾(預設無,若有指定endWith參數,則為該參數內容)的內容中要有什麼字串.
3404
				$conf["variableCheck::checkStringFormat"]["centerWith"]=" from https";
3405
				#$conf["length"],字串整數,字串的長度要多少(bytes).
3406
				#$conf["length"]="";
3407
				#$conf["lengthGrapheme"],字串整數,字串的長度要多少字位(grapheme).
3408
				#$conf["lengthGrapheme"]="";
3409
				#$conf["section"],字串陣列,元素數量代表,輸入字串的格式可以區分成多少段.每個元素為本函式的參數陣列剔除input跟section參數.
3410
				#$conf["section"]=array();
3411
				#參考資料:
3412
				#grapheme_strlen=>https://www.php.net/manual/en/function.grapheme-strlen.php
3413
				#grapheme/字位/可以書寫的最小單位=>https://zh.wikipedia.org/zh-tw/%E5%AD%97%E4%BD%8D
3414
				#grapheme_substr=>https://www.php.net/manual/en/function.grapheme-substr.php
3415
				#備註:
3416
				#無.
3417
				$checkStringFormat=variableCheck::checkStringFormat($conf["variableCheck::checkStringFormat"]);
3418
				unset($conf["variableCheck::checkStringFormat"]);
3419
 
3420
				#debug
3421
				#var_dump(__LINE__,$checkStringFormat);
3422
 
3423
				#如果執行失敗
3424
				if($checkStringFormat["status"]==="false"){
3425
 
3426
					#設置錯誤識別
3427
					$result["status"]="false";
3428
 
3429
					#設置錯誤訊息
3430
					$result["error"]=$checkStringFormat;
3431
 
3432
					#debug
3433
					var_dump(__LINE__,$result);
3434
 
3435
					#回傳結果
3436
					return $result;
3437
 
3438
					}#if end
3439
 
3440
				#如果是符合的暫存檔案
3441
				if($checkStringFormat["passed"]==="true"){
3442
 
3443
					#解析對應的 postName 與 server - start
3444
 
3445
					#函式說明:
3446
					#將字串特定關鍵字與其前面的內容剔除
3447
					#回傳結果:
3448
					#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3449
					#$result["error"],錯誤訊息陣列.
3450
					#$result["warning"],警告訊息鎮列.
3451
					#$result["founded"],有無找到定字串"true"代表有,"false"代表沒有.
3452
					#$result["function"],當前執行的函數名稱.
3453
					#$result["argu"],使用的參數.
3454
					#$result["oriStr"],要處理的原始字串內容.
3455
					#$result["content"],處理好的的字串內容.	
3456
					#必填參數:
3457
					#$conf["stringIn"],字串,要處理的字串.
3458
					$conf["stringProcess::delStrBeforeKeyWord"]["stringIn"]=$nodeInfo["name"];
3459
					#$conf["keyWord"],字串,特定字串.
3460
					$conf["stringProcess::delStrBeforeKeyWord"]["keyWord"]="client::config-cache-";
3461
					#可省略參數:
3462
					#$conf["recursive"],字串,預設為"false"代表找到一個關鍵字就會停止;"true"代表會即重複執行,知道沒有關鍵字為止.
3463
					#$conf["recursive"]="true";
3464
					#$conf["lastResult"],陣列,本函式前次執行的結果,若沒有找到關鍵字,則回改回傳該內容.
3465
					#$conf["lastResult"]=$delStrBeforeKeyWord;
3466
					#參考資料:
3467
					#無.
3468
					#備註:
3469
					#無.
3470
					$delStrBeforeKeyWord=stringProcess::delStrBeforeKeyWord($conf["stringProcess::delStrBeforeKeyWord"]);
3471
					unset($conf["stringProcess::delStrBeforeKeyWord"]);
3472
 
3473
					#如果執行失敗
3474
					if($delStrBeforeKeyWord["status"]==="false"){
3475
 
3476
						#設置錯誤識別
3477
						$result["status"]="false";
3478
 
3479
						#設置錯誤訊息
3480
						$result["error"]=$delStrBeforeKeyWord;
3481
 
3482
						#debug
3483
						var_dump(__LINE__,$result);
3484
 
3485
						#回傳結果
3486
						return $result;
3487
 
3488
						}#if end
3489
 
3490
					#如果沒有關鍵字
3491
					if($delStrBeforeKeyWord["founded"]==="false"){
3492
 
3493
						#設置錯誤識別
3494
						$result["status"]="false";
3495
 
3496
						#設置錯誤訊息
3497
						$result["error"]=$delStrBeforeKeyWord;
3498
 
3499
						#debug
3500
						var_dump(__LINE__,$result);
3501
 
3502
						#回傳結果
3503
						return $result;
3504
 
3505
						}#if end
3506
 
3507
					#函式說明:
3508
					#將字串特定關鍵字與其後面的內容剔除
3509
					#回傳結果:
3510
					#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3511
					#$result["error"],錯誤訊息陣列.
3512
					#$result["warning"],警告訊息鎮列.
3513
					#$result["founded"],有無找到定字串"true"代表有,"false"代表沒有.
3514
					#$result["function"],當前執行的函數名稱.
3515
					#$result["oriStr"],要處理的原始字串內容.
3516
					#$result["content"],處理好的的字串內容.
3517
					#$result["argu"],使用的參數.
3518
					#必填參數:
3519
					#$conf["stringIn"],字串,要處理的字串.
3520
					$conf["stringProcess::delStrAfterKeyWord"]["stringIn"]=$delStrBeforeKeyWord["content"];
3521
					#$conf["keyWord"],字串,特定字串.
3522
					$conf["stringProcess::delStrAfterKeyWord"]["keyWord"]=".json";
3523
					#可省略參數:
3524
					#$conf["deleteLastRepeatedOne"],字串,預設為"false";若為"true"則代表連續遇到同 $conf["keyWord"] 的內容,要將移除內容的起點往後移動到為後一個 $conf["keyWord"].
3525
					$conf["stringProcess::delStrAfterKeyWord"]["deleteLastRepeatedOne"]="true";
3526
					#參考資料:
3527
					#無.
3528
					#備註:
3529
					#無.
3530
					$delStrAfterKeyWord=stringProcess::delStrAfterKeyWord($conf["stringProcess::delStrAfterKeyWord"]);
3531
					unset($conf["stringProcess::delStrAfterKeyWord"]);
3532
 
3533
					#如果執行失敗
3534
					if($delStrAfterKeyWord["status"]==="false"){
3535
 
3536
						#設置錯誤識別
3537
						$result["status"]="false";
3538
 
3539
						#設置錯誤訊息
3540
						$result["error"]=$delStrAfterKeyWord;
3541
 
3542
						#debug
3543
						var_dump(__LINE__,$result);
3544
 
3545
						#回傳結果
3546
						return $result;
3547
 
3548
						}#if end
3549
 
3550
					#如果沒有關鍵字
3551
					if($delStrAfterKeyWord["founded"]==="false"){
3552
 
3553
						#設置錯誤識別
3554
						$result["status"]="false";
3555
 
3556
						#設置錯誤訊息
3557
						$result["error"]=$delStrAfterKeyWord;
3558
 
3559
						#debug
3560
						var_dump(__LINE__,$result);
3561
 
3562
						#回傳結果
3563
						return $result;
3564
 
3565
						}#if end
3566
 
3567
					#另存postName與server的字串
3568
					$postNameAndServerStr=$delStrAfterKeyWord["content"];
3569
 
3570
					#用 " from " 來切割
3571
					#函式說明:
3572
					#將固定格式的字串分開,並回傳分開的結果.
3573
					#回傳結果:
3574
					#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3575
					#$result["error"],錯誤訊息陣列
3576
					#$result["function"],當前執行的函數名稱.
3577
					#$result["argu"],使用的參數.
3578
					#$result["oriStr"],要分割的原始字串內容
3579
					#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。
3580
					#$result["dataCounts"],爲總共分成幾段
3581
					#$result["found"],是否有在$conf["stringIn"]找到$conf["spiltSymbol"],"true"代表有找到,"false"代表沒有找到.
3582
					#必填參數:
3583
					#$conf["stringIn"],字串,要處理的字串.
3584
					$conf["stringProcess::spiltString"]["stringIn"]=$postNameAndServerStr;
3585
					#$conf["spiltSymbol"],字串,爲以哪個符號作爲分割.
3586
					$conf["stringProcess::spiltString"]["spiltSymbol"]=" from ";
3587
					#可省略參數:
3588
					#$conf["allowEmptyStr"],是否允許分割出來空字串,預設為"false"不允許;"true"代表允許.
3589
					$conf["stringProcess::spiltString"]["allowEmptyStr"]="false";
3590
					#參考資料:
3591
					#無.
3592
					#備註:
3593
					#無.
3594
					$spiltString=stringProcess::spiltString($conf["stringProcess::spiltString"]);
3595
					unset($conf["stringProcess::spiltString"]);
3596
 
3597
					#如果執行失敗
3598
					if($spiltString["status"]==="false"){
3599
 
3600
						#設置錯誤識別
3601
						$result["status"]="false";
3602
 
3603
						#設置錯誤訊息
3604
						$result["error"]=$spiltString;
3605
 
3606
						#debug
3607
						var_dump(__LINE__,$resutl);
3608
 
3609
						#回傳結果
3610
						return $result;
3611
 
3612
						}#if end
3613
 
3614
					#如果沒有應該要存在的關鍵字
3615
					if($spiltString["found"]==="false"){
3616
 
3617
						#設置錯誤識別
3618
						$result["status"]="false";
3619
 
3620
						#設置錯誤訊息
3621
						$result["error"]=$spiltString;
3622
 
3623
						#debug
3624
						var_dump(__LINE__,$result);
3625
 
3626
						#回傳結果
3627
						return $result;
3628
 
3629
						}#if end
3630
 
3631
					#如果沒有切割出2兩段以上
3632
					if($spiltString["dataCounts"]<2){
3633
 
3634
						#設置錯誤識別
3635
						$result["status"]="false";
3636
 
3637
						#設置錯誤訊息
3638
						$result["error"]=$spiltString;
3639
 
3640
						#debug
3641
						var_dump(__LINE__,$result);
3642
 
3643
						#回傳結果
3644
						return $result;
3645
 
3646
						}#if end
3647
 
3648
					#取得解析好的來源(urlencoded)
3649
					$server=$spiltString["dataArray"][$spiltString["dataCounts"]-1];
3650
 
3651
					#函式說明:
3652
					#將字串特定關鍵字與其後面的內容剔除
3653
					#回傳結果:
3654
					#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3655
					#$result["error"],錯誤訊息陣列.
3656
					#$result["warning"],警告訊息鎮列.
3657
					#$result["founded"],有無找到定字串"true"代表有,"false"代表沒有.
3658
					#$result["function"],當前執行的函數名稱.
3659
					#$result["oriStr"],要處理的原始字串內容.
3660
					#$result["content"],處理好的的字串內容.
3661
					#$result["argu"],使用的參數.
3662
					#必填參數:
3663
					#$conf["stringIn"],字串,要處理的字串.
3664
					$conf["stringProcess::delStrAfterKeyWord"]["stringIn"]=$postNameAndServerStr;
3665
					#$conf["keyWord"],字串,特定字串.
3666
					$conf["stringProcess::delStrAfterKeyWord"]["keyWord"]=" from ".$server;
3667
					#可省略參數:
3668
					#$conf["deleteLastRepeatedOne"],字串,預設為"false";若為"true"則代表連續遇到同 $conf["keyWord"] 的內容,要將移除內容的起點往後移動到為後一個 $conf["keyWord"].
3669
					$conf["stringProcess::delStrAfterKeyWord"]["deleteLastRepeatedOne"]="true";
3670
					#參考資料:
3671
					#無.
3672
					#備註:
3673
					#無.
3674
					$delStrAfterKeyWord=stringProcess::delStrAfterKeyWord($conf["stringProcess::delStrAfterKeyWord"]);
3675
					unset($conf["stringProcess::delStrAfterKeyWord"]);
3676
 
3677
					#如果執行失敗
3678
					if($delStrAfterKeyWord["status"]==="false"){
3679
 
3680
						#設置錯誤識別
3681
						$result["status"]="false";
3682
 
3683
						#設置錯誤訊息
3684
						$result["error"]=$delStrAfterKeyWord;
3685
 
3686
						#debug
3687
						var_dump(__LINE__,$result);
3688
 
3689
						#回傳結果
3690
						return $result;
3691
 
3692
						}#if end
3693
 
3694
					#如果沒有關鍵字
3695
					if($delStrAfterKeyWord["founded"]==="false"){
3696
 
3697
						#設置錯誤識別
3698
						$result["status"]="false";
3699
 
3700
						#設置錯誤訊息
3701
						$result["error"]=$delStrAfterKeyWord;
3702
 
3703
						#debug
3704
						var_dump(__LINE__,$resutl);
3705
 
3706
						#回傳結果
3707
						return $result;
3708
 
3709
						}#if end
3710
 
3711
					#另存postName與server的字串
3712
					$postName=$delStrAfterKeyWord["content"];
3713
 
3714
					#解析對應的 postName 與 server - end
3715
 
3716
					#如果對應該cache檔案的cache不存在
3717
					if(!isset($conf["serverCache"]["clientSide"]["share"]["configs"][urldecode($server)][$postName])){
3718
 
3719
						#讀取其json
3720
						#函式說明:
3721
						#依據行號分隔抓取檔案的內容,結果會回傳一個陣列
3722
						#回傳的變數說明:
3723
						#$result["status"],執行是否成功,"true"代表成功;"fasle"代表失敗.
3724
						#$result["error"],錯誤訊息提示.
3725
						#$result["warning"],警告訊息.
3726
						#$result["function"],當前執行的函數名稱.
3727
						#$result["fileContent"],爲檔案的內容陣列.
3728
						#$result["lineCount"],爲檔案內容總共的行數.
3729
						#$result["fullContent"],為檔案的完整內容.
3730
						#$result["base64data"],為檔案的base64內容.
3731
						#$result["mimeType"],為檔案的mime type.
3732
						#必填參數:
3733
						#$conf["filePositionAndName"],字串,爲檔案的位置以及名稱.
3734
						$conf["fileAccess::getFileContent"]["filePositionAndName"]=$cacheFilePath.$nodeInfo["name"];
3735
						#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑
3736
						$conf["fileAccess::getFileContent"]["fileArgu"]=__FILE__;
3737
						#可省略參數:
3738
						#$conf["web"],是要取得網路上的檔案則為"true";反之預設為"false".
3739
						$conf["fileAccess::getFileContent"]["web"]="false";
3740
						#$conf["createIfnotExist"],字串,預設為"false"代表檔案不存在也不需要建立;反之為"true".
3741
						$conf["fileAccess::getFileContent"]["createIfnotExist"]="false";
3742
						#參考資料:
3743
						#file(),取得檔案內容的行數.
3744
						#file=>http:#php.net/manual/en/function.file.php
3745
						#rtrim(),剔除透過file()取得每行內容結尾的換行符號.
3746
						#filesize=>http://php.net/manual/en/function.filesize.php
3747
						#參考資料:
3748
						#無.
3749
						#備註:
3750
						#無.
3751
						$getFileContent=fileAccess::getFileContent($conf["fileAccess::getFileContent"]);
3752
						unset($conf["fileAccess::getFileContent"]);
3753
 
3754
						#如果執行失敗
3755
						if($getFileContent["status"]==="false"){
3756
 
3757
							#設置錯誤識別
3758
							$result["status"]="false";
3759
 
3760
							#設置錯誤訊息
3761
							$result["error"]=$getFileContent;
3762
 
3763
							#debug
3764
							var_dump(__LINE__,$result);
3765
 
3766
							#回傳結果
3767
							return $result;
3768
 
3769
							}#if end
3770
 
3771
						#debug
3772
						#var_dump(__LINE__,$getFileContent);
3773
 
3774
						#set json string content
3775
						$conf["serverCache"]["clientSide"]["share"]["configs"][urldecode($server)][$postName]["content"]=$getFileContent["fullContent"];
3776
 
3777
						#設置已經有 cache 成檔案
3778
						$conf["serverCache"]["clientSide"]["share"]["configs"][urldecode($server)][$postName]["cachedFile"]="true";
3779
 
3780
						#set cached file
3781
						$conf["serverCache"]["serverSide"]["config::funcToRunWhenIdleForClientCacheDaemon"]["cachedFile"][]=$nodeInfo["name"];
3782
 
3783
						#debug
3784
						#var_dump(__LINE__,$conf["serverCache"]);
3785
 
3786
						}#if end
3787
 
3788
					}#if end
3789
 
3790
				}#if end
3791
 
3792
			}#foreach end
3793
 
3794
		#檢查有每個 cache 檔案,若沒有對應的 clientCache,則cache 之. - end
3795
 
3796
		#檢查每個 clientCache 若過期則更新之. - start
3797
 
3798
		#如果沒有 $conf["serverCache"]["clientSide"]["share"]
3799
		if(!isset($conf["serverCache"]["clientSide"]["share"])){
3800
 
3801
			#初始化之
3802
			$conf["serverCache"]["clientSide"]["share"]["configs"]=array();
3803
 
3804
			}#if end
3805
 
3806
		#針對每個 client site 的 share configs 變數
3807
		foreach($conf["serverCache"]["clientSide"]["share"]["configs"] as $serverUrl => $postNames){
3808
 
3809
			#針對該site每個config資訊
3810
			foreach($postNames as $configName => $configVal){
3811
 
3812
				#如果沒有最後更新時間
3813
				if(!isset($postNames["time"])){
3814
 
3815
					#設置最後更新時間
3816
					$conf["serverCache"]["clientSide"]["share"]["configs"][$serverUrl][$configName]["time"]=time();
3817
 
3818
					#換下一個 postName
3819
					continue;
3820
 
3821
					}#if end
3822
 
3823
				#如果過期了
3824
				if( time()-$postNames["time"]>$checkVersionInterval ){
3825
 
3826
					#嘗試從網路取得config
3827
					#函式說明:
3828
					#查尋有使用 server 函式提供組態設定檔的服務,取得key的value.
3829
					#回傳結果:
3830
					#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
3831
					#$result["error"],錯誤訊息陣列.
3832
					#$result["function"],當前執行的函數名稱.
3833
					#$result["rawContent"],得到的原始訊息.
3834
					#$result["content"],用json_decode後的結果;若"inBg"為"true",則其每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值;key為"output"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.
3835
					#必填參數:
3836
					#$conf["server"],字串,組態服務設定服務的網址
3837
					$conf["config::client"]["server"]=$serverUrl;
3838
					#$conf["postName"],字串,POST變數的名稱,亦即要查尋的定義名稱.
3839
					$conf["config::client"]["postName"]=$configName;
3840
					#$conf["fileArgu"],字串,變數__FILE__的內容.
3841
					$conf["config::client"]["fileArgu"]=__FILE__;
3842
					#可省略參數:
3843
					#$conf["cache"],字串,預設為"true",代表會啟用cache服務;反之為"false".
3844
					$conf["config::client"]["cache"]="false";
3845
					#$conf["clientCacheDaemonSock"],字串,提供cache服務的 unix domain socket 檔案位置,預設為套件根目錄底下的"var/config::client/clientCacheDaemon.sock";.
3846
					#$conf["clientCacheDaemonSock"]="";
3847
					#$conf["inBg"],字串,預設為"false",代表在前景執行;反之為"true"代表在背景中執行,會強制將"cache"參數設為"false".
3848
					$conf["config::client"]["inBg"]="true";
3849
					#參考資料:
3850
					#無.
3851
					#備註:
3852
					#目前僅能跟server函式提供的服務對接.
3853
					$client=config::client($conf["config::client"]);
3854
					unset($conf["config::client"]);
3855
 
3856
					#若從網路取得成功
3857
					if($client["status"]==="true"){
3858
 
3859
						#另存來源
3860
						$client["content"]["server"]=$serverUrl;
3861
 
3862
						#另存 configName
3863
						$client["content"]["postName"]=$configName;
3864
 
3865
						#儲存起來下次再看跑完沒
3866
						$conf["serverCache"]["serverSide"]["config::funcToRunWhenIdleForClientCacheDaemon"]["procs"][]=$client["content"];
3867
 
3868
						#換處理下個 configName
3869
						continue;
3870
 
3871
						}#if end	
3872
 
3873
					#執行到這邊代表從網路取得失敗
3874
 
3875
					#將事件記錄起來
3876
					var_dump(__FILE__,__LINE__,$client);
3877
 
3878
					}#if end
3879
 
3880
				}#foreach end
3881
 
3882
			}#foreach end
3883
 
3884
		#檢查每個 clientCache 若過期則更新之. - end
3885
 
3886
		#檢查每個 clientCache 若無對應 cache file 則產生之. - start
3887
 
3888
		#針對每個 client site 的 share configs 變數
3889
		foreach($conf["serverCache"]["clientSide"]["share"]["configs"] as $serverUrl => $postNames){
3890
 
3891
			#針對該site每個postName資訊
3892
			foreach($postNames as $configName => $configVal){
3893
 
3894
				#expected cache file name
3895
				#$cacheFilePath."client::config-cache-".$configName." from ".$serverUrl.".json";
3896
 
3897
				#realistic cache file name
3898
				#$cacheFilePath."client::config-cache-".urlencode($configName)." from ".urlencode($serverUrl).".json";
3899
 
3900
				#函式說明:
3901
				#檢查多個檔案與資料夾是否存在.
3902
				#回傳的結果:
3903
				#$result["status"],執行正常與否,"true"代表正常,"false"代表不正常.
3904
				#$result["error"],錯誤訊息陣列.
3905
				#$resutl["function"],當前執行的涵式名稱.
3906
				#$result["argu"],使用的參數.
3907
				#$result["allExist"],所有檔案皆存在的識別,"true"代表皆存在,"false"代表沒有全部都存在.
3908
				#$result["varName"][$i],爲第$i個資料夾或檔案的路徑與名稱。
3909
				#$result["varNameFullPath"][$i],爲第$i個資料夾或檔案的完整檔案系統路徑與名稱,如果不存在則代表路徑是網址.
3910
				#$result["varNameWebPath"][$i],為第$i個資料夾或檔案的網址,若"web"參數為"true",才會有該內容.
3911
				#$result["varExist"][$i],爲第$i個資料夾或檔案是否存在,"true"代表存在,"false"代表不存在。
3912
				#必填參數:
3913
				#$conf["fileArray"],陣列字串,要檢查是否存在的檔案有哪些,須爲一維陣列數值。
3914
				$conf["fileAccess::checkMultiFileExist"]["fileArray"]=array($cacheFilePath."client::config-cache-".urlencode($configName)." from ".urlencode($serverUrl).".json");
3915
				#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑
3916
				$conf["fileAccess::checkMultiFileExist"]["fileArgu"]=__FILE__;
3917
				#可省略參數:
3918
				#$conf["disableWebSearch"],"字串",是否取消「當檔案找不到時,改用catchWebContent類別的wget函數來檢查檔案是否存在於網路上」的功能,"false"不取消,若要取消該功能請設為"true",若抓到的內容為空字串則會視為檔案不存在,預設為"true".
3919
				$conf["fileAccess::checkMultiFileExist"]["disableWebSearch"]="true";
3920
				#$conf["userDir"],字串,網頁是否置放於家目錄底下,"true"為是,"false"為不是,預設為"true".
3921
				$conf["fileAccess::checkMultiFileExist"]["userDir"]="false";
3922
				#$conf["web"],字串,檔案是放在web就是"true",反之為檔案系統"false",預設為"true".
3923
				$conf["fileAccess::checkMultiFileExist"]["web"]="false";
3924
				#參考資料:
3925
				#http://php.net/manual/en/function.file-exists.php
3926
				#http://php.net/manual/en/control-structures.foreach.php
3927
				#備註:
3928
				#函數file_exists檢查的路徑為檔案系統的路徑
3929
				#$result["varName"][$i]結果未實作
3930
				$checkMultiFileExist=fileAccess::checkMultiFileExist($conf["fileAccess::checkMultiFileExist"]);
3931
				unset($conf["fileAccess::checkMultiFileExist"]);
3932
 
3933
				#如果執行失敗
3934
				if($checkMultiFileExist["status"]==="false"){
3935
 
3936
					#設置錯誤識別
3937
					$result["status"]="false";
3938
 
3939
					#設置錯誤訊息
3940
					$result["error"]=$checkMultiFileExist;
3941
 
3942
					#debug
3943
					var_dump(__LINE__,$result);
3944
 
3945
					#回傳結果
3946
					return $result;
3947
 
3948
					}#if end
3949
 
3950
				#如果 cache file 不存在
3951
				if($checkMultiFileExist["allExist"]==="false"){
3952
 
3953
					#函式說明:
3954
					#將字串寫入到檔案
3955
					#回傳結果:
3956
					#$result["status"],"true"表示檔案寫入成功,"false"表示檔案寫入失敗.
3957
					#$result["error"],錯誤訊息陣列.
3958
					#$result["function"],當前執行的函數名稱.
3959
					#$result["fileInfo"],實際上寫入的檔案資訊陣列.
3960
					#$result["fileInfo"]["createdFileName"],建立好的檔案名稱.
3961
					#$result["fileInfo"]["createdFilePath"],檔案建立的路徑.
3962
					#$result["fileInfo"]["createdFilePathAndName"].建立好的檔案名稱與路徑.
3963
					#$result["argu"],使用的參數.
3964
					#必填參數:
3965
					#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑
3966
					$conf["fileAccess::writeTextIntoFile"]["fileArgu"]=__FILE__;
3967
					#可省略參數:
3968
					#$conf["fileName"],字串,爲要編輯的檔案名稱,預設為隨機產生的檔案名稱.
3969
					$conf["fileAccess::writeTextIntoFile"]["fileName"]=$cacheFilePath."client::config-cache-".urlencode($configName)." from ".urlencode($serverUrl).".json";
3970
					#$conf["inputString"],字串,爲要寫入到裏面的內容,若要每筆資料寫入後換行,則可以在字串內容後面加上 \r\n 即可,預設為"".
3971
					$conf["fileAccess::writeTextIntoFile"]["inputString"]=$conf["serverCache"]["clientSide"]["share"]["configs"][$serverUrl][$configName]["content"];
3972
					#$conf["writeMethod"],字串,爲檔案撰寫的方式,可省略,是複寫'a'還是,重新寫入'w',預設爲'w',重新寫入.
3973
					#$conf["writeMethod"]="a";
3974
					#$conf["checkRepeat"],字串,"true"代表建立檔案之前要先檢查檔案是否存在,若存在則在原名稱後面加上從(1)開始的編號.
3975
					#$conf["checkRepeat"]="";
3976
					#$conf["filenameExtensionStartPoint"],字串,檔案的副檔名是從倒數第幾個小數點(dot)開始,預設為"1",最後一個小數點,必須與$conf["checkRepeat"]搭配才會生效.
3977
					#$conf["filenameExtensionStartPoint"]="";
3978
					#$conf["repeatNameRule"],字串,遇到相同名稱的檔案要如何加上識別的編號,編號用「\$i」表示,預設為"(\$i)",必須與$conf["checkRepeat"]搭配才會生效.
3979
					#$conf["repeatNameRule"]="";
3980
					#$conf["web"],檔案是否位於網站上"true",若是在檔案系統則為"false",預設為"true".
3981
					$conf["fileAccess::writeTextIntoFile"]["web"]="false";
3982
					#參考資料:
3983
					#無.
3984
					#備註:
3985
					#無.
3986
					$writeTextIntoFile=fileAccess::writeTextIntoFile($conf["fileAccess::writeTextIntoFile"]);
3987
					unset($conf["fileAccess::writeTextIntoFile"]);
3988
 
3989
					#如果執行失敗
3990
					if($writeTextIntoFile["status"]==="false"){
3991
 
3992
						#設置錯誤識別
3993
						$result["status"]="false";
3994
 
3995
						#設置錯誤訊息
3996
						$result["error"]=$writeTextIntoFile;
3997
 
3998
						#debug
3999
						var_dump(__LINE__,$result);
4000
 
4001
						#回傳結果
4002
						return $result;
4003
 
4004
						}#if end
4005
 
4006
					#設置已經有 cache 成檔案
4007
					$conf["serverCache"]["clientSide"]["share"]["configs"][$serverUrl][$configName]["cachedFile"]="true";
4008
 
4009
					#set cached file
4010
					$conf["serverCache"]["serverSide"]["config::funcToRunWhenIdleForClientCacheDaemon"]["cachedFile"][]="client::config-cache-".urlencode($configName)." from ".urlencode($serverUrl).".json";
4011
 
4012
					}#if end
4013
 
4014
				}#foreach end
4015
 
4016
			}#foreach end
4017
 
4018
		#檢查每個 clientCache 若無對應 cache file 則產生之. - end
4019
 
4020
		#設置執行正常
4021
		$result["status"]="true";
4022
 
4023
		#回傳結果
4024
		return $result;
4025
 
4026
		}#function funcToRunWhenIdleForClientCacheDaemon end
4027
 
4028
	/*
4029
	#函式說明:
4030
	#處理來自config::client有使用cache的要求,其為常駐的unix domain socket
4031
	#回傳結果:
4032
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
4033
	#$result["error"],錯誤訊息陣列.
4034
	#$result["function"],當前執行的函數名稱.
4035
	#必填參數:
4036
	#無.
4037
	#可省略參數:
4038
	#$conf["sock"],字串,unix doamin socket的位置,預設為套件根目錄底下的"var/config::client/clientCacheDaemon.sock".
4039
	#$conf["sock"]="";
4040
	#$conf["cacheFilePath"],字串,cache的檔案位置,預設為套件根目錄底下的"var/config::client/",
4041
	#$conf["cacheFilePath"]="";
4042
	#$conf["checkVersionInterval"],字串,距離最後一次取得資料的時間多久就要檢查是否有新資料,預設為60秒.
4043
	#$conf["checkVersionInterval"]="60";
4044
	#參考資料:
4045
	#無.
4046
	#備註:
4047
	#無,
4048
	*/
4049
	public static function clientCacheDaemon(&$conf){
4050
 
4051
		#初始化要回傳的結果
4052
		$result=array();
4053
 
4054
		#取得當前執行的函數名稱
4055
		$result["function"]=__FUNCTION__;
4056
 
4057
		#取得參數
4058
		$result["argu"]=$conf;
4059
 
4060
		#如果 $conf 不為陣列
4061
		if(gettype($conf)!="array"){
4062
 
4063
			#設置執行失敗
4064
			$result["status"]="false";
4065
 
4066
			#設置執行錯誤訊息
4067
			$result["error"][]="\$conf變數須為陣列形態";
4068
 
4069
			#如果傳入的參數為 null
4070
			if(is_null($conf)){
4071
 
4072
				#設置執行錯誤訊息
4073
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
4074
 
4075
				}#if end
4076
 
4077
			#回傳結果
4078
			return $result;
4079
 
4080
			}#if end
4081
 
4082
		#函式說明:
4083
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
4084
		#回傳結果:
4085
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
4086
		#$result["error"],執行不正常結束的錯訊息陣列.
4087
		#$result["simpleError"],簡單表示的錯誤訊息.
4088
		#$result["function"],當前執行的函式名稱.
4089
		#$result["argu"],設置給予的參數.
4090
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
4091
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
4092
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
4093
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
4094
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
4095
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
4096
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
4097
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
4098
		#必填參數:
4099
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
4100
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
4101
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
4102
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
4103
		#可省略參數:
4104
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
4105
		#$conf["mustBeFilledVariableName"]=array();
4106
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
4107
		#$conf["mustBeFilledVariableType"]=array();
4108
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
4109
		#$conf["canBeEmptyString"]="false";
4110
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
4111
		#$conf["canNotBeEmpty"]=array();
4112
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
4113
		#$conf["canBeEmpty"]=array();
4114
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
4115
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("sock","cacheFilePath","checkVersionInterval");
4116
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
4117
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("sock","cacheFilePath","checkVersionInterval");
4118
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
4119
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string");
4120
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
4121
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null,null,"60");
4122
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
4123
		#$conf["disallowAllSkipableVarIsEmpty"]="";
4124
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
4125
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
4126
		#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
4127
		#$conf["disallowAllSkipableVarNotExist"]="";
4128
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
4129
		#$conf["arrayCountEqualCheck"][]=array();
4130
		#參考資料:
4131
		#array_keys=>http://php.net/manual/en/function.array-keys.php
4132
		#備註:
4133
		#無.
4134
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
4135
		unset($conf["variableCheck::checkArguments"]);
4136
 
4137
		#如果執行失敗
4138
		if($checkArguments["status"]==="false"){
4139
 
4140
			#設置錯誤識別
4141
			$result["status"]="false";
4142
 
4143
			#設置錯誤訊息
4144
			$result["error"]=$checkArguments;
4145
 
4146
			#回傳結果
4147
			return $result;
4148
 
4149
			}#if end
4150
 
4151
		#如果檢查不通過
4152
		if($checkArguments["passed"]==="false"){
4153
 
4154
			#設置錯誤識別
4155
			$result["status"]="false";
4156
 
4157
			#設置錯誤訊息
4158
			$result["error"]=$checkArguments;
4159
 
4160
			#回傳結果
4161
			return $result;
4162
 
4163
			}#if end
4164
 
4165
		#函式說明:
4166
		#取得目前瀏覽的頁面的路徑或執行的php程式路徑.
4167
		#回傳結果:
4168
		#$result["status"],執行是否正常,"true"代表執行成功,"false"代表執行失敗.
4169
		#$result["error"],錯誤訊息.
4170
		#$result["function"],檔前執行的函數名稱.
4171
		#$result["content"],目前瀏覽的頁面的路徑或執行的php程式路徑.
4172
		#$result["serverIp"],取得伺服器ip.
4173
		#$result["scheme"],取得與伺服器連線所使用的通訊協定.
4174
		#必填參數:
4175
		$conf["csInformation::getPathOfThisPhpFile"]["type"]="pathOnly";#想要取得的路徑類型,"full"代表完整路徑,"pathOnly"代表只要路徑,"lastLayer"代表上一層目錄的名稱
4176
		#必填參數:
4177
		#無.
4178
		#可省略參數:
4179
		#無.
4180
		#參考資料:
4181
		#http://blog.longwin.com.tw/2009/01/php-get-directory-file-path-dirname-2008/
4182
		#備註:
4183
		#無.
4184
		$getPathOfThisPhpFile=csInformation::getPathOfThisPhpFile($conf["csInformation::getPathOfThisPhpFile"]);
4185
		unset($conf["csInformation::getPathOfThisPhpFile"]);
4186
 
4187
		#如果執行失敗
4188
		if($getPathOfThisPhpFile["status"]=="false"){
4189
 
4190
			#設置錯誤識別
4191
			$result["status"]="false";
4192
 
4193
			#設置錯誤訊息
4194
			$result["error"]=$getPathOfThisPhpFile;
4195
 
4196
			#回傳結果
4197
			return $result;
4198
 
4199
			}#if end
4200
 
4201
		#如果沒有設定 sock
4202
		if(!isset($conf["sock"])){
4203
 
4204
			#設置預設的cache檔案名稱
4205
			$conf["sock"]=$getPathOfThisPhpFile["content"]."var/config::client/clientCacheDaemon.sock";
4206
 
4207
			}#if end
4208
 
4209
		#如果 無設置 cacheFilePath
4210
		if(!isset($conf["cacheFilePath"])){
4211
 
4212
			#設置預設的 cacheFilePath 
4213
			$conf["cacheFilePath"]=$getPathOfThisPhpFile["content"]."var/config::client/";
4214
 
4215
			}#if end
4216
 
4217
		#函式說明:
4218
		#建立 unix domain socket server, 僅提供具備檔案存取權限的用戶使用,預設提供可以下達任何指令的功能.
4219
		#回傳結果:
4220
		#$result["status"],"true"代表執行正常;"false"代表執行不正常.
4221
		#$result["error"],錯誤訊息陣列.
4222
		#$result["function"],當前執行的函式名稱.
4223
		#$result["serverCache"],函式結束前,儲存在serverCache的內容,若有元素"exit"存在則代表是正常結束.
4224
		#必填參數:
4225
		#$conf["sock"],字串,socket檔案要放在哪邊,名稱為何.
4226
		$conf["sock::unixDomainSockServer"]["sock"]=$conf["sock"];
4227
		#$conf["fileArgu"],字串,變數__FILE__的內容.
4228
		$conf["sock::unixDomainSockServer"]["fileArgu"]=__FILE__;
4229
		#可省略參數:
4230
		#$conf["changeOwner"],字串,要將socket檔案的擁有着權限進行修改."user.group"代表擁有者帳號為user,群組為group.
4231
		#$conf["sock::unixDomainSockServer"]["changeOwner"]="root.root";
4232
		#$conf["changePermission"],字串,要將socket檔案的權限設為多少.ex: "0666"(所有帳戶都有存取的權限) 或 "0660"(僅有擁有者與群組帳戶有存取的權限) 或 "0600"(只有擁有者有權限執行).
4233
		#$conf["sock::unixDomainSockServer"]["changePermission"]="0666";
4234
		#$conf["sessionTimeout"],字串,當連線結束後於下一次連線間隔多久就算session timeout,server端會將記錄移除,client端需要重新拿取id,預設為300秒.
4235
		#$conf["sessionTimeout"]="300";
4236
		#$conf["addOnProcessFunc"],字串陣列,增加用於處理 json request 的函式名稱,給予的參數為array("request"=>收到的json訊息,"sock"=>用戶的socket),若收到的不是json而是"quit"則代表用戶要結束連線;若收到的是$shutdownStr則代表要結束本函式.回傳的內容必須為陣列,例如 $res["continue"]="true"代表要繼續執行下一個addOnProcessFunc;"false"代表代表到此為止. $res["content"]="replaced content";代表要將收到的訊息取代成"replaced content". 最少要有回傳 $res["status"]數值"true"代表執行正常;"false"代表執行不正常.
4237
		$conf["sock::unixDomainSockServer"]["addOnProcessFunc"]=array("\qbpwcf\\config::addOnProcessFuncForClientCacheDaemon");
4238
		#$conf["funcToRunWhenIdle"],字串陣列,當沒有事件產生時,要執行的函式名稱,給予參數為array("client"=>所有用戶,"clientCache"=>$result["serverCache"]["clientSide"]["addOnProcessFunc"][$funcToRunWhenIdle],"serverCache"=>$result["serverCache"]["serverSide"]["funcToRunWhenIdle"][$funcToRunWhenIdle]).
4239
		$conf["sock::unixDomainSockServer"]["funcToRunWhenIdle"]=array("\qbpwcf\\config::funcToRunWhenIdleForClientCacheDaemon");
4240
		#$conf["paramsForFuncToRunWhenIdle"],2維陣列,每個元素代表指定給予funcToRunWhenIdle參數中的指定元素的參數.
4241
		#$conf["paramsForFuncToRunWhenIdle"]=array();
4242
		#$conf["infoToFunction"],陣列,需要增加給addOnProcessFunc跟funcToRunWhenIdle函式的資訊,在函式中其參數的info鍵值.
4243
		$conf["sock::unixDomainSockServer"]["infoToFunction"]=array("sock"=>$conf["sock"],"cacheFilePath"=>$conf["cacheFilePath"],"checkVersionInterval"=>$conf["checkVersionInterval"]);
4244
		#$conf["shutdownStrAddr"],字串,儲存收到用戶傳什麼樣的字串會結束本函式的檔案位置與名稱,預設為 $conf["sock"].".shutdown".
4245
		#$conf["shutdownStrAddr"]="";
4246
		#參考資料:
4247
		#http://php.net/manual/en/function.stream-socket-server.php
4248
		#備註:
4249
		#無.
4250
		$unixDomainSockServer=sock::unixDomainSockServer($conf["sock::unixDomainSockServer"]);
4251
		unset($conf["sock::unixDomainSockServer"]);
4252
 
4253
		#如果執行失敗
4254
		if($unixDomainSockServer["status"]==="false"){
4255
 
4256
			#設置錯誤識別
4257
			$result["status"]="false";
4258
 
4259
			#設置錯誤訊息
4260
			$result["error"]=$unixDomainSockServer;
4261
 
4262
			#回傳結果
4263
			return $result;
4264
 
4265
			}#if end
4266
 
4267
		}#function clientCacheDaemon end
4268
 
4269
	}#class config end
4270
 
4271
?>