Я хочу запустить несколько задач cURL в фоновом режиме с помощью PHP на Ubuntu. Есть несколько способов, но я не уверен, какой из них я должен выбрать.
Способ 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 мс – будет ли соединение остановлено, когда оно не будет выполнено?
EDIT : Way 2 не работает для меня, потому что необходим более высокий тайм-аут. Способ 1 может привести к замедлению работы вашего компьютера. Я сделал это: когда мне нужен идентификатор всех пользователей, я не делаю 1000 запросов, но я отправляю базу данных (SQLite) на другой сервер. Затем он ищет идентификаторы.
Ваш первый код будет запускать запрос curl в фоновом режиме, т. Е. Tle loop будет запускать N количество раз, выдавая запрос N curl, и PHP-скрипт будет завершен (независимо от запроса curl).
Второй вариант выдаст запрос CURL, и веб-сервер отправит вам статус 504 (Timeout), однако сценарий по-прежнему работает в фоновом режиме – он просто прекращает отправку данных клиенту.
Тем не менее я не уверен с тайм-аутом 1 мс, потому что connect_time может быть выше.