Ich weiß, es gibt Fragen dazu, aber bis jetzt hat niemand mir geholfen, mein Problem zu lösen.cURL Anfrage in PHP Skript funktioniert über Browser, aber nicht CRON
Ich habe ein PHP-Skript, dessen Aufgabe es ist, geplante E-Mails zu senden. Dies geschieht durch Aufruf eines Webservice, den ich kontrolliere, über cURL.
Im Browser ausgeführt wird, funktioniert es gut. Mit CRON ausgeführt, ist die cURL-Antwort leer. Es erreicht niemals den Webservice. Ich weiß das, weil ich die WS eine Textdatei schreiben ließ, wenn sie kontaktiert wurde. Es tut, wenn Sie über den Browser zugreifen, nicht über CRON.
Ich weiß, CRON läuft in einer anderen Umgebung, und ich bin nicht auf irgendwelche Umgebungsvariablen angewiesen, z. $_SERVER
. Der Pfad zu require()
ist ebenfalls nicht das Problem, da es erfolgreich Daten aus dieser Datei erhält, um eine Verbindung mit der DB herzustellen.
This question vorgeschlagen folgende cURL entscheidet sich das Hinzufügen, die ich getan habe, aber keine Würfel:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
Hier ist mein PHP-Skript:
//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');
}
Hat jemand eine Ahnung, warum es nicht zu Verbindung zu meinem Web-Service über cURL nur wenn in CRON ausgeführt?
Hier ist der Cron-Job:
/usr/bin/php /home/desyn/public_html/cron/send_scheduled_emails.php
überprüfen Sie Pfad und SSL – Deep
Können Sie ein wenig konkreter sein? Der Pfad zum CRON-Skript? Es wird ausgeführt, wie ich sage, und der Pfad zum 'require()' wird ebenfalls ausgeführt. – Utkanos
alles in Ihren (Fehler) Logs? und was ist die tatsächliche Cron-Syntax, die du benutzt hast? –