Subversion Repositories php-qbpwcf

Rev

Rev 383 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 383 Rev 396
Line 602... Line 602...
602
				#2 => readable handle connected to child stdin
602
				#2 => readable handle connected to child stdin
603
 
603
 
604
				#寫入內容作為 $executeBy 的輸入
604
				#寫入內容作為 $executeBy 的輸入
605
				$bytes2write=fwrite($process[$index]["pipes"][0], $cmdAndArguStr);
605
				$bytes2write=fwrite($process[$index]["pipes"][0], $cmdAndArguStr);
606
 
606
 
607
				#結束輸入
-
 
608
				fclose($process[$index]["pipes"][0]);
-
 
609
 
-
 
610
				#如果有完整寫入指令
607
				#如果有完整寫入指令
611
				if($bytes2write===strlen($cmdAndArguStr)){
608
				if($bytes2write===strlen($cmdAndArguStr)){
612
 
609
 
613
					#記錄輸入的指令
610
					#記錄輸入的指令
614
					$process[$index]["input"]=$cmdAndArguStr;
611
					$process[$index]["input"]=$cmdAndArguStr;
Line 645... Line 642...
645
 
642
 
646
				#設置執行結果
643
				#設置執行結果
647
				$result["content"][]=$cmdRes;
644
				$result["content"][]=$cmdRes;
648
 
645
 
649
				}#else end
646
				}#else end
-
 
647
				
-
 
648
			#結束輸入
-
 
649
			fclose($process[$index]["pipes"][0]);
650
 
650
 
651
			}#foreach end
651
			}#foreach end
652
 
652
 
653
		#針對每個回饋
653
		#針對每個回饋
654
		foreach($process as $index => $ps){
654
		foreach($process as $index => $ps){
Line 1149... Line 1149...
1149
					$stdout=stream_get_contents($proc["content"]);
1149
					$stdout=stream_get_contents($proc["content"]);
1150
 
1150
 
1151
					#取得錯誤輸出
1151
					#取得錯誤輸出
1152
					$stderr=stream_get_contents($proc["error"]);
1152
					$stderr=stream_get_contents($proc["error"]);
1153
 
1153
 
1154
					#設置執行失敗訊息
1154
					#關閉 pipe
1155
					$conf["procs"][$index]["error"]=$stderr;
1155
					fclose($proc["error"]);
1156
 
1156
 
1157
					#設置執行結果
1157
					#關閉 pipe
1158
					$conf["procs"][$index]["content"]=$stdout;
1158
					fclose($proc["content"]);
-
 
1159
					
-
 
1160
					#關閉程序
-
 
1161
					proc_close($proc["process"]);
1159
 
1162
 
1160
					}#if end
1163
					}#if end
-
 
1164
					
-
 
1165
				#反之
-
 
1166
				else{
-
 
1167
				
-
 
1168
					#取得標準輸出的 streams
-
 
1169
					$stdout=$proc["content"];
-
 
1170
					
-
 
1171
					#取得錯誤輸出的 streams
-
 
1172
					$stderr=$proc["error"];
-
 
1173
					
-
 
1174
					}#else end
-
 
1175
					
-
 
1176
				#設置執行結果
-
 
1177
				$conf["procs"][$index]["content"]=$stdout;
-
 
1178
				
-
 
1179
				#設置執行失敗訊息
-
 
1180
				$conf["procs"][$index]["error"]=$stderr;
1161
 
1181
 
1162
				}#if end
1182
				}#if end
1163
			
1183
			
1164
			#反之已經執行完畢
1184
			#反之已經執行完畢
1165
			else{
1185
			else{
Line 1171... Line 1191...
1171
					$stdout=stream_get_contents($proc["content"]);
1191
					$stdout=stream_get_contents($proc["content"]);
1172
 
1192
 
1173
					#設置執行結果
1193
					#設置執行結果
1174
					$conf["procs"][$index]["content"]=$stdout;
1194
					$conf["procs"][$index]["content"]=$stdout;
1175
					
1195
					
-
 
1196
					#關閉 pipe
-
 
1197
					fclose($proc["content"]);
-
 
1198
					
1176
					}#if end
1199
					}#if end
1177
					
