PHP-Feuer-und-Vergessen-POST-Request
Ich versuche zu schaffen, ein Feuer-und-vergessen-Methode in PHP, so dass ich kann POST
Daten auf einem Webserver und nicht auf eine Antwort warten. Ich habe gelesen, dass dies könnte erreicht werden, indem CURL
wie im folgenden code:
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
curl_exec($ch);
curl_close($ch);
Aber ich glaube nicht, dass es so funktioniert wie ich erwarte. Zum Beispiel, wenn die URL schicke ich die Anfrage hat einen Fehler, es bewirkt, dass mein script einen Fehler auslösen, wie gut. Wenn es war Feuer und vergessen, dass ich erwarten würde dass nicht passieren.
Kann mir jemand sagen ob ich was falsch mache oder eine alternative Vorschlag. Ich bin mit Windows lokal und Linux für Entwicklungs -, staging-und Produktion-Umgebungen.
UPDATE
Habe ich eine alternative gefunden Lösung hier: http://blog.markturansky.com/archives/205
Habe ich gereinigt wurde, in den folgenden code:
function curl_post_async($url, $params = array())
{
//create POST string
$post_params = array();
foreach ($params as $key => &$val)
{
$post_params[] = $key . '=' . urlencode($val);
}
$post_string = implode('&', $post_params);
//get URL segments
$parts = parse_url($url);
//workout port and open socket
$port = isset($parts['port']) ? $parts['port'] : 80;
$fp = fsockopen($parts['host'], $port, $errno, $errstr, 30);
//create output string
$output = "POST " . $parts['path'] . " HTTP/1.1\r\n";
$output .= "Host: " . $parts['host'] . "\r\n";
$output .= "Content-Type: application/x-www-form-urlencoded\r\n";
$output .= "Content-Length: " . strlen($post_string) . "\r\n";
$output .= "Connection: Close\r\n\r\n";
$output .= isset($post_string) ? $post_string : '';
//send output to $url handle
fwrite($fp, $output);
fclose($fp);
}
Dieser scheint besser zu funktionieren für mich.
Ist es eine gültige Lösung?
- Was Sie hier tun, ist nur das senden der Anfrage und dem schließen der Verbindung. Also es ist nicht so async wie würden Sie denken, es ist. Sie könnten Gabel Prozess, oder öffnen eine neue. PHP ist nicht Multitasking fähig.
- Sind Sie über einen Web-oder CLI ?
- Dies ist mit einem webserver.
- Bewirten Sie selbst, und Sie haben Zugriff auf die system () - Befehl?
- Wir sind selbst gehostet, Amazon Web Services, so dass wir Steuern alle Maschinen-Instanzen etc. und kann setup die Server auf unsere Bedürfnisse. Wenn ich keinen Zugang zu
system()
ich verlangen kann es aktiviert werden. - Die "POST erstellen "string" - Teil kann einfach ersetzt werden mit: $post_string = http_build_query($params);
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, mit Hilfe von sockets ist der Weg zu gehen wenn Sie don ' T care über die Antwort von der URL, die Sie aufrufen. Dies ist, weil die socket-Verbindung beendet werden kann, gerade nach dem Absenden der Anfrage ohne zu warten, und das ist genau das, was Sie nach - Feuer-und-Vergessen.
Zwei Hinweise:
Lohnt es sich zu überprüfen, ob die Steckdose kann es schon geöffnet worden, um zu verhindern, dass das Skript später beschweren, wenn wenn nicht:
Lohnt es sich, die Verknüpfung zu der original-Quelle der fsocket () - Skript, das Sie jetzt verwenden:
http://w-shadow.com/blog/2007/10/16/how-to-run-a-php-script-in-the-background/
stream_set_blocking($fp, 0);
vorfwrite($fp, $data);
wäre dies nicht notwendig, hier auch?Hier ist eine gereinigte version von diggersworld code verarbeitet auch andere HTTP-Methoden, die dann nach und wirft sinnvolle Ausnahmen, wenn die Funktion fehlschlägt.