/** * Retrieve all different elements * * @param $Message * @return boolean */ function toLog($Message = false, $Method = "a", $FileName = "error.log") { if (is_array($Message) or is_object($Message)) { $Message = print_r_log($Message); } $fp = fopen("{$FileName}", $Method); if ($FileName == "error.log") { fwrite($fp, "LOG " . date("Y-m-d H:i:s") . "\n" . $Message . "\n"); } else { fwrite($fp, $Message); } fclose($fp); return true; }
/** * slouzi pro nakesovani odpovedi dotazu typu SELECT pokud nekolik modulu na strance vola backend se stejnymi parametry * soucasne promazava cache po stanovenem limitu a umoznuje sdileni odpovedi vice aplikacnimi servery * @param string $query SQL dotaz SELECT ktery se ma vykonat * @param string $Benchmarked je-li vyplneno, bude zalogovan banchmark test do err_log a text bude pouzit jako identifikator ve vypisu logu * @param int $maxold pocet minut jak muze byt vysledek stary, jinak dojde k jeho aktualizaci (default 0) 0=cache off * @return array $out["rows"] ... radky s vysledky s omezenim limit, $out["count"] ... pocet nalezenych vysedku bez omezeni limitu */ public function query($query, $params = array(), $benchMarked = "", $maxOld = 0) { if (!is_array($params)) { $params = array($params); } $time_start = microtime(true); $isCache = $maxOld > 0 && !$this->isUpdate($query); $actualPDO = $this->getPDO($query, $isCache); $connectionInfo = $actualPDO === $this->pdoMaster ? $this->masterHost . "/" . $this->masterDBName . " (master)" : ($connectionInfo = $this->slaveHost . "/" . $this->slaveDBName . " (slave)"); if ($isCache) { // vypocteme id dotazu pro cache $checksum = sprintf("%u\n", crc32($query . print_r_log($params))); // zjistime zda uz takovy dotaz neprobehl a zda neni po expiraci $stmt = $actualPDO->prepare("SELECT *,TIMESTAMPDIFF(MINUTE,created,NOW()) AS oldmin FROM cache_sql WHERE sql_hash=?"); $stmt->execute(array($checksum)); $cache = $stmt->fetch(); $isCache = $stmt->rowCount() > 0 && $cache['oldmin'] < $maxOld; } //znovu se ptam na stejnou podminku, protoze se mohla mezitim zmenit if ($isCache) { $out = unserialize($cache['result']); } else { // neprobehl nebo vyexpiroval - provedeme dotaz a vysledek ulozime do cache $stmt = $actualPDO->prepare($query); $stmt->setFetchMode(PDO::FETCH_ASSOC); $success = $stmt->execute($params); $errorInfo = $stmt->errorInfo(); $out['errorCode'] = $errorInfo[0]; $out['errorText'] = $errorInfo[2]; $out["rows"] = $stmt->fetchAll(); $out["lastInsertId"] = $actualPDO->lastInsertId(); $out["affectedRows"] = $stmt->rowCount(); if (!SQLEngine::isError($out)) { $out['errorText'] = ""; $rs1 = $actualPDO->query("SELECT FOUND_ROWS() as pocet")->fetch(); $out['count'] = $rs1['pocet']; //pokud nezafunguje found_rows a vrati 0-1 radku, tak pro jistotu si vezmu pocet z vracenych radku if ($out['count'] + 0 < 2) { $out['count'] = count($out["rows"]); } } else { logmsg("SQLERROR:" . self::getErrorCode($out) . ":" . self::getErrorText($out) . "\n" . $query . "\n" . print_r_log($params), PEAR_LOG_CRIT); } if ($maxOld > 0) { // ulozime vysledek do cache pokud nepresahuje limitni delku mediumtext 2^24 $serial = serialize($out); if (strlen($serial) < pow(2, 24) && strlen($serial) > 0) { $sql = "REPLACE cache_sql SET sql_hash=?, result=?"; $stmt = $actualPDO->prepare($sql); $stmt->execute(array($checksum, $serial)); } } } $time_end = microtime(true); $time = $time_end - $time_start; global $conf; if ($conf["enableProfiler"]) { $stmt = $actualPDO->prepare("select count(*) as pocet from inzerat"); $stmt->setFetchMode(PDO::FETCH_ASSOC); $success = $stmt->execute(array()); $rs1 = $stmt->fetch(); $profilerInsert = "INSERT INTO profiler_data (request_id, request_uri, startSql, stopSql, query, params, pocetInzeratu, callStack) VALUES (?, ?, ?, ?, ?, ?, ?, ?);"; $e = new Exception(); $profileParams = array($_SERVER["REQUEST_TIME"], $_SERVER["REQUEST_URI"], $time_start, $time_end, $query, serialize($params), $rs1["pocet"], $e->getTraceAsString()); $stmt = $this->getPDOMaster()->prepare($profilerInsert); $stmt->execute($profileParams); } logmsg("BENCHMARK {$benchMarked} STOP for connection " . $connectionInfo . " " . round($time, 3) . "\n" . print_r_log($query) . "\n" . print_r_log($params), PEAR_LOG_DEBUG); return $out; }