使用 PHP 在后台运行多个 cURL


Run multiple cURLs in background using PHP

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

方式1:使用操作系统的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']." &");
}
?>

方式2: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 请求,即 tle 循环将运行 N 次发出 N 个 curl 请求,PHP 脚本将完成(与 curl 请求无关)。

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

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