PHP如何按顺序调用代理列表 实现代理依次取用而非随机选取
PHP顺序轮询代理IP的代码调整方案
你原有代码通过rand(0, count($proxylist) - 1)生成随机数组索引,所以每次拿到的代理都是随机的。要实现按列表顺序从头到尾循环取用代理,核心是解决PHP请求无状态的问题:每次请求结束后内存变量会销毁,所以需要持久化存储当前取用的代理位置索引,下次请求读取索引后自增,到列表末尾就重置为0从头开始。
具体实现代码(无额外依赖,用文本文件存索引)
<?php // 读取代理列表,自动过滤空行、每行首尾的换行和空格 $proxylist = array_filter(array_map('trim', file("proxies.txt")), function($line) { return strlen($line) > 0; }); // 索引存储文件,用来记录当前已经用到了代理列表的第几个位置 $indexStorage = 'proxy_current_index.txt'; // 索引文件不存在时初始化,默认从第一个代理(索引0)开始 if (!file_exists($indexStorage)) { file_put_contents($indexStorage, '0'); } // 读取当前索引值 $currentIndex = (int)file_get_contents($indexStorage); // 索引超出代理列表总长度时,重置为0实现循环 if ($currentIndex >= count($proxylist)) { $currentIndex = 0; } // 解析当前索引对应的代理信息 $proxyItem = explode(":", trim($proxylist[$currentIndex])); $proxyIp = trim($proxyItem[0]); $proxyPort = trim($proxyItem[1]); $formattedProxy = $proxyIp . ":" . $proxyPort; // 索引自增后存回文件,供下一次请求使用 file_put_contents($indexStorage, (string)($currentIndex + 1)); echo $formattedProxy;
注意事项
- 代码运行前请确保PHP对当前代码目录有读写权限,会自动生成
proxy_current_index.txt文件存储索引,不要手动修改这个文件里的数字 - 上述实现适合低并发场景,如果你的请求并发量很高,文件读写可能出现索引重复的问题,可以把索引存储替换为Redis,用
INCR原子命令做自增,准确性和性能更好 - 代码默认兼容
proxies.txt里存在空行、每行带多余空格/换行的情况,不需要提前手动清理代理列表文件
内容的提问来源于stack exchange,提问作者Arees Chan
相关产品推荐
相关产品推荐

