Rev 350 | Rev 383 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/*QBPWCF, Quick Build PHP website Component base on Fedora Linux.Copyright (C) 2014~2026 MIN ZHI, CHENThis file is part of QBPWCF.QBPWCF is free software: you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation, either version 3 of the License, or(at your option) any later version.QBPWCF is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with QBPWCF. If not, see <http://www.gnu.org/licenses/>.*/namespace qbpwcf;/*類別說明:提供資料與具備揮發性的物件、資源管理,讓不同程序與程式甚至不同語言都能夠共享資源.備註:無.*/class resource{/*#函式說明:#當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#必填參數:#$method,物件,為物件實體或類別名稱,會自動置入該參數.#$arguments,陣列,為呼叫方法時所用的參數.#可省略參數:#無.#參考資料:#__call=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic#備註:#無.*/public function __call($method,$arguments){#取得當前執行的函式$result["function"]=__FUNCTION__;#設置執行不正常$result["status"]="false";#設置執行錯誤$result["error"][]=__NAMESPACE__ ."/".$method."() 不存在!";#設置所丟入的參數$result["error"][]=$arguments;#回傳結果return $result;}#function __call end/*#函式說明:#當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#必填參數:#$method,物件,為物件實體或類別名稱,會自動置入該參數.#$arguments,陣列,為呼叫方法時所用的參數.#可省略參數:#無.#參考資料:#__callStatic=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic#備註:#無.*/public static function __callStatic($method,$arguments){#取得當前執行的函式$result["function"]=__FUNCTION__;#設置執行不正常$result["status"]="false";#設置執行錯誤$result["error"][]="欲呼叫的". __NAMESPACE__ ."/".$method."() 不存在!";#設置所丟入的參數$result["error"][]=$arguments;#回傳結果return $result;}#function __callStatic end/*#函式說明:#建立快取服務.實質上為unix domain socket server.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#必填參數:#無.#可省略參數:#$conf["sock"],字串,unix domain socket的路徑與名稱,預設為相對於當前套件的 var/qbpwcf/resource.sock#$conf["sock"]="";#$conf["debug"],字串,"true"代表要啟用debug模式;反之預設為"false"不啟用.#$conf["debug"]="";#$conf["addOnProcessFunc"],陣列,收到訊息後,要依順執行的函式,預設為array("\qbpwcf\resource::addOnProcessFunc"),會傳遞的參數為一陣列,每個元素的key與value依序為"id":"識別用戶的id";"last_request_time":"訊號來的時間";"request":"收到的訊息陣列";"socket":"跟用戶互動用socket";"clientCache":id對應用戶的cache;#$conf["addOnProcessFunc"]=array();#$conf["funcToRunWhenIdle"],陣列,閒置時要依序執行的函式,預設為array("/qbpwcf/resource::funcToRunWhenIdle");#$conf["funcToRunWhenIdle"]=array();#$conf["deafaultLifeTime"],字串,資源沒被使用時,預設的存留時間秒數,預設為"300".#$conf["deafaultLifeTime"]="300";#$conf["defaultUserGroup"],字串,unix domain socket的擁有者與群組為何,預設為"root.".webUser.#$ocnf["defaultUserGroup"]="root.".webUser;#$conf["defaultPermission"],字串,unix domain socket的權限設定,預設為"0660",代表擁有者與其群組有讀寫的權限.#$conf["defaultPermission"]="0660";#參考資料:#無.#備註:#僅能在命令列環境下運行.*/public static function server(&$conf){#初始化要回傳的結果$result=array();#取得當前執行的函數名稱$result["function"]=__FUNCTION__;#如果沒有參數if(func_num_args()==0){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]="函數".$result["function"]."需要參數";#回傳結果return $result;}#if end#涵式說明:#判斷當前環境為web還是cmd#回傳結果:#$result,"web"或"cmd"if(csInformation::getEnv()==="web"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";#回傳結果return $result;}#if end#取得參數$result["argu"]=$conf;#如果 $conf 不為陣列if(gettype($conf)!=="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif(is_null($conf)){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#預設的 unix domain socket addr$sock=pathinfo(__FILE__)["dirname"]."/../../var/qbpwcf/resource.sock";#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],執行不正常結束的錯訊息陣列.#$result["simpleError"],簡單表示的錯誤訊息.#$result["function"],當前執行的函式名稱.#$result["argu"],設置給予的參數.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=&$conf;#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可省略參數:#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");#$conf["mustBeFilledVariableName"]=array();#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".#$conf["mustBeFilledVariableType"]=array();#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.#$conf["canBeEmptyString"]="false";#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.#$conf["canNotBeEmpty"]=array();#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.#$conf["canBeEmpty"]=array();#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("sock","deafaultLifeTime","defaultUserGroup","defaultPermission");#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("sock","deafaultLifeTime","defaultUserGroup","defaultPermission");#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string","string");#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array($sock,"300","root.".webUser,"0660");#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".#$conf["disallowAllSkipableVarIsEmpty"]="";#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".#$conf["disallowAllSkipableVarIsEmptyArray"]="";#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".#$conf["disallowAllSkipableVarNotExist"]="";#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.#$conf["arrayCountEqualCheck"][]=array();#參考資料:#array_keys=>http://php.net/manual/en/function.array-keys.php#備註:#無.$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果執行異常if($checkArguments["status"]==="false"){#設置執行異常識別$result["status"]="false";#設置執行錯誤$result["error"]=$checkArguments;#回傳結果return $result;}#if end#初始化要儲存快取資料的變數$resource=array();/*$resource 結構$resource[$uuid]["value"],資源的內容.$resource[$uuid]["type"],資源的類型,有php_variable跟proc.$resource[$uuid]["life"],資源的壽命,單位為秒數.*/#函式說明:#建立 unix domain socket server, 僅提供具備檔案存取權限的用戶使用,預設提供可以下達任何指令的功能.#回傳結果:#$result["status"],"true"代表執行正常;"false"代表執行不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函式名稱.#$result["serverCache"],函式結束前,儲存在serverCache的內容,若有元素"exit"存在則代表是正常結束.#$result["serverCache"]["serverSide"],server side 的 cache.#$result["serverCache"]["serverSide"]["procs"], server side 的 procs cache,儲存執行的子程序資訊.#$result["serverCache"]["clientSide"],client site 的 cache.#必填參數:#$conf["sock"],字串,socket檔案要放在哪邊,名稱為何.$conf["sock::unixDomainSockServer"]["sock"]=$conf["sock"];#$conf["fileArgu"],字串,變數__FILE__的內容.$conf["sock::unixDomainSockServer"]["fileArgu"]=__FILE__;#可省略參數:#$conf["changeOwner"],字串,要將socket檔案的擁有着權限進行修改."user.group"代表擁有者帳號為user,群組為group.$conf["sock::unixDomainSockServer"]["changeOwner"]=$conf["defaultUserGroup"];#$conf["changePermission"],字串,要將socket檔案的權限設為多少.ex: "0666"(所有帳戶都有存取的權限) 或 "0660"(僅有擁有者與群組帳戶有存取的權限) 或 "0600"(只有擁有者有權限執行).$conf["sock::unixDomainSockServer"]["changePermission"]=$conf["defaultPermission"];#$conf["sessionTimeout"],字串,當連線結束後於下一次連線間隔多久就算session timeout,server端會將記錄移除,client端需要重新拿取id,預設為300秒.#$conf["sessionTimeout"]="300";#$conf["addOnProcessFunc"],字串陣列,增加用於處理 json request 的函式名稱,給予的參數為array("request"=>收到的json訊息,"sock"=>用戶的socket,"clientCache"=>給予所有用戶的cache),若收到的不是json而是"quit"則代表用戶要結束連線;若收到的是$shutdownStr則代表要結束本函式.回傳的內容必須為陣列,例如 $res["continue"]="true"代表要繼續執行下一個addOnProcessFunc;"false"代表代表到此為止. $res["content"]="replaced content";代表要將收到的訊息取代成"replaced content". 最少要有回傳 $res["status"]數值"true"代表執行正常;"false"代表執行不正常.$conf["sock::unixDomainSockServer"]["addOnProcessFunc"]=array("\qbpwcf\\resource::addOnProcessFunc");#$conf["funcToRunWhenIdle"],字串陣列,當沒有事件產生時,要執行的函式名稱,給予參數為array("client"=>所有用戶,"clientCache"=>$result["serverCache"]["clientSide"]["addOnProcessFunc"][$funcToRunWhenIdle],"serverCache"=>$result["serverCache"]["serverSide"]["funcToRunWhenIdle"][$funcToRunWhenIdle]).$conf["sock::unixDomainSockServer"]["funcToRunWhenIdle"]=array("\qbpwcf\\resource::funcToRunWhenIdle");#$conf["paramsForFuncToRunWhenIdle"],2維陣列,每個元素代表指定給予funcToRunWhenIdle參數中的指定元素的參數.#$conf["paramsForFuncToRunWhenIdle"]=array();#$conf["infoToFunction"],陣列,需要增加給addOnProcessFunc跟funcToRunWhenIdle函式的資訊,在函式中其參數的info鍵值.$conf["sock::unixDomainSockServer"]["infoToFunction"]=array("resource"=>$resource,"defaultLifeTime"=>$conf["deafaultLifeTime"]);#$conf["shutdownStrAddr"],字串,儲存收到用戶傳什麼樣的字串會結束本函式的檔案位置與名稱,預設為 $conf["sock"].".shutdown".#$conf["shutdownStrAddr"]="";#$conf["shutdownCallback"],字串,當收到 shutdownStrAddr 參數的字串後,會先執行該函式,傳遞的參數為一陣列,key值有clientCache、serverCache、info,再結束執行,預設不使用.$conf["sock::unixDomainSockServer"]["shutdownCallback"]="\qbpwcf\\resource::closeAllResurce";#參考資料:#http://php.net/manual/en/function.stream-socket-server.php#備註:#無.$unixDomainSockServer=sock::unixDomainSockServer($conf["sock::unixDomainSockServer"]);unset($conf["sock::unixDomainSockServer"]);#如果異常if($unixDomainSockServer["status"]==="false"){#設置執行異常$result["status"]="false";#設置執行錯誤訊息$result["error"]=$unixDomainSockServer;#回傳結果return $result;}#if end#設置執行正常$result["status"]="true";#回傳結果return $result;}#function server end/*#函式說明:#用於 server 的 addOnProcessFunc,亦即收到用戶訊息要做什麼事情.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#必填參數:#$conf["info"],陣列,資料庫資訊.$conf["info"]=array();#$conf["request"],字串,收到的json訊息,其元素key值有"id":用於識別unix domain client用戶該次訊息的id;"data":array("action","condition","value","type"),"action"的數值有read(讀取資源)跟write(寫入資源);"condition"的數值為一陣列,若為空陣列則代表沒有條件,通常是為新增資源,元素的key為"id"者代表目標資源的id,沒有時不會傳遞該參數;元素的key為"value"者代表目標資源是否相等於"value",且"type"為"php_variable";元素的key為"pid"者代表運行的資源程序pid,且"type"為"proc";"value"為資源,為任意php變數;"type"有php_variable(任何php變數)跟proc(透過指令啟動,透過unix domain socket互動).$conf["request"]="";#$conf["socket"],object,用戶的socket.$conf["socket"]=$object;#$conf["clientCache"],陣列,給予所有用戶的cache.$conf["clientCache"]=array();#$conf["last_req_time"],字串,收到client要求的時間.$conf["last_req_time"]="";#可省略參數:#無.#參考資料:#無.#備註:#無.*/public static function addOnProcessFunc(&$conf){#初始化要回傳的結果$result=array();#取得當前執行的函數名稱$result["function"]=__FUNCTION__;#如果沒有參數if(func_num_args()==0){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]="函數".$result["function"]."需要參數";#回傳結果return $result;}#if end#涵式說明:#判斷當前環境為web還是cmd#回傳結果:#$result,"web"或"cmd"if(csInformation::getEnv()==="web"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";#回傳結果return $result;}#if end#取得參數$result["argu"]=$conf;#如果 $conf 不為陣列if(gettype($conf)!=="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif(is_null($conf)){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],執行不正常結束的錯訊息陣列.#$result["simpleError"],簡單表示的錯誤訊息.#$result["function"],當前執行的函式名稱.#$result["argu"],設置給予的參數.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=&$conf;#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可省略參數:#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("request","socket","clientCache","last_req_time");#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("array","resource","array","integer");#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.#$conf["canBeEmptyString"]="false";#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.#$conf["canNotBeEmpty"]=array();#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.#$conf["canBeEmpty"]=array();#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("info");#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("info");#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("array");#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array($sock);#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".#$conf["disallowAllSkipableVarIsEmpty"]="";#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".#$conf["disallowAllSkipableVarIsEmptyArray"]="";#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".#$conf["disallowAllSkipableVarNotExist"]="";#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.#$conf["arrayCountEqualCheck"][]=array();#參考資料:#array_keys=>http://php.net/manual/en/function.array-keys.php#備註:#無.$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果執行異常if($checkArguments["status"]==="false"){#設置執行異常識別$result["status"]="false";#設置執行錯誤$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果檢查不通過if($checkArguments["passed"]==="false"){#設置執行異常識別$result["status"]="false";#設置執行錯誤$result["error"]=$checkArguments;#回傳結果return $result;}#if end#轉換成陣列$conf["request"]=(array)($conf["request"]);#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],執行不正常結束的錯訊息陣列.#$result["simpleError"],簡單表示的錯誤訊息.#$result["function"],當前執行的函式名稱.#$result["argu"],設置給予的參數.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=&$conf["request"];#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可省略參數:#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("data");#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("array");#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.#$conf["canBeEmptyString"]="false";#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.#$conf["canNotBeEmpty"]=array();#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.#$conf["canBeEmpty"]=array();#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("action");#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("condition","value","type");#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("array",null,"string");#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(array(),null,null);#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".#$conf["disallowAllSkipableVarIsEmpty"]="";#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".#$conf["disallowAllSkipableVarIsEmptyArray"]="";#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".#$conf["disallowAllSkipableVarNotExist"]="";#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.#$conf["arrayCountEqualCheck"][]=array();#參考資料:#array_keys=>http://php.net/manual/en/function.array-keys.php#備註:#無.$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果執行異常if($checkArguments["status"]==="false"){#設置執行異常識別$result["status"]="false";#設置執行錯誤$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果檢查不通過if($checkArguments["passed"]==="false"){#設置執行異常識別$result["status"]="false";#設置執行錯誤$result["error"]=$checkArguments;#回傳結果return $result;}#if end#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],執行不正常結束的錯訊息陣列.#$result["simpleError"],簡單表示的錯誤訊息.#$result["function"],當前執行的函式名稱.#$result["argu"],設置給予的參數.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=&$conf["request"]["data"];#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可省略參數:#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("action");#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.#$conf["canBeEmptyString"]="false";#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.#$conf["canNotBeEmpty"]=array();#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.#$conf["canBeEmpty"]=array();#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("action");#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("condition","value","type");#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("array",null,"string");#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(array(),null,null);#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".#$conf["disallowAllSkipableVarIsEmpty"]="";#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".#$conf["disallowAllSkipableVarIsEmptyArray"]="";#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".#$conf["disallowAllSkipableVarNotExist"]="";#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.#$conf["arrayCountEqualCheck"][]=array();#參考資料:#array_keys=>http://php.net/manual/en/function.array-keys.php#備註:#無.$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果執行異常if($checkArguments["status"]==="false"){#設置執行異常識別$result["status"]="false";#設置執行錯誤$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果檢查不通過if($checkArguments["passed"]==="false"){#設置執行異常識別$result["status"]="false";#設置執行錯誤$result["error"]=$checkArguments;#回傳結果return $result;}#if end#取得 request data 的參考$rdata=&$conf["request"]["data"];#判斷 actionswitch($rdata["action"]){#如果是要寫入case "write":#如果是空的,亦即沒有條件if(empty($rdata["condition"])){#代表要新增資料#判斷類型switch($rdata["type"]){#如果是 php 變數case "php_variable":#產生id#函式說明:#使用 linux 的 uuid 指令來產生 uuid 字串#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息.#$result["function"],當前執行的函式名稱.#$result["content"],uuid.#必填參數:#無.#可省略參數:#無.#參考資料:#無.#備註:#無.$uuid=cmd::uuid();#如果執行異常if($uuid["status"]==="false"){#設置執行異常識別$result["status"]="false";#設置執行錯誤$result["error"]=$uuid;#回傳結果return $result;}#if end#取得uuid$uuid=$uuid["content"];#初始化要設置的列$row=array();#設置存放的數值$row["value"]=$rdata["value"];#設置形態$row["type"]=$rdata["type"];#若無設定 lifeif(!isset($rdata["life"])){#設置預設的life$row["life"]=time()+$conf["info"]["defaultLifeTime"];}#if end#新增資料並指定 id$conf["info"]["resource"][$uuid]=$row;#設置新增的資料$result["content"]=array("id"=>$uuid,"info"=>$row);#設置執行正常$result["status"]="true";#回傳結果return $result;#跳出 switchbreak 2;#若是 proccase "proc":#取得要運行的程式與參數$cmdAndArgu=$rdata["value"];#函式說明:#透過proc來多執行序運作.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],使用的參數.#$result["content"],陣列,每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值,若為"?"則代表程序尚未結束,若為整數0,則代表順利執行結束,可透過proc_update函式進行資訊的更新與取得;key為"content"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.#必填參數:#$conf["cmds"],字串陣列,每個元素代表單一程序要執行的指令與參數.$conf["threads::proc"]["cmds"]=array($cmdAndArgu);#可省略參數:#$conf["wait"],字串,是否需要等待所有程序結束,預設為"true"要等待;反之為"false"不要等待.$conf["threads::proc"]["wait"]="false";#$conf["timeout"],字串陣列,每個元素代表單一程序執行的最大等待秒數,超過後將會強迫停止執行,僅當wait參數為"true"時生效.#$conf["timeout"]=array("10");#$conf["workingDir"],字串陣列,個別程式執行時的家目錄,預設不指定.#$conf["workingDir"]=array("path");#$conf["envs"],2維字串陣列,每個元素代表個別程式執行時的指定環境變數,key變數名稱;value為變數內容.預設為array("QBPWCF" => "Quick Build PHP Website Componment base on Fedora Linux");#$conf["envs"]=array(array("key"=>"value"));#$conf["executeBy"],字串陣列,每個元素代表個別指令要用什麼程式執行,預設為"bash".#$conf["executeBy"]=array("bash");#參考資料:#https://www.php.net/manual/en/function.proc-open.php#https://www.php.net/manual/en/function.proc-get-status.php#https://www.php.net/manual/en/function.proc-terminate.php#備註:#當wait參數為"true"時,會自動解析stdout與stderr,因此不用再透過 self::proc_update 來更新.#當wait參數不為"true"時,若需要取得當下的執行狀況,請使用 self::proc_update 來更新.$proc=threads::proc($conf["threads::proc"]);unset($conf["threads::proc"]);#如果執行異常if($proc["status"]==="false"){#設置跳過,不適用$result["status"]="continue";#回傳結果return $result;}#if end#函式說明:#更新透過proc執行的多程序資訊.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],使用的參數.#$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"代表程序的資訊.#必填參數:#$conf["procs"],陣列,運行self::proc後回傳的content.$conf["threads::proc_update"]["procs"]=$procs["content"];#可省略參數:#無.#參考資料:#無.#備註:#無.$proc_update=threads::proc_update($conf["threads::proc_update"]);unset($conf["threads::proc_update"]);#如果執行異常if($proc_update["status"]==="false"){#設置跳過,不適用$result["status"]="continue";#回傳結果return $result;}#if end#如果proc裡面的程式執行異常if($proc_update["content"]["status"]==="false"){#設置跳過,不適用$result["status"]="continue";#回傳結果return $result;}#if end#取得要儲存的php變數$value=$proc_update["content"][0];#產生id#函式說明:#使用 linux 的 uuid 指令來產生 uuid 字串#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],錯誤訊息.#$result["function"],當前執行的函式名稱.#$result["content"],uuid.#必填參數:#無.#可省略參數:#無.#參考資料:#無.#備註:#無.$uuid=cmd::uuid();#如果執行異常if($uuid["status"]==="false"){#設置執行異常識別$result["status"]="false";#設置執行錯誤$result["error"]=$uuid;#回傳結果return $result;}#if end#取得uuid$uuid=$uuid["content"];#初始化要設置的列$row=array();#設置存放的數值$row["value"]=$value;#設置形態$row["type"]=$rdata["type"];#新增資料並指定 id$conf["info"]["resource"][$uuid]=$row;#若無設定 lifeif(!isset($rdata["life"])){#設置預設的life$row["life"]=time()+$conf["info"]["defaultLifeTime"];}#if end#設置新增的資料$result["content"]=array("id"=>$uuid,"info"=>$row);#設置執行正常$result["status"]="true";#回傳結果return $result;#跳出 switchbreak 2;#其他類型default:#設置錯誤訊息$result["error"][]="unsupported type:".$rdata["type"];#設置執行異常$result["status"]="false";#回傳結果return $result;}#switch end}#if end#反之有條件else{#針對每個條件foreach($rdata["condition"] as $key => $val){#判斷 $keyswitch($key){#如果條件欄位是 idcase "id":#針對每筆記錄foreach($conf["info"]["resource"] as $idInM => $valInM){#如果找到符合id的資料if($idInM===$val){#取得現有資源類型$currentType=$conf["info"]["resource"][$idInM]["type"];#如果沒有指定新 typeif(!isset($rdata["type"])){#視為跟現有資源類型一樣$rdata["type"]=$currentType;}#if end#判斷新資源類型switch($rdata["type"]){#如果為 "php_variable"case "php_variable":#如果既有資源的類型為 "proc"if($currentType==="proc"){#pid#$valInM["proc_get_status"]["pid"];#關閉程序proc_close($valInM["process"]);}#if end#初始化要設置的列$row=array();#設置存放的數值$row["value"]=$rdata["value"];#設置形態$row["type"]=$rdata["type"];#若無設定 lifeif(!isset($rdata["life"])){#設置預設的life$row["life"]=time()+$conf["info"]["defaultLifeTime"];}#if end#寫入資源$conf["info"]["resource"][$idInM]=$row;#跳出 switchbreak;#如果為 "proc"case "proc":#如果既有資源的類型為 "proc"if($currentType==="proc"){#pid#$valInM["proc_get_status"]["pid"];#關閉程序proc_close($valInM["process"]);}#if end#取得要運行的程式與參數$cmdAndArgu=$rdata["value"];#函式說明:#透過proc來多執行序運作.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],使用的參數.#$result["content"],陣列,每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值,若為"?"則代表程序尚未結束,若為整數0,則代表順利執行結束,可透過proc_update函式進行資訊的更新與取得;key為"content"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.#必填參數:#$conf["cmds"],字串陣列,每個元素代表單一程序要執行的指令與參數.$conf["threads::proc"]["cmds"]=array($cmdAndArgu);#可省略參數:#$conf["wait"],字串,是否需要等待所有程序結束,預設為"true"要等待;反之為"false"不要等待.$conf["threads::proc"]["wait"]="false";#$conf["timeout"],字串陣列,每個元素代表單一程序執行的最大等待秒數,超過後將會強迫停止執行,僅當wait參數為"true"時生效.#$conf["timeout"]=array("10");#$conf["workingDir"],字串陣列,個別程式執行時的家目錄,預設不指定.#$conf["workingDir"]=array("path");#$conf["envs"],2維字串陣列,每個元素代表個別程式執行時的指定環境變數,key變數名稱;value為變數內容.預設為array("QBPWCF" => "Quick Build PHP Website Componment base on Fedora Linux");#$conf["envs"]=array(array("key"=>"value"));#$conf["executeBy"],字串陣列,每個元素代表個別指令要用什麼程式執行,預設為"bash".#$conf["executeBy"]=array("bash");#參考資料:#https://www.php.net/manual/en/function.proc-open.php#https://www.php.net/manual/en/function.proc-get-status.php#https://www.php.net/manual/en/function.proc-terminate.php#備註:#當wait參數為"true"時,會自動解析stdout與stderr,因此不用再透過 self::proc_update 來更新.#當wait參數不為"true"時,若需要取得當下的執行狀況,請使用 self::proc_update 來更新.$proc=threads::proc($conf["threads::proc"]);unset($conf["threads::proc"]);#如果執行異常if($proc["status"]==="false"){#設置跳過,不適用$result["status"]="continue";#回傳結果return $result;}#if end#函式說明:#更新透過proc執行的多程序資訊.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],使用的參數.#$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"代表程序的資訊.#必填參數:#$conf["procs"],陣列,運行self::proc後回傳的content.$conf["threads::proc_update"]["procs"]=$procs["content"];#可省略參數:#無.#參考資料:#無.#備註:#無.$proc_update=threads::proc_update($conf["threads::proc_update"]);unset($conf["threads::proc_update"]);#如果執行異常if($proc_update["status"]==="false"){#設置跳過,不適用$result["status"]="continue";#回傳結果return $result;}#if end#如果proc裡面的程式執行異常if($proc_update["content"]["status"]==="false"){#設置跳過,不適用$result["status"]="continue";#回傳結果return $result;}#if end#取得要儲存的php變數$value=$proc_update["content"][0];#初始化要設置的列$row=array();#設置存放的數值$row["value"]=$value;#設置形態$row["type"]=$rdata["type"];#若無設定 lifeif(!isset($rdata["life"])){#設置預設的life$row["life"]=time()+$conf["info"]["defaultLifeTime"];}#if end#寫入資源$conf["info"]["resource"][$idInM]=$row;#跳出 switchbreak;#其他 typedefault:#設置錯誤訊息$result["error"][]="unsupported type:".$rdata["type"];#設置執行異常$result["status"]="false";#回傳結果return $result;}#switch end#設置結果$result["content"]=array("id"=>$idInM,"value"=>$conf["info"]["resource"][$valInM]);#設置執行正常$result["status"]="true";#回傳結果return $result;}#if end}#foreach end#執行到這邊代表沒有符合條件的記錄#設置結果為null$result["content"]=null;#設置執行正常$result["status"]="true";#回傳結果return $result;#跳出 switchbreak;#如果條件欄位是 valuecase "value":#針對每筆記錄foreach($conf["info"]["resource"] as $idInM => $valInM){#如果不是 php_variableif($valInM["type"]!=="php_variable"){#跳過之continue;}#if end#如果找到符合value的資料if($valInM===$val){#如果沒有指定新 typeif(!isset($rdata["type"])){#視為跟現有資源類型一樣$rdata["type"]=$currentType;}#if end#判斷新資源類型switch($rdata["type"]){#如果為 "php_variable"case "php_variable":#如果既有資源的類型為 "proc"if($currentType==="proc"){#pid#$valInM["proc_get_status"]["pid"];#關閉程序proc_close($valInM["process"]);}#if end#初始化要設置的列$row=array();#設置存放的數值$row["value"]=$rdata["value"];#設置形態$row["type"]=$rdata["type"];#若無設定 lifeif(!isset($rdata["life"])){#設置預設的life$row["life"]=time()+$conf["info"]["defaultLifeTime"];}#if end#寫入資源$conf["info"]["resource"][$idInM]=$row;#跳出 switchbreak;#如果為 "proc"case "proc":#如果既有資源的類型為 "proc"if($currentType==="proc"){#pid#$valInM["proc_get_status"]["pid"];#關閉程序proc_close($valInM["process"]);}#if end#取得要運行的程式與參數$cmdAndArgu=$rdata["value"];#函式說明:#透過proc來多執行序運作.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],使用的參數.#$result["content"],陣列,每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值,若為"?"則代表程序尚未結束,若為整數0,則代表順利執行結束,可透過proc_update函式進行資訊的更新與取得;key為"content"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.#必填參數:#$conf["cmds"],字串陣列,每個元素代表單一程序要執行的指令與參數.$conf["threads::proc"]["cmds"]=array($cmdAndArgu);#可省略參數:#$conf["wait"],字串,是否需要等待所有程序結束,預設為"true"要等待;反之為"false"不要等待.$conf["threads::proc"]["wait"]="false";#$conf["timeout"],字串陣列,每個元素代表單一程序執行的最大等待秒數,超過後將會強迫停止執行,僅當wait參數為"true"時生效.#$conf["timeout"]=array("10");#$conf["workingDir"],字串陣列,個別程式執行時的家目錄,預設不指定.#$conf["workingDir"]=array("path");#$conf["envs"],2維字串陣列,每個元素代表個別程式執行時的指定環境變數,key變數名稱;value為變數內容.預設為array("QBPWCF" => "Quick Build PHP Website Componment base on Fedora Linux");#$conf["envs"]=array(array("key"=>"value"));#$conf["executeBy"],字串陣列,每個元素代表個別指令要用什麼程式執行,預設為"bash".#$conf["executeBy"]=array("bash");#參考資料:#https://www.php.net/manual/en/function.proc-open.php#https://www.php.net/manual/en/function.proc-get-status.php#https://www.php.net/manual/en/function.proc-terminate.php#備註:#當wait參數為"true"時,會自動解析stdout與stderr,因此不用再透過 self::proc_update 來更新.#當wait參數不為"true"時,若需要取得當下的執行狀況,請使用 self::proc_update 來更新.$proc=threads::proc($conf["threads::proc"]);unset($conf["threads::proc"]);#如果執行異常if($proc["status"]==="false"){#設置跳過,不適用$result["status"]="continue";#回傳結果return $result;}#if end#函式說明:#更新透過proc執行的多程序資訊.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],使用的參數.#$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"代表程序的資訊.#必填參數:#$conf["procs"],陣列,運行self::proc後回傳的content.$conf["threads::proc_update"]["procs"]=$procs["content"];#可省略參數:#無.#參考資料:#無.#備註:#無.$proc_update=threads::proc_update($conf["threads::proc_update"]);unset($conf["threads::proc_update"]);#如果執行異常if($proc_update["status"]==="false"){#設置跳過,不適用$result["status"]="continue";#回傳結果return $result;}#if end#如果proc裡面的程式執行異常if($proc_update["content"]["status"]==="false"){#設置跳過,不適用$result["status"]="continue";#回傳結果return $result;}#if end#取得要儲存的php變數$value=$proc_update["content"][0];#初始化要設置的列$row=array();#設置存放的數值$row["value"]=$value;#設置形態$row["type"]=$rdata["type"];#若無設定 lifeif(!isset($rdata["life"])){#設置預設的life$row["life"]=time()+$conf["info"]["defaultLifeTime"];}#if end#寫入資源$conf["info"]["resource"][$idInM]=$row;#跳出 switchbreak;#其他 typedefault:#設置錯誤訊息$result["error"][]="unsupported type:".$rdata["type"];#設置執行異常$result["status"]="false";#回傳結果return $result;}#switch end}#if end}#foreach end#執行到這邊代表沒有符合條件的記錄#設置結果為null$result["content"]=null;#設置執行正常$result["status"]="true";#回傳結果return $result;#跳出 switchbreak;#如果條件欄位是 pidcase "pid":#針對每筆記錄foreach($rdata["resource"] as $idInM => $valInM){#如果不是 procif($valInM["type"]!=="proc"){#跳過之continue;}#if end#取得 proc 的 pid$pidInM=$valInM["proc_get_status"]["pid"];#如果找到符合value的資料if($pidInM===$val){#如果沒有指定新 typeif(!isset($rdata["type"])){#視為跟現有資源類型一樣$rdata["type"]=$currentType;}#if end#判斷新資源類型switch($rdata["type"]){#如果為 "php_variable"case "php_variable":#如果既有資源的類型為 "proc"if($currentType==="proc"){#pid#$valInM["proc_get_status"]["pid"];#關閉程序proc_close($valInM["process"]);}#if end#初始化要設置的列$row=array();#設置存放的數值$row["value"]=$rdata["value"];#設置形態$row["type"]=rdata["request"]["type"];#若無設定 lifeif(!isset($rdata["life"])){#設置預設的life$row["life"]=time()+$conf["info"]["defaultLifeTime"];}#if end#寫入資源$conf["info"]["resource"][$idInM]=$row;#跳出 switchbreak;#如果為 "proc"case "proc":#如果既有資源的類型為 "proc"if($currentType==="proc"){#pid#$valInM["proc_get_status"]["pid"];#關閉程序proc_close($valInM["process"]);}#if end#取得要運行的程式與參數$cmdAndArgu=$rdata["value"];#函式說明:#透過proc來多執行序運作.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],使用的參數.#$result["content"],陣列,每個元素為其指令執行的結果訊息陣列,key為"status"代表執行是否正常的識別;key為"statusCode"代表程式結束後回傳給對應executeBy程式的數值,若為"?"則代表程序尚未結束,若為整數0,則代表順利執行結束,可透過proc_update函式進行資訊的更新與取得;key為"content"代表標準輸出,若為resource,則代表為pipe;key為"error"代表非標準輸出,若為resource,則代表為pipe;key為"input"代表成功輸入的指令;key為"process"代表該程序經proc_open後的process source;key為"proc_get_status"代表程序的資訊.#必填參數:#$conf["cmds"],字串陣列,每個元素代表單一程序要執行的指令與參數.$conf["threads::proc"]["cmds"]=array($cmdAndArgu);#可省略參數:#$conf["wait"],字串,是否需要等待所有程序結束,預設為"true"要等待;反之為"false"不要等待.$conf["threads::proc"]["wait"]="false";#$conf["timeout"],字串陣列,每個元素代表單一程序執行的最大等待秒數,超過後將會強迫停止執行,僅當wait參數為"true"時生效.#$conf["timeout"]=array("10");#$conf["workingDir"],字串陣列,個別程式執行時的家目錄,預設不指定.#$conf["workingDir"]=array("path");#$conf["envs"],2維字串陣列,每個元素代表個別程式執行時的指定環境變數,key變數名稱;value為變數內容.預設為array("QBPWCF" => "Quick Build PHP Website Componment base on Fedora Linux");#$conf["envs"]=array(array("key"=>"value"));#$conf["executeBy"],字串陣列,每個元素代表個別指令要用什麼程式執行,預設為"bash".#$conf["executeBy"]=array("bash");#參考資料:#https://www.php.net/manual/en/function.proc-open.php#https://www.php.net/manual/en/function.proc-get-status.php#https://www.php.net/manual/en/function.proc-terminate.php#備註:#當wait參數為"true"時,會自動解析stdout與stderr,因此不用再透過 self::proc_update 來更新.#當wait參數不為"true"時,若需要取得當下的執行狀況,請使用 self::proc_update 來更新.$proc=threads::proc($conf["threads::proc"]);unset($conf["threads::proc"]);#如果執行異常if($proc["status"]==="false"){#設置跳過,不適用$result["status"]="continue";#回傳結果return $result;}#if end#函式說明:#更新透過proc執行的多程序資訊.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],使用的參數.#$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"代表程序的資訊.#必填參數:#$conf["procs"],陣列,運行self::proc後回傳的content.$conf["threads::proc_update"]["procs"]=$procs["content"];#可省略參數:#無.#參考資料:#無.#備註:#無.$proc_update=threads::proc_update($conf["threads::proc_update"]);unset($conf["threads::proc_update"]);#如果執行異常if($proc_update["status"]==="false"){#設置跳過,不適用$result["status"]="continue";#回傳結果return $result;}#if end#如果proc裡面的程式執行異常if($proc_update["content"][0]["status"]==="false"){#設置跳過,不適用$result["status"]="continue";#回傳結果return $result;}#if end#取得要儲存的php變數$value=$proc_update["content"][0];#初始化要設置的列$row=array();#設置存放的數值$row["value"]=$value;#設置形態$row["type"]=$rdata["type"];#若無設定 lifeif(!isset($rdata["life"])){#設置預設的life$row["life"]=time()+$conf["info"]["defaultLifeTime"];}#if end#寫入資源$conf["info"]["resource"][$idInM]=$row;#跳出 switchbreak;#其他 typedefault:#設置錯誤訊息$result["error"][]="unsupported type:".$rdata["type"];#設置執行異常$result["status"]="false";#回傳結果return $result;}#switch end}#if end}#foreach end#執行到這邊代表沒有符合條件的記錄#設置結果為null$result["content"]=null;#設置執行正常$result["status"]="true";#回傳結果return $result;#跳出 switchbreak;#其他欄位default:#設置錯誤訊息$result["error"][]="unsupported column:".$key;#設置執行異常$result["status"]="false";#回傳結果return $result;}#switch end}#foreach end}#else end#結束switchbreak;#如果是 readcase "read":#如果是空的,亦即沒有條件,代表要取得全部.if(empty($rdata["condition"])){#針對每筆記錄foreach($conf["info"]["resource"] as $idInM => $valInM){#設置要取得的內容$result["content"][]=array("id"=>$idInM,"value"=>$valInM);}#foreach end#設置執行正常$result["status"]="true";#回傳結果return $result;}#if end#反之有條件else{#針對每個條件foreach($rdata["condition"] as $key => $val){#判斷 $keyswitch($key){#如果條件欄位是 idcase "id":#針對每筆記錄foreach($conf["info"]["resource"] as $idInM => $valInM){#如果找到符合id的資料if($idInM===$val){#設置結果$result["content"][]=array("id"=>$idInM,"value"=>$valInM);#設置執行正常$result["status"]="true";#回傳結果return $result;}#if end}#foreach end#執行到這邊代表沒有符合條件的記錄#設置結果為null$result["content"]=null;#設置執行正常$result["status"]="true";#回傳結果return $result;#跳出 switchbreak;#如果條件欄位是 valuecase "value":#針對每筆記錄foreach($conf["info"]["resource"] as $idInM => $valInM){#如果不是 php_variableif($valInM["type"]!=="php_variable"){#跳過之continue;}#if end#如果找到符合value的資料if($valInM===$val){#設置結果$result["content"]=array("id"=>$idInM,"value"=>$valInM);#設置執行結果$result["status"]="true";#回傳結果return $result;}#if end}#foreach end#執行到這邊代表沒有符合條件的記錄#設置結果為null$result["content"]=null;#設置執行正常$result["status"]="true";#回傳結果return $result;#跳出 switchbreak;#如果條件欄位是 pidcase "pid":#針對每筆記錄foreach($conf["info"]["resource"] as $idInM => $valInM){#如果不是 procif($valInM["type"]!=="proc"){#跳過之continue;}#if end#取得 proc 的 pid$pidInM=$valInM["proc_get_status"]["pid"];#如果找到符合value的資料if($pidInM===$val){#設置結果$result["content"]=array("id"=>$idInM,"value"=>$valInM);#設置執行結果$result["status"]="true";#回傳結果return $result;}#if end}#foreach end#執行到這邊代表沒有符合條件的記錄#設置結果為null$result["content"]=null;#設置執行正常$result["status"]="true";#回傳結果return $result;#跳出 switchbreak;#其他欄位default:#設置錯誤訊息$result["error"][]="unsupported column:".$key;#設置執行異常$result["status"]="false";#回傳結果return $result;}#switch end}#foreach end}#else end#結束switchbreak;#其他 actiondefault:#設置錯誤訊息$result["error"][]="unsupported action:".$conf["request"]["action"];#設置執行異常$result["status"]="false";#回傳結果return $result;}#switch end#執行到這邊代表不適用#設置不適用,可跳過$result["status"]="continue";#回傳結果return $result;}#function addOnProcessFunc end/*#函式說明:#用於 server 的 funcToRunWhenIdle,亦即沒有收到訊息閒置時要做什麼事情.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#必填參數:#$conf["info"],陣列,資料庫資訊.$conf["info"]=array();#$conf["client"],陣列,每個用戶的socket.$conf["client"]="";#$conf["serverCache"],陣列,只有server可以看到的cache.$conf["serverCache"]=array();#$conf["clientCache"],陣列,給予所有用戶的cache.$conf["clientCache"]=array();#可省略參數:#無.#參考資料:#無.#備註:#無.*/public static function funcToRunWhenIdle(&$conf){#初始化要回傳的結果$result=array();#取得當前執行的函數名稱$result["function"]=__FUNCTION__;#如果沒有參數if(func_num_args()==0){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]="函數".$result["function"]."需要參數";#回傳結果return $result;}#if end#涵式說明:#判斷當前環境為web還是cmd#回傳結果:#$result,"web"或"cmd"if(csInformation::getEnv()==="web"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";#回傳結果return $result;}#if end#取得參數$result["argu"]=$conf;#如果 $conf 不為陣列if(gettype($conf)!=="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif(is_null($conf)){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],執行不正常結束的錯訊息陣列.#$result["simpleError"],簡單表示的錯誤訊息.#$result["function"],當前執行的函式名稱.#$result["argu"],設置給予的參數.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=&$conf;#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可省略參數:#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");#$conf["mustBeFilledVariableName"]=array();#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".#$conf["mustBeFilledVariableType"]=array();#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.#$conf["canBeEmptyString"]="false";#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.#$conf["canNotBeEmpty"]=array();#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.#$conf["canBeEmpty"]=array();#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("info","serverCache","clientCache");#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("info","client","serverCache","clientCache");#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("info","client","serverCache","clientCache");#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array($sock);#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".#$conf["disallowAllSkipableVarIsEmpty"]="";#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".#$conf["disallowAllSkipableVarIsEmptyArray"]="";#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".#$conf["disallowAllSkipableVarNotExist"]="";#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.#$conf["arrayCountEqualCheck"][]=array();#參考資料:#array_keys=>http://php.net/manual/en/function.array-keys.php#備註:#無.$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果執行異常if($checkArguments["status"]==="false"){#設置執行異常識別$result["status"]="false";#設置執行錯誤$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果檢查不通過if($checkArguments["passed"]==="false"){#設置執行異常識別$result["status"]="false";#設置執行錯誤$result["error"]=$checkArguments;#回傳結果return $result;}#if end#取得resouce的參考$resource=&$conf["info"]["resource"];#針對每個資源foreach($resource as $rid => $info){#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],執行不正常結束的錯訊息陣列.#$result["simpleError"],簡單表示的錯誤訊息.#$result["function"],當前執行的函式名稱.#$result["argu"],設置給予的參數.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=$info;#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可省略參數:#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("value","type","life");#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array(null,"string",integer);#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.#$conf["canBeEmptyString"]="false";#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.#$conf["canNotBeEmpty"]=array();#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.#$conf["canBeEmpty"]=array();#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("action");#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("condition","value","type");#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("array",null,"string");#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(array(),null,null);#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".#$conf["disallowAllSkipableVarIsEmpty"]="";#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".#$conf["disallowAllSkipableVarIsEmptyArray"]="";#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".#$conf["disallowAllSkipableVarNotExist"]="";#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.#$conf["arrayCountEqualCheck"][]=array();#參考資料:#array_keys=>http://php.net/manual/en/function.array-keys.php#備註:#無.$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果執行異常if($checkArguments["status"]==="false"){#設置執行異常識別$result["status"]="false";#設置執行錯誤$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果檢查不通過if($checkArguments["passed"]==="false"){#設置執行異常識別$result["status"]="false";#設置執行錯誤$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果 life 過期if(time()>$info["life"]){#如果是 php_variable 的資源if($info["type"]==="php_variable"){#移除之unset($resource[$rid]);}#if end#反之如果是 proc 的自選else if($info["type"]==="proc"){#關閉之proc_close($info["value"]);#移除之unset($resource[$rid]);}#if end#反之為不應該有的類型else{#設置執行異常識別$result["status"]="false";#設置執行錯誤$result["error"][]="invalid resource type:".$info["type"];#設置執行錯誤$result["error"][]=$info;#回傳結果return $result;}#else end}#if end}#foreach end#設置執行正常$result["status"]="true";#回傳結果return $result;}#function funcToRunWhenIdle end/*#函式說明:#給 server 結束前呼叫的 callback 函式.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#必填參數:#$conf["info"],陣列,資料庫資訊.$conf["info"]=array();#$conf["serverCache"],陣列,只有server可以看到的cache.$conf["serverCache"]=array();#$conf["clientCache"],陣列,給予所有用戶的cache.$conf["clientCache"]=array();#可省略參數:#無.#參考資料:#無.#備註:#無.*/public static function closeAllResurce(&$conf){#初始化要回傳的結果$result=array();#取得當前執行的函數名稱$result["function"]=__FUNCTION__;#如果沒有參數if(func_num_args()==0){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]="函數".$result["function"]."需要參數";#回傳結果return $result;}#if end#涵式說明:#判斷當前環境為web還是cmd#回傳結果:#$result,"web"或"cmd"if(csInformation::getEnv()==="web"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";#回傳結果return $result;}#if end#取得參數$result["argu"]=$conf;#如果 $conf 不為陣列if(gettype($conf)!=="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif(is_null($conf)){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],執行不正常結束的錯訊息陣列.#$result["simpleError"],簡單表示的錯誤訊息.#$result["function"],當前執行的函式名稱.#$result["argu"],設置給予的參數.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=&$conf;#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可省略參數:#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");#$conf["mustBeFilledVariableName"]=array();#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".#$conf["mustBeFilledVariableType"]=array();#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.#$conf["canBeEmptyString"]="false";#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.#$conf["canNotBeEmpty"]=array();#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.#$conf["canBeEmpty"]=array();#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("serverCache","clientCache");#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("info","serverCache","clientCache");#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("array","array","array");#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array($sock);#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".#$conf["disallowAllSkipableVarIsEmpty"]="";#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".#$conf["disallowAllSkipableVarIsEmptyArray"]="";#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".#$conf["disallowAllSkipableVarNotExist"]="";#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.#$conf["arrayCountEqualCheck"][]=array();#參考資料:#array_keys=>http://php.net/manual/en/function.array-keys.php#備註:#無.$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果執行異常if($checkArguments["status"]==="false"){#設置執行異常識別$result["status"]="false";#設置執行錯誤$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果檢查不通過if($checkArguments["passed"]==="false"){#設置執行異常識別$result["status"]="false";#設置執行錯誤$result["error"]=$checkArguments;#回傳結果return $result;}#if end#針對每個資源foreach($conf["info"]["resouce"] as $id => $resource){#如果是 proc 類型if($resource["type"]==="proc"){#proc_close資源,避免系統出錯proc_close($resource["value"]);}#if end}#foreach end}#function closeAllResurce end/*#函式說明:#存取快取服務.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$reuslt["error"],執行不正常結束的錯訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],所使用的參數.#$result["content"],得到的回應字串.#必填參數:#$conf["action"],字串,"read":代表要讀取資料;"write":代表要寫入資料.#$conf["action"]="";#$conf["type"],字串,"php_variable":php的變數;"proc",透過proc運行的程序,可透過標準輸入進行操作.#$conf["type"]="";#可省略參數:#$conf["value"],null,"action"參數為write時,資源的內容,形態不固定.#$conf["value"]=null;#$conf["sock"],字串,unix domain socket的路徑與名稱,預設為相對於當前套件的 var/qbpwcf/resource.sock#$conf["sock"]="";#$conf["condition"],陣列,條件,預設為空陣列,代表沒有條件,通常是為新增資源,元素的key為"id"者代表目標資源的id;元素的key為"value"者代表目標資源是否相等於"value",且"type"為"php_variable";元素的key為"pid"者代表運行的資源程序pid,且"type"為"proc"#$conf["condition"]=array();#參考資料:#無.#備註:#僅能在命令列環境下運行.*/public static function client(&$conf){#初始化要回傳的結果$result=array();#取得當前執行的函數名稱$result["function"]=__FUNCTION__;#如果沒有參數if(func_num_args()==0){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"]="函數".$result["function"]."需要參數";#回傳結果return $result;}#if end#涵式說明:#判斷當前環境為web還是cmd#回傳結果:#$result,"web"或"cmd"if(csInformation::getEnv()==="web"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="函數 ".$result["function"]." 僅能在命令列環境下運行!";#回傳結果return $result;}#if end#取得參數$result["argu"]=$conf;#如果 $conf 不為陣列if(gettype($conf)!=="array"){#設置執行失敗$result["status"]="false";#設置執行錯誤訊息$result["error"][]="\$conf變數須為陣列形態";#如果傳入的參數為 nullif(is_null($conf)){#設置執行錯誤訊息$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";}#if end#回傳結果return $result;}#if end#預設的 unix domain socket addr$sock=pathinfo(__FILE__)["dirname"]."/../../var/qbpwcf/resource.sock";#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.#回傳結果:#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.#$result["error"],執行不正常結束的錯訊息陣列.#$result["simpleError"],簡單表示的錯誤訊息.#$result["function"],當前執行的函式名稱.#$result["argu"],設置給予的參數.#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.#$result["argu"],字串陣列,目前輸入的參數名稱陣列.#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.#$result["notNeedVar"],字串陣列,多餘的參數名稱.#必填參數:#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。$conf["variableCheck::checkArguments"]["varInput"]=&$conf;#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";#可省略參數:#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("action","type");#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string");#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.#$conf["canBeEmptyString"]="false";#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.#$conf["canNotBeEmpty"]=array();#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.#$conf["canBeEmpty"]=array();#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("sock");#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("value","sock","condition");#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");$conf["variableCheck::checkArguments"]["skipableVariableType"]=array(null,"string","array");#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null,$sock,array());#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".#$conf["disallowAllSkipableVarIsEmpty"]="";#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".#$conf["disallowAllSkipableVarIsEmptyArray"]="";#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".#$conf["disallowAllSkipableVarNotExist"]="";#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.#$conf["arrayCountEqualCheck"][]=array();#參考資料:#array_keys=>http://php.net/manual/en/function.array-keys.php#備註:#無.$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);unset($conf["variableCheck::checkArguments"]);#如果執行異常if($checkArguments["status"]==="false"){#設置執行異常識別$result["status"]="false";#設置執行錯誤$result["error"]=$checkArguments;#回傳結果return $result;}#if end#如果檢查不通過if($checkArguments["passed"]==="false"){#設置執行異常識別$result["status"]="false";#設置執行錯誤$result["error"]=$checkArguments;#回傳結果return $result;}#if end#初始化要傳遞的內容$request=array();#設置要傳送的 data$request["data"]["action"]=$conf["action"];#設置要傳送的 type$request["data"]["type"]=$conf["type"];#設置condition$request["data"]["condition"]=$conf["condition"];#如果有 valueif(isset($conf["value"])){#設置 value$request["data"]["value"]=$conf["value"];}#if end#連線到 unix domain socket,傳遞訊息,取得回應.#連線到 sock::unixDomainSocketServer 產生的 unix domain socket,傳送指定的訊息.#回傳結果:#$result["status"],"true"代表執行正常;"false"代表執行不正常.#$result["error"],錯誤訊息陣列.#$result["function"],當前執行的函式名稱.#$result["argu"],使用的參數.#$result["content"],得到的回應.#必填參數:#$conf["msg"],陣列,要傳送的訊息,其主$conf["msg"]["id"],是無法指定的.$conf["sock::sendAnyMsgToQBPWCFunixSocket"]["msg"]=$request;#可省略參數:#$conf["sock"],字串,要連線的 usr/bin/qbpwcf-sock.php 所產生的 unix domain socket 路徑與名稱,預設為 qbpwcf_usock_path.$conf["sock::sendAnyMsgToQBPWCFunixSocket"]["sock"]=$conf["sock"];#參考資料:#無.#備註:#無.$sendAnyMsgToQBPWCFunixSocket=sock::sendAnyMsgToQBPWCFunixSocket($conf["sock::sendAnyMsgToQBPWCFunixSocket"]);unset($conf["sock::sendAnyMsgToQBPWCFunixSocket"]);#如果執行異常if($sendAnyMsgToQBPWCFunixSocket["status"]==="false"){#設置執行異常識別$result["status"]="false";#設置執行錯誤$result["error"]=$sendAnyMsgToQBPWCFunixSocket;#回傳結果return $result;}#if end#設置得到的回應$result["content"]=$sendAnyMsgToQBPWCFunixSocket["content"];#設置執行正常$result["status"]="true";#回傳結果return $result;}#function client end}#classs refedosource end