これについて質問がありますが、これまでのところ私の問題を解決できませんでした。PHPスクリプトのcURLリクエストは、ブラウザ経由では動作しますが、CRONでは動作しません。
スケジュールされた電子メールを送信するという仕事をしているPHPスクリプトがあります。これは、私が制御するWebサービスをcURLを介して呼び出して行います。
ブラウザで実行すると正常に動作します。 CRON経由で実行すると、cURL応答は空です。それはWebサービスに到達することはありません。私はこれを知っています。なぜなら私はWSに連絡が取れたときにテキストファイルを書いていたからです。 CRONではなく、ブラウザ経由でアクセスする場合はそうです。
私はCRONが別の環境で動作していることは知っていますが、私は環境汚染物質に頼っていません。 $_SERVER
。 require()
へのパスは、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
チェックパスとSSL – Deep
もう少し具体的になることができますか? CRONスクリプトへのパス?私の言うように、それは実行しており、 'require()'へのパスも実行されています。 – Utkanos
あなたの(エラー)ログには何か?あなたが使った実際のcron構文は何ですか? –