=0; $i--) mkdir($dirs[$i], 0777); } function cache ($id) { global $PHP_SELF, $magic_cache_passthrough, $SERVER_NAME, $SERVER_PORT, $cache_directory, $QUERY_STRING; if ($magic_cache_passthrough != "") return; $self = basename($PHP_SELF); $file = "$cache_directory/$self/$id"; if (file_exists($file)) { $fp = fopen($file, "r"); $header = true; while(!feof($fp) && $header) { $line = fgets($fp, 2048); $line = substr($line, 0, strlen($line)-2); if ($line == "") $header = false; else Header($line); } while ($block = fread($fp, 2048)) echo $block; fclose($fp); exit; } else { $fp = fsockopen($SERVER_NAME, $SERVER_PORT, &$errno, &$errstr); if(!$fp) { echo "$errstr ($errno)
\n"; } else { cache_make_directory(dirname($file)); # Write to a temp file to avoid clobbering by other httpd's. $cfile = "$file-" . getmypid(); $cache = fopen($cfile, "w"); if ($QUERY_STRING != "") $fself = "$PHP_SELF?$QUERY_STRING&magic_cache_passthrough=yes"; else $fself = "$PHP_SELF?magic_cache_passthrough=yes"; fputs($fp, "GET $fself HTTP/1.0\n"); $headers = getallheaders(); while (list ($header, $value) = each($headers)) fputs($fp, "$header: $value\n"); fputs($fp, "\n"); $header = true; while(!feof($fp) && $header) { $line = fgets($fp, 2048); fputs($cache, $line); $line = substr($line, 0, strlen($line)-2); if ($line == "") $header = false; else Header($line); } while ($block = fread($fp, 2048)) { fputs($cache, $block); echo $block; } fclose($fp); fclose($cache); # Renames (under Unix, at least, and on a single filesystem) # is atomic, so no file locking is necessary. rename($cfile, $file); } exit; } } ?>