CRON에서 PHP 실행 안됨

프리터코더·2025년 5월 26일
0

php 문제 해결

목록 보기
31/79

CRON 작업에서 PHP 스크립트가 실행되지 않는 문제는 경로, 권한, 환경변수 등 다양한 원인이 있습니다. 주요 해결책을 알아보겠습니다.

1. PHP 실행 경로 명시하기

문제: CRON에서 PHP 실행 파일을 찾지 못함

which php
# crontab -e
# 잘못된 방법
0 */6 * * * php /var/www/html/cron/backup.php

# 올바른 방법 - 절대 경로 사용
0 */6 * * * /usr/bin/php /var/www/html/cron/backup.php
#!/usr/bin/php
<?php
// 스크립트 시작 로그
error_log("CRON 백업 스크립트 시작: " . date('Y-m-d H:i:s'));

// 백업 로직
$backup_file = '/backup/db_' . date('Y-m-d_H-i-s') . '.sql';
$command = "mysqldump -u username -p'password' database_name > $backup_file";
exec($command, $output, $return_code);

if ($return_code === 0) {
    error_log("백업 완료: $backup_file");
} else {
    error_log("백업 실패: " . implode("\n", $output));
}
?>

2. 작업 디렉토리와 환경변수 설정

문제: 상대 경로나 환경변수 문제로 스크립트 실행 실패

# crontab -e
# 환경변수와 작업 디렉토리 설정
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
SHELL=/bin/bash

# 작업 디렉토리 변경 후 실행
0 2 * * * cd /var/www/html && /usr/bin/php cron/daily_report.php
<?php
// 작업 디렉토리 확인 및 설정
$script_dir = dirname(__FILE__);
$project_root = dirname($script_dir);
chdir($project_root);

// 설정 파일 로드
require_once 'config/database.php';
require_once 'includes/functions.php';

// 로그 파일 경로 설정
$log_file = $project_root . '/logs/cron.log';
file_put_contents($log_file, date('Y-m-d H:i:s') . " - 일일 리포트 시작\n", FILE_APPEND);

// 리포트 생성 로직
generateDailyReport();

file_put_contents($log_file, date('Y-m-d H:i:s') . " - 일일 리포트 완료\n", FILE_APPEND);
?>

3. 권한 및 실행 가능 설정

문제: 스크립트 파일에 실행 권한이 없음

chmod +x /var/www/html/cron/cleanup.php
chown www-data:www-data /var/www/html/cron/cleanup.php
#!/usr/bin/php
<?php
// 임시 파일 정리 스크립트
$temp_dir = '/tmp/app_temp';
$log_dir = '/var/www/html/logs';

// 7일 이상 된 임시 파일 삭제
$files = glob($temp_dir . '/*');
foreach ($files as $file) {
    if (is_file($file) && time() - filemtime($file) > 7 * 24 * 3600) {
        unlink($file);
        error_log("삭제된 파일: $file");
    }
}

// 30일 이상 된 로그 파일 압축
$log_files = glob($log_dir . '/*.log');
foreach ($log_files as $log_file) {
    if (time() - filemtime($log_file) > 30 * 24 * 3600) {
        $gz_file = $log_file . '.gz';
        $command = "gzip -c $log_file > $gz_file && rm $log_file";
        exec($command);
    }
}
?>

4. 출력 및 오류 로깅 설정

문제: CRON 실행 결과나 오류를 확인할 수 없음

# crontab -e
# 출력과 오류를 모두 로그 파일로 저장
0 1 * * * /usr/bin/php /var/www/html/cron/email_sender.php >> /var/log/cron_email.log 2>&1

# 오류만 별도 로그로 저장
30 3 * * * /usr/bin/php /var/www/html/cron/data_sync.php > /dev/null 2>> /var/log/cron_error.log
<?php
// 오류 보고 설정
error_reporting(E_ALL);
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', '/var/log/php_cron_errors.log');

try {
    echo date('Y-m-d H:i:s') . " - 이메일 발송 시작\n";
    
    // 이메일 발송 로직
    $pending_emails = getPendingEmails();
    
    foreach ($pending_emails as $email) {
        if (sendEmail($email)) {
            echo "이메일 발송 성공: {$email['to']}\n";
            markEmailAsSent($email['id']);
        } else {
            echo "이메일 발송 실패: {$email['to']}\n";
        }
    }
    
    echo date('Y-m-d H:i:s') . " - 이메일 발송 완료\n";
    
} catch (Exception $e) {
    echo "오류 발생: " . $e->getMessage() . "\n";
    error_log("CRON 이메일 발송 오류: " . $e->getMessage());
}
?>

5. CRON 작업 테스트 및 디버깅

문제: CRON 작업이 제대로 동작하는지 확인하기 어려움

#!/usr/bin/php
<?php
// CRON 테스트 스크립트
$test_file = '/tmp/cron_test_' . date('Y-m-d_H-i-s') . '.txt';

$info = [
    'timestamp' => date('Y-m-d H:i:s'),
    'user' => get_current_user(),
    'working_directory' => getcwd(),
    'php_version' => PHP_VERSION,
    'memory_limit' => ini_get('memory_limit'),
    'include_path' => get_include_path(),
    'environment' => $_ENV
];

file_put_contents($test_file, print_r($info, true));

// 이메일로 결과 전송 (선택사항)
if (function_exists('mail')) {
    mail('admin@example.com', 'CRON 테스트 결과', "테스트 파일: $test_file");
}

echo "테스트 완료: $test_file\n";
?>
# 수동으로 CRON 스크립트 테스트
/usr/bin/php /var/www/html/cron/test_cron.php
# CRON 로그 확인
tail -f /var/log/cron.log

주의사항

  • 절대 경로: PHP 실행 파일과 스크립트 파일 모두 절대 경로 사용
  • 권한 설정: 스크립트 파일에 실행 권한 부여
  • 환경변수: 웹 환경과 다른 CRON 환경 고려
  • 로깅: 실행 결과와 오류를 반드시 로그로 남기기
  • 테스트: 수동 실행으로 먼저 테스트 후 CRON 등록
profile
일용직 개발자. freetercoder@gmail.com

0개의 댓글