Выделение памяти в php

Обновлено: 07.07.2024

По умолчанию WordPress устанавливает небольшой лимит на размер загружаемых изображений, видеороликов и других файлов. Аналогичная ситуация с PHP memory limit , который сказывается на возможности запускать плагины и скрипты.

Если вы запускаете сайт с большим количеством контента, эти лимиты могут стать проблемой. Можно получить ошибку при загрузке:

Объем загружаемого файла превышает ограничение, заданное директивой upload_max_filesize в файле php.ini Неустранимая ошибка: допустимый размер памяти 12345678 байт исчерпан (вы пытались выделить 2345678 байт) в /home/your-username/public_html/wp-includes/plugin.php в строке 1000

Рассмотрим наиболее эффективные способы увеличения этих лимитов на сервере. Начнем с memory limit php ini .

Обновление файла php.ini

Если вы используете CPanel , перейдите в раздел « Файлы » и нажмите кнопку « Диспетчер файлов ». Убедитесь, что установлен флажок « Показать скрытые файлы », а затем нажмите на кнопку « Перейти ».

Выберите папку wp-admin и найдите файл php.ini или php5.ini . Если такого файла нет, создайте его, нажав на кнопку « Создать файл », расположенную в верхнем левом углу. Назовите файл php.ini и нажмите во всплывающем окне кнопку « Создать файл »:

Обновление файла php.ini

Если ошибка не исчезла, попробуйте переименовать файл в php5.ini . Когда файл будет открыт, добавьте в него приведенные ниже строки, а затем сохраните изменения и закройте файл:

Прежде чем проверить, не исчезла ли ошибка, очистите кэш браузера.

Редактирование файла .htaccess

Если редактирование php.ini не помогло, попробуйте изменить файл .htaccess . Добавьте приведенный ниже код в конец файла:

Измените значения php ini set memory limit так, как вам нужно. Не забудьте сохранить файл и очистить кэш браузера.

Изменение файла wp-config.php

Сохраните файл и очистите кэш браузера.

Изменение лимитов в WHM

Если сайт размещен на VPS или выделенном сервере, можно попробовать изменить лимиты в WHM .

После того, как вы вошли в систему, перейдите в раздел Конфигурация сервера> Настройки > PHP .

Изменение лимитов в WHM

Введите нужные вам значения и нажмите кнопку « Сохранить ».

Затем перейдите в раздел Конфигурация служб> Редактор конфигурации PHP . Прокрутите страницу вниз до разделов memory_limit и upload_max_filesize :

Изменение лимитов в WHM - 2

Введите необходимые значения. В разделе « Параметры и информация » найдите memory_limit и задайте то же значение, которое вы установили в memory limit php ini и .htaccess .

Заключение

Мы рассмотрели все способы решения данной проблемы. Наслаждайтесь возможностью загружать большие файлы и продолжайте использовать на своем сайте плагины WordPress . Внесенные в php memory limit htaccess изменения должны вступить в силу через несколько минут, после чего можно будет приступить к работе с новыми параметрами.

Если нужно загрузить большие файлы только один раз, попробуйте сделать это через FTP . Обычно файлы, загруженные через FTP в каталог /wp-content/uploads/ , не отображаются в библиотеке медиа. Но с помощью плагина Media from FTP можно отобразить их всего в несколько кликов.

Если ни один из вариантов не дал результата, свяжитесь со своим хостинг-провайдером.

Пожалуйста, опубликуйте ваши комментарии по текущей теме статьи. За комментарии, подписки, дизлайки, отклики, лайки огромное вам спасибо!

Дайте знать, что вы думаете по этой теме статьи в комментариях. За комментарии, отклики, дизлайки, лайки, подписки огромное вам спасибо!

Возвращает количество памяти в байтах, которое было выделено PHP-скрипту на данный момент.

Список параметров

