Mehrere XML-Requests gleichzeitig

Sasser

Erfahrenes Mitglied
Guten Abend!

Ich mache derzeit in einer Schleife mehrere XML-Requests und übertrage diese per CURL. Leider schafft man es nicht, in einer Sekunde z.B. 2 solcher abzuarbeiten. Kann man die folgende Schleife optimieren, sodass mehrere Requests mit einer CURL-Connection möglich sind?

PHP:
class apicall {
	private $EBAY_devID;
	private $EBAY_appID;
	private $EBAY_certID;
	private $EBAY_server;
	
    public function __construct($EBAY_devID, $EBAY_appID, $EBAY_certID, $EBAY_server, $EBAY_call) {
		$this->EBAY_devID = $EBAY_devID;
		$this->EBAY_appID = $EBAY_appID;
		$this->EBAY_certID = $EBAY_certID;
        $this->EBAY_server = $EBAY_server;
		$this->EBAY_call = $EBAY_call;
	}
	
	public function sendHttpRequest($requestBody) {
		$connection = curl_init ();
		curl_setopt ( $connection, CURLOPT_URL, $this->EBAY_server );
		curl_setopt ( $connection, CURLOPT_SSL_VERIFYPEER, "0" );
		curl_setopt ( $connection, CURLOPT_SSL_VERIFYHOST, "0" );
		curl_setopt ( $connection, CURLOPT_HTTPHEADER, array ( "X-EBAY-API-COMPATIBILITY-LEVEL: 543", "X-EBAY-API-DEV-NAME: " . $this->EBAY_devID, "X-EBAY-API-APP-NAME: " . $this->EBAY_appID, "X-EBAY-API-CERT-NAME: " . $this->EBAY_certID, "X-EBAY-API-CALL-NAME: " . $this->EBAY_call, "X-EBAY-API-SITEID: 77" ) );
		curl_setopt ( $connection, CURLOPT_POST, "1" );
		curl_setopt ( $connection, CURLOPT_POSTFIELDS, $requestBody );
		curl_setopt ( $connection, CURLOPT_RETURNTRANSFER, "1" );
		$response = curl_exec ( $connection );
		curl_close ( $connection );
		return $response;
	}
}
$apicall = new apicall ( $EBAY_devID, $EBAY_appID, $EBAY_certID, $EBAY_server, "PlaceOffer" );
foreach ($autobid [$time] as $key => $value) {
			$requestXmlBody = '<?xml version="1.0" encoding="utf-8" ?>';
			$requestXmlBody .= '<PlaceOfferRequest xmlns="urn:ebay:apis:eBLBaseComponents">';
			$requestXmlBody .= "<RequesterCredentials>";
			$requestXmlBody .= "<eBayAuthToken>" . $autobid [$time][$key]["authcode"] . "</eBayAuthToken>";
			$requestXmlBody .= "</RequesterCredentials>";
			$requestXmlBody .= "<EndUserIP>" . $autobid [$time][$key]["ip"] . "</EndUserIP>";
			$requestXmlBody .= "<BlockOnWarning>true</BlockOnWarning>";
			$requestXmlBody .= "<AffiliateTrackingDetails>";
			$requestXmlBody .= "<AffiliateUserID>" . $EBAY_id . "</AffiliateUserID>";       
			$requestXmlBody .= "<ApplicationDeviceType>Browser</ApplicationDeviceType>";
			$requestXmlBody .= "<TrackingID></TrackingID>";                 
			$requestXmlBody .= "<TrackingPartnerCode></TrackingPartnerCode>";   
			$requestXmlBody .= "</AffiliateTrackingDetails>";
			$requestXmlBody .= "<ItemID>" . $autobid [$time][$key]["itemID"] . "</ItemID>";
			$requestXmlBody .= "<Offer>";
			$requestXmlBody .= "<Action>Bid</Action>";
			$requestXmlBody .= "<MaxBid>" . $autobid [$time][$key]["maxbid"] . "</MaxBid>";
			$requestXmlBody .= "<Quantity>1</Quantity>";
			$requestXmlBody .= "<UserConsent>true</UserConsent>";
			$requestXmlBody .= "</Offer>";
			$requestXmlBody .= "</PlaceOfferRequest>";
			$apicall->sendHttpRequest ( $requestXmlBody );
		}
 
Sieht im ersten Moment recht unspektakulär aus. Wahrscheinlich ist es dein curl-Request, der so lange dauert. Man könnte das aber beispielsweise mit einer Job-Queue parallelisieren..
 
