PHP cURL, выполняющий скрипт, не работает должным образом - PullRequest
0 голосов
/ 02 января 2012

Функция

<code>function curlPost($url, $postArray = NULL, $timeout=2, $errorReport=FALSE) {
    # PREPARE THE POST STRING
    if ($postArray != NULL) {
        $postString = '';
        foreach ($postArray as $key => $val) {
            $postString .= urlencode($key) . '=' . urlencode($val) . '&';
        }
        $postString = rtrim($postString, '&');
    }

    # PREPARE THE CURL CALL
    $curl = curl_init();
    curl_setopt( $curl, CURLOPT_URL,            $url         );
    curl_setopt( $curl, CURLOPT_HEADER,         FALSE        );
    curl_setopt( $curl, CURLOPT_POST,           TRUE         );
    ($postArray != NULL) ? curl_setopt( $curl, CURLOPT_POSTFIELDS,     $postString ) : '';
    curl_setopt( $curl, CURLOPT_TIMEOUT,        $timeout     );
    curl_setopt( $curl, CURLOPT_RETURNTRANSFER, TRUE         );

    # EXECUTE THE CURL CALL
    $htm = curl_exec($curl);
    $err = curl_errno($curl);
    $inf = curl_getinfo($curl);

    # ON FAILURE
    if (!$htm) {
        # PROCESS ERRORS HERE
        if ($errorReport) {
            echo "CURL FAIL: {$url} TIMEOUT={$timeout}, CURL_ERRNO={$err}";
            echo "<pre>\n";
            var_dump($inf);
            echo "
\ n "; createLog (" CURL FAIL: {$ url} TIMEOUT = {$ timeout}, CURL_ERRNO = {$ err} ");} curl_close ($curl); вернуть FALSE;} # ON SUCCESS curl_close ($ curl); вернуть $ htm;}

Задача

Я использую cURL для того, чтобыдля выполнения некоторых ботов. Например;

$url = 'http://siteurl.com/crons/transfer_members.php';
$response = curlPost($url, NULL, 10);
echo ($response) ? "{$url} executed" : "Couldn't execute {$url}";

Он работает, как и ожидалось, но у меня есть тонны членов, поэтому мне пришлось использовать нумерацию страниц, например;

http://siteurl.com/crons/transfer_members.php?page=1

http://siteurl.com/crons/transfer_members.php?page=2 и т. Д.

Он просто передает первый набор результатов и не переносится на другие страницы. Если я выполняю его вручную, он перенаправляет на следующую страницу (если есть записи).

Что мне делать в этот момент? Я довольно застрял и у меня сейчас нет идей. Я буду рад, если кто-нибудь сможет мне помочь с этой проблемой.

Примечание:

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

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

# REDIRECT
echo '<meta http-equiv="refresh" content="' . $timer . ';url=' . $url . '">';

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

У меня есть таблица crons в моей базе данных, и я определяю $url с записями таблицы циклических крон.Некоторые страницы PHP могут иметь нумерацию страниц, некоторые не имеют нумерации страниц.Вот почему я действительно хотел бы избегать использования вызовов cURL внутри цикла для разбивки на страницы.

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

Значение;если я захожу на http://siteurl.com/crons/transfer_members.php в моем браузере, он перенаправляет меня на следующую страницу с мета-перенаправлением (пример: http://siteurl.com/crons/transfer_members.php?page=x)

Я ожидал того же с cURL. Когда cURL будет вызывать http://siteurl.com/crons/transfer_members.php он должен пройти по следующим страницам, пока все страницы не будут завершены. Он просто посещает первую страницу и останавливается там.

Ответы [ 3 ]

1 голос
/ 02 января 2012

Вам нужно смоделировать правильно.Причин может быть много,

  1. siteurl.com может отслеживать реферер.
  2. Вы также не отправляете правильный заголовок Request .Передается только заголовок по умолчанию для завитков.
  3. siteurl.com может использовать Cookie .Вы также не обрабатываете это тоже.

На самом деле это полностью зависит от того, как siteurl.com отвечает на ваш запрос.

Также вы, похоже, не используете пагинацию на $url = 'http://siteurl.com/crons/transfer_members.php'; Это должнобыть больше похожим на

for($i=0;$i<100;$i++){
    $url = 'http://siteurl.com/crons/transfer_members.php?page='.$i;
    $response = curlPost($url, NULL, 10);
    echo ($response) ? "{$url} executed" : "Couldn't execute {$url}";
}
0 голосов
/ 05 января 2012

У меня просто был другой подход. Я возвратил http://siteurl.com/cron/transfer_members.php?page=n. Если возвращаемый результат начинается с http:// or https://, то я звонил cURL еще раз, пока возвращаемые данные не стали finished.

Я все еще не использовал cURL в цикле (это вызвало бы другие нежелательные результаты), но все же сумел заставить его работать.

Особая благодарность @ Shiplu .

0 голосов
/ 02 января 2012

Если вы направляете браузер на последующие страницы с помощью тега script или meta, браузер обрабатывает это для вас, а cURL - нет. Одним из решений здесь является быстрое выполнение str_pos для кода, который вы используете, и, если он найден, снова вызовите cURL. Сделайте это в цикле и соберите все выходные данные, пока строка не будет найдена, когда вы закончите.

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