Передача true позволяет узнать реальное количество памяти, выделенной PHP скрипту системой, включая неиспользуемые страницы. Если аргумент не задан или равен false , будет возвращено только количество используемой памяти.

Замечание:

PHP не отслеживает память, которая выделялась не emalloc()

Возвращаемые значения

Возвращает количество памяти в байтах.

Примеры

<?php
// Это просто пример, цифры ниже будут
// отличаться в зависимости от вашей системы

echo memory_get_usage () . "\n" ; // 36640

$a = str_repeat ( "Hello" , 4242 );

echo memory_get_usage () . "\n" ; // 57960

echo memory_get_usage () . "\n" ; // 36744

Смотрите также

  • memory_get_peak_usage() - Возвращает пиковое значение объёма памяти, выделенное PHP

User Contributed Notes 15 notes

To get the memory usage in KB or MB

<?php
function convert ( $size )
$unit =array( 'b' , 'kb' , 'mb' , 'gb' , 'tb' , 'pb' );
return @ round ( $size / pow ( 1024 ,( $i = floor ( log ( $size , 1024 )))), 2 ). ' ' . $unit [ $i ];
>

echo convert ( memory_get_usage ( true )); // 123 kb
?>

Note, that the official IEC-prefix for kilobyte, megabyte and so on are KiB, MiB, TiB and so on.

At first glance this may sound like "What the hell? Everybody knows, that we mean 1024 not 1000 and the difference is not too big, so what?". But in about 10 years, the size of harddisks (and files on them) reaches the petabyte-limit and then the difference between PB and PiB is magnificent.

Better to get used to it now. :)

To get the memory usage in KB or MB

<?php
function echo_memory_usage () <
$mem_usage = memory_get_usage ( true );

if ( $mem_usage < 1024 )
echo $mem_usage . " bytes" ;
elseif ( $mem_usage < 1048576 )
echo round ( $mem_usage / 1024 , 2 ). " kilobytes" ;
else
echo round ( $mem_usage / 1048576 , 2 ). " megabytes" ;

memory_get_usage() is used to retrieve the memory allocated to PHP only (or your running script). But intuitively, many people expect to get the memory usage of the system, based on the name of the function.

So if you need the overall memory usage, following function might be helpful. If retrieves the memory usage either in percent (without the percent sign) or in bytes by returning an array with free and overall memory of your system. Tested with Windows (7) and Linux (on an Raspberry Pi 2):

// Returns used memory (either in percent (without percent sign) or free and overall in bytes)
function getServerMemoryUsage ( $getPercentage = true )
$memoryTotal = null ;
$memoryFree = null ;

if ( stristr ( PHP_OS , "win" )) // Get total physical memory (this is in bytes)
$cmd = "wmic ComputerSystem get TotalPhysicalMemory" ;
@ exec ( $cmd , $outputTotalPhysicalMemory );

// Get free physical memory (this is in kibibytes!)
$cmd = "wmic OS get FreePhysicalMemory" ;
@ exec ( $cmd , $outputFreePhysicalMemory );

if ( $outputTotalPhysicalMemory && $outputFreePhysicalMemory ) // Find total value
foreach ( $outputTotalPhysicalMemory as $line ) if ( $line && preg_match ( "/^2+\$/" , $line )) $memoryTotal = $line ;
break;
>
>

// Find free value
foreach ( $outputFreePhysicalMemory as $line ) if ( $line && preg_match ( "/^1+\$/" , $line )) $memoryFree = $line ;
$memoryFree *= 1024 ; // convert from kibibytes to bytes
break;
>
>
>
>
else
if ( is_readable ( "/proc/meminfo" ))
$stats = @ file_get_contents ( "/proc/meminfo" );

if ( $stats !== false ) // Separate lines
$stats = str_replace (array( "\r\n" , "\n\r" , "\r" ), "\n" , $stats );
$stats = explode ( "\n" , $stats );