1200
					
1178
				#如果錯誤輸出依然為 resource
1201
				#如果錯誤輸出依然為 resource
1179
				if(gettype($proc["error"])==="resource"){
1202
				if(gettype($proc["error"])==="resource"){
1180
				
1203
				
1181
					#取得錯誤輸出
1204
					#取得錯誤輸出
1182
					$stderr=stream_get_contents($proc["error"]);
1205
					$stderr=stream_get_contents($proc["error"]);
1183
					
1206
					
1184
					#設置執行失敗訊息
1207
					#設置執行失敗訊息
1185
					$conf["procs"][$index]["error"]=$stderr;
1208
					$conf["procs"][$index]["error"]=$stderr;
-
 
1209
					
-
 
1210
					#關閉 pipe
-
 
1211
					fclose($proc["error"]);
1186
				
1212
				
1187
					}#if end
1213
					}#if end
-
 
1214
					
-
 
1215
				#關閉程序
-
 
1216
				proc_close($proc["process"]);
1188
			
1217
			
1189
				}#else end
1218
				}#else end
1190
 
1219
 
1191
			}#foreach end
1220
			}#foreach end
1192
 
1221
 
Line 1222... Line 1251...
1222
	#參考資料:
1251
	#參考資料:
1223
	#https://www.php.net/manual/en/function.proc-open.php
1252
	#https://www.php.net/manual/en/function.proc-open.php
1224
	#https://www.php.net/manual/en/function.proc-get-status.php
1253
	#https://www.php.net/manual/en/function.proc-get-status.php
1225
	#https://www.php.net/manual/en/function.proc-terminate.php
1254
	#https://www.php.net/manual/en/function.proc-terminate.php
1226
	#備註:
1255
	#備註:
1227
	#無.
1256
	#目前會有子程序不會結束的問題.
1228
	*/
1257
	*/
1229
	public static function proc_stream_select(&$conf){
1258
	public static function proc_stream_select(&$conf){
1230
	
1259
	
1231
		#初始化要回傳的結果
1260
		#初始化要回傳的結果
1232
		$result=array();
1261
		$result=array();
Line 1494... Line 1523...
1494
		
1523
		
1495
		#回傳結果
1524
		#回傳結果
1496
		return $result;
1525
		return $result;
1497
	
1526
	
1498
		}#function proc_stream_select end
1527
		}#function proc_stream_select end
-
 
1528
		
-
 
1529
	/*
-
 
1530
	#函式說明:
-
 
1531
	#類似stream_select的替代方案, 用來檢查透過proc運行的多執行序其標準輸出、錯誤輸出是否有訊息,程序是否已經結束.
-
 
1532
	#回傳結果:
-
 
1533
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
1534
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
-
 
1535
	#$result["function"],當前執行的函式名稱.
-
 
1536
	#$result["argu"],使用的參數.
-
 
1537
	#$result["content"],陣列,運行中的程序,可作為下次呼叫本函式的procs參數.
-
 
1538
	#$result["streams"],陣列,元素為對應channelName索引的輸出.
-
 
1539
	#$result["allStreamsClosed"],字串,"true"代表streams參數的通道已經全部關閉;反之為"false".
-
 
1540
	#$result["gotMsg"],字串,"true"代表有訊息輸出;反之為"false".
-
 
1541
	#必填參數:
-
 
1542
	#$conf["procs"],陣列,threads::proc回傳的content.
-
 
1543
	$conf["procs"]=array();
-
 
1544
	#可省略參數:
-
 
1545
	#$conf["channelName"],陣列,每個元素為兩個元素的陣列,第一個元素為對應procs元素的標準輸出的stream/channel名稱,預設為std_$index,第二個元素為對應procs元素的錯誤輸出,預設為err_$index,$index為從0開始的整數.
-
 
1546
	#$conf["channelName"]=array();
-
 
1547
	#$conf["periodToWait"],整數,要等待多少秒來嘗試取得訊息,預設為1秒鐘.
-
 
1548
	#$conf["periodToWait"]=1;
-
 
1549
	#參考資料:
-
 
1550
	#https://www.php.net/manual/en/function.proc-open.php
-
 
1551
	#https://www.php.net/manual/en/function.proc-get-status.php
-
 
1552
	#https://www.php.net/manual/en/function.proc-terminate.php
-
 
1553
	#備註:
-
 
1554
	#無.
-
 
1555
	*/
