이 기사의 예에서는 PHP가 대량의 MySQL 데이터를 쿼리할 때 발생하는 메모리 부족 문제에 대한 솔루션을 분석합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.
1. 질문
PHP를 사용하여 대량의 MySQL 데이터를 쿼리할 때 프로그램이 아직 실행되지 않고 경고 팝업이 나타납니다.
치명적인 오류: 허용된 메모리 크기 100663296바이트가 소진되었습니다(103바이트 할당 시도)
오류 메시지: PHP가 할당한 100M 메모리가 이미 사용되었습니다.
2. 해결책:
가장 간단한 해결책은 실행 파일의 헤드에
을 추가하는 것입니다.ini_set('memory_limit','256M');
PHP에서 사용하는 메모리 공간을 늘리려면 메모리를 256M 이상으로 늘리세요
하지만 다음에 더 많은 데이터를 읽으려면 어떻게 해야 할까요? 계속해서 데이터를 늘릴 수 없어서 PHP가 서버의 메모리를 잡아먹게 됩니다.
다음은 함수입니다:
php에서 사용하는 메모리 양을 가져오려면 memory_get_usage() 메서드를 사용하세요. 읽은 데이터 항목의 수가 증가함에 따라 PHP에서 사용하는 메모리도 단계적으로 증가하는 것으로 나타났습니다.
PHP가 mysql을 쿼리할 때의 데이터가 메모리에 저장되어 있나요? 몇 번 검색해본 결과 이것이 실제로 의미하는 바임을 알았습니다.
mysql의 C API 함수에는 mysql_use_result() 및 mysql_store_result()가 포함됩니다
mysql_store_result()는 mysqlServer에서 클라이언트로 결과 세트를 읽는 반면, mysql_use_result()는 결과 세트의 메타 정보만 읽습니다.
1. PHP의 mysql_query는 mysql_store_result()를 호출하여 자동으로 결과 세트를 얻고 캐시합니다
2. PHP의 또 다른 함수인 mysql_unbuffered_query()는 mysql_use_result()를 호출합니다. 한편, 이는 대규모 결과 세트를 처리할 때 상당한 메모리를 절약합니다. 반면, 전체 SQL 문이 실행될 때까지 기다리지 않고 첫 번째 행을 가져온 직후 결과 집합을 작업할 수 있습니다.
그래서 많은 양의 데이터를 읽을 때는 mysql_query() 대신 mysql_unbuffered_query()를 사용할 수 있습니다. 테스트해본 결과 정말 그렇습니다. 그리고 모든 데이터를 가져온 후에도 메모리가 1MB 이내로 유지되고 늘어나지 않았습니다.
mysql_unbuffered_query()는 SQL 쿼리를 MySQL로 보내지만, mysql_query()처럼 결과 집합을 자동으로 가져오고 캐시하지는 않습니다. 한편으로 이는 매우 큰 결과 세트를 처리할 때 상당한 메모리를 절약합니다. 반면, 전체 SQL 문이 실행될 때까지 기다리지 않고 첫 번째 행을 가져온 직후 결과 집합을 작업할 수 있습니다. 여러 데이터베이스 연결을 사용하는 경우 선택적 매개변수 link_identifier를 지정해야 합니다.
mysql_unbuffered_query()의 이점에는 비용이 듭니다. mysql_num_rows() 및 mysql_data_seek()는 mysql_unbuffered_query()가 반환한 결과 집합 위에 사용할 수 없습니다. 또한, 새로운 SQL 쿼리를 MySQL에 보내기 전에 캐시되지 않은 SQL 쿼리에 의해 생성된 모든 결과 행을 가져와야 합니다.
따라서 비즈니스 요구에 따라 적절하게 기능을 선택해야 합니다
이 기사가 모든 사람의 PHP 프로그래밍 설계에 도움이 되기를 바랍니다.