Использовать неблокирующие потоки для паралеллизации запросов REST-Api в PHP? - PullRequest
2 голосов
/ 29 июля 2011

Рассмотрим следующий сценарий:

  • http://www.restserver.com/example.php возвращает некоторый контент, с которым я хочу работать в моем веб-приложении.

  • Я не хочу загружать его, используя ajax (проблемы с SEO и т. Д.)

  • Моя страница генерирует 100 мс, для загрузки ресурса REST также требуется 100 мс.

  • Мы предполагаем, что время создания моего веб-сайта составляет 100 мсек, прежде чем я начну работать с ресурсом REST.То, что происходит после этого, можно игнорировать.

Пример кода:

Index.php моего сайта

<?
do_some_heavy_mysql_stuff(); // takes 100 ms
get_rest_resource(); // takes 100 ms
render_html_with_data_from_mysql_and_rest(); // takes neglectable amount of time
?>

Веб-сайт займет ~ 200 мс длягенерировать.

Я хочу превратить это в:

<?
Restclient::initiate_rest_loading(); // takes 0ms
do_some_heavy_mysql_stuff(); // takes 100 ms
Restclient::get_rest_resource(); // takes 0 ms because 100 ms have already passed since initiation
render_html_with_data_from_mysql_and_rest(); // takes neglectable amount of time
?>

Создание веб-сайта займет ~ 100 мс.

Для достижения этой цели я подумал об использовании чего-то вроде этого:

(Я почти уверен, что этот код не будет работать, потому что этот вопрос все о том, как спросить, как это сделать и возможно ли это. Я просто подумал, что какой-то наивный код может продемонстрировать это лучше всего)

class Restclient {
    public static $buffer;
    public static function initiate_rest_loading() {
        // open resource
        $handle = fopen ("http://www.restserver.com/example.php", "r");
        // set to non blocking so fgets will return immediately
        stream_set_blocking($handle,0);
        // initate loading, but return immediately to continue website generation
        fgets($handle, 40960);
    }
    public static function get_rest_resource() {
        // set stream to blocking again because now we really want the data
        stream_set_blocking($handle,1);
        // get the data and save it so templates can work with it
        self::$buffer = fgets($handle, 40960); templates
    }
}

Итак, последний вопрос:

  • Возможно ли это и как?

  • Что я должен отслеживать (переполнение внутреннего буфера,длины потоков и т. д.)

  • Существуют ли лучшие методы?

  • Хорошо ли это работает с ресурсами http?

  • Любой вход оценивается!

Надеюсь, я объяснил это понятно.Если что-то неясно, пожалуйста, оставьте комментарий, чтобы я мог перефразировать его!

1 Ответ

3 голосов
/ 29 июля 2011

Как «любой вход оценивается», вот мое:

  • То, что вы хотите, называется асинхронным (вы хотите что-то, пока что-то еще делается) вbackground ").

Чтобы решить вашу проблему, я подумал об этом:

  1. Разделите do_some_heavy_mysql_stuff и get_rest_resource в двух разных сценариях PHP.

  2. Использовать cURL «multi» для одновременных запросов.Пожалуйста, проверьте:

Таким образом, вы можете выполнять оба сценария одновременно.Используя мультифункциональность cURL, вы можете одновременно звонить на номера http://example.com/do_some_heavy_mysql_stuff.php и http://example.com/get_rest_resource.php, а затем играть с результатами, как только они станут доступны.

Это мои первые мысли, и Iim делится имис тобой.Может быть, есть разные и более интересные подходы ... Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...