-
 
1556
	public static function proc_streams_select(&$conf){
-
 
1557
	
-
 
1558
		#初始化要回傳的結果
-
 
1559
		$result=array();
-
 
1560
 
-
 
1561
		#取得當前執行的函數名稱
-
 
1562
		$result["function"]=__FUNCTION__;
-
 
1563
 
-
 
1564
		#如果沒有參數
-
 
1565
		if(func_num_args()==0){
-
 
1566
 
-
 
1567
			#設置執行失敗
-
 
1568
			$result["status"]="false";
-
 
1569
 
-
 
1570
			#設置執行錯誤訊息
-
 
1571
			$result["error"]="函數".$result["function"]."需要參數";
-
 
1572
 
-
 
1573
			#回傳結果
-
 
1574
			return $result;
-
 
1575
 
-
 
1576
			}#if end
-
 
1577
 
-
 
1578
		#涵式說明:
-
 
1579
		#判斷當前環境為web還是cmd
-
 
1580
		#回傳結果:
-
 
1581
		#$result,"web"或"cmd"
-
 
1582
		if(csInformation::getEnv()==="web"){
-
 
1583
 
-
 
1584
			#設置執行失敗
-
 
1585
			$result["status"]="false";
-
 
1586
 
-
 
1587
			#設置執行錯誤訊息
-
 
1588
			$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";
-
 
1589
 
-
 
1590
			#回傳結果
-
 
1591
			return $result;
-
 
1592
 
-
 
1593
			}#if end
-
 
1594
		
-
 
1595
		#取得參數
-
 
1596
		$result["argu"]=$conf;
-
 
1597
 
-
 
1598
		#如果 $conf 不為陣列
-
 
1599
		if(gettype($conf)!=="array"){
-
 
1600
 
-
 
1601
			#設置執行失敗
-
 
1602
			$result["status"]="false";
-
 
1603
 
-
 
1604
			#設置執行錯誤訊息
-
 
1605
			$result["error"][]="\$conf變數須為陣列形態";
-
 
1606
 
-
 
1607
			#如果傳入的參數為 null
-
 
1608
			if(is_null($conf)){
-
 
1609
 
-
 
1610
				#設置執行錯誤訊息
-
 
1611
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
-
 
1612
 
-
 
1613
				}#if end
-
 
1614
 
-
 
1615
			#回傳結果
-
 
1616
			return $result;
-
 
1617
 
-
 
1618
			}#if end
-
 
1619
		
-
 
1620
		#函式說明:
-
 
1621
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
-
 
1622
		#回傳結果:
-
 
1623
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
1624
		#$result["error"],執行不正常結束的錯訊息陣列.
-
 
1625
		#$result["simpleError"],簡單表示的錯誤訊息.
-
 
1626
		#$result["function"],當前執行的函式名稱.
-
 
1627
		#$result["argu"],設置給予的參數.
-
 
1628
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
-
 
1629
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
-
 
1630
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
-
 
1631
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
-
 
1632
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
-
 
1633
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
-
 
1634
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
-
 
1635
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
-
 
1636
		#必填參數:
-
 
1637
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
-
 
1638
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
-
 
1639
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
-
 
1640
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
-
 
1641
		#可省略參數:
-
 
1642
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
-
 
1643
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("procs");
-
 
1644
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".
-
 
1645
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("array");
-
 
1646
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
-
 
1647
		#$conf["canBeEmptyString"]="false";
-
 
1648
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
-
 
1649
		#$conf["canNotBeEmpty"]=array();
-
 
1650
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
-
 
1651
		#$conf["canBeEmpty"]=array();
-
 
1652
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
-
 
1653
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("channelName","periodToWait");
-
 
1654
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
-
 
1655
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("channelName","periodToWait");
-
 
1656
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
-
 
1657
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("array","integer");
-
 
1658
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
-
 
1659
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null,1);
-
 
1660
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
-
 
1661
		#$conf["disallowAllSkipableVarIsEmpty"]="";
