2017-11-27 2 views
2

여기에 대한 질문이 있지만 지금까지 아무도 내 문제를 해결하지 못했습니다.PHP 스크립트의 cURL 요청은 브라우저를 통해 작동하지만 CRON은 작동하지 않습니다.

예약 된 전자 메일을 보내는 PHP 스크립트가 있습니다. 이 작업은 cURL을 통해 내가 제어하는 ​​웹 서비스를 호출하여 수행됩니다.

브라우저에서 실행하면 정상적으로 작동합니다. CRON을 통해 실행하면 cURL 응답이 비어 있습니다. 결코 웹 서비스에 도달하지 못합니다. 연락을 할 때 WS가 텍스트 파일을 작성했기 때문에 이것을 알았습니다. CRON이 아닌 브라우저를 통해 액세스하는 경우에 해당됩니다.

CRON은 다른 환경에서 작동하며 어떤 환경 오염에도 의존하지 않는다는 것을 알고 있습니다. $_SERVER. require() 경로는 DB에 연결하기 위해 해당 파일에서 데이터를 성공적으로 가져 오는 중 문제가되지 않습니다.

This question

내가했던 다음과 같은 컬 OPTS을 추가, 제안,하지만 주사위 :

//prep 
define('WS_URL', 'http://mywebservicedomain.com/index.php/web_service'); 
require '../application/config/database.php'; 
$db = new mysqli($db['default']['hostname'], $db['default']['username'], $db['default']['password'], $db['default']['database']) or die('failed to connect to DB'); 

//get scheduled e-mails 
$res = $db->query('SELECT * FROM _cron_emails WHERE send_when < NOW()'); 

//process each... 
while ($email_arr = $res->fetch_assoc()) { 

    //...get API connection info 
    $api_accnt = $db->query($sql = 'SELECT id, secret FROM _api_accounts WHERE project = "'.$email_arr['project'].'"'); 
    $api_accnt = $api_accnt->fetch_assoc(); 

    //...recreate $_POST env 
    $tmp = json_decode($email_arr['post_vars'], 1); 
    $_POST = array(); 
    foreach($tmp as $key => $val) $_POST[$key] = !is_array($val) ? $val : implode(',', $val); 

    //...call API to send e-mail 
    $ch = curl_init($url = WS_URL.'/send_scheduled_email/'.$email_arr['email_id'].'/'.$email_arr['store_id'].'/'.$email_arr['item_id']); 
    curl_setopt_array($ch, array(
     CURLOPT_RETURNTRANSFER => true, 
     CURLOPT_POST => true, 
     CURLOPT_SAFE_UPLOAD => true, 
     CURLOPT_SSL_VERIFYHOST => 1, //<-- tried adding this 
     CURLOPT_SSL_VERIFYPEER => 1, //<-- ditto 
     CURLOPT_POSTFIELDS => array_merge($_POST, array(
      'api_key' => $api_accnt['id'], 
      'api_secret' => $api_accnt['secret'], 
     )) 
    )); 
    $resp = curl_exec($ch); //<-- empty when CRON 

    //if e-mail was sent OK, or decider script said it was ineligible, delete it from the queue 
    if (($resp == 'ok' || $resp == 'ineligible')) 
     $db->query('DELETE FROM _cron_emails WHERE id = '.$email_arr['id'].' LIMIT 1'); 

} 

사람이 어떤 생각을 가지고 있는가가에 실패하는 이유 :

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 

여기 내 PHP 스크립트 없습니다 CRON에서 실행될 때만 cURL을 통해 내 웹 서비스에 연결합니까?

다음은 CRON 작업입니다 : 이것은 매우 특별한 밝혀졌다 결국

/usr/bin/php /home/desyn/public_html/cron/send_scheduled_emails.php 
+0

경로 및 SSL 확인 – Deep

+0

좀 더 구체적으로 기재 할 수 있습니까? CRON 스크립트 경로? 내가 말하는 것처럼 실행 중이고'require()'에 대한 경로도 실행 중입니다. – Utkanos

+0

(오류) 로그에있는 내용이 있습니까? 그리고 실제로 사용 된 cron 구문은 무엇입니까? –

답변

0

, 나는, 문제가 흔히 상상한다. 다른 사람들에게 너무 많은 도움이 될지는 의심 스럽지만 여기에 남겨 두겠습니다.

기본적으로 내 서버는 도메인을 통해 자체적으로 cURL을하는 것을 좋아하지 않았습니다. 서버가 CRON 스크립트에서 컬에 의해 호출되는

은 CRON 작업이 실행 된 동일한 서버이었다 이것은 브라우저를 통해 문제가 입증되지 않은

(그러나 다른 계정 및 웹 사이트.) CRON을 통해서만.

도메인을 사용하는 대신 서버의 로컬 IP를 사용하도록 cURL 요청을 변경하면이 문제가 해결됩니다.

관련 문제