Асинхронная обработка API с PHP - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть эта PHP функция, которая регистрирует посетителей в файл .txt (по соображениям безопасности). Он использует API, чтобы получить их местоположение. Он отлично работает на localhost, но когда он действительно работает, он записывает пустые значения. Я предполагаю, что это потому, что функции запускаются до того, как API успел вернуть данные. Есть ли способ написать что-то вроде Javascript promise или какую-нибудь асинхронную функцию, которая будет ожидать возврата данных, прежде чем записывать их в журнал?

Это то, что у меня сейчас есть:

function getLocation() {
    $query = @unserialize (file_get_contents('http://ip-api.com/php/'));
    if ($query && $query['status'] == 'success') {
        $user = $_SERVER['REMOTE_ADDR'].' - '.date("H:i:s d-m-Y").' - '.$query['country'].', '.$query['regionName'].', '.$query['city'].', '.$query['zip'];
        $file = '../logs/userlog.txt';
        $currentFileData = file_get_contents($file);
        $currentFileData .= $user . PHP_EOL;
        file_put_contents($file, $currentFileData);
    }
}

Какой вывод должен быть:

127.0.0.1 - 11:59:33 03-04-2020 - South Africa, Western Cape, Cape Town, 8001

Что такое фактический вывод:

127.0.0.1 - 11:59:33 03-04-2020 - , , , 

Ваша помощь будет в значительной степени оценили!

Ответы [ 2 ]

3 голосов
/ 03 апреля 2020

Вы не передаете IP-адрес, указанный в документации после / php / части URL. Это должно быть

$query = @unserialize (file_get_contents('http://ip-api.com/php/' . $_SERVER['REMOTE_ADDR']));
0 голосов
/ 03 апреля 2020

решено: Благодаря посту @ DanielProtopopov я обнаружил в документации, что эта php версия API устарела. Таким образом, используя исправление @ DanielProtopopov, я должен использовать JSON API для его работы:

$query = json_decode(file_get_contents('http://ip-api.com/json/' . $_SERVER['REMOTE_ADDR']));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...