我正在尝试编写一个工具来检查代理服务器是否已启动并可供使用。到目前为止,我已经在下面的课程中提出了两种方法(我已经删除了对这个问题多余的setter和getter)。
第一种方法使用cURL
并尝试通过代理请求页面,第二种工具使用fsockopen
并尝试打开与代理的连接。
class ProxyList {
/**
* You could set this to localhost, depending on your environment
* @var string The URL that the proxy validation method will use to check proxies agains
* @see ProxyList::validate()
*/
const VALIDATION_URL = "http://m.www.yahoo.com/robots.txt";
const TIMEOUT = 3;
private static $valid = array(); // Checked and valid proxies
private $proxies = array(); // An array of proxies to check
public function validate($useCache=true) {
$mh = curl_multi_init();
$ch = null;
$handles = array();
$delay = count($this->proxies) * 10000;
$running = null;
$proxies = array();
$response = null;
foreach ( $this->proxies as $p ) {
// Using the cache and the proxy already exists? Skip the rest of this crap
if ( $useCache && !empty(self::$valid[$p]) ) {
$proxies[] = $p;
continue;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_URL, self::VALIDATION_URL);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, true);
curl_setopt($ch, CURLOPT_PROXY, $p);
curl_setopt($ch, CURLOPT_NOBODY, true); // Also sets request method to HEAD
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_TIMEOUT, self::TIMEOUT);
curl_multi_add_handle($mh, $ch);
$handles[$p] = $ch;
}
// Execute the multi-handle
do {
curl_multi_exec($mh, $running);
usleep($delay);
} while ( $running );
// Get the results of the requests
foreach ( $handles as $proxy => $ch ) {
$status = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE);
// Great success
if ( $status >= 200 && $status < 300 ) {
self::$valid[$proxy] = true;
$proxies[] = $proxy;
}
else {
self::$valid[$proxy] = false;
}
// Cleanup individual handle
curl_multi_remove_handle($mh, $ch);
}
// Cleanup multiple handle
curl_multi_close($mh);
return $this->proxies = $proxies;
}
public function validate2($useCache=true) {
$proxies = array();
foreach ( $this->proxies as $proxy ) {
// Using the cache and the proxy already exists? Skip the rest of this crap
if ( $useCache && !empty(self::$valid[$proxy]) ) {
$proxies[] = $proxy;
continue;
}
list($host, $post) = explode(":", $proxy);
if ( $conn = @fsockopen($host, $post, $errno, $error, self::TIMEOUT) ) {
self::$valid[$proxy] = true;
$proxies[] = $proxy;
fclose($conn);
} else {
self::$valid[$proxy] = false;
}
}
return $this->proxies = $proxies;
}
}
到目前为止,我更喜欢cURL
方法,因为它允许我并行检查大批代理,这是快速的,而不是像fsockopen
那样一次检查。
我没有对代理做过多少工作,所以我很难判断这些方法中的任何一种是否足以验证代理是否可用,或者是否有更好的方法我缺少。
答案 0 :(得分:1)
嗯。尝试通过代理建立与安全(最可能可用)URL的连接,并检查错误,发出声音o.k.对我来说。
为了绝对最大的安全性,您可能希望在另一个验证网址(例如Google上的某些内容)中添加另一个调用,或者为了以防万一而进行两次调用。
答案 1 :(得分:1)
cURL是首选方法,因为multi_exec。
我不打算做两次检查,但立即执行google(或Proxyjudge)调用。 代理有时可以允许套接字,但只是不会取一个东西:因此你的cURL方法是安全的而不是那么慢。
如上面提到的Pekka:它取决于预期用途。
你是否使用了Charon并收获了大量的代理,我希望它们能够针对代理判断进行检查,我想知道周转时间(以避免代理速度慢)和无关紧要。
如果您想将它用作企业代理的监控系统,我只想确保它可以获取页面。
a(混乱)通过使用cURL获取URL来检查代理的示例。
TLDR:使用cURL,它可以处理并行请求,并且最稳定而不会减慢(通过不进行双重检查)。 http://www.oooff.com/php-affiliate-seo-blog/php-automation-coding/easy-php-proxy-checker-writing-tutorial/