目次
PHPでマルチスレッドを実装する2つの方法
ホームページ バックエンド開発 PHPチュートリアル PHP_PHP チュートリアルでマルチスレッドを実装する 2 つの方法

PHP_PHP チュートリアルでマルチスレッドを実装する 2 つの方法

Jul 13, 2016 am 09:44 AM
php 個人の 成し遂げる 方法 単純

PHPでマルチスレッドを実装する2つの方法

PHP+shellでマルチスレッドを実装する方法

まず、簡単な php コードを書きます。スクリプトの実行時間を長くして効果を確認しやすくするために、しばらくスリープします (笑)。まずはtest.phpのコードを見てみましょう: ls

PHPコード:

for ($i=0;$i<10;$i++) {
エコー $i;
睡眠(10);
}
?>

シェルスクリプトのコードを見てください、とてもシンプルです

#!/bin/bash
1 2 3 4 5 6 7 8 9 10 の私のために
する
/usr/bin/php -q /var/www/html/test.php &
完了しました

PHP コードをリクエストする行に & 記号があることに気づきましたか? これがないと、マルチスレッドを実行できないため、サービスがバックグラウンドで実行されることを意味します。シェルの各ループで使用する必要はありません。次のファイルをリクエストする前に、すべての PHP コードが実行されるのを待ちます。これにより、以下のシェルを実行して効果を確認できます。ここには 10 個の test.php プロセスが表示され、再度実行してから、Linux タイマーがこのシェルを定期的に要求します。これは、バッチ ダウンロードなど、マルチスレッドを必要とするタスクを処理する場合に非常に便利です。

WEBサーバーを使用してphpでマルチスレッドを実装する

今ファイル a.php を実行しているとします。しかし、プログラム内で WEB サーバーに別の b.php を実行するようリクエストすると、2 つのファイルが同時に実行されます (追記: リンクリクエストが送信された後)。 , WEB クライアントが終了したかどうかに関係なく、サーバーが実行します)

実行したいのは別のファイルではなく、このファイル内のコードの一部である場合があります。どうすればよいでしょうか?
実際、パラメータは a.php が実行するプログラムを制御するために使用されます。

以下の例を見てください:

//a.php,b.php

PHPコード:---------------------------------------------- -- ----------------------------------

関数 runThread()
{
$fp = fsockopen('localhost', 80, $errno, $errmsg);

                                                                                                                                                                                                                                  //理解できない場合は、RFC の定義を参照してください

fclose($fp);
}

