使用PHP ping数千个网站的最快方法

使用PHP ping数千个网站的最快方法,php,performance,Php,Performance,我目前正在使用CURL+PHP ping URL。但在我的脚本中,发送一个请求,然后等待响应,然后再发送另一个请求。。。如果每个响应需要~3秒,则ping 10k链接需要8个多小时 是否有一种方法可以同时发送多个请求,比如某种多线程 谢谢。PHP没有真正的多线程功能 但是,您始终可以异步发出CURL请求 这将允许您触发批ping,而不是一次触发一个ping 参考: 编辑:请记住,在终止之前,您必须让PHP等待所有响应返回 基督教徒 您可以使用fork来派生php进程,也可以查看curl内置的多

我目前正在使用CURL+PHP ping URL。但在我的脚本中,发送一个请求,然后等待响应,然后再发送另一个请求。。。如果每个响应需要~3秒,则ping 10k链接需要8个多小时

是否有一种方法可以同时发送多个请求,比如某种多线程


谢谢。PHP没有真正的多线程功能

但是,您始终可以异步发出CURL请求

这将允许您触发批ping,而不是一次触发一个ping

参考:

编辑:请记住,在终止之前,您必须让PHP等待所有响应返回

  • 基督教徒

您可以使用fork来派生php进程,也可以查看curl内置的多线程

我会将ping脚本作为一个新进程来使用和执行。或多个进程

您可以使用所有要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多路复用策略。简而言之