PHP에서 허용되는 메모리 크기 33554432 바이트 (43148176 바이트 할당 시도)


279

이 오류 메시지가 표시됩니다. 제안 사항이 있습니까?

PHP에서 허용되는 메모리 크기 33554432 바이트 (43148176 바이트 할당 시도)


5
php.ini 파일에서 최대 메모리 제한을 64MB로 늘리십시오. 구글 검색 그러나 왜 그렇게 많은 메모리를 할당하려고하는지 물을 수 있습니까? 어떤 코드 라인이 실패합니까?

1
스크립트가 실패했을 때 무엇을하고 있습니까? 코드를 게시 할 수 있습니까?
Neil Aitken

3
매우 큰 txt 파일처럼 보입니다.
macbirdie 2012

10
일반적으로, 잠재적으로 크거나 임의적 인 크기의 파일을 한 번에 한 줄씩 읽고 각 행을 읽을 때마다 이전 행 메모리를 덮어 씁니다. 또는 최신 항목을 얻기 위해 파일에 꼬리를 붙이거나 향할 수도 있습니다. 파일이 커질 때 메모리 할당을 없애는 것이 답이 아닙니다.
ekerner

답변:


319

마침내 나는 대답을 찾았습니다.

파일에서 오류가 발생하기 전에이 줄을 아래 줄에 추가하십시오.

ini_set('memory_limit', '-1');

서버의 무제한 메모리 사용이 필요하며 정상적으로 작동합니다.

친구 제안을 해주셔서 감사합니다.


125
여전히 메모리가 소진 된 이유 를 확인해야합니다 . 전체 파일을 읽을 필요는 없으며 순차적으로 읽을 수도 있습니다.
macbirdie 2012 년

8
- @panidarapu 및 @Don 존스 : 메모리의 양, 그리고에 따라 방법 이 스크립트를 사용,이 방법으로 메모리 사용량의 변화를 허용하는 위험 할 수 있습니다. 경우에 따라 피드를 더 작은 청크로 나누고 필요한 것을 구문 분석 할 수 있습니다. 다행이지만 조심하십시오.
익명 겁쟁이

5
이 제안은 저에게 효과적이었습니다. 스크립트에서 동적으로 메모리 제한을 늘리려면 ini_set () 함수를 사용하십시오. ini_set ( 'memory_limit', '128M');
mente

37
여러분,이 빠른 수정을 위해 가지 마십시오. 장기적으로 다치게 할 수 있습니다. 좋은 프로그래머는이 메모리 소비의 원인을 파악하고 유지하는 대신 필요에 따라 증가시켜야합니다 UNLIMITED.
Sumoanand

113
와우,이 엄청나게 반향 된 답변은 나에게 실제로 나쁜 연습처럼 보입니다. -1!
Ambidex

59

공유 호스팅의 한계를 높이는 간단한 두 가지 방법은 다음과 같습니다.

  1. PHP.ini 파일에 액세스 할 수 있으면 PHP.ini에서 줄을 변경하십시오. 줄에 32M이 표시되면 64M을 시도하십시오. memory_limit = 64M ; Maximum amount of memory a script may consume (64MB)

  2. PHP.ini에 접근 할 수 없다면 이것을 .htaccess 파일에 추가하십시오 : php_value memory_limit 64M


47

스크립트가 너무 많은 메모리를 사용하고 있습니다. 제어가 부족한 루프가 있고 루프의 각 패스에서 객체를 생성하거나 배열에 추가하는 경우 PHP에서 종종 발생할 수 있습니다.

무한 루프를 확인하십시오.

이것이 문제가되지 않는다면, 완료된 객체를 null로 설정하여 파괴함으로써 PHP를 도와주십시오. 예.$OldVar = null;

실제로 오류가 발생하는 코드를 확인하십시오. 그 줄이 방대한 양의 메모리를 할당 할 것으로 기대하십니까? 그렇지 않다면 무엇이 잘못되었는지 알아 내려고 시도하십시오 ...