Also mein Problem liegt jetzt nicht unbedingt an dem Request, der kann ruhig eine halbe bis dreiviertel Sekunde dauern, nur wollte ich dabei mehrere Calls mit einem Aufruf realisieren, da es ab und zu passiert dass mehrere zur gleichen Zeit übertragen werden sollen, jedoch immer an die gleiche Adresse.

Mein folgender Test funktioniert leider überhaupt nicht, obwohl in der Manuel steht, dass CURLOPT_POSTFIELDS auch ein Array schluckt:

PHP:
$apicall = new apicall ( $EBAY_devID, $EBAY_appID, $EBAY_certID, $EBAY_server, "PlaceOffer" );
$requestXmlBody = array ();
		foreach ($autobid [$time] as $key => $value) {
			$xml = '<?xml version="1.0" encoding="utf-8" ?>';
			$xml .= '<PlaceOfferRequest xmlns="urn:ebay:apis:eBLBaseComponents">';
			$xml .= "<RequesterCredentials>";
			$xml .= "<eBayAuthToken>" . $autobid [$time][$key]["authcode"] . "</eBayAuthToken>";
			$xml .= "</RequesterCredentials>";
			$xml .= "<EndUserIP>" . $autobid [$time][$key]["ip"] . "</EndUserIP>";
			$xml .= "<BlockOnWarning>true</BlockOnWarning>";
			$xml .= "<AffiliateTrackingDetails>";
			$xml .= "<AffiliateUserID>" . $EBAY_id . "</AffiliateUserID>";       
			$xml .= "<ApplicationDeviceType>Browser</ApplicationDeviceType>";
			$xml .= "<TrackingID></TrackingID>";                 
			$xml .= "<TrackingPartnerCode></TrackingPartnerCode>";   
			$xml .= "</AffiliateTrackingDetails>";
			$xml .= "<ItemID>" . $autobid [$time][$key]["itemID"] . "</ItemID>";
			$xml .= "<Offer>";
			$xml .= "<Action>Bid</Action>";
			$xml .= "<MaxBid>" . $autobid [$time][$key]["maxbid"] . "</MaxBid>";
			$xml .= "<Quantity>1</Quantity>";
			$xml .= "<UserConsent>true</UserConsent>";
			$xml .= "</Offer>";
			$xml .= "</PlaceOfferRequest>";
			array_push ( $requestXmlBody, $xml );
		}
		if (count ( $requestXmlBody ) > "0") {
			$apicall->sendHttpRequest ( $requestXmlBody );
		}

class apicall {
    private $EBAY_devID;
    private $EBAY_appID;
    private $EBAY_certID;
    private $EBAY_server;
    
    public function __construct($EBAY_devID, $EBAY_appID, $EBAY_certID, $EBAY_server, $EBAY_call) {
        $this->EBAY_devID = $EBAY_devID;
        $this->EBAY_appID = $EBAY_appID;
        $this->EBAY_certID = $EBAY_certID;
        $this->EBAY_server = $EBAY_server;
        $this->EBAY_call = $EBAY_call;
    }
    
    public function sendHttpRequest($requestBody) {
        $connection = curl_init ();
        curl_setopt ( $connection, CURLOPT_URL, $this->EBAY_server );
        curl_setopt ( $connection, CURLOPT_SSL_VERIFYPEER, "0" );
        curl_setopt ( $connection, CURLOPT_SSL_VERIFYHOST, "0" );
        curl_setopt ( $connection, CURLOPT_HTTPHEADER, array ( "X-EBAY-API-COMPATIBILITY-LEVEL: 543", "X-EBAY-API-DEV-NAME: " . $this->EBAY_devID, "X-EBAY-API-APP-NAME: " . $this->EBAY_appID, "X-EBAY-API-CERT-NAME: " . $this->EBAY_certID, "X-EBAY-API-CALL-NAME: " . $this->EBAY_call, "X-EBAY-API-SITEID: 77" ) );
        curl_setopt ( $connection, CURLOPT_POST, "1" );
        curl_setopt ( $connection, CURLOPT_POSTFIELDS, $requestBody );
        curl_setopt ( $connection, CURLOPT_RETURNTRANSFER, "1" );
        $response = curl_exec ( $connection );
        curl_close ( $connection );
        return $response;
    }
}
 
Zuletzt bearbeitet:
Zurück