2013-02-16 2 views
0

Мой PHP-скрипт для изображений сеттинга сервера на устройства с дисплеем с высоким разрешением часто дает ошибку 500, и я понятия не имею, почему. Это мой сценарий:PHP скрипт изображения часто дает ошибку 500 ошибки внутреннего сервера

<?php 

/**********************/ 
/* SETTING VARS */ 
/**********************/ 
define('CACHE_TIME', 24*60*60); 

$document_root = $_SERVER['DOCUMENT_ROOT']; 
$source_file  = $document_root."/".$_GET['img']; 
$source_ext  = strtolower(pathinfo($source_file, PATHINFO_EXTENSION)); 
$retina_file  = pathinfo($source_file, PATHINFO_DIRNAME).'/'.pathinfo($source_file, PATHINFO_FILENAME).'@2x.'.pathinfo($source_file, PATHINFO_EXTENSION); 
$cache_directive = 'must-revalidate'; 
$dpr    = $_COOKIE['dpr']; 


/*********************/ 
/* WHICH FILE? */ 
/*********************/ 
if($dpr == 2){ 
    if(file_exists($retina_file)){ 
     $serve_file = $retina_file; 
    }else{ 
     $serve_file = $source_file; 
    } 
}else{ 
    if(file_exists($source_file)){ 
     $serve_file = $source_file; 
    }else{ 
     $serve_file = $retina_file; 
    } 
} 


/**********************/ 
/* SERVING FILE */ 
/**********************/ 
if (!file_exists($serve_file)) { 
    header('HTTP/1.1 404 Not Found', true); 
    exit(); 
} 

// Send cache headers 
header("Cache-Control: private, {$cache_directive}, max-age=".CACHE_TIME, true); 
date_default_timezone_set('GMT'); 
header('Expires: '.gmdate('D, d M Y H:i:s', time()+CACHE_TIME).' GMT', true); 

$etag = '"'.filemtime($serve_file).fileinode($serve_file).'"'; 
header("ETag: $etag", true); 
if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && ($_SERVER['HTTP_IF_NONE_MATCH']) === $etag) { 
    // File in cache hasn't change 
    header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($serve_file)).' GMT', true, 304); 
    exit(); 
} 

// Send image headers 
if (in_array($source_ext, array('png', 'gif', 'jpeg', 'bmp'))) { 
    header("Content-Type: image/".$source_ext, true); 
} 
else { 
    header("Content-Type: image/jpeg", true); 
} 
header('Content-Length: '.filesize($serve_file), true); 

// Send file 
readfile($serve_file); 
exit(); 
?> 

Вот мой журнал ошибок:

[13-Feb-2013 06:51:10 America/Chicago] PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/lib/php/extensions/no-debug-non-zts-20090626/pdo_sqlite.so' - /usr/local/lib/php/extensions/no-debug-non-zts-20090626/pdo_sqlite.so: cannot make segment writable for relocation: Cannot allocate memory in Unknown on line 0 
[13-Feb-2013 06:51:42 America/Chicago] PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/lib/php/extensions/no-debug-non-zts-20090626/ssh2.so' - /usr/local/lib/php/extensions/no-debug-non-zts-20090626/ssh2.so: failed to map segment from shared object: Cannot allocate memory in Unknown on line 0 
[13-Feb-2013 08:23:21 America/Chicago] PHP Fatal error: Out of memory (allocated 262144) (tried to allocate 261900 bytes) in Unknown on line 0 
[13-Feb-2013 08:55:36 America/Chicago] PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/lib/php/extensions/no-debug-non-zts-20090626/ssh2.so' - /usr/local/lib/php/extensions/no-debug-non-zts-20090626/ssh2.so: failed to map segment from shared object: Cannot allocate memory in Unknown on line 0 
[16-Feb-2013 04:24:10 America/Chicago] PHP Fatal error: Out of memory (allocated 262144) (tried to allocate 261900 bytes) in Unknown on line 0 

ошибка происходит на случайных изображений на странице, это всегда разные из них. Иногда страница даже загружается без ошибок на мои изображения.

+1

Попробуйте проверить ваш файл 'error_log'. – Achrome

+0

Звучит как проблема с ограничениями на стороне сервера. – arkascha

+0

У меня уже есть, но я действительно не получал более мудрой формы. Я тоже опубликую его. – CupOfTea696

ответ

2

Проверьте memory_limit ini php.ini и поднимите, если необходимо. Также убедитесь, что буферизация вывода отключена с помощью ob_get_level(). Если включено, вызовите ob_end_flush() перед readfile().

+0

Я проверю, хотя я не уверен, что мой хост позволит мне изменить этот предел. – CupOfTea696

+0

На самом деле, используя ob_start («callback», 1024 * 1024); похоже, решила проблему. – CupOfTea696

+0

Что вы включили в callback()? Попробуйте просто вызвать ob_end_flush() перед readfile(), если кто-то включит буферизацию. – sivann

Смежные вопросы