// Separate values and find correct lines for total and free mem
foreach ( $stats as $statLine ) $statLineData = explode ( ":" , trim ( $statLine ));

//
// Extract size (TODO: It seems that (at least) the two values for total and free memory have the unit "kB" always. Is this correct?
//

// Total memory
if ( count ( $statLineData ) == 2 && trim ( $statLineData [ 0 ]) == "MemTotal" ) $memoryTotal = trim ( $statLineData [ 1 ]);
$memoryTotal = explode ( " " , $memoryTotal );
$memoryTotal = $memoryTotal [ 0 ];
$memoryTotal *= 1024 ; // convert from kibibytes to bytes
>

// Free memory
if ( count ( $statLineData ) == 2 && trim ( $statLineData [ 0 ]) == "MemFree" ) $memoryFree = trim ( $statLineData [ 1 ]);
$memoryFree = explode ( " " , $memoryFree );
$memoryFree = $memoryFree [ 0 ];
$memoryFree *= 1024 ; // convert from kibibytes to bytes
>
>
>
>
>

if ( is_null ( $memoryTotal ) || is_null ( $memoryFree )) return null ;
> else if ( $getPercentage ) return ( 100 - ( $memoryFree * 100 / $memoryTotal ));
> else return array(
"total" => $memoryTotal ,
"free" => $memoryFree ,
);
>
>
>

function getNiceFileSize ( $bytes , $binaryPrefix = true ) if ( $binaryPrefix ) $unit =array( 'B' , 'KiB' , 'MiB' , 'GiB' , 'TiB' , 'PiB' );
if ( $bytes == 0 ) return '0 ' . $unit [ 0 ];
return @ round ( $bytes / pow ( 1024 ,( $i = floor ( log ( $bytes , 1024 )))), 2 ) . ' ' . (isset( $unit [ $i ]) ? $unit [ $i ] : 'B' );
> else $unit =array( 'B' , 'KB' , 'MB' , 'GB' , 'TB' , 'PB' );
if ( $bytes == 0 ) return '0 ' . $unit [ 0 ];
return @ round ( $bytes / pow ( 1000 ,( $i = floor ( log ( $bytes , 1000 )))), 2 ) . ' ' . (isset( $unit [ $i ]) ? $unit [ $i ] : 'B' );
>
>

// Memory usage: 4.55 GiB / 23.91 GiB (19.013557664178%)
$memUsage = getServerMemoryUsage ( false );
echo sprintf ( "Memory usage: %s / %s (%s%%)" ,
getNiceFileSize ( $memUsage [ "total" ] - $memUsage [ "free" ]),
getNiceFileSize ( $memUsage [ "total" ]),
getServerMemoryUsage ( true )
);

?>

The function getNiceFileSize() is not required. Just used to shorten size in bytes.

[EDIT by danbrown AT php DOT net: This is intended by the author to only be used with PHP 4 < 4.3.2.]

I'd just like to point out that although sandeepc at myrealbox dot com's idea for displaying the current memory usage is a good one, it's perhaps a bad idea to pipe the entire process list through grep. A better performing method would be to select only the process we're interested in:

<?php
$pid = getmypid ();
error_log ( 'MEMORY USAGE (% KB PID ): ' . ` ps --pid $pid --no-headers -o%mem,rss,pid `);
?>

True, it's not much of a performance boost, but every bit helps.

I can confirm that this function triggers a garbage collection. I have a script that exceeded 128MB of memory at some point and ended with a fatal error. I was confused, because the script dealt with some large files initially, but the memory load from that point on should have been marginal, and the error occurred at the very end.

Those large files were dealt in a dedicated function and i even used unset() on the variable holding the file after the file was written to disk inside that function. So the memory should have been cleared twice, first after the unset() call, and second once the function ended.

To debug the memory usage, I called memory_get_usage(true) at some points and echo-ed the memory allocation. Just by adding a few echos here and there in the script, the memory usage never exceeded 1MB overhead (on top of the current file size) and the memory error disappeared.