-
 
1662
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
-
 
1663
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
-
 
1664
		#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
-
 
1665
		#$conf["disallowAllSkipableVarNotExist"]="";
-
 
1666
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
-
 
1667
		#$conf["arrayCountEqualCheck"][]=array();
-
 
1668
		#參考資料:
-
 
1669
		#array_keys=>http://php.net/manual/en/function.array-keys.php
-
 
1670
		#備註:
-
 
1671
		#無.
-
 
1672
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
-
 
1673
		unset($conf["variableCheck::checkArguments"]);
-
 
1674
		
-
 
1675
		#如果執行異常
-
 
1676
		if($checkArguments["status"]==="false"){
-
 
1677
		
-
 
1678
			#設置執行失敗
-
 
1679
			$result["status"]="false";
-
 
1680
 
-
 
1681
			#設置執行錯誤訊息
-
 
1682
			$result["error"]=$checkArguments;
-
 
1683
			
-
 
1684
			#回傳結果
-
 
1685
			return $result;
-
 
1686
		
-
 
1687
			}#if end
-
 
1688
			
-
 
1689
		#如果參數檢查不通過
-
 
1690
		if($checkArguments["passed"]==="false"){
-
 
1691
		
-
 
1692
			#設置執行失敗
-
 
1693
			$result["status"]="false";
-
 
1694
 
-
 
1695
			#設置執行錯誤訊息
-
 
1696
			$result["error"]=$checkArguments;
-
 
1697
			
-
 
1698
			#回傳結果
-
 
1699
			return $result;
-
 
1700
		
-
 
1701
			}#if end
-
 
1702
		
-
 
1703
		#初始化預設的 channel name
-
 
1704
		$default_channelName=array();
-
 
1705
		
-
 
1706
		#針對每個 proc
-
 
1707
		foreach($conf["procs"] as $index => $proc){
-
 
1708
		
-
 
1709
			#設置預設的 channle name
-
 
1710
			$default_channelName[]=array("std_".$index,"err_".$index);
-
 
1711
		
-
 
1712
			}#foreach end
-
 
1713
		
-
 
1714
		#函式說明:
-
 
1715
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
-
 
1716
		#回傳結果:
-
 
1717
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
1718
		#$result["error"],執行不正常結束的錯訊息陣列.
-
 
1719
		#$result["simpleError"],簡單表示的錯誤訊息.
-
 
1720
		#$result["function"],當前執行的函式名稱.
-
 
1721
		#$result["argu"],設置給予的參數.
-
 
1722
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
-
 
1723
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
-
 
1724
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
-
 
1725
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
-
 
1726
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
-
 
1727
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
-
 
1728
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
-
 
1729
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
-
 
1730
		#必填參數:
-
 
1731
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
-
 
1732
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
-
 
1733
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
-
 
1734
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
-
 
1735
		#可省略參數:
-
 
1736
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
-
 
1737
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("procs");
-
 
1738
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".
-
 
1739
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("array");
-
 
1740
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
-
 
1741
		#$conf["canBeEmptyString"]="false";
-
 
1742
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
-
 
1743
		#$conf["canNotBeEmpty"]=array();
-
 
1744
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
-
 
1745
		#$conf["canBeEmpty"]=array();
-
 
1746
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
-
 
1747
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("channelName","periodToWait");
-
 
1748
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
-
 
1749
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("channelName","periodToWait");
-
 
1750
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
-
 
1751
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("array","integer");
-
 
1752
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
-
 
1753
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array($default_channelName,1);
-
 
1754
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
-
 
1755
		#$conf["disallowAllSkipableVarIsEmpty"]="";
-
 
1756
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
-
 
1757
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
-
 
1758
		#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
-
 
1759
		#$conf["disallowAllSkipableVarNotExist"]="";
-
 
1760
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
-
 
1761
		$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array("procs","channelName");
-
 
1762
		#參考資料:
-
 
1763
		#array_keys=>http://php.net/manual/en/function.array-keys.php
-
 
1764
		#備註:
-
 
1765
		#無.
-
 
1766
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
-
 
1767
		unset($conf["variableCheck::checkArguments"]);
-
 
1768
	