関数a()
{
$fp = fopen('result_a.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");

fclose($fp); }

関数 b()
{
$fp = fopen('result_b.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");

fclose($fp); }

If(!isset($_GET['act'])) $_GET['act'] = 'a';

If($_GET['act'] == 'a')
{
runThread();
a();
}
else if($_GET['act'] == 'b') b();
?>
-------------------------------------------------- ----------------------------------


result_a.log と result_b.log を開いて 2 つのファイルのアクセス時間を比較すると、これら 2 つは実際に異なるスレッドで実行されていることがわかります。

上記は単なる例であり、他の形式に改良することができます。

PHP でマルチスレッドが使用できるようになったので、問題が発生します。それは、PHP 自体がマルチスレッドをサポートしていないことです。それでは、どうすればよいでしょうか。

1. 競合を避けるために、同じリソースにアクセスしないようにしてください。ただし、データベースは同時操作をサポートしているため、マルチスレッド PHP で同じファイルにデータを書き込まないでください。その場合は、flock を呼び出してファイルをロックするなど、同期に他の方法を使用します。または、一時ファイルを作成し、別のスレッドでファイルが消えるのを待ちます。 これは、次と同等です。この一時ファイルが存在するということは、スレッドが実際に動作していることを意味します

このファイルがもう存在しない場合は、他のスレッドがそのファイルを解放したことを意味します。

2. fputs の実行後に runThread が取得するソケットからデータを読み取らないようにします。これは、fgets のような関数がすぐにデータを読み書きする場合に、ノンブロッキング モードを使用する必要があるためです。ブロッキングモードが使用されている場合、プログラムはマルチスレッドではないため、次のプログラムを実行する前に、データの交換が必要な場合は、外部ファイルで完了する必要があります。本当にやりたい場合は、socket_set_nonblock ($fp) を使用してください。

ここまで述べましたが、この方法を使用する必要があるのはどのような場合ですか?
答えは「はい」です。ご存知のとおり、ネットワーク リソースを常に読み取るアプリケーションでは、ネットワークの速度がボトルネックになります。この方法を採用すると、複数のスレッドで同時に異なるページを読み取ることができます。
8848やsoasoなどのショッピングモールサイトから情報を検索できるプログラムを作りました。アリババのウェブサイトからビジネス情報や企業ディレクトリを読み取るプログラムもあり、この技術も利用されています。 どちらのプログラムも、情報を読み取ってデータベースに保存するためにサーバーに継続的に接続する必要があるためです。 この技術を活用することで、応答待ちのボトルネックを解消します。

php でマルチスレッドをシミュレートする 3 つの方法


PHP 言語自体はマルチスレッドをサポートしていません。一般的に、PHP の優れたパートナーのマルチスレッド機能を利用するものをまとめました。 LINUX と APACHE、LAMP

また、これはシミュレートされているため、実際にはマルチプロセスではありません。プロセスとスレッドは 2 つの異なる概念です。以下のメソッドはすべてインターネットから見つかります。

1. LINUXオペレーティングシステムを使用します

for ($i=0;$i<10;$i++) {

エコー $i;

睡眠(5);
}
?>

上記をtest.phpとして保存し、SHELLコードを記述します

#!/bin/bash

1 2 3 4 5 6 7 8 9 10 の私のために

する

php -q test.php &
完了しました

2. fork 子プロセスを使用します (実際には、LINUX オペレーティング システムも使用します)

宣言(ティック=1);

$bWaitFlag = FALSE; /// プロセスの終了を待つかどうか

; $intNum = 10 /// プロセスの総数
; $pids = array() /// 処理 PID 配列
echo (「開始」);
for($i = 0; $i <$intNum; $i++) {
$pids[$i] = pcntl_fork();/// 子プロセスを生成し、現在行からテスト実行コードを開始し、親プロセスのデータ情報は引き継がない
if(!$pids[$i]) {
// サブプロセスプロセスコードsegment_Start
$str="";
睡眠(5+$i);
for ($j=0;$j<$i;$j++) {$str.="*";}
echo "$i -> " . time() . " $str n";
exit();
// サブプロセスプロセスコードsegment_End
}
}
if ($bWaitFlag)
{
for($i = 0; $i pcntl_waitpid($pids[$i], $status, WUNTRACED);
echo "wait $i -> " . "n";
}
}
echo (「終了」);
?>

3. WEB サーバーを使用する場合、PHP はマルチスレッドをサポートしませんが、APACHE はサポートします (笑)。
ドキュメント a.php を実行しているとします。しかし、プログラム内で別の b.php を実行するように WEB サーバーにリクエストします。

その後、2 つのドキュメントが同時に実行されます (コードは上記と同じです)

もちろん、マルチスレッドが必要な部分はJAVAに任せて、PHPで呼び出すこともできます(笑)

system('java multiThread.java');

?>



http://www.bkjia.com/PHPjc/1049987.htmlwww.bkjia.com

本当http://www.bkjia.com/PHPjc/1049987.html技術記事 PHP でマルチスレッドを実装する 2 つの方法 PHP+シェルでマルチスレッドを実装する方法 まず、スクリプトの実行時間を長くし、効果を確認しやすくするために、しばらくスリープします。 、はは!まずは…
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP データベースの操作 CakePHP データベースの操作 Sep 10, 2024 pm 05:25 PM

CakePHP でデータベースを操作するのは非常に簡単です。この章では、CRUD (作成、読み取り、更新、削除) 操作について理解します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP ルーティング CakePHP ルーティング Sep 10, 2024 pm 05:25 PM

この章では、ルーティングに関連する次のトピックを学習します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

CakePHP のロギング CakePHP のロギング Sep 10, 2024 pm 05:26 PM

CakePHP へのログインは非常に簡単な作業です。使用する関数は 1 つだけです。 cronjob などのバックグラウンド プロセスのエラー、例外、ユーザー アクティビティ、ユーザーが実行したアクションをログに記録できます。 CakePHP でのデータのログ記録は簡単です。 log()関数が提供されています

See all articles