2017-11-24 2 views
1

나는 5000 명의 사용자 데이터베이스를 보유하고 있습니다. 이미 일주일에 한 번씩 cron 작업이 실행 중입니다. 처음에는 사용자가 100 명 중 하나 였을 때 정상적으로 작동했습니다. 이제 사용자가 5000 명에 도달하면 Cron 작업이 500-600 명 정도의 사용자에게 실행되어 중단됩니다. 나는 그것을 연구하여 HTTP가 무국적 프로토콜을 따르므로 새로운 요청이있을 때마다 cron 작업이 중단된다는 결론을 얻었습니다. 이제 내 질문은 어떻게 모든 5000 사용자에 대한 Cron 작업을 중단없이 실행할 수 있습니다. 도와주세요.대량으로 5000 명의 사용자를 대상으로 cron 작업을 계속 실행하는 방법

+0

먼저 0 ~ 100 .. 1백-2백초 및 대한 실행처럼 .. 배치를 작성 등등 .. 내가 N 크론없이이 .. – Confused

+0

다음이 될 것입니다, @Springie 나는 이것을 시도 할 것이다. –

답변

1

시간과 메모리 제한을 초과 할 수 있으므로 PHP 오류 로그를 먼저 확인합니다. 데이터베이스 쿼리를 수행하는 중이라면 로그를 검사하여 한계에 도달했는지 확인합니다.

PHP 메모리 제한 메모리 제한은 현재 메모리가 부족하면 스크립트가 이상 실행할 수 증가

을 높입니다.

옵션 1

업데이트 php.ini 파일. 요구 사항에 맞게 256을 변경하십시오.

php_value memory_limit 256MB 

옵션 2

요구 사항에 맞게 다시, 메모리 제한을 늘리 256을 변경 ini_set('memory_limit', nM)를 추가

ini_set('memory_limit','256M'); 

PHP 실행 제한 증가

현재 실행 제한 시간을 증가하여 PHP 파일에 set_time_limit(n)을 추가 (요구 사항에 맞게 300 변경) :

ini_set('max_execution_time', 300); //300 seconds = 5 minutes 

분할 위로 데이터베이스 결과 (일괄)

당신이를 반환하는 쿼리를 수행하는 경우 행 수가 많으면 시간이 초과 될 수 있습니다. 한계 및 오프셋을 사용하여 큰 쿼리를 더 작은 청크로 분할하는 다음 예제 로직을 구현해 볼 수 있습니다.

// Get total rows count 
$total_rows = SELECT count(id) FROM users; 

// Set a block size 
$block_size = 300; 

// Init starting offset 
$block_offset = 0; 

for($block = $block_offset; $block < $total_rows; $block = $block + $block_size) { 

    // Query 
    $data = SELECT * FROM table LIMIT $block_size OFFSET $block_offset; 

    // Loop through each row and process here 
    foreach($data as $row) { 
    .. code here 

    // You can also echo out something here so script is returning some data. Sometimes if nothing is sent back for a while it can cause issues (not generally for a cron though) e.g. 
    echo 'Done block ' . $block; 
    } 

    // Update block offset, so offset increments by block size (300) 
    $block_offset = $block_offset + $block_size ; 

} 
+0

감사를 @Confused 만든에 필요한 것처럼 –

+0

작동하는지 그리고 대답으로 받아들이는지 알려주십시오 – Springie

+0

예. 확실합니다. 다음에 확실히 업데이트 할 것입니다. –

관련 문제