好的,我基本上想要的是,一旦来自“proxies.txt”的代理被用于它然后被移动到诸如“used.txt”之类的文件,所以只有新的未使用的代理保留在“代理”中.txt“因为id抓取程序我每次启动都从列表的最顶端开始,每个代理每24小时只能抓一次ID。
{
switch(@$argv[1]) {
case '0':
default:
$list = fopen('proxies.txt', 'r');
while(!feof($list))
{
$proxy = fgets($list);
$idGen->generate($proxy);
}
fclose($list);
break;
}
$loop++;
usleep(50000);
$idGen->report('Starting loop #'.$loop);
}
还有一种方法可以让它删除死代理当前的curl设置
$tries = 0;
$xData = '';
$timeout = 3;
//echo "Tries -> ";
while($xData=='' && $tries < 3) {
$ch = curl_init(); //curl init :D
curl_setopt($ch, CURLOPT_URL, 'website.com/idauth.php?t='.rand(100000000000,1000000000000000000000000000000000)); //url
curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
$data = curl_exec($ch);
curl_close($ch);
$rdata = $data;
if(@$data{0} == '<') {
return;//Bad Proxy Detected.
}
if(strpos($data, 'Not Found') != FALSE) {
$data = '&UserId=0&k1=0&k2=0';
}
if($data != '&UserId=0&k1=0&k2=0') {
if(strpos($data, '&k2=0') != FALSE) {
$data = '&UserId=0&k1=0&k2=0';
} else {
$xData = $data;
}
} else {
echo $data."\n";
}
$tries++;
}
if($xData=='') {
return;//Dead Proxy
}
答案 0 :(得分:0)
将整个代理列表加载到一个数组中,进行操作并在完成后重写整个文件。
当您在请求中执行多线程时,可能会在数据库中更好地工作,这对您的问题来说似乎很自然。在这种情况下,只需删除等。
在你的顶级函数范围之外的某个地方:
$proxies = array()
function load_proxies() {
global $proxies;
$list = fopen('proxies.txt', 'r');
while(!feof($list))
{
$proxy = fgets($list);
$proxies[] = $proxy;
}
fclose($list);
}
function get_proxy() {
global $proxies;
return array_pop($proxies);
//here you may want to save over proxies.txt, and write out the chosen proxy to used.txt
}