Umsetzung PHP mit CURL > PHP ohne CURL - benötige Hilfe

Mofu

Grünschnabel
Hallo,

ich stehe derzeit leider vor dem Problem, eine PHP-API-Ansprache, diese nutzt CURL entsprechend in PHP ohne CURL umzusetzten.
Bei der API handelt es sich um ein Robot-System mit entsprechender Rückgabe, die Auswertung der Rückgabe ist aber nicht Bestandteil dieser Frage, da ich diese Verarbeitung zu einem späterem Zeitpunkt benötige und hierfür eine bereits funktionierende Lösung über regexp erstellt habe.
Die Robotansprache erfolgt über POST.
Folgend der Code mit CURL:
PHP:
include "abc.php";
$adns = new zzz( "http://zieladresse" );
$user = "abc";
$pass = "cba";
$context = "context";

$request = array(
	"auth" => array(
		"user" => $user,
		"password" => $pass,
		"context" => $context
	),
	"task" => array(
		"demo" => "1",
		"code" => "0101"
	)
);
$result = $adns->request( $request );
print_r( $result );

Die abc.php:
PHP:
set_time_limit( 0 );
class zzz {
	var $host;
	var $port;
	var $request;
	var $reply;
	var $status;
	var $error;
	
	function zzz( $host, $port=4569 ) {
		$this->host = $host;
		$this->port = $port;
	}
	function setError( $error, $value ) {
		$this->error = $error.$value;
	}
	function request( $data ) {
		global $user_data;	
		$data[auth][user]     = ( $data[auth][user] ? $data[auth][user] : $user_data[user][user] );
		$data[auth][password] = ( $data[auth][password] ? $data[auth][password] : $user_data[password] );
		$data[auth][context]  = ( $data[auth][context] ? $data[auth][context] : $user_data[user][context] );
		return unserialize( $this->requestCurl( serialize($data) ) );
		$this->request = $data;
		$this->_get_messages( $this->reply[result][msg] );
		if( !$this->_check_status( $this->reply[result][status] )) {
			return FALSE;
		}
		return $this->reply[data];
	}
	function requestCurl( $data_str ) {
		if( !$ch = curl_init( $this->host )) {
			$this->setError( "Connection Error.", "Es konnte keine Verbindung hergestellt werden" );
			return FALSE;
		}
		curl_setopt( $ch, CURLOPT_POST, 1 );
		curl_setopt( $ch, CURLOPT_POSTFIELDS, $data_str );
		curl_setopt( $ch, CURLOPT_HEADER, 0 );
		curl_setopt( $ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0" );
		curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );
		curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
		
		if( !$data = curl_exec( $ch )) {
			$this->setError( "Curl execusion error.", curl_error( $ch ));
			return FALSE;
		}
		curl_close( $ch );
		return $data;
	}
}

function getmicrotime() {
    list($usec, $sec) = explode(" ",microtime()); 
    return ((float)$usec + (float)$sec); 
}

Mein Versuch die Umsetzung zu realisieren mit dem Code:
PHP:
function PostIt($host, $path, $referer, $data_to_send) {
  $fp = fsockopen($host, 80);
  fputs($fp, "POST $path HTTP/1.1\r\n");
  fputs($fp, "Host: $host\r\n");
  fputs($fp, "Referer: $referer\r\n");
  fputs($fp, "Content-type: text\r\n");
  fputs($fp, "Content-length: ". strlen($data_to_send) ."\r\n");
  fputs($fp, "Connection: close\r\n\r\n");
  fputs($fp, $data_to_send);
  printf("Sent!\n");
  while(!feof($fp)) {
      $res .= fgets($fp, 128);
  }
  fclose($fp);
  return $res;
}
$data = array(
	"auth" => array(
		"user" => $user;
		"password" => $pass,
		"context" => $context
	),
	"task" => array(
		"demo" => "1",
		"code" => "0101"
	)
);
$x = PostIt(
              "www.zieladresse.de",
              "/zielscript.pl",
              "PHP-Script",
              $data
);
schlug fehl, da offensichtlich nicht die Array korrekt gepostet werden, wobei ich zugestehen muß, das ich diese Umsetzung aufgrund eines mir vorliegenden PEARL-Scriptes gemacht habe (PEARL kann ich aber auch nicht verwenden, sonst würde ich das machen...).

Ich hoffe das mir jemand hierbei helfen kann.

Gruss
Mofu
 
Zuletzt bearbeitet:
Schau dir mal Dennis Wronkas HTTPConnection-Klasse an.
Die nimmt dir sehr viel Arbeit ab und lässt sich leicht bedienen!

Hallo daddz,

zuerst vielen Dank für deine Antwort. Vom Prinzip her sicherlich (haben Klassen ja so ansich :-) ) ist aber für mein Problem nicht anwendbar, da es mir ja hierbei nicht um die Methode des Postaufrufs geht (diese ist ja gelösst) sondern vielmehr um den Sendeinhalt.
Auch die Auswertung der Antwort ist bereits von mir erstellt.
Ich muß irgendwo "den Wald vor lauter Bäumen" nicht sehen, da die Antwort des Servers defenitiv aussagt, das die übermittelten Daten nicht oder nicht korrekt ankommen, so das er diese nicht verarbeiten kann.

Gruss
Mofu
 
Sammel die Anfrage mal erst in einer Variable und lass dir dessen Wert ausgeben. So kannst du manuell prüfen, ob sie so ist wie du sie haben möchtest.
In deinem Fall müsstest du nämlich das Datenarray ausbreiten und die Elementwerte weiterverarbeiten, da die einfache Ausgabe eines Arrays nur „Array“ ist:
PHP:
echo array();
 
Zurück