功能
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时,它应该经过下一页,直到所有页面都完成。它只是访问第一页并停在那里。
答案 0 :(得分:1)
您需要正确模拟。可能有很多原因,
siteurl.com
可能会跟踪引荐来源。 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}";
}
答案 1 :(得分:0)
如果您通过script
或meta
标记将浏览器定向到连续的页面,则浏览器会为您处理,但cURL不会。这里的一个解决方案是为您使用的代码执行快速str_pos,如果找到则再次调用cURL。在循环中执行此操作并收集所有输出,直到找不到字符串为止。
答案 2 :(得分:0)
我只是采用了不同的方法。
我回来了http://siteurl.com/cron/transfer_members.php?page=n。如果返回的结果以http:// or https://
开头,那么我再次致电cURL
,直到返回的数据为finished
。
我仍然没有在循环中使用cURL(它会导致其他不需要的结果),但仍设法让它工作。
特别感谢@ Shiplu 。