执行脚本的PHP cURL无法按预期工作

时间:2012-01-02 14:56:26

标签: php curl

功能

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 "</pre>\n";
            createLog("CURL FAIL: {$url} TIMEOUT={$timeout}, CURL_ERRNO={$err}");
        }
        curl_close($curl);
        return FALSE;
    }

    # ON SUCCESS
    curl_close($curl);
    return $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等。

它只是传输第一个结果集,而不是其他页面。如果我手动执行它,它将重定向到下一页(如果有记录)。

此时我该怎么办?我很困惑,此刻我的想法不合时宜。如果有人能帮我解决这个问题,我将很高兴。

注意:

一切都在同一个领域。没有跟踪任何推荐人,也没有检查任何cookie。只调用纯PHP页面。如果页面中有任何由cURL调用的分页,我使用元重定向重定向到下一页。

我不想在循环中使用cURL。如果调用php页面需要分页,我在调用的php页面中添加以下代码;

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

额外信息

我的数据库中有crons表,我用循环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 个答案:

答案 0 :(得分:1)

您需要正确模拟。可能有很多原因,

  1. siteurl.com可能会跟踪引荐来源。
  2. 您也没有发送正确的请求标头。它只是传递的卷发默认标题。
  3. siteurl.com可能正在使用 Cookie 。你也没有处理它。
  4. 实际上,这完全取决于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}";
    }
    

答案 1 :(得分:0)

如果您通过scriptmeta标记将浏览器定向到连续的页面,则浏览器会为您处理,但cURL不会。这里的一个解决方案是为您使用的代码执行快速str_pos,如果找到则再次调用cURL。在循环中执行此操作并收集所有输出,直到找不到字符串为止。

答案 2 :(得分:0)

我只是采用了不同的方法。 我回来了http://siteurl.com/cron/transfer_members.php?page=n。如果返回的结果以http:// or https://开头,那么我再次致电cURL,直到返回的数据为finished

我仍然没有在循环中使用cURL(它会导致其他不需要的结果),但仍设法让它工作。

特别感谢@ Shiplu