2011-07-04 30 views
1

私はVB doeventsに相当するPHPを探しています。 私はVBでリアルタイム解析パッケージを作成し、doeventを使ってオペレーティングシステムにリリースしました。 Doeventsを使うと、私はメモリ内にとどまり、メモリをいっぱいにすることなく連続して実行でき、ユーザーの入力に応答することができます。 私はPHPでパッケージを書き直しました。私は同じdoevents機能を探しています。 存在しない場合は、自分のスケジュールを変更して終了することができます。 しかし、私は現在、それをどうやって行うのか分かりません。それはもっと多くのオーバーヘッドを追加すると思います。 ありがとう、gerardg私はVB doeventsのPHP相当物を探しています

+0

あなたはWebページとして、またはcronジョブとしてコードを起動していますか? – BugFinder

+1

PHPはリアルタイム処理用ではありません。協力的にマルチタスク化されたシステム(Win 3.xなど)を使用している場合を除き、ある時点でスクリプトのタイムスライスが使い果たされ、制御が取り除かれます。 –

+0

Answer BugFinder質問:Webページボタンからコードを開始しています。 – gerardg

答えて

2

VBで何かを書きましたが、doevents()関数は集中的な処理中にアプリケーションにプロセッサを渡すことができました(通常、他のシステムイベントが発生するのを許可します - あなたのUIがハングアップしていないようにWM_PAINTが最も一般的です)。

PHPにはこのような機能はありません。スクリプトは1つのプロセスとして実行され、終了します(完了したとき、またはデフォルトの30秒のタイムアウトに達したとき)。

スレッドの観点から考えると(ほとんどのWindowsプログラマーがそうしているように)、スクリプトのインスタンスを2つ以上生成する必要がある場合は、おそらくPHP's Process Control functionsを見てください。

+0

Jahufarにお返事ありがとうございます。あなたは私の質問を理解している。あなたとMarc Bは、PHPにはそのような機能がないと言っています。あなたが送信したプロセス制御機能を使って自分自身のスケジュールを変更することができるようです。私は自分自身のサーバーに乗っているときに、set_time_limit($ time)、他の関数、およびコントロール関数のためのCycloneの推奨をテストしようとしています。 (ISPのマシン上で開発していますので、私が望むようにシステムを制御することはできません)サーバが到着した後、私はアップデートをしてここに戻ります。ありがとうございました。 – gerardg

1

私はdoeventsのどの側面をエミュレートしようとしているのか完全にはわからないので、ここではあなたにとって有益なものがほとんどあります。

スクリプトの先頭にob_implicit_flush(true)を使用して、暗黙的な出力バッファのフラッシュを有効にすることができます。つまり、あなたのスクリプトがechoまたはprintを呼び出すたびに、または何かを表示するのに使うものがあれば、PHPは自動的にそのすべてをユーザのブラウザに送ります。また、呼び出すたびにob_flush()を使用して何かを表示することもできます。これはVBでApplication.DoEvents()のように動作し、UIをアクティブに保ちながら何かが出力されるたびに呼び出される必要があります。

もちろん、スクリプトで出力バッファを使用している場合は、フラッシュする前にバッファのコピーを作成してob_get_contents()とすることができます。

通常より多くの時間スクリプトを実行する必要がある場合は、より長いtiemoutをset_time_limit($time)に設定できます。あなたはより多くのメモリを必要とし、あなたがあなたの.htaccessファイルを編集するためのアクセス権を持っている場合は、次のコードを配置し、値を編集:64メガバイトのメモリ制限を設定します

php_value memory_limit 64M 

を。

複数のスクリプトを一度に実行する場合は、pcntl_execを使用して別のスクリプトを実行することができます。

DoEvents()について何か重要なことが見当たらない場合は、私に知らせてください。

+0

サイクロンにお答えいただきありがとうございます。あなたは確かにこれを研究しました。私はISPのサーバー上でまだ開発中であり、サーバーが到着するまですべてを制御することはできません。私はあなたの推薦で、自分のプロセスを再スケジュールする必要がある回数を減らすことができると思います。私はあなたが推薦する関数を使って練習し、あとで自分のサーバ上でそれらを実装し、自分自身を再スケジュールしないで、メモリに留まることを望みます。私はあなたの推奨事項とJahufarのプロセス制御機能のリスト(私が再スケジュールする必要がある場合)でDoEvents機能を達成できると思います。ありがとうございました。 – gerardg

+0

@gerardg:うれしい!それがどうなるか教えてください! – Cyclone

3
+0

usleepはdoeventsのようにアクティブではありません。なぜなら、他のプロセスに制御を戻すのではなく、実行を遅らせるだけなのでです。 jsコードを出力するPHPをテストするページタブを開いて、ドキュメントのタイトルの内容をカウンタ値で変更し、usleepを使用して0.01秒ごとに遅延させますが、このテストプログラムがドキュメントのタイトルを更新している間は他のページタブをクリックできません。 –

+0

私が探していたもの – Andrew

0

PHPが要求処理の非同期のために設計されているマイクロ秒の一定数の遅延プログラムの実行..探しているものです。しかし、ちょっとしたハッカーでバックグラウンドになることが強制されます。

PHPは単一のスレッドとして実行されているので、CPUが既に処理しているように他のことをすることを心配する必要はありません。これが当てはまらない場合、ウェブサーバは一度に1ページだけを提供することができ、他のすべてのリクエストは待ち行列に座る必要があります。検出可能な条件が発生するまで(DBや何かに設定した「今すぐ終了してください」などのメッセージが出るまで)、期限切れにならないような書類を書く必要があります。

他の人に指摘されているように、set_time_limit($something);とおそらくusleepが必要です。コードが非常に多くのCPUループを大量に食べている場合は、コードが「速すぎます」を停止します。しかし、データベース接続も使用している場合、ほとんどのスクリプト時間は、実際にはデータベースを待っているスクリプト(スクリプトにとっては最大のオーバーヘッド)です。

screenを使ってバックグラウンドタスクにデタッチしてPHPワーカースレッドを作成しました。他の方法も、タイムアウトまたは終了するセッションがない限り(Webブラウザが閉じられたときなど)、機能します。スクリプトがx分または時間ごとに実行されているかどうかを確認するスクリプトを開始するcronは、強制的に存在するか、またはシステムの再起動から自動的に回復します。

TL; DR:doeventsはPHPに「焼き付け」されており、心配する必要はありません。

関連する問題