使用PHP ping数千个网站的最快方法
我目前正在使用CURL+PHP ping URL。但在我的脚本中,发送一个请求,然后等待响应,然后再发送另一个请求。。。如果每个响应需要~3秒,则ping 10k链接需要8个多小时 是否有一种方法可以同时发送多个请求,比如某种多线程使用PHP ping数千个网站的最快方法,php,performance,Php,Performance,我目前正在使用CURL+PHP ping URL。但在我的脚本中,发送一个请求,然后等待响应,然后再发送另一个请求。。。如果每个响应需要~3秒,则ping 10k链接需要8个多小时 是否有一种方法可以同时发送多个请求,比如某种多线程 谢谢。PHP没有真正的多线程功能 但是,您始终可以异步发出CURL请求 这将允许您触发批ping,而不是一次触发一个ping 参考: 编辑:请记住,在终止之前,您必须让PHP等待所有响应返回 基督教徒 您可以使用fork来派生php进程,也可以查看curl内置的多
谢谢。PHP没有真正的多线程功能 但是,您始终可以异步发出CURL请求 这将允许您触发批ping,而不是一次触发一个ping 参考: 编辑:请记住,在终止之前,您必须让PHP等待所有响应返回
- 基督教徒
curl具有“多请求”功能,这本质上是一种处理线程请求的方法。研究本页上的示例:运行多个php进程 过程1:pings站点1-1000 过程2:pings站点1001-2001 …您可以使用PHP exec()函数执行unix命令,如wget来完成此任务
exec('wget -O - http://example.com/url/to_ping /dev/null 2>&1 &');
这绝不是一个理想的解决方案,但确实完成了任务,通过将输出发送到/dev/null并在后台运行它,您无需等待响应即可进入下一个“ping”
注意:出于安全目的,某些服务器禁用了exec()。使用curl中可用的
curl\u multi.*
函数。看
您必须将URL分组为较小的集合:一次添加所有10k链接不太可能奏效。因此,围绕以下代码创建一个循环,并在$url
变量中使用URL子集(如100)
$all = array();
$handle = curl_multi_init();
foreach ($urls as $url) {
$all[$url] = curl_init();
// Set curl options for $all[$url]
curl_multi_add_handle($handle, $all[$url]);
}
$running = 0;
do {
curl_multi_exec($handle, $running;);
} while ($running > 0);
foreach ($all as $url => $curl) {
$content = curl_multi_getcontent($curl);
// do something with $content
curl_multi_remove_handle($handle, $curl);
}
curl_multi_close($handle);
首先,我想指出的是,这不是一个基本的任务,你可以做任何类型的共享托管提供商。我想你肯定会被禁的 因此,我假设您能够编译软件(VPS?)并在后台启动长时间运行的进程(使用)。我会使用一个(我非常喜欢作为PHP客户端库)来保存列表中的消息。(P.S:我更愿意在node.js/python中编写这篇文章(下面的解释适用于PHP),因为我认为这项任务可以很快用这些语言编写。我将尝试编写它,稍后在github上发布代码。) Redis: Redis是一种高级键值存储。 它类似于memcached,但是 数据集不是易变的,并且 可以是字符串,与中的完全相同 memcached,但也包括列表、集合和 有序集合。所有这些数据类型都可以 被原子操作操纵 要推/弹出元素,请添加/删除 元素,执行服务器端联合, 交集,集合之间的差异, 等等Redis支持不同的 排序能力 然后启动两个工作进程,这些进程将从列表中删除(如果没有可用的消息,则阻塞)消息 Blpop: 这就是Redis真正的优势所在 有趣。BLPOP和BRPOP是 LPOP的阻塞等价物和 RPOP命令。如果队列中的任何 它们指定的键在中有一个项 它,该项目将弹出和 返回。如果没有,Redis 客户端将阻塞,直到密钥变为 可用(或超时过期)- 指定0表示无限超时) Curl并不完全是ping(ICMP-Echo),但我想一些服务器可能会阻止这些请求(安全性)。我首先尝试(使用nmap snippet部分)主机,如果ping失败,则返回curl,因为ping比使用curl更快 Libcurl: 免费的客户端URL传输 库,支持FTP、FTPS、Gopher (协议)、HTTP、HTTPS、SCP、SFTP、, TFTP、TELNET、DICT、文件、LDAP、LDAP、, IMAP、POP3、SMTP和RTSP(最后 四个仅在更新的版本中 7.20.0或2010年2月9日) Ping: Ping是一种计算机网络 用于测试的管理实用程序 网络上主机的可达性 Internet协议(IP)网络和到 测量车辆的往返时间 从源服务器发送的消息 主机到目标计算机。这个 这个名字来自主动声纳 术语Ping通过发送 因特网控制消息协议 (ICMP)将请求数据包回显到 目标主机正在等待ICMP 答复 但接下来您应该执行一个HEAD请求,只检索header来检查主机是否启动。否则,您也将下载url的内容(需要时间/成本带宽) 头部: HEAD方法与GET方法相同 但服务器不能返回 响应中的消息正文。这个 HTTP中包含的元信息 响应头请求的头 应与信息相同 为响应GET请求而发送。 此方法可用于获取 有关实体的元信息 由请求默示,无需 转移实体本身。 这种方法通常用于测试 超文本链接的有效性, 可访问性,以及最近的 修改
然后每个辅助进程都应该使用curl\u multi。我认为link可以很好地实现这一点(除了它不满足head请求)。要在每个进程中具有某种并发性。要处理此类任务,请尝试I/O多路复用策略。简而言之