ホームページ  >  記事  >  バックエンド開発  >  PHP マルチスレッドの小さなケース

PHP マルチスレッドの小さなケース

オリジナル
2017-11-10 10:36:412149ブラウズ

PHP マルチスレッドに関しては、多くの問題が発生します。次の記事では、PHP マルチスレッドに関する小規模なプロジェクトの問題について、3 つの解決策を紹介します。

プロジェクトの状況:

300W+のユーザーデータをqcloudに同期するには、一度に1つのcurlしか同期できず、1秒あたり約3回の同期しかありません。300Wのデータを同期するには10日以上かかると推定されているため、私は考えました。マルチスレッド解決の使用について。

オプション 1:

C++ でマルチプロセス ソリューションを作成し、複数のプロセスをフォークして問題を解決します。メインスレッドはデータの読み取り/保存を担当し、サブスレッドはcurlを担当します。

解決策 2:

解決策 1 と同じように、PHP を使用してマルチプロセス ソリューションを作成します。メインスレッドが読み取り、子スレッドがカールします。

しかし、PHPは複数のプロセスを持たないため、スレッド/プロセスを直接制御することはできません。したがって、マルチプロセスの実装には Linux に依存するしかありません。

PHPの関数pcntl_fork()は、Linuxのforkに相当するプロセスを作成することができます。

fork との違いは、pcntl_fork によって返される 0 が子プロセスであり、返される ID が子プロセスの pid であることです (一方、fork は親プロセスに対して 0 を返し、子プロセスは ppid を返します)。 Linuxではpcntl_fork()関数が必要であること 上記だけで動作します。pcntl.soモジュールをロードする必要があると言われていますが、動作しないようです。

オプション 3:

php+shell はマルチスレッドをシミュレートします

例: test.php ファイルは、プロジェクトに必要な関数 (データベースの読み取りと書き込み、curl を含む) を実装します

次のように別のシェルを作成して保存しますas start.sh:

#!/bin/bash  //指定bash,必须for(( i=0; i<20; i++))do
    php test.php &    //执行test.php,&符号的意思是把该操作放在后台执行,这样shell就可以继续执行下一步sleep命令了。如果没有这个符号,shell会阻塞在这里。
    sleep 1s
done

最後にシェルを実行し、sudo ./start.sh

shellで20個のプロセスを起動し、それぞれtest.phpを実行します

しかし、それぞれのプロセスがメインプロセスに相当するため、共通リソースが難しいこの場合、共有リソースはデータベースのみなので、データベースを操作するたびにロックします。詳細については、他の記事を参照してください。 mysqlロック。 基本的に毎秒解決できるデータベース操作と比較して、curl は数百のメッセージを連続して送信するのに数十秒以上かかるため、データベースのロックによる影響はほとんどありません。

要約: これは PHP マルチスレッドに関する小さなケースにすぎませんが、頭を使っていただき、この記事がそのような問題を解決するためのアイデアを提供できることを願っています。

関連する推奨事項:

java - pthreads は PHP マルチスレッドです。

ソケット - PHPマルチスレッド、マルチプロセスを使用する

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

以上がPHP マルチスレッドの小さなケースの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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