-
 
1769
		#如果執行異常
-
 
1770
		if($checkArguments["status"]==="false"){
-
 
1771
		
-
 
1772
			#設置執行失敗
-
 
1773
			$result["status"]="false";
-
 
1774
 
-
 
1775
			#設置執行錯誤訊息
-
 
1776
			$result["error"]=$checkArguments;
-
 
1777
			
-
 
1778
			#回傳結果
-
 
1779
			return $result;
-
 
1780
		
-
 
1781
			}#if end
-
 
1782
			
-
 
1783
		#如果參數檢查不通過
-
 
1784
		if($checkArguments["passed"]==="false"){
-
 
1785
		
-
 
1786
			#設置執行失敗
-
 
1787
			$result["status"]="false";
-
 
1788
 
-
 
1789
			#設置執行錯誤訊息
-
 
1790
			$result["error"]=$checkArguments;
-
 
1791
			
-
 
1792
			#回傳結果
-
 
1793
			return $result;
-
 
1794
		
-
 
1795
			}#if end
-
 
1796
			
-
 
1797
		#每個 channelName 參數的元素必須為 有兩個元素的陣列,key值要為0跟1.
-
 
1798
		
-
 
1799
		#針對 channelName 的每個元素
-
 
1800
		foreach($conf["channelName"] as $chName){
-
 
1801
			
-
 
1802
			#函式說明:
-
 
1803
			#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
-
 
1804
			#回傳結果:
-
 
1805
			#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
1806
			#$result["error"],執行不正常結束的錯訊息陣列.
-
 
1807
			#$result["simpleError"],簡單表示的錯誤訊息.
-
 
1808
			#$result["function"],當前執行的函式名稱.
-
 
1809
			#$result["argu"],設置給予的參數.
-
 
1810
			#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
-
 
1811
			#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
-
 
1812
			#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
-
 
1813
			#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
-
 
1814
			#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
-
 
1815
			#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
-
 
1816
			#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
-
 
1817
			#$result["notNeedVar"],字串陣列,多餘的參數名稱.
-
 
1818
			#必填參數:
-
 
1819
			#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
-
 
1820
			$conf["variableCheck::checkArguments"]["varInput"]=&$chName;
-
 
1821
			#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
-
 
1822
			$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
-
 
1823
			#可省略參數:
-
 
1824
			#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
-
 
1825
			$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array(0,1);
-
 
1826
			#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".
-
 
1827
			$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string");
-
 
1828
			#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
-
 
1829
			#$conf["canBeEmptyString"]="false";
-
 
1830
			#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
-
 
1831
			#$conf["canNotBeEmpty"]=array();
-
 
1832
			#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
-
 
1833
			#$conf["canBeEmpty"]=array();
-
 
1834
			#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
-
 
1835
			#$conf["skipableVariableCanNotBeEmpty"]=array();
-
 
1836
			#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
-
 
1837
			#$conf["skipableVariableName"]=array();
-
 
1838
			#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
-
 
1839
			#$conf["skipableVariableType"]=array();
-
 
1840
			#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
-
 
1841
			#$conf["skipableVarDefaultValue"]=array("");
-
 
1842
			#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
-
 
1843
			#$conf["disallowAllSkipableVarIsEmpty"]="";
-
 
1844
			#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
-
 
1845
			#$conf["disallowAllSkipableVarIsEmptyArray"]="";
-
 
1846
			#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
-
 
1847
			#$conf["disallowAllSkipableVarNotExist"]="";
-
 
1848
			#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
-
 
1849
			#$conf["arrayCountEqualCheck"][]=array();
-
 
1850
			#$conf["arrayCount"],字串陣列,為檢查指定的陣列參數,其元素數量要為多少,預設不指定.
-
 
1851
			#$conf["arrayCount"][]=array("variableName",$elementCount);
-
 
1852
			#參考資料:
-
 
1853
			#array_keys=>http://php.net/manual/en/function.array-keys.php
-
 
1854
			#備註:
-
 
1855
			#無.
-
 
1856
			$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
-
 
1857
			unset($conf["variableCheck::checkArguments"]);
-
 
1858
		
-
 
1859
			#如果執行異常
-
 
1860
			if($checkArguments["status"]==="false"){
-
 
1861
			
-
 
1862
				#設置執行失敗
-
 
1863
				$result["status"]="false";
-
 
1864
 
-
 
1865
				#設置執行錯誤訊息
-
 
1866
				$result["error"]=$checkArguments;
-
 
1867
				
-
 
1868
				#回傳結果
-
 
1869
				return $result;
-
 
1870
			
-
 
1871
				}#if end
-
 
1872
				
-
 
1873
			#如果檢查不通過
-
 
1874
			if($checkArguments["passed"]==="false"){
-
 
1875
			
-
 
1876
				#設置執行失敗
-
 
1877
				$result["status"]="false";
-
 
1878
 
-
 
1879
				#設置執行錯誤訊息
-
 
1880
				$result["error"]=$checkArguments;
-
 
1881
				
-
 
1882
				#回傳結果
-
 
1883
				return $result;
-
 
1884
			
-
 
1885
				}#if end
-
 
1886
		
-
 
1887
			}#foreach end