The method sandeepc at myrealbox dot com posted yields larger memory usage, my guess is that it includes all the PHP interpreter/internal code and not just the script being run.

1) Use ps command
MEMORY USAGE (% KB PID ): 0.8 12588 25087 -> about 12MB
2) Use memory_get_usage()
int(6041952) -> about 6MB

This is a function that should work for both Windows XP/2003 and most distrabutions of UNIX and Mac OS X.

return preg_replace ( '/[\D]/' , '' , $output [ 5 ] ) * 1024 ;
>
>else
<
//We now assume the OS is UNIX
//Tested on Mac OS X 10.4.6 and Linux Red Hat Enterprise 4
//This should work on most UNIX systems
$pid = getmypid ();
exec ( "ps -eo%mem,rss,pid | grep $pid " , $output );
$output = explode ( " " , $output [ 0 ]);
//rss is given in 1024 byte units
return $output [ 1 ] * 1024 ;
>
>
>
?>

Note that the description for `memory_get_usage` is different than it's default parameter!

"`int memory_get_usage ([ bool $real_usage = FALSE ] )`
Returns the amount of memory, in bytes, that's currently being allocated to your PHP script. "

Default parameter = `FALSE`

WRONG description: Returns the amount of memory, in bytes, that's currently being allocated to your PHP script.

It must be: Returns the amount of memory, in bytes, that's currently used by your PHP script.

[EDIT by danbrown AT php DOT net: This function will only extend Windows versions of PHP where the server has the required third-party software.]

I was unable to get the previous examples working properly and created code which works at least for me. Enjoy!

// try to use PHP build in function
if( function_exists ( 'memory_get_usage' ) ) <
return memory_get_usage ();
>

// Try to get Windows memory usage via pslist command
if ( substr ( PHP_OS , 0 , 3 ) == 'WIN' )

$resultRow = 8 ;
$resultRowItemStartPosition = 34 ;
$resultRowItemLength = 8 ;

$output = array();
exec ( 'pslist -m ' . getmypid () , $output );

return trim ( substr ( $output [ $resultRow ], $resultRowItemStartPosition , $resultRowItemLength )) . ' KB' ;


// No memory functionality available at all
return '<b style="color: red;">no value</b>' ;

Parameters

Set this to true to get total memory allocated from system, including unused pages. If not set or false only the used memory is reported.

Note:

PHP does not track memory that is not allocated by emalloc()

Return Values

Returns the memory amount in bytes.

Examples

<?php
// This is only an example, the numbers below will
// differ depending on your system

echo memory_get_usage () . "\n" ; // 36640

$a = str_repeat ( "Hello" , 4242 );

echo memory_get_usage () . "\n" ; // 57960

echo memory_get_usage () . "\n" ; // 36744

See Also

  • memory_get_peak_usage() - Returns the peak of memory allocated by PHP

User Contributed Notes 15 notes

To get the memory usage in KB or MB

<?php
function convert ( $size )
$unit =array( 'b' , 'kb' , 'mb' , 'gb' , 'tb' , 'pb' );
return @ round ( $size / pow ( 1024 ,( $i = floor ( log ( $size , 1024 )))), 2 ). ' ' . $unit [ $i ];
>

echo convert ( memory_get_usage ( true )); // 123 kb
?>

Note, that the official IEC-prefix for kilobyte, megabyte and so on are KiB, MiB, TiB and so on.

At first glance this may sound like "What the hell? Everybody knows, that we mean 1024 not 1000 and the difference is not too big, so what?". But in about 10 years, the size of harddisks (and files on them) reaches the petabyte-limit and then the difference between PB and PiB is magnificent.

Better to get used to it now. :)

To get the memory usage in KB or MB

<?php
function echo_memory_usage () <
$mem_usage = memory_get_usage ( true );