3
나는이 정확한 문제가 있었다-실수로 재귀 함수를 만들었으므로 코드 실행 중 임의의 시간에 메모리가 부족했다. 이것은 메모리 누수를 찾기 위해 만든 세계에서 가장 메모리 효율적인 코드를 가지고있는 나의 장점을 가지고있었습니다.
Kris Selbekk

1
구멍을 뚫고 토끼를 쫓을 다른 사람들을 위해. Symfony의 Doctrine은 monolog에 문제가 있다고 생각하고 PDO 예외가있을 때 예외에 대한 예외를 시도하여 실제 문제 (제 경우 손상된 db 파일)를 숨기므로 무한 루프 예외를 만듭니다.
Desislav Kamenov

39

하기 :

ini_set('memory_limit', '-1');

결코 좋지 않습니다. 매우 큰 파일을 읽으려면 비트 단위로 복사하는 것이 가장 좋습니다. 최상의 연습을 위해 다음 코드를 시도하십시오.

$path = 'path_to_file_.txt';

$file = fopen($path, 'r');
$len = 1024; // 1MB is reasonable for me. You can choose anything though, but do not make it too big
$output = fread( $file, $len );

while (!feof($file)) {
    $output .= fread( $file, $len );
}

fclose($file);

echo 'Output is: ' . $output;

6
이 모든 사람들이 memory_limit를 -1로 설정하도록 권장한다고 믿을 수 없습니다 ... 프로덕션 서버에서 할 수있는 미친 일. 훨씬 깨끗한 솔루션에 감사드립니다.
JohnWolf

2
"모범 사례"에있는 동안 while루프 후 파일 핸들러를 닫는 것이 좋습니다 .fclose($file)
kodeart

2
@assetCorp 예를 들어 파일에 100MiB가 있고 PHP 메모리 제한이 여전히 32MiB로 설정되어 있으면이 방법이 도움이됩니다. 1MiB의 보안 청크로 읽은 다음 루프가 31에 도달하면 사용 가능한 모든 메모리를 사용하는 변수에 추가하십시오. 반복. 어떻게 더 좋아? 청크를 하나의 변수에 모두 저장하지 않아도 유사하게 출력하면 문제를 해결하는 데 도움이됩니다.
helvete

17

불행히도 PHP는 사용자가 생각하는 것보다 더 빠르게 메모리를 소비하는 방식으로 프로그래밍하기가 쉽습니다. PHP 5가 PHP 4보다 자동으로 수행되지만 문자열, 배열 및 객체를 복사하면 참조가 수행됩니다. 그러나 가장 작은 논리 단위를 처리하는 것보다 여러 단계에 걸쳐 데이터 세트를 전체적으로 처리하는 것도 낭비입니다. 한 번에. 전형적인 예는 데이터베이스에서 큰 결과 집합을 사용하는 것입니다. 대부분의 프로그래머는 전체 결과 집합을 배열로 가져온 다음로 여러 번 반복합니다 foreach(). while()루프를 사용하여 한 번에 한 행씩 페치 및 처리 하는 것이 훨씬 더 효율적인 메모리 입니다. 파일 처리에도 동일하게 적용됩니다.


이것이 그렇게하는 것 같습니다.
Kzqai

13

큰 파일을 읽으려면 한 번에 읽는 대신 비트 단위로 읽어야합니다.
간단한 수학 : 1MB 큰 파일을 한 번에 읽는 경우 데이터를 보유하려면 동시에 1MB 이상의 메모리가 필요합니다.

따라서 fopen&를 사용하여 조금씩 읽어야합니다 fread.


1
사용하여이 문제를 해결 :$fh = fopen($folder.'/'.$filename, "rb") or die(); $buffer = 1024*1024; while (!feof($fh)) { print(fread($fh, $buffer)); flush(); } fclose($fh);
카이 NOACK

12

php7.2에서 laravel 5.6과 동일한 문제에 직면했습니다. memory_limit = 128M내 응용 프로그램 요구에 따라 php.ini 의 변수 양을 늘 립니다. 256M / 512M / 1048M 일 수 있습니다 .... 이제는 잘 작동합니다.


6

