ホームページ  >  記事  >  バックエンド開発  >  PHP は pcntl_fork を使用して画像のマルチプロセス ダウンロードを実装します。_PHP チュートリアル

PHP は pcntl_fork を使用して画像のマルチプロセス ダウンロードを実装します。_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:11:41992ブラウズ

PHP は、pcntl_fork を使用して画像のマルチプロセスダウンロードを実装します。

この記事の例では、PHP が pcntl_fork を使用して画像のマルチプロセス ダウンロードを実装する方法を説明します。参考のためにみんなで共有してください。具体的な分析は次のとおりです:

PHP pcntl_fork — 現在のプロセスの現在位置にブランチ、子プロセスを生成します。 注釈: fork は、親プロセスと子プロセスの両方がフォーク位置から実行を継続することです。親プロセスを実行すると、fork の戻り値は子プロセス番号となり、子プロセスは 0 を取得します。

注: PHP にはマルチプロセスを実装できる pcntl_fork 関数がありますが、pcntl 拡張機能をロードする必要があり、この拡張機能は Linux でのみコンパイルできます。

1. まず、ubuntu で pcntl.so をコンパイルします。ubuntu で pcntl パッケージが見つからなかったので、フォルダーを作成し、その中に pcntl パッケージ全体をダウンロードして、次のコマンドを実行しました。は次のとおりです:

コードをコピーします コードは次のとおりです:
# mkdir php
#cdphp
# apt-get ソース php5
# cd php5-(WHATEVER_RELEASE)/ext/pcntl
#phpize
# ./configure (注1)
#作る
# make install phpize コマンドは、PHP プラグイン モジュールのコンパイル環境を準備するために使用されます

インストールが成功すると extname.so が作成され、PHP のプラグイン モジュール ディレクトリに配置されます (デフォルトでは /usr/lib/php/modules/ に保存されます)。php.ini を調整して行を追加する必要があります。 extension=extname.so。この場合のみ、このプラグイン モジュールを使用できます。

例:

コードをコピーします コードは次のとおりです:
void pcntl_exec(string $path [,array $args [,array $envs ]])

pcntl_exec — 現在のプロセス空間で指定されたプログラムを実行します。コードは次のとおりです:

コードをコピーします コードは次のとおりです:
$cmds=array(
array('/home/jerry/projects/www/test2.php')、
array('/home/jerry/projects/www/test3.php')
);
foreach($cmds として $cmd){
$pid=pcntl_fork(); if($pid==-1){
//プロセスの作成に失敗しました
echo '子プロセスの作成に失敗した場合は -1 を返します'; 終了(-1); }
else if($pid){
//親プロセスは子プロセス番号を取得するため、親プロセスによって実行されるロジックは次のとおりです
pcntl_wait($status,WNOHANG); }
その他{
//サブプロセス処理ロジック
睡眠(5); pcntl_exec('/usr/bin/php',$cmd); 終了(0); }
}

たとえば、複数の画像を同時にダウンロードするには、コードは次のとおりです:



コードをコピーします

コードは次のとおりです:
#!/usr/bin/php
// クロールする必要がある Web ページのアドレス
$url = 'http://www.bkjia.com'; $content = ファイル_get_contents($url); preg_match_all('/ list($sm, $ss) =explode(" ", microtime()); foreach ($k => $val として $matches)
{
$pid[$k] = pcntl_fork(); if(!$pid[$k])
{
ダウンロード($url, $val); // 子プロセスは終了する必要があります。終了しないと、再帰的なマルチプロセスが実行されます。親プロセスは終了しません。終了しないと、マルチプロセスが終了します。
終了(0); }

if ($pid[$k])
{
// pcntl_waitpid($pid[$k], $status, WUNTRACED); }

}
エコー「ダウンロードが完了しました」

list($em, $es) =explode(" ", microtime());
echo "所要時間:",($es+$em) - ($ss + $sm),"n"; /**
* ウェブ画像を取得
*
​*/
関数ダウンロード($url, $val)
{
$pic_url = $val[1]; if (strpos($val[1], '//') !== false)
{
;
}
elseif (preg_match('@^(.*?)/@', $val[1], $inner_matches) == 0)
{
$pic_url = $url.$val[1]; }
elseif (preg_match('@[:.]@', $inner_matches[1], $tmp_matches) == 0)
{
$pic_url = $url.$val[1]; }

$pic = ファイル_get_contents($pic_url);
if ($pic === false)
{
戻る
}

preg_match('@/([^/]+)$@', $pic_url, $tmp_matches); // Assert を使用して例外を処理できます
$pic_file_name = $tmp_matches[1]; $f = fopen("tmp/".$pic_file_name, "wb"); fwrite($f, $pic); fclose($f); }

/* ファイルの終わり pcntl_fork.php */
?>


この記事で説明した内容が皆様の PHP プログラミング設計に役立つことを願っています。




http://www.bkjia.com/PHPjc/928221.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/928221.html

技術記事

PHP は、pcntl_fork を使用して画像のマルチプロセスのダウンロードを実装します。この記事では、pcntl_fork を使用して画像のマルチプロセスのダウンロードを実装する PHP の例について説明します。参考のためにみんなで共有してください。詳細な分析...

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