Rev 306 | Rev 339 | 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\zerosll::sslUpdater_cmd").#$conf["addOnProcessFunc"]=array();#$conf["funcToRunWhenIdle"],陣列,閒置時要依序執行的函式,預設為array("/qbpwcf/zerossl::sslUpdater_idle");#$conf["funcToRunWhenIdle"]=array();#參考資料:#無.#備註:#僅能在命令列環境下運行.*/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");#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("sock");#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");#$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#初始化要儲存快取資料的變數$resource=array();#函式說明:#建立 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["changeOwner"]="";#$conf["changePermission"],字串,要將socket檔案的權限設為多少.ex: "0666"(所有帳戶都有存取的權限) 或 "0660"(僅有擁有者與群組帳戶有存取的權限) 或 "0600"(只有擁有者有權限執行).#$conf["changePermission"]="";#$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);#$conf["shutdownStrAddr"],字串,儲存收到用戶傳什麼樣的字串會結束本函式的檔案位置與名稱,預設為 $conf["sock"].".shutdown".#$conf["shutdownStrAddr"]="";#參考資料:#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訊息.$conf["request"]="";#$conf["sock"],object,用戶的socket.$conf["sock"]=$object;#$conf["clientCache"],陣列,給予所有用戶的cache.$conf["clientCache"]=array();#可省略參數:#無.#參考資料:#無.#備註:#無.*/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["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","request","sock","clientCache");#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("info","request","sock","clientCache");#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("array","object","object","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檢查參數#檢查參數#函式說明:#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.#回傳結果:#$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"]=&(array)($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("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#判斷 actionswitch($conf["request"]["action"]){#如果是要寫入case "write":#如果是空的,亦即沒有條件if(empty($conf["request"]["condition"])){#代表要新增資料#判斷類型switch($conf["request"]["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"]=$conf["request"]["value"];#設置形態$row["type"]=$conf["request"]["type"];#新增資料並指定 id$conf["info"]["resource"][$uuid]=$row;#設置新增的資料$result["content"]=array("id"=>$uuid,"info"=>$row);#設置執行正常$result["status"]="true";#回傳結果return $result;#跳出 switchbreak 2;#若是 proccase "proc":#取得要運行的程式與參數$cmdAndArgu=$conf["request"]["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"];#產生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"]=$conf["request"]["type"];#新增資料並指定 id$conf["info"]["resource"][$uuid]=$row;#設置新增的資料$result["content"]=array("id"=>$uuid,"info"=>$row);#設置執行正常$result["status"]="true";#回傳結果return $result;#跳出 switchbreak 2;#其他類型default:#設置錯誤訊息$result["error"][]="unsupported type:".$conf["request"]["type"];#設置執行異常$result["status"]="false";#回傳結果return $result;}#switch end}#if end#反之有條件else{#針對每個條件foreach($conf["request"]["condition"] as $key => $val){#判斷 $keyswitch($key){#如果條件欄位是 idcase "id":#針對每筆記錄foreach($conf["info"]["resource"] as $idInM => $valInM){#如果找到符合id的資料if($idInM===$val){#設置結果$result["content"]=array("id"=>$conf["info"]["resource"][$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){#設置結果$result["content"]=array("id"=>$conf["info"]["resource"][$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;#如果條件欄位是 pidcase "pid":針對每筆記錄foreach($conf["info"]["resource"] as $idInM => $valInM){#如果不是 procif($valInM["type"]!=="proc"){#跳過之continue;}#if end#取得 proc 的 pid$pidInM=$valInM["content"][0]["proc_get_status"]["pid"];#如果找到符合value的資料if($pidInM===$val){#設置結果$result["content"]=array("id"=>$conf["info"]["resource"][$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;#其他欄位default:#設置錯誤訊息$result["error"][]="unsupported column:".$key;#設置執行異常$result["status"]="false";#回傳結果return $result;}#switch end}#foreach end}#else end#結束switchbreak;#如果是 readcase "read":#如果是空的,亦即沒有條件,代表要取得全部.if(empty($conf["request"]["condition"])){#針對每筆記錄foreach($conf["info"]["resource"] as $idInM => $valInM){#設置要取得的內容$result["content"][]=array("id"=>$conf["info"]["resource"][$idInM],"value"=>$valInM);}#foreach end#設置執行正常$result["status"]="true";#回傳結果return $result;}#if end#反之有條件else{#針對每個條件foreach($conf["request"]["condition"] as $key => $val){#判斷 $keyswitch($key){#如果條件欄位是 idcase "id":#針對每筆記錄foreach($conf["info"]["resource"] as $idInM => $valInM){#如果找到符合id的資料if($idInM===$val){#設置結果$result["content"][]=array("id"=>$conf["info"]["resource"][$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"=>$conf["info"]["resource"][$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["content"][0]["proc_get_status"]["pid"];#如果找到符合value的資料if($pidInM===$val){#設置結果$result["content"]=array("id"=>$conf["info"]["resource"][$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["request"],字串,收到的json訊息.$conf["request"]="";#$conf["sock"],object,用戶的socket.$conf["sock"]=$object;#$conf["clientCache"],陣列,給予所有用戶的cache.$conf["clientCache"]=array();#可省略參數:#無.#參考資料:#無.#備註:#無.*/public static function funcToRunWhenIdle(&$conf){}#public static function funcToRunWhenIdle end}#classs refedosource end