나는 또한 같은 문제가 있었고 phpinfo.ini, php.ini 또는 .htaccess 파일을 찾아 보았습니다. 마지막으로 일부 PHP 파일을 살펴보고 열어서 메모리의 코드를 확인했습니다. 마지막 으로이 솔루션은 내가 얻은 것이며 나에게 효과적이었습니다. 워드 프레스를 사용하고 있었 으므로이 솔루션은 워드 프레스 메모리 크기 제한 문제에서만 작동 할 수 있습니다. 내 해결책 은 / public_html / wp-includes 폴더 에서 default-constants.php 파일을 엽니 다 . 코드 편집기로 해당 파일을 열고 범위 내에서 메모리 설정을 찾 거나 Ctrl + F를 눌러 "memory"라는 단어를 찾으십시오. 당신은 거기에 올 것이다 와 . 내 경우에는 64MB, 128MB, 200MB로 늘 렸습니다.wp_initial_constantsWP_MEMORY_LIMITWP_MAX_MEMORY_LIMIT

// Define memory limits.
if ( ! defined( 'WP_MEMORY_LIMIT' ) ) {
    if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
        define( 'WP_MEMORY_LIMIT', $current_limit );
    } elseif ( is_multisite() ) {
        define( 'WP_MEMORY_LIMIT', '200M' );
    } else {
        define( 'WP_MEMORY_LIMIT', '128M' );
    }
}

if ( ! defined( 'WP_MAX_MEMORY_LIMIT' ) ) {
    if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
        define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
    } elseif ( -1 === $current_limit_int || $current_limit_int > 268435456 /* = 256M */ ) {
        define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
    } else {
        define( 'WP_MAX_MEMORY_LIMIT', '256M' );
    }
}

Btw, 나쁜 습관이므로 다음 코드를 수행하지 마십시오.

ini_set('memory_limit', '-1');

1
.htaccess 및 php.ini 파일에 액세스 할 수없는 워드 프레스 웹 사이트에서 작동합니다. +1
Mustafa sabir

'핵심'워드 프레스 파일에서 이러한 제한을 변경하는 것은 실제로 좋은 생각이 아니라고 말하고 싶습니다. wp-config.php차후 WordPress 업데이트로 덮어 쓰지 않을 수 있는 한도를 매우 쉽게 추가 할 수 있습니다. 또한 '핵심'WordPress 파일이 변경되면 몇 가지 보안 플러그인 (예 : WordFence)이 불평 할 것입니다.
Gwyneth Llewelyn

1
@GwynethLlewelyn 나는 그것을하는 방법을 모른다, 당신은 그것을 자세히 설명 할 수 있습니까?
garakchy

1
아 ... 그냥 편집 wp-config.php. 그리고 (내가합니다 .e 두 줄이를 추가 define( 'WP_MEMORY_LIMIT', '200M' );하고 define( 'WP_MAX_MEMORY_LIMIT', '256M' );. 파일과는 달리 아래 즉, 모든 것을 '핵심'WP (에 wp-includesWP 업그레이드 덮어 씁니다), wp-config.php하지 않습니다 - 그것은을 위해 정확하게있다 WP 상수를 재정의하는 정확한 목적
Gwyneth Llewelyn

1
"나쁜 연습"은 상황에 따라 다릅니다. -1단기 실행 프로세스에 적합합니다. 예를 들어 단위 테스트 또는 작곡가 설치 등을 실행하는 데 사용되는 PHP 빌더 컨테이너입니다. 프로덕션 사이트를 그런 식으로 설정하지 마십시오.
emmdee

5

스크립트의 모든 코드 위에 다음 줄을 실행하여 PHP 스크립트에 허용되는 메모리를 늘릴 수 있습니다.

ini_set('memory_limit','-1'); // enabled the full memory available.

또한 스크립트에서 원하지 않는 변수를 할당 해제하십시오.

이 PHP 라이브러리를 확인하십시오 : PHP로 메모리 확보



3

많은 답변이 스크립트를 제공하는 스크립트의 메모리 양을 늘리려 고 시도하지만 예기치 않은 양의 볼륨이나 크기로 인해 메모리에 너무 자유 롭다는 것을 의미합니다. PHP 문서는 메모리 문제가 " 잘못 작성된 스크립트 " 때문이라고 말합니다.

언급되어야한다 ini_set('memory_limit', '-1');(제한 없음)이 같은 서버 불안정해질 수 있습니다 0 bytes free = bad things. 대신 스크립트가 수행하려는 작업과 컴퓨터에서 사용 가능한 메모리 양에 따라 적절한 균형을 찾으십시오.

더 나은 접근법 : 스크립트 작성자 (또는 야심 찬)라면 xdebug를 사용 하여 이러한 메모리 문제를 디버깅 할 수 있습니다 . 최신 버전 (2.6.0-2018-01-29 출시)은 메모리 호출을 통해 많은 양의 메모리를 소비하는 함수 호출을 보여줍니다. 그렇지 않으면 찾기 어려운 스크립트 문제가 노출됩니다. 일반적으로 비효율은 루프에서 수신되는 볼륨을 기대하지 않지만 각 사례는 독자에게 연습으로 남습니다. :)

