الطريقة الأكثر فعالية لاسترداد مصدر موقع الويب من خلال PHP؟(الحصول على الطلب)

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

  •  22-08-2019
  •  | 
  •  

سؤال

أعلم أنه يمكن استخدام file_get_contents لاسترداد مصدر صفحة الويب، ولكنني أريد معرفة الطريقة الأكثر فعالية.

لدي فصل قديم قمت بإنشائه منذ وقت طويل ويستخدم شيئًا مثل هذا:

    $this->socket = fsockopen($this->host, 80);

    fputs($this->socket, 'GET ' . $this->target . ' HTTP/1.0' . "\n");
    fputs($this->socket, 'Host: ' . $this->host . "\n"); 
    fputs($this->socket, 'User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5' . "\n");
    fputs($this->socket, 'Connection: close' . "\n\n");

    $this->source = '';

    while(!feof($this->socket))
    {
        $this->source .= fgets($this->socket, 128);
    }

    fclose($this->socket);

هل هذا افضل طريق؟أعني بالأكثر كفاءة إرجاع أسرع النتائج.

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

المحلول

file_get_contents() هي الطريقة الأفضل والأكثر فعالية.لكن في كلتا الحالتين ليس هناك فرق كبير لأن عنق الزجاجة هو الشبكة وليس المعالج.يجب أن تكون إمكانية قراءة التعليمات البرمجية أيضًا مصدر قلق.

ضع في اعتبارك هذا المعيار أيضًا: http://www.ebrueggeman.com/php_benchmarking_fopen.php

نصائح أخرى

ورمز لديك هو على الأرجح الطريقة الأسرع والأسهل لتفعل ما نتحدث عنه. ومع ذلك، فإنه ليست مرنة جدا إذا كنت ترغب في القيام بمهام أكثر تعقيدا (مثل نشر أو دعم HTTP 1.1 الاشياء مثل المحتوى ترميز ونقل ترميز).

إذا كنت تريد شيئا من شأنها أن التعامل مع الحالات الأكثر تعقيدا وكذا، استخدام فب الضفيرة .

غير متأكد؟دعونا اختبار!يفتح البرنامج النصي أدناه example.org 10 مرات باستخدام الطريقتين:

$t = microtime(true);
$array = array();
for($i = 0; $i < 10; $i++) {
    $source = file_get_contents('http://www.example.org');
}
print microtime(true) - $t;
print '<br>';
$t = microtime(true);
$array = array();
for($i = 0; $i < 10; $i++) {
    $socket = fsockopen('www.example.org', 80);
    fputs($socket, 'GET / HTTP/1.0' . "\n");
    fputs($socket, 'Host: www.example.org' . "\n"); 
    fputs($socket, 'User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5' . "\n");
    fputs($socket, 'Connection: close' . "\n\n");
    $source = '';
    while(!feof($socket)) {
        $source .= fgets($socket, 128);
    }
    fclose($socket);
}
print microtime(true) - $t;

التشغيل الأول:

file_get_contents: 3.4470698833466
fsockopen: 6.3937518596649

التشغيل الثاني:

file_get_contents: 3.5667569637299
fsockopen: 6.4959270954132

الجولة الثالثة

file_get_contents: 3.4623680114746
fsockopen: 6.4249370098114

منذ ذلك الحين file_get_contents أسرع وأكثر إيجازًا وسأعلن أنه الفائز!

لن تحصل على أداء أفضل من file_get_contents المدمج مع كود البيرة مثل هذا.في الواقع، فإن التسلسل المستمر على سلاسل قصيرة يصل طولها إلى 128 بايت (؟لماذا؟) سيكون أداؤه سيئًا إلى حد ما.

لHTTP هناك نكون أسباب للقيام بذلك بنفسك أو استخدام مكتبة خارجية، على سبيل المثال:

  • تحتاج إلى التحكم في مهلات الشبكة

  • تريد دفق المحتوى مباشرة من المقبس بدلاً من تجميعه

لكن الأداء ليس واحداً منها؛ستقتصر وظيفة PHP البسيطة والمدمجة فقط على سرعة الشبكة، وهو أمر لا يمكنك فعل أي شيء حياله.

scroll top