PHPアプリケーションでマルチスレッドを使用するにはどうすればいいですか?質問する

PHPアプリケーションでマルチスレッドを使用するにはどうすればいいですか?質問する

PHP でマルチスレッド モデルを実際に実装する方法、または単にシミュレートする方法はありますか。しばらく前に、オペレーティング システムに PHP 実行ファイルの別のインスタンスを強制的にロードさせ、他の同時プロセスを処理できると提案されました。

これの問題は、PHP コードの実行が終了しても、PHP インスタンスはメモリ内に残ります。PHP 内からインスタンスを強制終了する方法がないためです。したがって、複数のスレッドをシミュレートしている場合は、何が起こるかは想像がつくでしょう。そのため、私はまだ、PHP 内からマルチスレッドを効果的に実行またはシミュレートする方法を探しています。何かアイデアはありますか?

ベストアンサー1

警告: この拡張機能はメンテナンスされておらず、廃止されていると見なされます。警告: pthreads 拡張機能は Web サーバー環境では使用できません。したがって、PHP でのスレッド化は CLI ベースのアプリケーションのみに制限されます。警告: pthreads (v3) は PHP 7.2 以降でのみ使用できます。これは、7.0 および 7.1 では ZTS モードが安全ではないためです。

https://www.php.net/manual/en/intro.pthreads.php


PHPではマルチスレッドが可能です

はい、PHPでマルチスレッドを実行することができます。pスレッド

からPHPドキュメント:

pthreads は、PHP でのマルチスレッドに必要なすべてのツールを提供するオブジェクト指向 API です。PHP アプリケーションは、スレッド、ワーカー、およびスレッド オブジェクトを作成、読み取り、書き込み、実行、および同期できます。

警告: pthreads 拡張機能は Web サーバー環境では使用できません。したがって、PHP でのスレッド化は CLI ベースのアプリケーションのみに限定する必要があります。

簡単なテスト

#!/usr/bin/php
<?php
class AsyncOperation extends Thread {

    public function __construct($arg) {
        $this->arg = $arg;
    }

    public function run() {
        if ($this->arg) {
            $sleep = mt_rand(1, 10);
            printf('%s: %s  -start -sleeps %d' . "\n", date("g:i:sa"), $this->arg, $sleep);
            sleep($sleep);
            printf('%s: %s  -finish' . "\n", date("g:i:sa"), $this->arg);
        }
    }
}

// Create a array
$stack = array();

//Initiate Multiple Thread
foreach ( range("A", "D") as $i ) {
    $stack[] = new AsyncOperation($i);
}

// Start The Threads
foreach ( $stack as $t ) {
    $t->start();
}

?>

ファーストラン

12:00:06pm:     A  -start -sleeps 5
12:00:06pm:     B  -start -sleeps 3
12:00:06pm:     C  -start -sleeps 10
12:00:06pm:     D  -start -sleeps 2
12:00:08pm:     D  -finish
12:00:09pm:     B  -finish
12:00:11pm:     A  -finish
12:00:16pm:     C  -finish

2回目の実行

12:01:36pm:     A  -start -sleeps 6
12:01:36pm:     B  -start -sleeps 1
12:01:36pm:     C  -start -sleeps 2
12:01:36pm:     D  -start -sleeps 1
12:01:37pm:     B  -finish
12:01:37pm:     D  -finish
12:01:38pm:     C  -finish
12:01:42pm:     A  -finish

実世界の例

error_reporting(E_ALL);
class AsyncWebRequest extends Thread {
    public $url;
    public $data;

    public function __construct($url) {
        $this->url = $url;
    }

    public function run() {
        if (($url = $this->url)) {
            /*
             * If a large amount of data is being requested, you might want to
             * fsockopen and read using usleep in between reads
             */
            $this->data = file_get_contents($url);
        } else
            printf("Thread #%lu was not provided a URL\n", $this->getThreadId());
    }
}

$t = microtime(true);
$g = new AsyncWebRequest(sprintf("http://www.google.com/?q=%s", rand() * 10));
/* starting synchronization */
if ($g->start()) {
    printf("Request took %f seconds to start ", microtime(true) - $t);
    while ( $g->isRunning() ) {
        echo ".";
        usleep(100);
    }
    if ($g->join()) {
        printf(" and %f seconds to finish receiving %d bytes\n", microtime(true) - $t, strlen($g->data));
    } else
        printf(" and %f seconds to finish, request failed\n", microtime(true) - $t);
}

おすすめ記事