まずは..
いいえ、CS の定義によると、これらは真のスレッドではありませんが、実際には違いを見分けることはできません。このライブラリは、マクドナルドの新しい「マックプラント」ハンバーガーのパティが牛肉に似ているよりも、実際のスレッドの感触に近いものです。 ?
あなたも私と同じなら、PHP が大好きです。あなたは、言語の柔軟性とパワー、つまり、いい加減なコードを書く自由 (私はそれを支持しませんが、いい加減なコードを書く権利は命をかけて守ります) や、議論の余地のない美しい論理芸術作品を作成する自由を愛しています。これで、私のすべての C (および C++) プログラマーの皆さんは、PHP の威力を真に誇示するだけでなく、次のプロジェクトを強力にサポートするライブラリを手に入れることができました。
このライブラリを使用すると、POSIX マルチスレッドに非常によく似た方法で、非常に効率的に並列処理を行うことができます。すべてのphpthreads間でグローバル変数を共有し、作成時に値/オブジェクト/配列を PHPTHread に渡し、実行中のphpthreads間で値/オブジェクト/配列を簡単に共有し、各 PHPThread がphpthread_join()
関数のファミリー。
このライブラリを設計したのは、大量のデータ (画像やビデオを思い浮かべてください) を迅速に転送できる数千の同時接続を簡単に処理できる高性能 WebSocket サーバーを作成したかったからです。はい、基本的にはfork()
ing サーバーですが、最上位の PHPThread レイヤーにより、簡単な (スレッドのような) IPC メカニズムを提供しながら、デプロイが非常に簡単になります。 C を使用してパフォーマンスを向上させることもできましたが、私にとっては、C の方が移植性が高く、サーバーが起動したときに展開しやすいように思えたので、ここにしました。
より技術的な人々のために、このライブラリは「ティック」を使用する必要があるために一時的に妨げられることはありません。それが高速化の理由の一部です。ライブラリは内部でシグナル (SIGUSR1 や SIGUSR2 など) を使用して実行を中断し、非常に流動的にコンテキストを切り替えます。はい、SIGUSR1 と 2 を独占しているので、プロジェクトでこれらのシグナルを使用している場合は、指定されたメッセージ ハンドラー関数にphpthread_send_message()
を使用することを検討してください (examples/messages1.php および example/messages2.php を参照)。それはあなたの目的に完全に適合するはずです。
「examples」ディレクトリには実行できるサンプルがあります。簡単に実行できるように自由にシバンを配置したり、 php <filename>
をプレフィックスとして付けて実行したりできます。まだ全部は完了していませんが、かなりの数を完了しました。少なくとも、機能を十分に理解するには十分です。
phpthreadsは次の PHP 拡張機能が必要です。
<?php
require_once '../lib/phpthread.php'; /* Use correct path! */
function thread_proc( $thread,
$param)
{
echo "nt[PHPTHREAD] - I've started and have a param: "" . print_r($param, true) . ""!n";
for ($i = 0; $i < 15; $i++) {
usleep(1000000);
echo "t[PHPTHREAD] - Tick!n";
}
$myobj = (object)array(
'seconds_alive'=>$i,
'lucky_number'=>rand(0, 10000)
);
echo "nt[PHPTHREAD] - I'm returning this:n";
print_r($myobj);
echo "n";
echo "<--------------------------------------->nn";
return $myobj;
}
$id = phpthread_create($phpthread, array(), "thread_proc", null, array("this awesome string!"));
for ($i = 0; $i < 5; $i++) {
echo "n[MAIN] - Doing my thing...n";
usleep(1000000);
}
echo "n[MAIN] - Okay, I'm tired. Waiting on child to quit.n";
phpthread_join($id, $retval);
echo "n[MAIN] - Child is done. It returned:n";
print_r($retval);