2009-02-26 7 views
6

私は最近、http://php.net/pcntlについて読んで、その機能がどれくらいうまく機能しているのか、PHPの中核機能ではないので、PHPでマルチスレッドを使用するのが賢明であると驚いていました。PHPでのマルチスレッド化

私は、cronjobの実行を手動で起動するようなフィードバックを必要としないイベントをトリガーしたいと考えています。

それはすべてPCNTLパッケージZend Frameworkの

答えて

7

で書かれたWebアプリケーションで実行することになって非常に正常に動作します - それはちょうど応じunix functionsを使用しています。唯一の欠点は、phpがWebサーバーのコンテキストから呼び出された場合、それらを使用できないことです。つまり、シェルスクリプトでは使用できますが、ウェブページでは使用できません。少なくとも、calling a forking script with execなどのハックを使用していない場合はそうではありません。

[編集] 私はちょうどwhy mod_php cannot forkを説明するページを見つけました。基本的にセキュリティ上の問題です。

+0

私はwebappでそれを使いたかったのですが:( – Thomaschaaf

2

複数のスレッドでPHPコードを実行させる唯一の方法は、スレッドが完全に分離されており、コードがそれらを制御できないため、スレッド化されたWebサーバーのモジュールとしてphpを実行することです。私が知る限り、pcntlはスレッドだけでなくプロセスを管理します。

4

これはスレッド制御ではなく、プロセス制御です。スレッドのライブラリはpthreads (POSIX threads)で、PHPには含まれていないので、PHPにはマルチスレッド機能はありません。

マルチプロセスでは、mod_phpでそれを使用することはできません。これは巨大なセキュリティホール(生成されたプロセスはすべてのWebサーバーの特権を持ちます)です。

2

PHPから手動でcrontabを実行する必要がある場合は、おそらくキューを使用します。ジョブを追加するデータベーステーブルがあります。 cronまたはデーモンとして実行している別のプロセスは、表示されているようにジョブを実行します。

これを行うもう1つの方法は、別のスクリプトを設定し、それにHTTP GETを行うことです。これはかなりスレッド化されているわけではありませんが、PHPの別のコマンドに砲撃する方法の1つです。

たとえば、/usr/bin/somescript.shをオンデマンドで実行する場合は、システムコールを実行したが必要です。これは、localhostからのみアクセス可能な仮想ホスト上にあります。

私はWebサーバーへのソケット呼び出しを行い、スクリプトを取得します。鍵はにありません。はソケットで読み取られ、ブロックされません。戻り値がsomescript.phpであることを確認したい場合は、後でメインスクリプトでブロックしないようにします。

somescript.phpの実行に時間がかかる場合(呼び出し元のスクリプトよりも時間がかかる場合)、ソケットが閉じられたときにスクリプトが終了するのを防ぐには、いくつかの魔法が必要です。

1

例:

10月25日、2011年のように、このモジュールは、「人生の終わりに」に達していると、このようなElysia Cronなどのプロジェクトを支持して廃止されました。このモジュールは、Cron MTからインスパイアされたコアパッチがD7にコミットされたという点で全く役に立たなかったわけではありません。

は... Drupalは、主に匿名のトラフィックを受信するサイトのための非常に重要なパフォーマンスとスケーラビリティ向上を可能とするための静的なページのキャッシュを提供します。共有ホスティングの場合、これはパフォーマンスを向上させる上で最適なオプションです。専用サーバーでは、代わりにワニスを使用することをお勧めします。