运行 在后台使用多个 cURL PHP

Run multiple cURLs in background using PHP

我想在 Ubuntu 上使用 PHP 在后台 运行 多个 cURL 任务。 有几种方法,但我不确定应该选择哪一种。

方式一:使用OS的cURL

<?php

require_once('database.php');
$db = new Database; // SQLite3 database
$query = $db->query("SELECT * FROM users");
while ($user = $query->fetchArray(SQLITE3_ASSOC)) {
    exec("nohup curl --url http://example.com/?id=".$user['id']." &");
}

?>

方式二:http://www.paul-norman.co.uk/2009/06/asynchronous-curl-requests

<?php

require_once('database.php');
$db = new Database; // SQLite3 database
$query = $db->query("SELECT * FROM users");
while ($user = $query->fetchArray(SQLITE3_ASSOC)) {
     $ch = curl_init();

     curl_setopt($ch, CURLOPT_URL, "http://example.com/?id=".$user['id']);
     curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
     curl_setopt($ch, CURLOPT_TIMEOUT_MS, 1);

     curl_exec($ch);
     curl_close($ch);
}

?>

我不明白方法 2 的工作原理。有人可以解释一下吗?如果我有 100 000 - 500 000 个用户,我应该选择什么方式? 请注意,cURL 可以完成它的工作大约 2 - 8 秒。我不确定方法 2 是否可行,因为如果它可以完成它的工作几秒钟并且超时是设置为 1 毫秒 - 连接未完成时会停止吗?

编辑:方法 2 对我不起作用,因为需要更高的超时时间。方式 1 可能会导致您的计算机运行速度变慢。我这样做了:当我需要所有用户的 ID 时,我不会执行 1000 个请求,而是将数据库 (SQLite) 发送到我的另一台服务器。然后,它会查找 ID。

您的第一个代码将在后台 运行 curl 请求,即循环将 运行 N 次发出 N curl 请求并且 PHP 脚本将完成(无论卷曲请求)。

第二个选项将发出 CURL 请求,网络服务器将向您发送状态 504(超时),但脚本仍在后台 运行s -- 它只是停止向客户端发送数据。

我仍然不确定 1 毫秒超时,因为 connect_time 可能更高。