3

wampserver を使用して、ローカル コンピューターでワードプレス コードをテストおよび実行しています。pthread を実行するために、次の手順に従いました。

1)http://windows.php.net/downloads/pecl/releases/pthreads/0.44/からpthread zipファイルを取得しました (私のマシンにはphp 5.3.13がありphp_pthreads-0.44-5.3-ts-vc9-x86.zip file、上記のリンクからダウンロードしました)。

2) zip ファイルを解凍します。php_pthreads.dll をC:\wamp\bin\php\php5.3.13\extディレクトリに移動しました。

3) pthreadVC2.dll をC:\wamp\bin\php\php5.3.13ディレクトリに移動しました。

4)次に、ファイルの先頭にC:\wamp\bin\php\php5.3.13\php.iniコードを開いて追加しました。extension=php_pthreads.dll

しかし、次のコードを実行しようとすると:

<?php
class My extends Thread {
    public function run() {
        printf("%s is Thread #%lu\n", __CLASS__, $this->getThreadId());
    }
}
$my = new My();
$my->start();
?>

次のエラーが表示されます。

Fatal error: Class 'Thread' not found in C:\wamp\www\wp-admin\includes\post.php on line 2

コンピューターに pthreads をインストールして、php で使用する方法を教えてください。他のソフトウェアをインストールする必要がありますか?

4

6 に答える 6

3

wampserver には、2 つの別々の場所に php.ini があることに気付きました。1 つは /wamp/bin/php/php5... ディレクトリにあり、もう 1 つは /wamp/bin/apache/apache.../bin ディレクトリにあります (「...」はバージョン番号を表します)。 . 2 つのファイルは同一である必要があります。なぜなら、wampserver の全体的な起動手順によって、明らかに両方とも異なる時間にロードされるからです。

(注: 私はこれを最近発見したばかりで、wampserver で凝ったことをするのは「時代遅れ」である可能性があります。おそらく、他の誰もが両方のファイルを長い間扱ってきたので、この単純なことがうまくいくかどうかはわかりません。あなたの問題を解決してください; 私はここに来て、マルチスレッド処理に関する情報を自分で探しました. :)

もう1つ。このページによると: www.php.net/manual/en/pthreads.requirements.php pthreads を機能させるには、PHP を "--enable-zts" でコンパイルする必要があります。wampserver の PHP 部分がそのようにコンパイルされたという証拠を見つけることができませんでした。


(数か月後) すぐにスレッド処理を行う必要はないと判断したので、実際に必要になるまで、他のことを続けました。WampServer にコンパイルされた PHP のバージョンは、"pthread" 拡張機能をサポートしていると言えますが、最初にいくつかのセットアップ作業が必要です。私が見た指示では、(ダウンロードして解凍した後に) いくつかの .dll ファイルを特定の場所に配置することが言及されていましたが、それは私にとってはうまくいきませんでした。それらを \Windows\System32 ディレクトリにコピーするとうまくいきました。(それらを \apache...\bin ディレクトリに置くこともできます。そこには他の php .dll ファイルがいくつかあります。)

その後、あなたがしたのと同じように、別のスレッドで実際に何かを行うために、「スレッド」クラスを拡張する「クラス」を定義する必要があります。Thread クラスの「run()」関数は「抽象」であり、拡張クラスで実際の関数として「実現」する必要があります。次に、「new」演算子は、実際に使用するために、その指定されたクラスのオブジェクトである「インスタンス」を作成できます。必要なクラスは次のとおりです。

//Purpose: Use another thread to run the code in another php file, after a delay
class xT extends Thread
{ var $fil, $tim;

  function savWhatWhen($f="", $t=0)
  { $this->fil = $f;                    //save What, file to process
    $this->tim = $t;                    //save When, delay before processing file
    return;
  }

  function run()
  { ini_set('max_execution_time', 600); //600 seconds = 10 minutes
    sleep($this->tim);                  //do a delay; beware of max-exec-time!
    include($this->fil);                //load file-to-process, and process it
    return;
} }

その「savWhatWhen()」関数は、基本的な Thread クラスのこの拡張用に特別に作成されました。そのクラスを使用するためのコードを次に示します。

  $TH = new xT();                                    //prepare a separate Thread
  $TH->savWhatWhen("d:/wamp/myscripts/test.php", 45);//file-name and delay time
  $TH->start();                                      //after delay, process file
  //the code that does this can terminate, while OTHER thread is doing a delay

このコードをコピーする場合は、php.ini の「open_basedir」設定で、指定したファイルへのアクセスが許可されていることを確認する必要があることに注意してください。


さらに数か月後: 多くの作業が行われているため、pthread オブジェクトの使用に多くの時間を費やしていません。pthread を実際に自分が望んでいた方法で使用できるかどうか疑問に思うほどの特異性に遭遇しました。1. 最初の php ファイルが AJAX によって呼び出され、何かを実行します。2. Web サーバー上の PHP プロセッサがそれを行います。3. 様々なデータがブラウザにエコーされることになっています。4. 最初の php ファイルは別のスレッドの作成を呼び出し、終了します。5. ブラウザはエコーされたデータをまだ受信していません! 6. Web サーバー上の PHP プロセッサは、2 番目のスレッドに委譲された作業を実行します。7. 2 番目のスレッドが終了すると、ブラウザはエコー データを受け取ります。

この記事を書いている時点で、私は何かを見逃していると思っています。おそらく、最初のスレッドが終了したときに、強力な「フラッシュ」処理を実行する必要があります。これにより、ブラウザーがエコーされたデータを受信し、サーバー上の PHP プロセッサが処理を行っている間にユーザーが処理を実行できるようになります。

于 2013-07-25T04:21:19.783 に答える
1

extension_dir = "ext"php.ini ファイルで確認してください。拡張機能が存在するフォルダーを指していることを確認し、コメントされていないことを確認します (;前にセミコロンがあります)。

于 2013-07-02T08:21:56.813 に答える
1

私は同じ問題に遭遇しましたpthreadVC2.dll

..wamp\bin\apache\Apache2.4.4\bin

..\wamp\bin\php\php5.4.16php.netのガイドの代わりに)問題を解決しました

于 2014-03-02T17:30:09.147 に答える
0

Wamp サーバーには、ブラウザー用と CLI 用に個別の php.ini 構成ファイルがあります。

WAMP サーバーを使用してブラウザで pthreads モジュールを使用するには、「pthreadVC2.dll」を apache の「bin」ディレクトリにもコピーする必要があります。

これらのフォルダーの両方に「pthreadVC2.dll」が含まれているはずです (デフォルトの場所にインストールされている場合)。

C:\wamp\bin\php\php[x.x.xx]\bin
C:\wamp\bin\apache\apache[x.x.x]\bin

また、php bin ディレクトリと apache bin ディレクトリ内の php.ini ファイルを更新して、以下を含める必要があります。

extension=php_pthreads.dll

これは、ブラウザーと cli で wamp サーバーで pthreads を使用できることを意味します。

于 2014-05-12T20:47:59.120 に答える