if ( $mem_usage < 1024 )
echo $mem_usage . " bytes" ;
elseif ( $mem_usage < 1048576 )
echo round ( $mem_usage / 1024 , 2 ). " kilobytes" ;
else
echo round ( $mem_usage / 1048576 , 2 ). " megabytes" ;

memory_get_usage() is used to retrieve the memory allocated to PHP only (or your running script). But intuitively, many people expect to get the memory usage of the system, based on the name of the function.

So if you need the overall memory usage, following function might be helpful. If retrieves the memory usage either in percent (without the percent sign) or in bytes by returning an array with free and overall memory of your system. Tested with Windows (7) and Linux (on an Raspberry Pi 2):

// Returns used memory (either in percent (without percent sign) or free and overall in bytes)
function getServerMemoryUsage ( $getPercentage = true )
$memoryTotal = null ;
$memoryFree = null ;

if ( stristr ( PHP_OS , "win" )) // Get total physical memory (this is in bytes)
$cmd = "wmic ComputerSystem get TotalPhysicalMemory" ;
@ exec ( $cmd , $outputTotalPhysicalMemory );

// Get free physical memory (this is in kibibytes!)
$cmd = "wmic OS get FreePhysicalMemory" ;
@ exec ( $cmd , $outputFreePhysicalMemory );

if ( $outputTotalPhysicalMemory && $outputFreePhysicalMemory ) // Find total value
foreach ( $outputTotalPhysicalMemory as $line ) if ( $line && preg_match ( "/^6+\$/" , $line )) $memoryTotal = $line ;
break;
>
>

// Find free value
foreach ( $outputFreePhysicalMemory as $line ) if ( $line && preg_match ( "/^4+\$/" , $line )) $memoryFree = $line ;
$memoryFree *= 1024 ; // convert from kibibytes to bytes
break;
>
>
>
>
else
if ( is_readable ( "/proc/meminfo" ))
$stats = @ file_get_contents ( "/proc/meminfo" );

if ( $stats !== false ) // Separate lines
$stats = str_replace (array( "\r\n" , "\n\r" , "\r" ), "\n" , $stats );
$stats = explode ( "\n" , $stats );

// Separate values and find correct lines for total and free mem
foreach ( $stats as $statLine ) $statLineData = explode ( ":" , trim ( $statLine ));

//
// Extract size (TODO: It seems that (at least) the two values for total and free memory have the unit "kB" always. Is this correct?
//

// Total memory
if ( count ( $statLineData ) == 2 && trim ( $statLineData [ 0 ]) == "MemTotal" ) $memoryTotal = trim ( $statLineData [ 1 ]);
$memoryTotal = explode ( " " , $memoryTotal );
$memoryTotal = $memoryTotal [ 0 ];
$memoryTotal *= 1024 ; // convert from kibibytes to bytes
>

// Free memory
if ( count ( $statLineData ) == 2 && trim ( $statLineData [ 0 ]) == "MemFree" ) $memoryFree = trim ( $statLineData [ 1 ]);
$memoryFree = explode ( " " , $memoryFree );
$memoryFree = $memoryFree [ 0 ];
$memoryFree *= 1024 ; // convert from kibibytes to bytes
>
>
>
>
>

if ( is_null ( $memoryTotal ) || is_null ( $memoryFree )) return null ;
> else if ( $getPercentage ) return ( 100 - ( $memoryFree * 100 / $memoryTotal ));
> else return array(
"total" => $memoryTotal ,
"free" => $memoryFree ,
);
>
>
>

