ホームページ >バックエンド開発 >PHPチュートリアル >PHP でマルチスレッドを実装するにはどうすればよいですか?

PHP でマルチスレッドを実装するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-25 06:24:12555ブラウズ

How Can I Implement Multithreading in PHP?

PHP でマルチスレッドを使用する方法

はじめに

PHP でマルチスレッド モデルを実装することは可能ですか、実際に実装するかどうかそれを実行するか、単にシミュレートします。以前は、オペレーティング システムに PHP 実行可能ファイルの別のインスタンスを強制的にロードして、他の同時プロセスを処理させることが提案されていました。

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

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

はい、PHP ではマルチスレッドに pthread を使用できます。

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);
        }
    }
}

// 创建一个数组
$stack = array();

// 启动多线程
foreach ( range("A", "D") as $i ) {
    $stack[] = new AsyncOperation($i);
}

// 启动所有线程
foreach ( $stack as $t ) {
    $t->start();
}

?>

実際のケース

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)) {
            /*
             * 如果请求大量数据,你可能想要使用 fsockopen 和 read,并在读取之间使用 usleep
             */
            $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));
/* 开始同步 */
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);
}

以上がPHP でマルチスレッドを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。