Вызов PHP fpassthru / fopen, вызвавший «не удалось открыть поток: не удалось выполнить HTTP-запрос!» с первой попытки - PullRequest
0 голосов
/ 22 марта 2012

У меня периодически возникает проблема с функцией fpassthru, когда мне выдается следующая ошибка, из-за которой мне приходится выходить из сценария.Это ошибка, которую я получаю:

Предупреждение: fopen (http://www.devcrm.lan/rw/category/?session_id=29cc6ecc068bcc1a3862cadb8b9d09c5&admin_sess_id=&g_id=W&cat_id=226&d_id=0&pdid=0&sale=0&page=0&position=&slug=womens/sale/&ajax=0&view_all=0&all=0&c_code=RW&u_region=RW&c_id=1&filter_cat_id[]=&filter_size[]=&filter_colour[]=&filter_price[]=&HTTP_USER_AGENT=Mozilla%2F5.0+%28Windows+NT+6.1%3B+WOW64%3B+rv%3A10.0.2%29+Gecko%2F20100101+Firefox%2F10.0.2&user_http_host=www.devcrm.lan&user_mobile_config=0) [function.fopen]: не удалось открыть поток: сбой HTTP-запроса! В / var / www / vhosts / dev / devcrm/shop/index.php в строке 213

Это область моего кода, где я использую fpassthru. К сожалению, я вынужден использовать эту функцию (на данный момент, во всяком случае) из-за наследствапроблемы с кодом. Используется для отправки через keep $ url_parameters при переходе от страницы к странице.

    $options = array(
        'http' => array(
            'max_redirects' => 5,          
            'timeout'       => 1,
        )
    );
    $context = stream_context_create($options);

    $fpthruPath = URL . "category/" . $url_parameters;

    $fp = fopen($fpthruPath, 'rb', false, $context);
    if ( false !== $fp ) {
        fpassthru($fp);
        fclose($fp);
    }
    exit();

Странно то, что если я возьму URL, который вставляю в fopen, и вставлю егов браузере - это работает! Кроме того, это только кажется, выдает эту ошибку первый раз, когда я иду на страницу. Это проблема настройки Apache?

Ответы [ 2 ]

0 голосов
/ 13 июня 2012

Однажды я установил соединение с удаленным http-сервером.В конце концов я обнаружил, что перед их кластером серверов был балансировщик нагрузки.Я не знаю, что они использовали, но при первом запросе иногда выдает перенаправление на точно такой же URL-адрес, чтобы они могли установить cookie-файл со значением serverid.1004 * Изначально я не удосужился отослать куки обратно после перенаправления, потому что он работал без него.Однажды он периодически начал давать мне тайм-ауты шлюза.Отправка куки на второй запрос решила его.

0 голосов
/ 19 апреля 2012

ОК, по крайней мере, после нескольких недель царапин на голове я обнаружил, что настройка HTTP тайм-аута, которую я передаю в stream_context_create, вызывает сбой fopen. Когда я комментирую это, я больше не получаю не удалось открыть поток: HTTP-запрос не выполнен! предупреждение от fopen.

Я не уверен, однако, почему это стало проблемой с момента обновления до 5.3.10, поскольку это никогда не было проблемой при использовании 5.1.6. Я искал около 5,3 постов производительности, но не могу найти много. Понятно, что у меня есть серьезные опасения по поводу выпуска этого в живую среду, как будто что-то, что работает в 5.1.6, теперь борется, предположительно из-за ограниченного времени ожидания, в 5.3.10, тогда есть проблемы производительности с более новой версией PHP, которые не ' Т документально? Других изменений в коде между сценарием, который не работает (периодически) на 5.3.10, но всегда работает на 5.1.6, не было.

Я не уверен, стоит ли удалять тайм-аут или просто увеличить его до 5 или что-то в этом роде.

$options = array(
            'http' => array(
                'max_redirects' => 5          // stop after 5 redirects
                 // 'timeout'       => 1,         // timeout of 1 second
            )
        );
$context = stream_context_create($options);

$fp = fopen($fpthruPath, 'rb', false, $context);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...