function getNiceFileSize ( $bytes , $binaryPrefix = true ) if ( $binaryPrefix ) $unit =array( 'B' , 'KiB' , 'MiB' , 'GiB' , 'TiB' , 'PiB' );
if ( $bytes == 0 ) return '0 ' . $unit [ 0 ];
return @ round ( $bytes / pow ( 1024 ,( $i = floor ( log ( $bytes , 1024 )))), 2 ) . ' ' . (isset( $unit [ $i ]) ? $unit [ $i ] : 'B' );
> else $unit =array( 'B' , 'KB' , 'MB' , 'GB' , 'TB' , 'PB' );
if ( $bytes == 0 ) return '0 ' . $unit [ 0 ];
return @ round ( $bytes / pow ( 1000 ,( $i = floor ( log ( $bytes , 1000 )))), 2 ) . ' ' . (isset( $unit [ $i ]) ? $unit [ $i ] : 'B' );
>
>

// Memory usage: 4.55 GiB / 23.91 GiB (19.013557664178%)
$memUsage = getServerMemoryUsage ( false );
echo sprintf ( "Memory usage: %s / %s (%s%%)" ,
getNiceFileSize ( $memUsage [ "total" ] - $memUsage [ "free" ]),
getNiceFileSize ( $memUsage [ "total" ]),
getServerMemoryUsage ( true )
);

?>

The function getNiceFileSize() is not required. Just used to shorten size in bytes.

[EDIT by danbrown AT php DOT net: This is intended by the author to only be used with PHP 4 < 4.3.2.]

I'd just like to point out that although sandeepc at myrealbox dot com's idea for displaying the current memory usage is a good one, it's perhaps a bad idea to pipe the entire process list through grep. A better performing method would be to select only the process we're interested in:

<?php
$pid = getmypid ();
error_log ( 'MEMORY USAGE (% KB PID ): ' . ` ps --pid $pid --no-headers -o%mem,rss,pid `);
?>

True, it's not much of a performance boost, but every bit helps.

I can confirm that this function triggers a garbage collection. I have a script that exceeded 128MB of memory at some point and ended with a fatal error. I was confused, because the script dealt with some large files initially, but the memory load from that point on should have been marginal, and the error occurred at the very end.

Those large files were dealt in a dedicated function and i even used unset() on the variable holding the file after the file was written to disk inside that function. So the memory should have been cleared twice, first after the unset() call, and second once the function ended.

To debug the memory usage, I called memory_get_usage(true) at some points and echo-ed the memory allocation. Just by adding a few echos here and there in the script, the memory usage never exceeded 1MB overhead (on top of the current file size) and the memory error disappeared.

The method sandeepc at myrealbox dot com posted yields larger memory usage, my guess is that it includes all the PHP interpreter/internal code and not just the script being run.

1) Use ps command
MEMORY USAGE (% KB PID ): 0.8 12588 25087 -> about 12MB
2) Use memory_get_usage()
int(6041952) -> about 6MB

This is a function that should work for both Windows XP/2003 and most distrabutions of UNIX and Mac OS X.

return preg_replace ( '/[\D]/' , '' , $output [ 5 ] ) * 1024 ;
>
>else
<
//We now assume the OS is UNIX
//Tested on Mac OS X 10.4.6 and Linux Red Hat Enterprise 4
//This should work on most UNIX systems
$pid = getmypid ();
exec ( "ps -eo%mem,rss,pid | grep $pid " , $output );
$output = explode ( " " , $output [ 0 ]);
//rss is given in 1024 byte units
return $output [ 1 ] * 1024 ;
>
>
>
?>

Note that the description for `memory_get_usage` is different than it's default parameter!

"`int memory_get_usage ([ bool $real_usage = FALSE ] )`
Returns the amount of memory, in bytes, that's currently being allocated to your PHP script. "

Default parameter = `FALSE`

WRONG description: Returns the amount of memory, in bytes, that's currently being allocated to your PHP script.

It must be: Returns the amount of memory, in bytes, that's currently used by your PHP script.

[EDIT by danbrown AT php DOT net: This function will only extend Windows versions of PHP where the server has the required third-party software.]

I was unable to get the previous examples working properly and created code which works at least for me. Enjoy!

// try to use PHP build in function
if( function_exists ( 'memory_get_usage' ) ) <
return memory_get_usage ();
>

