التحقق من عنوان URL صالح (من php الصابون العميل)

StackOverflow https://stackoverflow.com/questions/1406632

  •  05-07-2019
  •  | 
  •  

سؤال

أنا أكتب التطبيق على شبكة الإنترنت التي تسمح للمستخدم لتحديد عنوان URL على SoapClient.أردت التحقق من صحة php يمكن الاتصال العميل عندما يقوم المستخدم بإرسال نموذج.وأعتقد أنني يمكن أن تفعل هذا من خلال محاولة القبض أو set_error_handler (أو مزيج من الاثنين).ومع ذلك يبدو أن هذا غير ممكن بالنسبة أخطاء قاتلة.هل هناك طريقة للحصول على SoapClent لاختبار URL التي لن رمي غير قابل للاسترداد الخطأ ؟

Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://example.com/wibble'

أريد أن العلم خطأ كما URL غير موجود ، ولكن أود أن تكون قادرة على اللحاق به.

وإلا أفترض أن تحاول تحميل و التحقق من صحة URL نفسي ولكن كنت أعتقد أنه سيكون من الممكن القيام بذلك من SoapClient.

يجب أن يكون هذا خطأ فادح?

تحرير

بعد قراءة rogeriopvl الجواب أنا reaslise التي كان يجب أن أقول أن كنت قد حاولت 'استثناءات' الخيار soapclient منشئ (في يأس) استخدام الصابون-خطأ-معالج وظيفة.

هل كانت مفيدة؟

المحلول

هل تستخدم xdebug?وفقا هذه PHP تقرير الشوائب و المناقشة, ، تم إصلاح المشكلة على الأقل منذ PHP 5.1 ، ولكن هذا xdebug علة عبث مع 'خطأ فادح أن الاستثناء التحويلات في الطريق أن الاستثناء لا يتم إنشاء خطأ فادح 'التسريبات من خلال'.

أنا يمكن أن تتكاثر هذه محليا مع xdebug تمكين:

try {
  $soapClient = new SoapClient('http://www.example.com');
}
catch(Exception $e) {
  $exceptionMessage = t($e->getMessage());
  print_r($exceptionMessage);
}

هذا يعطيني خطأ فادح وصفت, حتى من دون الدخول في الصيد شرط:

Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://www.example.com'

يعمل إذا كنت تعطيل xdebug الحق قبل الدعوة:

xdebug_disable();
try {
  $soapClient = new SoapClient('http://www.example.com');
}
catch(Exception $e) {
  $exceptionMessage = t($e->getMessage());
  print_r($exceptionMessage);
}

هذا يتسبب في الاستثناء كما هو متوقع, و علي السليم SoapFault الكائن في القبض شرط مع رسالة:

SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://www.example.com'

وذلك أساسا الاستثناءات العمل المعلن عنها.إذا كانت لا تعمل في الحال ، قد تواجه xdebug علة ، أو ربما مشكلة مشابهة مع آخر 3rd الطرف المكونات.

نصائح أخرى

نقلا عن SoapClient الوثائق:

الاستثناءات الخيار هو قيمة منطقية تحدد ما إذا كان الصابون الأخطاء رمي استثناءات من نوع SoapFault.

لذلك عليك أن تحاول شيئا مثل:

$client = new SoapClient("some.wsdl", array('exceptions' => TRUE));

هذه الطريقة سوف رمي SoapFault استثناءات تسمح لك لإلقاء القبض عليهم.

انظر: http://bugs.xdebug.org/view.php?id=249

الحلول الممكنة:

Index: trunk/www/sites/all/libraries/classes/defaqtoSoapClient.class.php
===================================================================
--- classes/defaqtoSoapClient.class.php
+++ classes/defaqtoSoapClient.class.php
@@ -31,10 +31,23 @@

     try {
+        // xdebug and soap exception handling interfere with each other here 
+        // so disable xdebug if it is on - just for this call
+        if (function_exists('xdebug_disable')) {
+            xdebug_disable();
+        }
       //Create the SoapClient instance
       parent::__construct($wsdl, $options);
     }
     catch(Exception $parent_class_construct_exception) {
+        if (function_exists('xdebug_enable')) {
+            xdebug_enable();
+        }
       // Throw an exception an say that the SOAP client initialisation is failed
       throw $parent_class_construct_exception;
+    } 
+    if (function_exists('xdebug_enable')) {
+        xdebug_enable();
     }
   }

يمكنك محاولة القيام حليقة أو fsockopen طلب التحقق من عنوان URL صالح.

لمعلوماتك, أنا باستخدام SoapClient مع PHPUnit لاختبار البعيد WebServices و حصلت نفس المشكلة!

  • عند استخدام قديمة PHPUnit الإصدار (3.3.x) كطرف ثالث, phpunit تحطم
  • عند استخدام الإصدار الحالي من PHPUnit (3.4.6) كطرف ثالث, phpunit عرض "RuntimeException".

هنا هو أول طريقة الاختبار :

public function testUnavailableURL() {
    $client = new SoapClient("http://wrong.URI");
}

هنا هو PHPUnit النتيجة الأولى :

There was 1 error:

1) MyTestCase::testUnavailableURL
RuntimeException: 


FAILURES!

هنا هو بلدي الثاني طريقة الاختبار :

public function testUnavailableURL() {
        try {
          $client = @new SoapClient("http://wrong.URI");
        } catch (SoapFault $fault) {
          print "SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})";
        }
}

هنا هو PHPUnit الثانية نتيجة الاختبار :

PHPUnit 3.4.6 by Sebastian Bergmann.

.SOAP Fault: (faultcode: WSDL, faultstring: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://wrong.URI' : failed to load external entity "http://wrong.URI"
)...

Time: 3 seconds, Memory: 4.25Mb

OK

ملحوظة::وجدت phpunit تذكرة على هذا الموضوع : تذكرة 417

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top