-
 
1888
		
-
 
1889
		#函式說明:
-
 
1890
		#更新透過proc執行的多程序資訊.
-
 
1891
		#回傳結果:
-
 
1892
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
-
 
1893
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
-
 
1894
		#$result["function"],當前執行的函式名稱.
-
 
1895
		#$result["argu"],使用的參數.
-
 
1896
		#$result["content"],陣列,每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值,若為"?"則代表程序尚未結束,可透過proc_update函式進行資訊的更新與取得;key為"output"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.
-
 
1897
		#必填參數:
-
 
1898
		#$conf["procs"],陣列,運行self::proc後回傳的content.
-
 
1899
		$conf["threads::proc_update"]["procs"]=$conf["procs"];
-
 
1900
		#可省略參數:
-
 
1901
		#無.
-
 
1902
		#參考資料:
-
 
1903
		#無.
-
 
1904
		#備註:
-
 
1905
		#無.
-
 
1906
		$proc_update=threads::proc_update($conf["threads::proc_update"]);
-
 
1907
		unset($conf["threads::proc_update"]);
-
 
1908
		
-
 
1909
		#debug
-
 
1910
		#var_dump(__LINE__,$proc_update);
-
 
1911
		
-
 
1912
		#如果執行異常
-
 
1913
		if($proc_update["status"]==="false"){
-
 
1914
		
-
 
1915
			#設置執行錯誤
-
 
1916
			$result["error"]=$proc_update;
-
 
1917
		
-
 
1918
			#設置執行異常
-
 
1919
			$result["status"]="false";
-
 
1920
			
-
 
1921
			#回傳結果
-
 
1922
			return $result;
-
 
1923
			
-
 
1924
			}#if end
-
 
1925
			
-
 
1926
		#debug
-
 
1927
		#var_dump(__LINE__,$conf["channelName"]);
-
 
1928
			
-
 
1929
		#針對每個程序
-
 