// Try to get Windows memory usage via pslist command
if ( substr ( PHP_OS , 0 , 3 ) == 'WIN' )

$resultRow = 8 ;
$resultRowItemStartPosition = 34 ;
$resultRowItemLength = 8 ;

$output = array();
exec ( 'pslist -m ' . getmypid () , $output );

return trim ( substr ( $output [ $resultRow ], $resultRowItemStartPosition , $resultRowItemLength )) . ' KB' ;


// No memory functionality available at all
return '<b style="color: red;">no value</b>' ;

Настройки потребления ресурсов в PHP скриптах можно установить в главном конфигурационном файле php.ini, а также в самих скриптах.

В файле php.ini за это отвечают директивы из раздела Resource Limits (ограничение потребления ресурсов).

Как увеличить память для PHP скриптов

Для этого в файле php.ini найдите и отредактируйте директиву:

Эта директива задаёт максимальное время в секундах, в течение которого скрипт должен полностью загрузиться. Если этого не происходит, парсер завершает работу скрипта. Этот механизм помогает предотвратить зависание сервера из-за плохо написанного скрипта. По умолчанию на загрузку даётся 30 секунд. Если PHP запущен из командной строки, это значение по умолчанию равно 0.

На максимальное время выполнения не влияют системные вызовы, потоковые операции и т.п.

При работе в безопасном режиме эту настройку нельзя изменить функцией ini_set(). Если значение все же нужно изменить, надо либо выключить безопасный режим, либо изменить значение прямо в php.ini.

Веб-серверы обычно имеют свои настройки тайм-аута, по истечении которого сами завершают выполнение скрипта PHP. В Apache есть директива Timeout, в IIS есть функция CGI timeout. В обоих случаях по умолчанию установлено 300 секунд. Точные значения можно узнать из документации к веб-серверу.

Функция для увеличения и ограничения времени выполнения PHP

Функция set_time_limit ограничивает время выполнения скрипта.

Она задает время в секундах, в течение которого скрипт должен завершить работу. Если скрипт не успевает, вызывается фатальная ошибка. По умолчанию дается 30 секунд, либо время, записанное в настройке max_execution_time в php.ini (если такая настройка установлена).

При вызове set_time_limit() перезапускает счетчик с нуля. Другими словами, если тайм-аут изначально был 30 секунд, и через 25 секунд после запуска скрипта будет вызвана функция set_time_limit(20), то скрипт будет работать максимум 45 секунд.

  • СЕКУНДЫ (максимальное время выполнения в секундах. Если задан ноль, время выполнения неограничено)

Возвращаемые значения: возвращает TRUE в случае успеха, иначе FALSE.

Внимание: эта функция не работает, если PHP работает в безопасном режиме. Обойти это ограничение можно только выключив безопасный режим или изменив значение настройки в php.ini.

Замечание: функция set_time_limit() и директива max_execution_time влияют на время выполнения только самого скрипта. Время, затраченное на различные действия вне скрипта, такие как системные вызовы функции system(), потоковые операции, запросы к базам данных и т.п. не включаются в расчет времени выполнения скрипта. Это не относится к системам Windows, где расчитывается абсолютное время выполнения.

Увеличение выделенной памяти для PHP скриптов

Директива в файле php.ini

задаёт максимальный объем памяти в байтах, который разрешается использовать скрипту. Это помогает предотвратить ситуацию, при которой плохо написанный скрипт съедает всю доступную память сервера. Для того, чтобы убрать ограничения, установите значение этой директивы в -1.

В версиях до PHP 5.2.1 для использования этой директивы, она должна была быть указана на этапе компиляции. Так, ваша строка конфигурации должна была включать: --enable-memory-limit. Эта опция компиляции была также необходима для использования функций memory_get_usage() и memory_get_peak_usage() до версии 5.2.1.

Если используется целое число, то значение измеряется байтами. Вы также можете использовать сокращённую запись.