Xdebug는 문서는 유용하지만, 3 단계로 요약된다 :

  1. 그것은 설치 - 사용 가능한을 통해 apt-getyum
  2. 구성 -xdebug.ini : xdebug.profiler_enable = 1,xdebug.profiler_output_dir = /where/ever/
  3. QCacheGrind , KCacheGrind 와 같은 도구에서 프로파일보기

2

파일을 읽으려고하면 PHP에서 메모리를 차지합니다. 예를 들어, MP3 파일을 열고 읽으려고하면 (예 : $ data = file ( " http://mydomain.com/path/sample.mp3 ") 파일 을 모두 메모리로 가져옵니다. .

Nelson이 제안한 것처럼 실제로이 메모리를 많이 사용해야하는 경우 최대 메모리 제한을 늘릴 수 있습니다.


2

우리는 비슷한 상황을 겪었고 우리는 답의 맨 위에서 ini_set ( 'memory_limit', '-1'); 1MB보다 큰 KB로 압축 된 이미지 파일이 모두 제대로 작동했습니다.


1

쓰다

ini_set('memory_limit', '-1');

PHP 태그를 연 후 상단의 index.php에


1

Wordpress에서 새 테마로 전환 한 후에도 같은 오류 메시지가 나타납니다. PHP는 5.3 버전을 실행하고 있었으므로 7.2로 전환했습니다. 문제가 해결되었습니다.


1

공유 호스팅을 사용하는 경우, PHP 크기 제한을 늘릴 수 없습니다.

cpanel로 이동하여 PHP 버전을 7.1 이상으로 업그레이드하면 좋습니다.


0

워드 프레스 사용자는 라인을 추가하십시오 :

@ini_set('memory_limit', '-1');

wp-settings.php의 wordpress installed root 폴더에서 찾을 수 있습니다


0

호스팅을 갱신하지 않았으며 데이터베이스는 읽기 전용이었습니다. Joomla는 세션을 작성해야했지만 할 수 없었습니다.


0

커맨드 라인에서 PHP를 실행하는 것과 같은 문제가있었습니다. 최근에 php.ini 파일을 변경했으며 php.ini를 변경하는 동안 실수를했습니다.

이것은 PHP7.0입니다

내가 실수 한 php.ini의 경로 : /etc/php/7.0/cli/php.ini

나는 memory_limit = 256(의미 256 bytes)
대신 memory_limit = 256M(의미 256 Mega bytes)을 설정했습니다.

; 스크립트가 소비 할 수있는 최대 메모리 양 (128MB)
; http://php.net/memory-limit
memory_limit = 128M

수정하면 프로세스가 정상적으로 실행되기 시작했습니다.



-1

라 라벨을 사용하는 경우 다음 방법을 사용하십시오

public function getClientsListApi(Request $request){ print_r($request->all()); //for all request print_r($request->name); //for all name }

대신에

public function getClientsListApi(Request $request){ print_r($request); // it show error as above mention }

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.