1930
		foreach($proc_update["content"] as $index => $pInfo){
-
 
1931
		
-
 
1932
			#如果程序尚未結束
-
 
1933
			if($pInfo["statusCode"]==="?"){
-
 
1934
			
-
 
1935
				#初始化等待訊息的時間
-
 
1936
				$periodToWait=0;
-
 
1937
			
-
 
1938
				#無窮迴圈
-
 
1939
				while(true){
-
 
1940
				
-
 
1941
					#取得目前 std 的輸出
-
 
1942
					$std=fgets($pInfo["content"]);
-
 
1943
					
-
 
1944
					#取得目前 err 的輸出
-
 
1945
					$err=fgets($pInfo["error"]);
-
 
1946
					
-
 
1947
					# 如果有 std 輸出
-
 
1948
					if(!empty($std)){
-
 
1949
					
-
 
1950
						#設置 streams std 的輸出
-
 
1951
						$result["streams"][$conf["channelName"][$index][0]]=$std;
-
 
1952
						
-
 
1953
						#跳出迴圈
-
 
1954
						break;
-
 
1955
						
-
 
1956
						}#if end
-
 
1957
							
-
 
1958
					#如果有 err 輸出
-
 
1959
					if(!empty($err)){
-
 
1960
						
-
 
1961
						#設置 streams err 的輸出
-
 
1962
						$result["streams"][$conf["channelName"][$index][1]]=$err;
-
 
1963
						
-
 
1964
						#跳出迴圈
-
 
1965
						break;
-
 
1966
					
-
 
1967
						}#if end
-
 
1968
					
-
 
1969
						
-
 
1970
					#如果已經達到等待的時間上限
-
 
1971
					if($periodToWait>=$conf["periodToWait"]){
-
 
1972
					
-
 
1973
						#跳出迴圈
-
 
1974
						break;
-
 
1975
					
-
 
1976
						}#if end
-
 
1977
						
-
 
1978
					#等待1秒
-
 
1979
					sleep(1);
-
 
1980
					
-
 
1981
					#已經待的時間加1
-
 
1982
					$periodToWait=$periodToWait+1;
-
 
1983
				
-
 
1984
					}#while end
-
 
1985
			
-
 
1986
				#儲存尚未運行完畢的程序
-
 
1987
				$result["content"][]=$pInfo;
-
 
1988
			
-
 
1989
				}#if end
-
 
1990
				
-
 
1991
			#反之程序已經結束
-
 
1992
			else{
-
 
1993
			
-
 
1994
				#如果有標準輸出
-
 
1995
				if(gettype($pInfo["content"])==="string"){
-
 
1996
				
-
 
1997
					#如果有內容
-
 
1998
					if(!empty($pInfo["content"])){
-
 
1999
				
-
 
2000
						#設置 streams std 的輸出
-
 
2001
						$result["streams"][$conf["channelName"][$index][0]]=$pInfo["content"];
-
 
2002
						
-
 
2003
						}#if end
-
 
2004
				
-
 
2005
					}#if end
-
 
2006
			
-
 
2007
				#如果有錯誤輸出
-
 
2008
				if(gettype($pInfo["error"])==="string"){
-
 
2009
				
-
 
2010
					#如果有內容
-
 
2011
					if(!empty($pInfo["error"])){
-
 
2012
						
-
 
2013
						#設置 streams err 的輸出
-
 
2014
						$result["streams"][$conf["channelName"][$index][1]]=$pInfo["error"];
-
 
2015
						
-
 
2016
						}#if end
-
 
2017
				
-
 
2018
					}#if end
-
 
2019
			
-
 
2020
				}#else end
-
 
2021
		
-
 
2022
			}#foreach end
-
 
2023
			
-
 
2024
		#如果沒有運行中的程序
-
 
2025
		if(empty($result["content"])){
-
 
2026
		
-
 
2027
			#設置所有 streams 已經關閉.
-
 
2028
			$result["allStreamsClosed"]="true";
-
 
2029
		
-
 
2030
			}#if end
-
 
2031
			
-
 
2032
		#反之
-
 
2033
		else{
-
 
2034
		
-
 
2035
			#設置所有 streams 未關閉.
-
 
2036
			$result["allStreamsClosed"]="false";
-
 
2037
		
-
 
2038
			}#else end
-
 
2039
		
-
 
2040
		#如果有輸出
-
 
2041
		if(!empty($result["streams"])){
-
 
2042
		
-
 
2043
			#設置有輸出的識別
-
 
2044
			$result["gotMsg"]="true";
-
 
2045
		
-
 
2046
			}#if end
-
 
2047
			
-
 
2048
		#反之
-
 
2049
		else{
-
 
2050
		
-
 
2051
			#設置沒有輸出的識別
-
 
2052
			$result["gotMsg"]="false";
-
 
2053
		
-
 
2054
			}#else end
-
 
2055
		
-
 
2056
		#設置運行正常
-
 
2057
		$result["status"]="true";
-
 
2058
	
-
 
2059
		#回傳結果
-
 
2060
		return $result;
-
 
2061
	
-
 
2062
		}#function proc_streams_select end
1499
 
2063
 
1500
	/*
2064
	/*
1501
	#函式說明:
2065
	#函式說明:
1502
	#透過parallel展示多執行序運作.
2066
	#透過parallel展示多執行序運作.
1503
	#回傳結果:
2067
	#回傳結果: