Как я могу запустить запрос FQL в фоновом режиме? (асинхронные вызовы API через php) - PullRequest
3 голосов
/ 04 сентября 2011

Я хотел бы выполнить особенно дорогостоящий fql-запрос в фоновом режиме, записать результаты в базу данных и получить его позже без необходимости ждать каждого шага.

Можете ли вы поделиться примером того, как асинхронно выполнять запрос на Facebook?

main.php

$uid = $facebook->getUser();
if ($uid) {
    try {
        echo $user;

        ////////////////////////////////////////////////////////
        // Run lengthy query here, asynchronously (async.php) //
        ////////////////////////////////////////////////////////
        //                                                    //
        // For example: $profile = $facebook->api('/me');     //
        // (I know this request doesn't take long, but        //
        // if I can run it in the background, it'll do.       //
        //                                                    //
        ////////////////////////////////////////////////////////


    } catch (FacebookApiException $e) {
        echo $e;
    }
}

async.php

$profile = $facebook->api('/me');
$run = mysql_query("INSERT INTO table (id) VALUES (" . $profile['id'] . ");";

complete.php

echo getProfileId(); // assume function grabs id from db, as stored via async.php

1 Ответ

2 голосов
/ 04 сентября 2011

Мое решение для запуска заданий PHP в фоновом режиме - просто сделать так, чтобы сам скрипт выполнял новый запрос, выполняющий фактическое задание.

Код, который я использовал ранее, следующий: я не уверен, что есть более элегантные решения ... но в прошлом он работал более чем достаточно для меня. Причина, по которой я использую fsock, а не file_get_contents () и т. Д., Конечно, так что мне не придется ждать окончания работы (что может нанести ущерб цели)

$sock = fsockopen("127.0.0.1", 80);
fwrite($sock, "GET /yourjoburl/ HTTP/1.1\r\n");
fwrite($sock, "Host: yourdomain.com\r\n");
fwrite($sock, "Connection: close\r\n");
fwrite($sock, "\r\n");
fflush($sock);
fclose($sock);

Итак, другой скрипт записывает результаты и ход выполнения в базу данных или что-то еще ... также помните, что MySQL поддерживает мьютексы, что означает, что вы можете легко предотвратить одновременное выполнение нескольких заданий ... или чтобы другие сценарии могли дождаться завершения задания.

PS. Причина, по которой я лично избегаю exec и всего такого, заключается в том, что работать с разными серверами, разными настройками, разными операционными системами и т. Д. Это просто хлопотно. Это работает одинаково на всех хостах, которые позволяют открывать сокеты. Хотя вам может потребоваться добавить закрытый ключ к запросу, который вы проверяете в задании, или проверить IP-адрес вызывающего абонента, чтобы другие пользователи не могли запускать задания.

РЕДАКТИРОВАТЬ: Это не проверено, но должно работать, если вы хотите переслать также куки, включая куки сессии.

$sock = fsockopen("127.0.0.1", 80);
fwrite($sock, "GET /yourjoburl/ HTTP/1.1\r\n");
fwrite($sock, "Host: yourdomain.com\r\n");
fwrite($sock, "Cookie: " . $_SERVER['HTTP_COOKIE'] . "\r\n");
fwrite($sock, "Connection: close\r\n");
fwrite($sock, "\r\n");
fflush($sock);
fclose($sock);
...