Maison  >  Article  >  développement back-end  >  Comment utiliser Fibers pour obtenir la concurrence dans PHP8.0

Comment utiliser Fibers pour obtenir la concurrence dans PHP8.0

PHPz
PHPzoriginal
2023-05-14 09:01:352013parcourir

Avec le développement continu de la technologie Internet moderne, le nombre de visites de sites Web augmente, ce qui impose également des exigences plus élevées en matière de capacités de traitement simultanées du serveur. Comment améliorer les capacités de traitement simultané du serveur est un problème auquel chaque développeur doit faire face. Dans ce contexte, PHP8.0 introduit la nouvelle fonctionnalité Fibers, permettant aux développeurs PHP de maîtriser une nouvelle façon de traiter la concurrence.

Qu'est-ce que les fibres ?

Tout d'abord, nous devons comprendre ce que sont les fibres. Les fibres sont des threads légers qui prennent en charge efficacement le traitement asynchrone du code PHP. Le code PHP traditionnel est monothread et ne peut pas véritablement implémenter d'opérations asynchrones. Il doit souvent attendre la fin des opérations d'E/S, ce qui entraîne un blocage inutile. L'émergence de Fibers résout ce problème, permettant au code PHP de prendre en charge le traitement simultané comme d'autres langages tels que Node.js.

Utiliser les fibres pour obtenir la simultanéité

Parlons de la façon d'utiliser les fibres pour obtenir la simultanéité.

  1. Installer l'extension Swoole

En PHP8.0, Fibers est implémenté sur la base de l'extension Swoole, vous devez donc d'abord installer l'extension Swoole. Il peut être installé via PECL :

pecl install swoole 
  1. Création d'objets Fiber

L'utilisation de Fibers pour obtenir la concurrence nécessite la création d'objets Fiber. La création d'objets Fibre peut être réalisée en créant des fonctions anonymes ou des méthodes de classe. Par exemple :

$fiber = new SwooleFiber(function() {
  // 这里是并发要执行的代码
});

或

class MyClass {
  public function onReceive($server, $fd, $reactor_id, $data) {
    // 这里是并发要执行的代码
  }
}
$fiber = new SwooleFiber([$myClass, 'onReceive']);
  1. Start Fiber

Après avoir créé l'objet Fiber, vous devez démarrer Fiber. Pour démarrer Fiber, vous pouvez utiliser la méthode start ou la méthode suspend. Utilisez la méthode start pour démarrer Fiber immédiatement et exécuter le code défini dans Fiber. Par exemple : start方法或者suspend方法。使用start方法可以立即启动Fiber并执行Fiber中定义的代码。例如:

$fiber->start();

suspend方法则可以暂停Fiber的执行,等待下一次执行。例如:

$fiber->suspend();
  1. 切换Fiber

在Fiber中,使用swoole_fiber_switch函数可以切换Fiber的执行。例如:

function foo() {
  echo 'foo ';
  yield;
  echo 'bar ';
  yield;
  echo 'baz';
}
$fiber1 = new SwooleFiber($foo);
$fiber2 = new SwooleFiber($foo);
$fiber1->start();
$fiber2->start();
while ($fiber1->getStatus() !== SwooleFiber::STATUS_DEAD || $fiber2->getStatus() !== SwooleFiber::STATUS_DEAD) {
  if ($fiber1->getStatus() !== SwooleFiber::STATUS_DEAD) {
    swoole_fiber_switch($fiber1);
  }
  if ($fiber2->getStatus() !== SwooleFiber::STATUS_DEAD) {
    swoole_fiber_switch($fiber2);
  }
}

在上面的例子中,我们创建了两个Fiber对象,并让它们交替执行,输出foobarbaz

  1. 使用协程API

除了手动切换Fiber外,Swoole扩展还提供了一些协程API,可以方便地进行并发处理。例如,使用Co::create方法可以创建协程对象,并使用Co::parallel可以让多个协程并行执行。例如:

$urls = [
  'http://example.com/foo',
  'http://example.com/bar',
  'http://example.com/baz',
];
$coros = [];
foreach ($urls as $url) {
  $coros[] = Co::create(function() use ($url) {
    $html = file_get_contents($url);
    return strlen($html);
  });
}
$results = Co::parallel($coros);

在上面的例子中,我们创建了三个协程对象,分别访问三个URL,最后使用Co::parallelrrreee

La méthode suspend peut suspendre l'exécution de Fiber et attendre la prochaine exécution. Par exemple :

rrreee

    Switch Fiber

    #🎜🎜#Dans Fiber, utilisez la fonction swoole_fiber_switch pour changer Exécution fibre. Par exemple : #🎜🎜#rrreee#🎜🎜#Dans l'exemple ci-dessus, nous créons deux objets Fiber et les laissons s'exécuter alternativement pour générer foobarbaz. #🎜🎜#
      #🎜🎜#Utiliser l'API coroutine#🎜🎜##🎜🎜##🎜🎜#En plus de changer manuellement de fibre, l'extension Swoole fournit également des API coroutine pour faciliter l'exécution simultanée traitement. Par exemple, utilisez la méthode Co::create pour créer un objet coroutine et utilisez Co::parallel pour permettre à plusieurs coroutines de s'exécuter en parallèle. Par exemple : #🎜🎜#rrreee#🎜🎜#Dans l'exemple ci-dessus, nous avons créé trois objets coroutine, accédé à trois URL respectivement et finalement utilisé la méthode Co::parallel pour combiner ces trois coroutines pour exécuter en parallèle, obtenir des résultats et les restituer. #🎜🎜##🎜🎜#Summary#🎜🎜##🎜🎜#Fibers est une nouvelle fonctionnalité introduite dans PHP8.0, qui utilise pleinement les capacités de traitement simultané de l'expansion Swoole. L'utilisation de Fibers peut facilement implémenter le traitement asynchrone du code PHP et améliorer les capacités de traitement simultané du serveur. Bien entendu, les fibres doivent également être utilisées avec prudence et il convient de veiller à éviter des problèmes tels que la concurrence entre les ressources. J'espère que l'introduction de cet article pourra aider les développeurs PHP à mieux comprendre les fibres et à effectuer un meilleur traitement simultané. #🎜🎜#

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn