From: Michael Ang Date: Thu, 13 Oct 2011 23:27:59 +0000 (+0000) Subject: Write to fast tmp file instead of overly clever "stream if successful" code path X-Git-Url: http://git.rot13.org/?p=bookreader.git;a=commitdiff_plain;h=823909a4e2bebc3f1a08ac662582dcc749b6ae04 Write to fast tmp file instead of overly clever "stream if successful" code path --- diff --git a/BookReaderIA/datanode/BookReaderImages.inc.php b/BookReaderIA/datanode/BookReaderImages.inc.php index 2fb7abf..2c6f839 100644 --- a/BookReaderIA/datanode/BookReaderImages.inc.php +++ b/BookReaderIA/datanode/BookReaderImages.inc.php @@ -227,8 +227,8 @@ class BookReaderImages // Process some of the request parameters $zipPath = $requestEnv['zip']; $file = $requestEnv['file']; - if (! $ext) { - $ext = $requestEnv['ext']; + if (array_key_exists('ext', $requestEnv)) { + $ext = $requestEnv['ext']; // Will get santized below } else { // Default to jpg $ext = 'jpeg'; @@ -440,15 +440,16 @@ class BookReaderImages // print $cmd; $filenameForClient = $this->filenameForClient($file, $ext); + + $errorMessage = ''; - $headers = array('Content-type: '. self::$MIMES[$ext], - 'Cache-Control: max-age=15552000', - 'Content-disposition: inline; filename=' . $filenameForClient); - + //if (! $this->passthruIfSuccessful($headers, $cmd, $errorMessage)) { // $$$ move to BookReaderRequest - $errorMessage = ''; - - if (! $this->passthruIfSuccessful($headers, $cmd, $errorMessage)) { // $$$ move to BookReaderRequest + $tempFile = $this->getTempFilename($ext); + array_push($this->tempFiles, $tempFile); + + $imageCreated = $this->createOutputImage($cmd, $tempFile, $errorMessage); + if (! $imageCreated) { // $$$ automated reporting trigger_error('BookReader Processing Error: ' . $cmd . ' -- ' . $errorMessage, E_USER_WARNING); @@ -468,7 +469,10 @@ class BookReaderImages $cmd = $unzipCmd . $this->getDecompressCmd($imageInfo, $powReduce, $rotate, $scale, $region, $stdoutLink) . $compressCmd; trigger_error('BookReader rerunning with new cmd: ' . $cmd, E_USER_WARNING); - if ($this->passthruIfSuccessful($headers, $cmd, $errorMessage)) { // $$$ move to BookReaderRequest + + //if ($this->passthruIfSuccessful($headers, $cmd, $errorMessage)) { // $$$ move to BookReaderRequest + $imageCreated = $this->createOutputImage($mcd, $tempFile, $errorMessage); + if ($imageCreated) { $recovered = true; } else { $this->cleanup(); @@ -481,6 +485,22 @@ class BookReaderImages } } + if ($imageCreated) { + // Send the image + + $headers = array('Content-type: '. self::$MIMES[$ext], + 'Cache-Control: max-age=15552000', + 'Content-disposition: inline; filename=' . $filenameForClient, + 'Content-Length: ' . filesize($tempFile)); + + foreach($headers as $header) { + header($header); + } + ob_clean(); + flush(); // attempt to send header to client + readfile($tempFile); + } + $this->cleanup(); } @@ -696,6 +716,7 @@ class BookReaderImages $this->BRfatal('Unknown image type: ' . $imageType); break; } + return $decompressCmd; } @@ -713,6 +734,7 @@ class BookReaderImages // other cases, e.g. if there are warnings on stderr function passthruIfSuccessful($headers, $cmd, &$errorMessage) { + $retVal = false; $errorMessage = ''; @@ -794,6 +816,12 @@ class BookReaderImages return $retVal; } + function createOutputImage($cmd, $tempFile, &$errorMessage) { + $fullCmd = $cmd . " > " . $tempFile; + system($fullCmd); // $$$ better error handling + return file_exists($tempFile); + } + function BRfatal($string) { $this->cleanup(); throw new Exception("Image error: $string"); @@ -1057,17 +1085,30 @@ class BookReaderImages } // Get the directory for temporary files. Use the fast in-RAM tmp if available. - /* function getTempDir() { - var $fast = '/var/tmp/fast'; - if (is_dir($fast)) { - // We assume it's writeable + $fastbr = '/var/tmp/fast/bookreader'; + + if (is_writeable($fastbr)) { + // Our directory in fast tmp already exists + return $fastbr; + } else { + // Check for fast tmp and make our directory + $fast = '/var/tmp/fast'; + if (is_writeable($fast)) { + if (mkdir($fastbr)) { + return $fastbr; + } + } return $fast; } + // All else failed -- system tmp that should get cleaned on reboot return '/tmp'; } - */ + + function getTempFilename($ext) { + return tempnam($this->getTempDir(), "BookReaderImages"); + } // Clean up temporary files and resources function cleanup() { diff --git a/BookReaderIA/datanode/BookReaderImages.php b/BookReaderIA/datanode/BookReaderImages.php index fd06508..f6e3b13 100644 --- a/BookReaderIA/datanode/BookReaderImages.php +++ b/BookReaderIA/datanode/BookReaderImages.php @@ -30,7 +30,7 @@ require_once('BookReaderImages.inc.php'); // Serve request $bri = new BookReaderImages(); try { - if ($_REQUEST['page']) { + if (array_key_exists('page', $_REQUEST) && $_REQUEST['page']) { // Need to lookup metadata $bri->serveLookupRequest($_REQUEST); } else {