2017-11-27 8 views
2

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 
+0

überprüfen Sie Pfad und SSL – Deep

+0

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

+0

alles in Ihren (Fehler) Logs? und was ist die tatsächliche Cron-Syntax, die du benutzt hast? –

Antwort

0

Am Ende dieses ein ganz besonderes entpuppte, und ich denke, ungewöhnlich, Problem. Ich bezweifle, dass es anderen zu viel hilft, aber ich lasse es hier für den Fall.

Im Wesentlichen mochte mein Server nicht selbst über eine Domäne cURL'ing.

Der Server von cURL im Cron-Skript aufgerufen wird, war der gleiche Server, der die Crontask auf lief

Das ist nicht bewiesen, hat ein Problem über einen Browser sein (aber ein anderes Konto und Website.); nur über CRON.

Das Ändern der cURL-Anforderung zur Verwendung der lokalen IP-Adresse des Servers anstelle der Verwendung der Domäne löste dies.

Verwandte Themen