Доступные опции: K (для килобайт), M (для мегабайт) и G (для гигабайт; доступна начиная с PHP 5.1.0); они регистронезависимы. Все остальное считается байтами. 1M равно одному мегабайту или 1048576 байтам. 1K равно одному килобайту или 1024 байтам. Эти сокращения вы можете использовать в php.ini и в функции ini_set(). Обратите внимание, что числовое значение приводится к типу integer; например, 0.5M интерпретируется как 0.

Увеличение времени парсинга данных из запроса.

Директива в файле php.ini

задаёт максимальное время в секундах, в течение которого скрипт должен разобрать все входные данные, переданные запросами вроде POST или GET. Это время измеряется от момента, когда PHP вызван на сервере до момента, когда скрипт начинает выполняться. Значение по умолчанию -1, что означает, что будет использоваться max_execution_time. Если установить равным 0, то ограничений по времени не будет.

При запуске в командной строке значение директивы установлено на -1 (неограниченно).

Увеличение глубины вложенности входных переменных

Директива в файле php.ini

задаёт максимальную глубину вложенности входных переменных (то есть $_GET, $_POST.). По умолчанию данная директива закомментирована.

Ограничение на количество входных переменных

Директива в файле php.ini

определяет, входных переменных может быть принято в одном запросе (ограничение накладывается на каждую из глобальных переменных $_GET, $_POST и $_COOKIE отдельно). Использование этой директивы снижает вероятность сбоев в случае атак с использованием хеш-коллизий. Если входных переменных больше, чем задано директивой, выбрасывается предупреждение E_WARNING, а все последующие переменные в запросе игнорируются. По умолчанию данная директива закомментирована.

Внимание: после внесения изменений в файл php.ini необходимо перезагрузить веб-сервер, чтобы изменения вступили в силу.

Проверка использование ресурсов

Функция getrusage получает информацию об использовании текущего ресурса.

Возвращаемые значения: возвращает ассоциативный массив, содержащий данные возвращённые из системного вызова. Имена элементов соответствуют документированным именам полей.

Пример использования getrusage():


Увеличение разрешённого размера файлов для загрузки на сервер

Кроме описанных ограничений на потребление непосредственных ресурсов веб-сервера, также имеются ограничения, которые оказывают косвенное воздействие на ресурсы: например, загрузка слишком большого файла на сервер может потребовать большого количества ресурсов для его обработки, либо привести к переполнению дискового хранилища сервера. Поэтому существуют дополнительные лимиты, включённые в другие разделы конфигурационного файла помимо Resource Limits.

В частности, директива

устанавливает максимальный размер закачиваемого файла.

Если используется целое число, значение измеряется байтами. Вы также можете использовать сокращённую запись, которая описана чуть выше.

Максимально допустимый размер данных, отправляемых методом POST

Методом пост могут отправляться как текстовые данные (например, при отправке комментария на сайт), так и файлы. Если вы увеличили значение upload_max_filesize чтобы иметь возможность загружать файлы большего размера на сайт, то также нужно увеличить и значение директивы:

Замечание: PHP разрешает сокращения значений байт, включая K (кило), M (мега) и G (гига). PHP автоматически преобразует все эти сокращения. Будьте осторожны с превышением диапазона 32-битных целых значений (если вы используете 32-битную версию), так как это приведёт к ошибке вашего скрипта.

Для полного снятия лимитов значение можно установить на 0.

Значение этой настройки игнорируется, если чтение данных POST отключено с помощью enable_post_data_reading.

Увеличение количества файлов, выгружаемых на сайт за один раз

устанавливает максимально разрешённое количество одновременно закачиваемых файлов. Начиная с PHP 5.3.4, пустые поля загрузки не рассматриваются этим ограничением.

Имеются ввиду не общее количество одновременно закачиваемых файлов, которые могут выполнять различные пользователи, а именно количество файлов за один запрос.

Читайте также: