Функция curl_exec заставляет сервер сбросить соединение - PullRequest
0 голосов
/ 27 мая 2009

У меня странная проблема со следующей функцией, которую я написал. Вкратце, эта функция подключается к URL и извлекает выходные данные с помощью функций curl. Однако, когда я выполняю эту функцию, я получаю сообщение «сервер неожиданно разорвал соединение»:

/**
 * Connects to remote URL and posts parameters, returns the result
 *
 * @param string $URL 
 * @param string $ArrayPostParameters 
 * @param string $HTTPRequestType 
 * @param string $HTTPAuth 
 * @param string $HTTPAuthUsername 
 * @param string $HTTPAuthPassword 
 * @param string $ConnectTimeOutSeconds 
 * @param string $ReturnHeaders 
 * @return array
 * @author xxxxxxxxxx
 */
function DataPostToRemoteURL($URL, $ArrayPostParameters, $HTTPRequestType = 'POST', $HTTPAuth = false, $HTTPAuthUsername = '', $HTTPAuthPassword = '', $ConnectTimeOutSeconds = 1, $ReturnHeaders = false)
    {
    $PostParameters = implode('&', $ArrayPostParameters);

    $CurlHandler = curl_init();
        curl_setopt($CurlHandler, CURLOPT_URL, $URL);

        if ($HTTPRequestType == 'GET')
            {
            curl_setopt($CurlHandler, CURLOPT_HTTPGET, true);
            }
        elseif ($HTTPRequestType == 'PUT')
            {
            curl_setopt($CurlHandler, CURLOPT_PUT, true);
            }
        elseif ($HTTPRequestType == 'DELETE')
            {
            curl_setopt($CurlHandler, CURLOPT_CUSTOMREQUEST, 'DELETE');
            }
        else
            {
            curl_setopt($CurlHandler, CURLOPT_POST, true);
            curl_setopt($CurlHandler, CURLOPT_POSTFIELDS, $PostParameters);
            }

        curl_setopt($CurlHandler, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($CurlHandler, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($CurlHandler, CURLOPT_FOLLOWLOCATION, 5);
        curl_setopt($CurlHandler, CURLOPT_CONNECTTIMEOUT, $ConnectTimeOutSeconds);
        curl_setopt($CurlHandler, CURLOPT_TIMEOUT, $ConnectTimeOutSeconds);
        curl_setopt($CurlHandler, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3');

        // The option doesn't work with safe mode or when open_basedir is set.
        if ((ini_get('safe_mode') != false) && (ini_get('open_basedir') != false))
            {
            curl_setopt($CurlHandler, CURLOPT_FOLLOWLOCATION, true);
            }

        if ($ReturnHeaders == true)
            {
            curl_setopt($CurlHandler, CURLOPT_HEADER, true);
            }
        else
            {
            curl_setopt($CurlHandler, CURLOPT_HEADER, false);
            }

        if ($HTTPAuth == true)
            {
            curl_setopt($CurlHandler, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
            curl_setopt($CurlHandler, CURLOPT_USERPWD, $HTTPAuthUsername.':'.$HTTPAuthPassword);
            }

        $RemoteContent = curl_exec($CurlHandler);

    if (curl_error($CurlHandler) != '')
        {
        return array(false, curl_error($CurlHandler));
        }

    curl_close($CurlHandler);   

    return array(true, $RemoteContent);
    }

Когда я отлаживал функцию, я заметил, что функция curl_exec () вызывает эту проблему. Нет сообщения curl_error и не генерируется ошибка PHP.

Есть ли у вас представление о причине (ах)? Safe_mode отключен в PHP.INI для вашей информации.

Заранее спасибо за помощь!

1 Ответ

1 голос
/ 27 мая 2009

Как вы вызываете эту функцию? Если вы оставляете параметр $ ConnectTimeOutSeconds по умолчанию равным 1, ваш параметр CURLOPT_TIMEOUT может вызывать проблему, поскольку для подключения и возврата страницы может потребоваться более 1 секунды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...