English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
[ زيارة HTTP ]
عادة، هناك العديد من الطرق لزيارة HTTP، وهي بالأساس: curl، socket، file_get_contents() وما إلى ذلك.
إذا واجهنا عدم الاستجابة من الخادم المعني لفترة طويلة، فإننا سنواجه المأساة، وسنكون قادرين بسهولة على تدمير الخادم بأكمله، لذا يجب أن نأخذ في الاعتبار أيضًا مشكلة الوقت الأقصى عند زيارة HTTP.
[ زيارة CURL HTTP ]
CURL هو مكتبة نستخدمها بشكل شائع لاستدعاء واجهات بروتوكول HTTP، وقدرتها عالية، بالإضافة إلى بعض الميزات الداعمة للمعالجة المتوازية.
CURL:
curl_setopt($ch, opt) يمكنه تعيين بعض الإعدادات الزمنية، بما في ذلك:
(مهم) CURLOPT_TIMEOUT يحدد الوقت الأقصى الذي يسمح به cURL بالتنفيذ في الثواني.
(مهم) CURLOPT_TIMEOUT_MS يحدد الوقت الأقصى الذي يسمح به cURL بالتنفيذ في الميليسي ثانية. (تم إضافته في cURL 7.16.2. يمكن استخدامه من PHP 5.2.3 فصاعداً. )
CURLOPT_CONNECTTIMEOUT في البداية ينتظر وقت الاتصال، إذا تم تعيينه على 0، فإنه ينتظر إلى أجل غير مسمى.
CURLOPT_CONNECTTIMEOUT_MS هو الوقت الذي يتم فيه محاولة الاتصال بالخادم، ويتم قياسه بالأمثلة. إذا تم إعداده إلى 0، فإن الوقت يصبح غير محدود. تم إضافته في cURL 7.16.2. يمكن استخدامه من PHP 5.2.3 فما فوق.
CURLOPT_DNS_CACHE_TIMEOUT هو الوقت الذي يتم فيه حفظ معلومات DNS في الذاكرة، والقيمة الافتراضية هي 120 ثانية.
وقت التحقق من الزمن البالغ 1 ثانية عادة:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 60); //يكفي إعداد عدد الثواني فقط
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_USERAGENT, $defined_vars['HTTP_USER_AGENT']);
استخدام وقت التحقق من الزمن البالغ 1 ثانية عادة:
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
إذا كان يجب على curl إجراء وقت تحقق من الزمن البالغ 1 ملي ثانية، يجب إضافة:
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
أو
curl_setopt($ch, CURLOPT_NOSIGNAL, true); يمكن دعم إعداد وقت التحقق من الزمن البالغ 1 ملي ثانية
مثال على تحديد وقت التحقق من الزمن البالغ 1 ملي ثانية باستخدام curl:
<?php if (!isset($_GET['foo'])) { //العميل $ch = curl_init('http://example.com/'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_NOSIGNAL, 1); //التحذير، يجب إعداد هذا العدد لتحديد الوقت الزمني بالأمثلة curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200); //الوقت الزمني للتحقق من الزمن، تم إضافته في cURL 7.16.2. يمكن استخدامه من PHP 5.2.3 فما فوق $data = curl_exec($ch); $curl_errno = curl_errno($ch); $curl_error = curl_error($ch); curl_close($ch); if ($curl_errno > 0) { echo "خطأ cURL ($curl_errno): $curl_error\n"; } echo "تم استقبال البيانات: $data\n"; } } //خادم sleep(10); echo "Done."; } ?>
نصائح أخرى:
1. بناءً على الخبرة، يمكن تلخيص ذلك بأن: إصدار cURL >= libcurl/7.21.0، يُطبق تباطؤ المئوية ثانية بالتأكيد، تذكر ذلك.
2. هناك مشكلة في تباطؤ curl_multi بالمئوية ثانية... دعم زيارة واحدة لتباطؤ المئوية ثانية، ولكن curl_multi لا يعمل بشكل دقيق عند تنفيذ عدة زيارات
[زيارة HTTP بطريقة معالجة التدفق]
بالإضافة إلى curl، نستخدم غالبًا fsockopen أو وظائف معالجة الملفات لمعالجة بروتوكول HTTP، لذا فإن معالجة تباطؤ هذا الجزء ضرورية أيضًا.
عادةً يمكن إعداد وقت التباطؤ في الاتصال مباشرة، ولكن يجب معالجة تباطؤ قراءة التدفق بشكل منفرد.
كتابة كودك الخاص:
$tmCurrent = gettimeofday(); $intUSGone = ($tmCurrent['sec'] - $tmStart['sec']) * 1000000 + ($tmCurrent['usec'] - $tmStart['usec']); if ($intUSGone > $this->_intReadTimeoutUS) { return false; }
أو باستخدام وظائف معالجة التدفق المدمجة stream_set_timeout() و stream_get_meta_data() لمعالجة:
<?php //Timeout في الثواني $timeout = 5; $fp = fsockopen("example.com", 80, $errno, $errstr, $timeout); if ($fp) { fwrite($fp, "GET / HTTP/1.0\r\n"); fwrite($fp, "Host: example.com\r\n"); fwrite($fp, "Connection: Close\r\n\r\n"); stream_set_blocking($fp, true); //مهم،إعداد الوضع غير المُحظور stream_set_timeout($fp,$timeout); //إعداد وقت الصلاحية $info = stream_get_meta_data($fp); while ((!feof($fp)) && (!$info['timed_out'])) { $data .= fgets($fp, 4096); $info = stream_get_meta_data($fp); ob_flush; flush(); } if ($info['timed_out']) { echo "Connection Timed Out!"; } echo $data; } }
فتح ملف زمني:
<?php $timeout = array( 'http' => array( 'timeout' => 5 //إعداد وقت الصلاحية، وحدة الزمن هي الثواني ) ); $ctx = stream_context_create($timeout); $text = file_get_contents("http://example.com/", 0, $ctx); ?>
فتح ملف زمني:
<?php $timeout = array( 'http' => array( 'timeout' => 5 //إعداد وقت الصلاحية، وحدة الزمن هي الثواني ) ); $ctx = stream_context_create($timeout); if ($fp = fopen("http://example.com/", "r", false, $ctx)) { while( $c = fread($fp, 8192)) { echo $c; } fclose($fp); } ?>
هذا هو محتوى الشرح السهل الذي قدمه لك المحرر حول حل مشكلة انتهاء الوقت عند معالجة PHP وبوابة الوصول، نأمل أن تحصلوا على الدعم والمزيد من النداءات لتدريب呐喊~