Ho trascorso innumerevoli ore a trattare con SOAP in PHP. Ora posso affermare di conoscerlo a fondo. :)
Prima domanda: SoapClient e cURL sono intesi per diverso scopo. SoapClient è interamente basato su SOAP, mentre cURL riguarda il trasporto HTTP. Il protocollo di accesso SOAP è un livello superiore rispetto al protocollo di trasporto. SOAP può essere trasmesso da qualsiasi trasporto tu scelga: spesso il documento SOAP (che è semplicemente un documento XML) viene inviato via SMTP (cioè via email) per attraversare i firewall restrittivi. cURL è solo uno strumento per accedere ad alcuni server web da qualche parte.
Seconda domanda: il tempo trascorso in Speedwise per l'esecuzione locale sarà minimo in cURL. Ma questo sarà neutralizzato dalla bassa qualità di tale codice che non seguirà lo standard SOAP ed è destinato a fallire in un modo o nell'altro (e potrebbe anche non farvi sapere). Generalmente in esecuzione la maggior parte del tempo sarà spesa per il trasporto (ad es. Su un server web lento/occupato di rete), quindi non importa molto in che modo si utilizzerà.
Ora vediamo sotto il cofano: l'estensione Soap in PHP è piuttosto incompleta. La ricerca rapida della parola "falso" produce 33 posizioni diverse nel codice. Molti di loro sono php_encoding.c.Sfortunatamente PHP SOAP in alcuni casi non è in grado di produrre SOAP corretto o incapace di capire il SOAP corretto - l'interoperabilità è un problema. La maggior parte dei problemi riguarda PHP e .NET SOAP, ma suppongo che se cercherete di accedere a .NET SOAP con cURL avrete bisogno di un po 'più di poche righe di codice per farlo funzionare. Fortunatamente il SOAP è abbastanza buono in PHP SOAP e funziona con altre implementazioni SOAP. Se vuoi usare SoapHeaders o MustUnderstand essere pronti ad avere un po 'di un incubo. SoapHeaders è relativamente facile da fare con cURL. mustUnderstand sarà piuttosto difficile da fare in cURL.
Il principale vantaggio dell'utilizzo di SoapClient è WSDL (linguaggio di descrizione dei servizi Web). Fondamentalmente si può fare:
$client = new SoapClient("http://webserver.com/service.wsdl");
$client->executeRemoteFunction($paramters);
con l'arricciatura si sarà in grado di farlo perché non ha WSDL parser. Se la fine remota cambierà le sue specifiche l'implementazione di cURL fallirà miseramente e non te lo farà sapere. A questo punto puoi dire: ma se il web server remoto farà cadere silenziosamente executeRemoteFunction() allora non lo saprei neanche! Non è questo il caso: SoapClient con throw Eccezione SoapFault e devi prenderlo e gestirlo oppure il tuo script si fermerà con un messaggio di eccezione non gestito. In ogni caso, lo saprai.
Tuttavia non aspettatevi PHP SOAP per fare alcune cose buone come il controllo dei tipi. Anche se WSDL remoto richiederebbe xs: il PHP SOAP intero lo ignorerebbe e invierà qualsiasi tipo che forniresti in silenzio. Digitare il controllo con cURL? Non può essere fatto perché non c'è supporto WSDL in primo luogo.
Inoltre, mentre si parla di SOAP WSDL, tenere presente che PHP memorizzerà i WSDL per 7 giorni (impostazione predefinita). I rapidi cambiamenti di WSDL durante lo sviluppo ti metteranno nei guai in pochissimo tempo: cancellare la cache WSDL non è sempre facile. Ma d'altra parte è possibile disabilitare completamente la cache WSDL durante lo sviluppo: la velocità diminuirà, ma almeno si sarà in grado di svilupparsi senza avere "Non ho idea del motivo per cui non fa quello che voglio!"
Quindi leggendo alcune cose buone in PHP SOAP ci si potrebbe chiedere se ci siano buoni motivi per usare cURL per SOAP. E la mia risposta è "sì", c'è. Sfortunatamente PHP SOAP non è in grado di creare alcuni tipi di SoapHeader. Quindi, se vai a cose così avanzate, dovrai usare SoapClient per creare un documento SOAP, quindi modificarlo con alcuni strumenti XML (come PHP DOM) e poi inviarlo con cURL. Ma questa è completamente un'altra storia.
Se si inizia con SOAP in PHP, fare un favore e attenersi all'estensione PHP SOAP, non cURL. È un modo più semplice per gestire SOAP, è veloce, l'estensione viene mantenuta (quindi aspettarsi che la sua interoperabilità salga alla fine), comprende WSDL e fornisce una buona segnalazione e gestione degli errori.
C'è qualche differenza di prestazioni e scenari in cui dovrei usarne uno rispetto all'altro? –
Se sai come creare un'implementazione migliore usando l'arricciatura, immagino che il ricciolo potrebbe essere più veloce. Non creerei la mia implementazione. Abbiamo usato SoapClient in vaste applicazioni senza problemi. –
Sento ancora che ci potrebbe essere una risposta migliore con pro e contro –