2017-11-27 4 views
2

これについて質問がありますが、これまでのところ私の問題を解決できませんでした。PHPスクリプトのcURLリクエストは、ブラウザ経由では動作しますが、CRONでは動作しません。

スケジュールされた電子メールを送信するという仕事をしているPHPスクリプトがあります。これは、私が制御するWebサービスをcURLを介して呼び出して行います。

ブラウザで実行すると正常に動作します。 CRON経由で実行すると、cURL応答は空です。それはWebサービスに到達することはありません。私はこれを知っています。なぜなら私はWSに連絡が取れたときにテキストファイルを書いていたからです。 CRONではなく、ブラウザ経由でアクセスする場合はそうです。

私はCRONが別の環境で動作していることは知っていますが、私は環境汚染物質に頼っていません。 $_SERVERrequire()へのパスは、DBに接続するためにそのファイルからデータを正常に取得しているため、問題ではありません。

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

ここに私のPHPスクリプトはいない:それが失敗した理由を

//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'); 

} 

誰もが任意のアイデアを持っています

This questionは、私がやったが、ないサイコロれ、次のcURLを付き合え追加提案しましたCRONで実行されている場合のみ、cURLを使用してWebサービスに接続しますか?ここで

は、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要求を変更すると、これが解決されました。

関連する問題