我想在Ubuntu上使用PHP在后台运行多个cURL任务。 有几种方法,但我不确定应该选择哪一种。
方式1:使用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']." &");
}
?>
方式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如何运作。有人可以解释一下吗?如果我有10万到50万用户,我应该选择什么方式? 请注意cURL可以完成大约2-8秒的工作。我不确定方法2是否可行,因为如果它可以完成其工作几秒钟并且超时设置为1 ms - 未完成时是否会停止连接?
编辑 :方式2对我不起作用,因为需要更高的超时时间。方式1可能会导致计算机工作速度变慢。我这样做了:当我需要所有用户的ID时,我不做1000个请求,但是我将数据库(SQLite)发送到我的另一个服务器。然后,它会查找ID。
答案 0 :(得分:2)
你的第一个代码将在后台运行curl请求,即循环将运行N次,发出N个curl请求,PHP脚本将完成(无论卷曲请求如何)。
第二个选项将发出CURL请求,Web服务器将向您发送状态504(超时),但脚本仍然在后台运行 - 它只是停止向客户端发送数据。
我仍然不确定1ms超时,因为connect_time可能更高。