لقد قمنا مؤخرًا بكتابة العديد من البرامج للوصول عن بعد عبر HTTP، ونتواصل بشكل أساسي مع فئة WebHttpRequest في مكتبة فئة .NET والكائن المشترك Microsoft.XMLHTTP، ومن خلال هذه الفئات الملائمة، يمكننا محاكاة الويب من خلال C#. يصل عملاء ASP وJavascript إلى صفحات الويب الأخرى. لكنني أردت اليوم استخدام PHP لتنفيذ وظيفة مماثلة، لكنني لم أتمكن من العثور على الاتجاه لفترة من الوقت، لذلك اضطررت إلى "الحصول على ما يكفي من الطعام والملابس" بنفسي.
في الوقت الحالي، لا توجد فئة مشابهة لـ HttpRequest في PHP، ومع ذلك، وجدت مثل هذه الصفحة من فئة HttpRequest في الوثائق الرسمية عبر الإنترنت، ولكنها ذكرت فقط أن هذه الوظيفة قد تكون موجودة فقط في إصدار CVS...
للتنفيذ لا يعد الوصول إلى HTTP أكثر من مجرد إرسال طلب باستخدام المقبس ثم قراءة معلومات الإرجاع. لذلك كتبت فئة HttpRequest باستخدام المقبس. بالطبع، يمكن تنفيذها أيضًا باستخدام وظيفة fsockopen()، ولكن الفرق بين الاثنين ليس كبيرًا جدًا، فالكود المحدد موجود في المرفق.
<?php
/**
* الشبكة: كائن طلب HTTP
* المؤلف: لي هويو (كاراجان لي)، شنغهاي، الصين.
*/
فئة HttpRequest{
فار $sHostAdd;
فار $sUri;
فار $iPort;
var $sRequestHeader;
فار $sResponse;
الدالة HttpRequest($sUrl){
$sPatternUrlPart = '/http://([az-.0-9]+)(:(d+)){0,1}(.*)/i';
$arMatchUrlPart = array();
preg_match($sPatternUrlPart, $sUrl, $arMatchUrlPart);
$this->sHostAdd = gethostbyname($arMatchUrlPart[1]);
إذا (فارغة($arMatchUrlPart[4])){
$this->sUri = '/';
}آخر{
$this->sUri = $arMatchUrlPart[4];
}
إذا (فارغ($arMatchUrlPart[3])){
$this->iPort = 80;
}آخر{
$this->iPort = $arMatchUrlPart[3];
}
$this->addRequestHeader('Host: '.$arMatchUrlPart[1]);
$this->addRequestHeader('الاتصال: إغلاق');
}
وظيفة addRequestHeader($sHeader){
$this->sRequestHeader .= Trim($sHeader)."rn";
}
الدالة sendRequest($sMethod = 'GET', $sPostData = ''){
$sRequest = $sMethod." ".$this->sUri." HTTP/1.1rn";
$sRequest .= $this->sRequestHeader;
إذا ($sMethod == 'POST'){
$sRequest .= "نوع المحتوى: application/x-www-form-urlencodedrn";
$sRequest .= "طول المحتوى: ".strlen($sPostData)."rn";
$sRequest .= "rn";
$sRequest .= $sPostData."rn";
}
$sRequest .= "rn";
$sockHttp = مقبس_إنشاء(AF_INET, SOCK_STREAM, SOL_TCP);
إذا (!$sockHttp){
يموت('socket_create() فشل!');
}
$resSockHttp =ocket_connect($sockHttp, $this->sHostAdd, $this->iPort);
إذا (!$resSockHttp){
يموت('socket_connect() فشل!');
}
المقبس_الكتابة($sockHttp, $sRequest, strlen($sRequest));
$this->sResponse = '';
بينما ($sRead = المقبس_قراءة($sockHttp, 4096)){
$this->sResponse .= $sRead;
}
المقبس_إغلاق($sockHttp);
}
وظيفة الحصول على الاستجابة () {
إرجاع $this->sResponse;
}
وظيفة getResponseBody(){
$sPatternSeperate = '/rnrn/';
$arMatchResponsePart = preg_split($sPatternSeperate, $this->sResponse, 2);
إرجاع $arMatchResponsePart[1];
}
الدالة getResponseHead(){
$sPatternSeperate = '/rnrn/';
$arMatchResponsePart = preg_split($sPatternSeperate, $this->sResponse, 2);
إرجاع $arMatchResponsePart[0];
}
}
?>