2

PHPで並列処理が必要だったのですが、PHPは拡張機能をインストールしないと対応していないので、これmulti_curlを実現するために使用しています。

main.php- すべてprocess.php異なる $_GET パラメータを持つ URL の配列を作成します。次に、multi_curl を使用してそれらをすべて実行します。

process.php- 各スレッドの処理ロジック。

これが実行可能な方法であるかどうかを知りたいだけです。これは遅刻ですか?それは多くのオーバーヘッドを引き起こしますか?これを行うより賢明な方法はありますか?ありがとう。

4

4 に答える 4

1

https://github.com/krakjoe/pthreads

PHP のスレッド化 ...

楽しみ ...

UNIX にインストールするには、スレッド セーフ バージョンの PHP が必要です。ほとんどのディストリビューションはこのバージョンをパッケージ化していないため、自分でビルドする必要があります。

その方法を簡単に説明すると、次のようになります。

cd /usr/src
wget  http://php.net/get/php-5.3.17.tar.bz2/from/us.php.net/mirror
tar -xf php-5.3.17.tar.bz2
cd php-5.3.17/ext
wget https://github.com/krakjoe/pthreads/tarball/master -O pthreads.tar.gz
tar -xf pthreads.tar.gz
mv krakjoe-pthreads* pthreads
cd ../
./buildconf --force
./configure --enable-maintainer-zts --enable-pthreads --prefix=/usr
make
make install

私はそれから始めて、分離されたコピー --prefix を --prefix=/home/mydir のようなプライベートな場所で作成するか、一部のディストリビューションには /usr/src/debug があり、そのような場所に適していますもの。--with-mysql などを追加したいのは明らかですが、その方法はシステムによって異なります (ヒント、php -i | grep configure > factory.config を使用して、現在の php インストールの configure 行を保存し、それが不平を言うライブラリが利用できないことを知っていることを知って、そのカスタムビルドをベースにしてください apt-get|yum install away )。

于 2012-09-19T15:32:00.703 に答える
0

もちろん、それは一般的に実行可能な方法です。そのため、機能が存在します。

いつものように、悪魔は細部に宿ります。複数の同時リクエストは、他のプロセスと競合してサーバー リソースを消費します。並行性の程度を調整する必要があります。

于 2012-09-18T14:49:23.983 に答える
0

PHP は合理的な手段でマルチプロセッシングをサポートしていないことを念頭に置いて、あなたの場合には multi_curl が良い解決策のようです!

于 2012-09-18T14:49:34.860 に答える
0

ウェブサーバー上で PHP を実行している (そして multi_curl が利用できない可能性がある) 場合、(ライブラリを使用せずに) スクリプトを並行して実行させる 1 つの方法は、localhost:80 へのソケットを開き、必要なスクリプトを手動でウェブサーバーに実行させることです。それらは、サーバーのマルチスレッドを使用して並行して実行されます。次に、ループ内ですべての結果を収集し、すべてが完了すると (または選択したタイムアウトの後)、続行します。

これは、Web ページで参照されているすべての画像のサイズを取得するスクリプトから取られたコードです。

get_img_size.php スクリプトは、1 つの画像のサイズと情報を取得します。

$sockets[] は、テストするイメージごとに 1 つのソケットを保持する配列です。

        foreach($metaItems['items'] as $uCnt=>$uVal) {
            $metaItem=ContentLoader::splitOneNew($metaItems,$uCnt);
            $AnImage=$metaItem['url'];

            $sockets[$AnImage] = fsockopen($_SERVER['HTTP_HOST'], 80, $errno, $errstr, 30);
            if(!$sockets[$AnImage]) {
                echo "$errstr ($errno)<br />\n";
            } else {
                $pathToRetriever=dirname($_SERVER['PHP_SELF']).'/tools/get_img_size.php?url='.rawurlencode($AnImage);
                // echo('<div>META Retrieving '.$pathToRetriever.' on server '.$_SERVER['HTTP_HOST'].'</div>');
                $out = "GET $pathToRetriever HTTP/1.1\r\n";
                $out .= "Host: ".$_SERVER['HTTP_HOST']."\r\n";
                $out .= "Connection: Close\r\n\r\n";
                // echo($out);
                fwrite($sockets[$AnImage], $out);
                fflush($sockets[$AnImage]);
                // echo("<div>Socket open for $AnImage...</div>");
                // flush();
            }
        }
    }  else $FoundImagePaths2[]=$metaItems; // ALL of them urls belongs to us

この後、「スレッド」が機能している間、自分のビジネスを行うことができます。次に、ループで、すべての $sockets[] から読み取り、EOF のテストを続けます。この例では、コードのずっと後の部分 (各 $AnImage のループ):

            if(isset($sockets[$AnImage])) {
                if(feof($sockets[$AnImage])) {
                    if(!isset($sizes[$AnImage])) $sizes[$AnImage]='';
                    $sizes[$AnImage].=fgets($sockets[$AnImage], 4096);

                    // echo("<div>HTML $AnImage DONE.</div>");
                    // echo("<div>[ ".$sizes[$AnImage]." ]</div>");
                    // flush();
                    fclose($sockets[$AnImage]);
                    unset($sockets[$AnImage]);

                    $mysizes=ContentLoader::cleanResponse($sizes[$AnImage]);

                    // echo($sizes[$AnImage]." ");
                    // echo(ContentLoader::cleanResponse($sizes[$AnImage]));

                    if(!is_array($mysizes)) {continue;}

                    if($mysizes[0]>64 && $mysizes[1]>64 && ($mysizes[0]>128 || $mysizes[1]>128))
                        $FoundImagePaths2[]=array('kind'=>'image','url'=>$AnImage,'ext'=>$ext,'width'=>$mysizes[0],'height'=>$mysizes[1],'mime'=>$mysizes['mime']);

メモリとプロセス、および速度の点で効率的ではありませんが、1 つの画像に数秒かかる場合、20 以上の画像を含むページ全体をすべてテストするのに同じ数秒かかります。結局のところ、これはどういうわけか並列 PHP です。

于 2014-02-06T10:17:31.747 に答える