이 오류 메시지가 표시됩니다. 제안 사항이 있습니까?
PHP에서 허용되는 메모리 크기 33554432 바이트 (43148176 바이트 할당 시도)
이 오류 메시지가 표시됩니다. 제안 사항이 있습니까?
PHP에서 허용되는 메모리 크기 33554432 바이트 (43148176 바이트 할당 시도)
답변:
마침내 나는 대답을 찾았습니다.
파일에서 오류가 발생하기 전에이 줄을 아래 줄에 추가하십시오.
ini_set('memory_limit', '-1');
서버의 무제한 메모리 사용이 필요하며 정상적으로 작동합니다.
친구 제안을 해주셔서 감사합니다.
UNLIMITED
.
스크립트가 너무 많은 메모리를 사용하고 있습니다. 제어가 부족한 루프가 있고 루프의 각 패스에서 객체를 생성하거나 배열에 추가하는 경우 PHP에서 종종 발생할 수 있습니다.
무한 루프를 확인하십시오.
이것이 문제가되지 않는다면, 완료된 객체를 null로 설정하여 파괴함으로써 PHP를 도와주십시오. 예.$OldVar = null;
실제로 오류가 발생하는 코드를 확인하십시오. 그 줄이 방대한 양의 메모리를 할당 할 것으로 기대하십니까? 그렇지 않다면 무엇이 잘못되었는지 알아 내려고 시도하십시오 ...
하기 :
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;
while
루프 후 파일 핸들러를 닫는 것이 좋습니다 .fclose($file)
불행히도 PHP는 사용자가 생각하는 것보다 더 빠르게 메모리를 소비하는 방식으로 프로그래밍하기가 쉽습니다. PHP 5가 PHP 4보다 자동으로 수행되지만 문자열, 배열 및 객체를 복사하면 참조가 수행됩니다. 그러나 가장 작은 논리 단위를 처리하는 것보다 여러 단계에 걸쳐 데이터 세트를 전체적으로 처리하는 것도 낭비입니다. 한 번에. 전형적인 예는 데이터베이스에서 큰 결과 집합을 사용하는 것입니다. 대부분의 프로그래머는 전체 결과 집합을 배열로 가져온 다음로 여러 번 반복합니다 foreach()
. while()
루프를 사용하여 한 번에 한 행씩 페치 및 처리 하는 것이 훨씬 더 효율적인 메모리 입니다. 파일 처리에도 동일하게 적용됩니다.
큰 파일을 읽으려면 한 번에 읽는 대신 비트 단위로 읽어야합니다.
간단한 수학 : 1MB 큰 파일을 한 번에 읽는 경우 데이터를 보유하려면 동시에 1MB 이상의 메모리가 필요합니다.
따라서 fopen
&를 사용하여 조금씩 읽어야합니다 fread
.
$fh = fopen($folder.'/'.$filename, "rb") or die(); $buffer = 1024*1024; while (!feof($fh)) { print(fread($fh, $buffer)); flush(); } fclose($fh);
나는 또한 같은 문제가 있었고 phpinfo.ini, php.ini 또는 .htaccess 파일을 찾아 보았습니다. 마지막으로 일부 PHP 파일을 살펴보고 열어서 메모리의 코드를 확인했습니다. 마지막 으로이 솔루션은 내가 얻은 것이며 나에게 효과적이었습니다. 워드 프레스를 사용하고 있었 으므로이 솔루션은 워드 프레스 메모리 크기 제한 문제에서만 작동 할 수 있습니다. 내 해결책 은 / public_html / wp-includes 폴더 에서 default-constants.php 파일을 엽니 다 . 코드 편집기로 해당 파일을 열고 범위 내에서 메모리 설정을 찾 거나 Ctrl + F를 눌러 "memory"라는 단어를 찾으십시오. 당신은 거기에 올 것이다 와 . 내 경우에는 64MB, 128MB, 200MB로 늘 렸습니다.wp_initial_constants
WP_MEMORY_LIMIT
WP_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');
wp-config.php
차후 WordPress 업데이트로 덮어 쓰지 않을 수 있는 한도를 매우 쉽게 추가 할 수 있습니다. 또한 '핵심'WordPress 파일이 변경되면 몇 가지 보안 플러그인 (예 : WordFence)이 불평 할 것입니다.
wp-config.php
. 그리고 (내가합니다 .e 두 줄이를 추가 define( 'WP_MEMORY_LIMIT', '200M' );
하고 define( 'WP_MAX_MEMORY_LIMIT', '256M' );
. 파일과는 달리 아래 즉, 모든 것을 '핵심'WP (에 wp-includes
WP 업그레이드 덮어 씁니다), wp-config.php
하지 않습니다 - 그것은을 위해 정확하게있다 WP 상수를 재정의하는 정확한 목적
-1
단기 실행 프로세스에 적합합니다. 예를 들어 단위 테스트 또는 작곡가 설치 등을 실행하는 데 사용되는 PHP 빌더 컨테이너입니다. 프로덕션 사이트를 그런 식으로 설정하지 마십시오.
스크립트의 모든 코드 위에 다음 줄을 실행하여 PHP 스크립트에 허용되는 메모리를 늘릴 수 있습니다.
ini_set('memory_limit','-1'); // enabled the full memory available.
또한 스크립트에서 원하지 않는 변수를 할당 해제하십시오.
이 PHP 라이브러리를 확인하십시오 : PHP로 메모리 확보
많은 답변이 스크립트를 제공하는 스크립트의 메모리 양을 늘리려 고 시도하지만 예기치 않은 양의 볼륨이나 크기로 인해 메모리에 너무 자유 롭다는 것을 의미합니다. PHP 문서는 메모리 문제가 " 잘못 작성된 스크립트 " 때문이라고 말합니다.
언급되어야한다 ini_set('memory_limit', '-1');
(제한 없음)이 같은 서버 불안정해질 수 있습니다 0 bytes free = bad things
. 대신 스크립트가 수행하려는 작업과 컴퓨터에서 사용 가능한 메모리 양에 따라 적절한 균형을 찾으십시오.
더 나은 접근법 : 스크립트 작성자 (또는 야심 찬)라면 xdebug를 사용 하여 이러한 메모리 문제를 디버깅 할 수 있습니다 . 최신 버전 (2.6.0-2018-01-29 출시)은 메모리 호출을 통해 많은 양의 메모리를 소비하는 함수 호출을 보여줍니다. 그렇지 않으면 찾기 어려운 스크립트 문제가 노출됩니다. 일반적으로 비효율은 루프에서 수신되는 볼륨을 기대하지 않지만 각 사례는 독자에게 연습으로 남습니다. :)
Xdebug는 문서는 유용하지만, 3 단계로 요약된다 :
apt-get
및 yum
등xdebug.profiler_enable = 1
,xdebug.profiler_output_dir = /where/ever/
파일을 읽으려고하면 PHP에서 메모리를 차지합니다. 예를 들어, MP3 파일을 열고 읽으려고하면 (예 : $ data = file ( " http://mydomain.com/path/sample.mp3 ") 파일 을 모두 메모리로 가져옵니다. .
Nelson이 제안한 것처럼 실제로이 메모리를 많이 사용해야하는 경우 최대 메모리 제한을 늘릴 수 있습니다.
커맨드 라인에서 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
수정하면 프로세스가 정상적으로 실행되기 시작했습니다.