Какой подход лучше между fsockopen и curl?

Я создаю приложение для автоматического регулярного выставления счетов.
Сообщите мне, какой вариант выбрать для отправки запроса на сервер

  • fsockeopen
  • завиток

и почему один лучше другого?


person Gaurav    schedule 09.05.2011    source источник


Ответы (5)


я бы порекомендовал вам curl из-за настраиваемых параметров. например ssl

person Flask    schedule 09.05.2011
comment
Мнение 8-летнего ребенка, отвечающего на вопросы и ответы: это должен был быть комментарий, а не ответ. - person akinuri; 08.05.2019

Я бы рекомендовал использовать потоковые контексты PHP со встроенными функциями: http://us3.php.net/manual/en/book.stream.php . Полная функциональность HTTP/S и прекрасно интегрируется с функциями fopen/file_get_contents. Вы можете (например) сделать POST следующим образом:

$chunk = file_get_contents("https://graph.facebook.com/oauth/access_token?client_id=".FACEBOOK_APP_ID."&client_secret=".FACEBOOK_SECRET."&grant_type=client_credentials");
if ($request_ids && $chunk) {
    $cookie = explode('=', $chunk);
    if (count($cookie) == 2) $cookie = $cookie[1];
    else $cookie = $cookie[0];

    // flush it
    foreach ($request_ids as $request_id) {
        $context = stream_context_create(array(
            'http' => array(
                'method'        => 'POST',
                'content'       => 'method=DELETE',
                'user_agent'    => "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6 (.NET CLR 3.5.30729)",
                'max_redirects' => 0
            )
        ));
        @file_get_contents('https://graph.facebook.com/' . $request_id . '?access_token=' . $cookie, false, $context);
    }
}

Этот код входит в Facebook, получает токен входа в приложение, а затем использует безопасный HTTP POST для удаления ряда объектов с помощью графического API.

Если вам нужно сделать что-то покрасивее, вы тоже можете это сделать.

$context = stream_context_create(array('http' => array(
   // set HTTP method
   'method'         => 'GET',
   'user_agent'     => "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6 (.NET CLR 3.5.30729)",
   'max_redirects'  => 0
)));

// extract the cookies
$fp      = fopen(URL, "r", false, $context);
$meta    = stream_get_meta_data($fp);
$headers = $metadata['wrapper_data'];
fclose($fp);

Будет вести журнал. Будет получать заголовки, возвращаемые URL-адресом. Никаких внешних библиотек не требуется.

person Femi    schedule 09.05.2011
comment
Итак, что мне делать, если значение allow_url_fopen равно false? - person Chameron; 12.12.2011

Ни то, ни другое. Я имею в виду, не напрямую.

Написание и разбор HTTP-заголовков поверх сокета — это безумие, а API curl я считаю откровенно оскорбительным.

Взгляните на HTTP_Request2 PEAR, возможно, он даже установлен на вашем компьютере. А если нет, вы можете просто связать его со своим кодом — это лицензия BSD. Он оборачивает либо сокеты, либо curl и предоставляет относительно нормальный HTTP-интерфейс.

person Charles    schedule 09.05.2011

Используйте Curl, когда вам нужно обрабатывать протокол http, и сокет, когда вам нужен более общий доступ к серверу, отличному от http.

person user1784245    schedule 04.05.2013

Я изучаю это прямо сейчас и наткнулся на следующую страницу, на которой приведен код для тестирования различных параметров и получения результатов скорости. Очень интересно.

http://www.hashbangcode.com/blog/quickest-way-download-web-page-php

person TeeHays    schedule 26.07.2014
comment
Мне очень нравится подход, сделанный здесь, но у него есть серьезный недостаток. Тестирование имеет большие колебания во времени, это настолько серьезно, что весь результат измерения практически бесполезен. Время ответа сервера, мгновенная задержка сервера, а также мгновенное качество маршрута к серверу — все это играет большую роль в тестах. Реальный вывод, который я сделал из теста, заключается в том, что он почти не имеет отношения к HTTP-запросам, поскольку случайные различные задержки кратны любой разнице в производительности API. - person John; 03.10.2016