Ralat SOAP: Menghuraikan WSDL pada Pelayan Pengeluaran
Apabila cuba menggunakan SoapClient untuk menghuraikan WSDL daripada URL jauh, SOAP- ERROR ditemui pada pelayan pengeluaran. Pelayan WAMP tempatan berjaya mengendalikan operasi, tetapi isu ini berterusan pada pelayan pengeluaran.
Mesej Ralat
Mesej ralat khusus yang diterima ialah:
SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl' : failed to load external entity "http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl"/taxation_customs/vies/checkVatService.wsdl"
Penyiasatan
Setelah penyiasatan lanjut, didapati ralat itu berpunca daripada ketidakupayaan SoapClient untuk menghuraikan WSDL semasa cuba memuatkannya daripada URL. Ini berlaku walaupun WSDL boleh diakses melalui panggilan terus menggunakan curl daripada baris arahan.
Penyelesaian
Isu telah diselesaikan dengan menetapkan ejen pengguna secara eksplisit dalam SoapClient menggunakan strim konteks:
$soapClientOptions = array( 'stream_context' => $context, 'cache_wsdl' => WSDL_CACHE_NONE ); $client = new SoapClient($wsdlUrl, $soapClientOptions);
Pendekatan ini memastikan bahawa maklumat ejen pengguna HTTP yang diperlukan disertakan dalam permintaan, membolehkan SoapClient berjaya menghuraikan WSDL daripada URL jauh.
Cerapan Tambahan
Analisis lanjut mendedahkan bahawa isu itu juga boleh dikaitkan dengan tetapan khusus pada pelayan pengeluaran. Permintaan HTTP melalui IPv6 dengan rentetan ejen pengguna HTTP yang hilang nampaknya mencetuskan ralat. Dengan memaksa IPv4 atau menyatakan rentetan ejen pengguna secara eksplisit, permintaan itu dapat berjaya tanpa menghadapi ralat SOAP.
Atas ialah kandungan terperinci Mengapa SoapClient saya gagal menghuraikan WSDL pada pelayan pengeluaran tetapi berfungsi pada pelayan tempatan saya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!