Рубрики
Uncategorized

Процесс PHP: go + Chan + отложить

Автор оригинала: David Wong.

Язык Swoole4 by PHP обеспечивает мощный режим программирования CSP Co. Нижний слой обеспечивает 3 Ключевые слова, могут легко выполнять все виды функций.

  • Swoole4 Предоставлено PHP Ассоциация Грамматика из Golang В этом направлении ПЕРЕЙТИ Команда разработчиков Дань уважения
  • PHP+Свул Процесс может работать с Golang Хорошо дополняется. Golang Статический язык, строгий и мощный, с хорошей производительностью, PHP+Swool : динамический язык, гибкий и простой в использовании

Эта статья основана на Swool-4.2.9 и PHP-7.2.9 издании

  • перейти : создайте процесс
  • чан : создайте канал
  • отложить : задача задержки, выполняется при завершении процесса, сначала входит, а затем выходит

это 3 Базовой реализацией каждой функции является Операция с памятью , без ввода-вывода Потребления ресурсов. Так же, как PHP Из Массива То же самое очень дешево. При необходимости его можно использовать напрямую. Это и сокет и файл Последнему необходимо подать заявку на дескрипторы портов и файлов из операционной системы, что может привести к блокировке чтения и записи Ввода-вывода Ждать.

Использование функции go позволяет выполнять функцию одновременно. Во время программирования, если часть логики может выполняться одновременно, она может быть помещена в go В процессе сотрудничества.

Последовательное выполнение

function test1() 
{
    sleep(1);
    echo "b";
}
    
function test2() 
{
    sleep(2);
    echo "c";
}

test1();
test2();

Результат выполнения:

[email protected]:~$ time php b1.php
bc
real    0m3.080s
user    0m0.016s
sys     0m0.063s
[email protected]:~$

В приведенном выше коде test1 и test2 Он будет выполняться последовательно и должен быть 3 Секунды до завершения.

Одновременное выполнение

Используйте go Создайте процесс, который позволяет test1 и test2 Две функции становятся параллельными.

Swoole\Runtime::enableCoroutine();

go(function () 
{
    sleep(1);
    echo "b";
});
    
go(function () 
{
    sleep(2);
    echo "c";
});

Swool\Runtime::включить сопрограмму() Эффект заключается в PHP Предоставленном потокеспящем режиме |/、 |/pdo 、 |/mysql |/、 redis Переключении с синхронного блока на асинхронное взаимодействие Ввод-вывод

Результат выполнения:

[email protected]:~$ time php co.php
bc
real    0m2.076s
user    0m0.000s
sys     0m0.078s
[email protected]:~$

Вы можете видеть, что он используется только здесь 2 Секунды до завершения.

  • Время последовательного выполнения равно общему времени выполнения всех задач: t1+t2+t3...
  • Время одновременного выполнения равно максимальному времени выполнения всех задач: max(t1, t2, t3, ...)

Да. перейти После ключевых слов параллельное программирование намного проще. В то же время это приносит новые проблемы, если таковые имеются 2 Два процесса выполняются одновременно. Другой процесс должен полагаться на результаты выполнения двух процессов. Что, если мы решим эту проблему?

Ответ заключается в использовании каналов( Канал ) в Swoole4 Используется в сотрудничестве новый канал Вы можете создать канал. Канал можно понимать как очередь со своим собственным расписанием. Он имеет два интерфейса push и pop :

  • push : запись контента на канал. Если он заполнен, он перейдет в состояние ожидания и автоматически восстановится, когда освободится место
  • pop : прочитайте контент с канала. Если он пуст, он перейдет в состояние ожидания и автоматически восстановится при наличии данных

Это может быть легко реализовано с помощью каналов Параллельное управление

$chan = new chan(2);

1
go (function () use ($chan) {
    $result = [];
    for ($i = 0; $i < 2; $i++)
    {
        $result += $chan->pop();
    }
    var_dump($result);
});

2
go(function () use ($chan) {
   $cli = new Swoole\Coroutine\Http\Client('www.qq.com', 80);
       $cli->set(['timeout' => 10]);
       $cli->setHeaders([
       'Host' => "www.qq.com",
       "User-Agent" => 'Chrome/49.0.2587.3',
       'Accept' => 'text/html,application/xhtml+xml,application/xml',
       'Accept-Encoding' => 'gzip',
   ]);
   $ret = $cli->get('/');
   //$cli - > body response content is too large, here use HTTP status code as test
   $chan->push(['www.qq.com' => $cli->statusCode]);
});

3
go(function () use ($chan) {
   $cli = new Swoole\Coroutine\Http\Client('www.163.com', 80);
   $cli->set(['timeout' => 10]);
   $cli->setHeaders([
       'Host' => "www.163.com",
       "User-Agent" => 'Chrome/49.0.2587.3',
       'Accept' => 'text/html,application/xhtml+xml,application/xml',
       'Accept-Encoding' => 'gzip',
   ]);
   $ret = $cli->get('/');
   //$cli - > body response content is too large, here use HTTP status code as test
   $chan->push(['www.163.com' => $cli->statusCode]);
});

Результат выполнения:

[email protected]:~/swoole-src/examples/5.0$ time php co2.php
array(2) {
  ["www.qq.com"]=>
  int(302)
  ["www.163.com"]=>
  int(200)
}

real    0m0.268s
user    0m0.016s
sys     0m0.109s
[email protected]:~/swoole-src/examples/5.0$

Используйте здесь go Созданный 3 Индивидуальный процесс 2 Ассоциация за мир 3 Отдельные запросы qq.com и 163.com Домашняя страница. Ассоциация 1 Нужно получить Http Результат запроса. Он используется здесь chan Для достижения параллельного управления.

  • Ассоциация 1 Дважды переключите канал pop , поскольку очередь пуста, она перейдет в состояние ожидания
  • Ассоциация 2 Ассоциация за мир 3 Когда выполнение завершено, push Данные, процесс 1 Получите результаты, продолжайте снижаться

В процессе совместного программирования некоторые задачи, возможно, потребуется выполнять автоматически при выходе из программы совместного выполнения для выполнения работ по очистке. Быть похожим на PHP Из register_shutdown_function В Swoole4 Может использоваться в отложенной реализации.

Swoole\Runtime::enableCoroutine();

go(function () {
    echo "a";
    defer(function () {
        echo "~a";
    });
    echo "b";
    defer(function () {
        echo "~b";
    });
    sleep(1);
    echo "c";
});

Результат выполнения:

[email protected]:~/swoole-src/examples/5.0$ time php defer.php
abc~b~a
real    0m1.068s
user    0m0.016s
sys     0m0.047s
[email protected]:~/swoole-src/examples/5.0$

Swoole4 Предоставлено Go + Chan + Отличается от PHP Принес новый CSP Режим параллельного программирования. Гибкое использование Swoole4 Предоставляемые функции позволяют решать задачи проектирования и разработки различных сложных функций в работе.