使用PHP

时间:2016-03-08 18:04:27

标签: php curl background-process traffic

我想在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。

1 个答案:

答案 0 :(得分:2)

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

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

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