2013-07-19 1 views
0

PHP로 Excel 파일의 내용을 기반으로 동적 cron 작업을 예약하고이 값을 스크립트에 argv으로 전달합니다.Cron Job이 PHP 스크립트에 대한 인수를 등록하지 않은 것으로 보입니다. 그러나 해당 스크립트는 예외로 구성됩니다.

$data = new SpreadSheet_Excel_Reader("sample-data.xls", false); 

$surveyToken = "Token"; 
$email = rawurlencode($data->val(2, "B")); 
$dateCompleted = rawurlencode($data->val(2, "C")); 
$followUpOne = rawurlencode($data->val(2, "E")); 
$followUpTwo = rawurlencode($data->val(2, "F")); 
$programName = rawurlencode($data->val(2, "G")); 
$subject = rawurlencode($data->val(2, "H")); 
$firstName = rawurlencode($data->val(2, "I")); 
$lastName = rawurlencode($data->val(2, "J")); 
$learningGoal = rawurlencode($data->val(2, "K")); 
$importanceScore = rawurlencode($data->val(2, "L")); 
$confidenceScore = rawurlencode($data->val(2, "M")); 
$strategies = rawurlencode($data->val(2, "N")); 
$timeLine = rawurlencode($data->val(2, "O")); 
$measures = rawurlencode($data->val(2, "P")); 
$resources = rawurlencode($data->val(2, "Q")); 

$output = shell_exec("crontab -l"); 
file_put_contents("crontab.txt", $output . "39 * * * * /usr/local/php53/bin/php mail.php $surveyToken $email $dateCompleted $followUpOne $followUpTwo $programName $subject $firstName $lastName $learningGoal $importanceScore $confidenceScore $strategies $timeLine $measures $resources" . PHP_EOL); 
exec("crontab crontab.txt"); 

나는 mail.php 스크립트에서 원시 URL 디코딩을 사용하고 argv에서 변수를 얻어서 이메일을 보내고있다 : 다음과 같이 내 코드입니다.

나는이 스크립트를 출력 된 "url"및 인수와 함께 명령 줄에서 실행하고 cron 작업을 예약하지 않음으로써이 스크립트를 테스트했습니다.

이렇게 실행하면 정상적으로 작동합니다. 위의 코드를 실행하면 cron 작업이 제대로 작동하고 php 파일이 나에게 이메일을 보내지만 모든 변수는 argv에서 비어 있습니다.

+0

실행했을 때 crontab -l 또는 -e (또는 crontab.txt보기/편집) 할 수 있으며 매개 변수에 특수 문자가 없는지 mail.php 스크립트를 깨뜨릴 수 있습니까? –

+0

$ email 매개 변수에서 얻은 이메일 주소 또는 mail.php 스크립트에 내장 된 이메일 주소는 무엇입니까? –

답변

1

명령 줄/shell_exec에 인수를 보내면 URL이 아니기 때문에 rawurlencode()을 사용하면 안됩니다.

대신 escapeshellarg()을 사용해야합니다. 이 경우 shell_exec에서 사용할 변수가 올바르게 이스케이프됩니다.

그렇기 때문에 나는 이와 같이 동적 스케줄링을 피하려고 노력할 것입니다. Excel 파일을 읽고 메일 파일을 포함하는 매시간 cron-job을 실행할 것입니다. 작업 대기열을 생성하려면 비슷한 데이터베이스를 사용할 수 있습니다.

+0

하지만 매일 파일을 읽을 필요가 없기 때문에 내 방식이 나아지지 않을 것입니다. –

+0

@ Witch-King 나는 1이라고 생각하지 않는다. 당신은 cron-job을 추가하고 제거하지 않는다. 동시에 제어 할 수없는 작업이 생길 수 있습니다. 2. cron-job이 필요한 권한을 가지고 있지 않은 사용자 (웹 사용자와 같이 php를 실행하는 사용자)로 설정되어 있으면 문제가 발생할 수 있습니다. 섬기는 사람). – jeroen

+0

@ Witch-King 그런데, 내가하고 싶은 일 (정확히 무엇을하고 있는지 보지 않고)은 스크립트가 실행될 때 데이터베이스 큐에 작업을 추가하고 cron-job을 한 시간에 한 번 실행하도록 설정합니다 (또는 하루, 뭐든간에 ...) 대기열을 처리합니다. 처리되지 않은 행이 있는지를 확인하는 것은 간단한 db-call입니다. – jeroen

0

필자에게 발생하는 한 가지는 php.ini에서 register_argc_argv를 설정했는지 또는 ini_set()을 사용하여 설정했는지 확인해야한다는 것입니다.

+0

아니요. 인수를 위반하는 것이 cron 작업이기 때문입니다. PHP 스크립트만으로도이를 수용 할 수 있습니다. –

관련 문제