PHP;CURL ведет себя по-разному при доступе через браузер против CLI - PullRequest
0 голосов
/ 26 января 2019

У меня есть серверное приложение, которое будет запускать некоторые долгоиграющие PHP-скрипты в фоновом режиме через CLI. Одним из них является простой паук, который просматривает список веб-сайтов и извлекает их содержимое с помощью cURL.

Когда функция, выполняющая работу, является частью страницы, к которой обращается браузер, она работает нормально. Когда я добавляю работу к PHP-скрипту, работающему в CLI, сайты, скрывающиеся за cloudflare, не могут указать «Пожалуйста, включите куки». и затем вдаваясь в подробности, что я заблокирован.

Это функция PHP:

static function getPage($url, $timeout = 5)
{
    $agent= 'Mozilla/5.0 (compatible; SimpleSpiderBot/0.1; +'.url('/').')';
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_VERBOSE, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERAGENT, $agent);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);

    $html = @curl_exec($ch);
    curl_close($ch);
    return $html;
}

Что меня смущает, так это то, что PHP выполняет всю работу одинаково, отличается только среда PHP (CLI и Apache-запрос). Я попытался настроить команду PHP CLI на использование того же файла PHP.ini, что и на странице, но это не сработало.

Редактировать: Код обработки cookie был добавлен, но когда это не помогло решить проблему, я удалил лишний код для ясности.

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Проблема заключается в том, что CloudFlare попытается проверить несколько аспектов запроса, но это не обязательно говорит о том, что «неправильно сформировано».В этом случае написанная мной функция url () возвращала "/" при работе в фоновом режиме, в отличие от полного URL-адреса, такого как "example.com/", как в браузере.Это означало, что пользовательский агент будет читать «Mozilla / 5.0 (совместимо; SimpleSpiderBot / 0.1; /)», что явно не нравится Cloudflare.

Мой совет разработчикам, сталкивающимся с этим вопросом, заключается в тщательной проверке каждогозаголовок и опция, чтобы увидеть, может ли Cloudflare быть «придирчивым» к контенту, так как кажется, что даже небольшое «уродство» заблокирует запрос.

0 голосов
/ 26 января 2019

Я не могу придумать причину, по которой ваш веб-сервер преуспел бы, но CLI терпит неудачу, когда дело доходит до файлов cookie.Согласно haxx.se, который, как я полагаю, является официальным сайтом для curl, curl не обрабатывает куки-файлы, если вы явно не укажете их .Я полагаю, что ваш сценарий выше по умолчанию не потрудится обрабатывать файлы cookie. То, что вы получаете какое-либо корректное поведение, если сайт требует, чтобы файлы cookie предполагали, что вы что-то пропустили или что ваша проблема лежит в другом месте.

Обратите внимание, что вы можете настроить запрос скручивания на прием файлов cookie , как описано здесь .

...