1

バックグラウンド:

現在、私たちの会社には、レポート作成を自動化するためのPHPベースのアプリがあります。それはこのように動作します:

  1. フォームを含むWebページは、ローカルに保存されるいくつかの構成を含むiniファイルを生成します
  2. PHP CLIスクリプトは、手順1で生成されたiniファイルを受け入れ、それに基づいて、インターネットからデータがフェッチされたドキュメントを含むディレクトリを作成します。(完了するまでに5〜10分かかります)
  3. 別のWebフォームは、フォルダーの内容を調べ、検証を行い、ディレクトリの内容をプレビューとして表示します。

これらのステップのいずれかの間で、ユーザー入力が必要であり、場合によっては、ユーザーがスクリプト2を中断して、一部のini値を修正する必要があります。


問題:

Webブラウザでcliスクリプトを実行して、ユーザーが[ビルド]ボタンをクリックした後、iniファイル(または配列)が生成され、2番目のスクリプトに自動的に渡されるようにします。ただし、そのスクリプトを独立して実行し(別の「スレッド」をシミュレート)、必要に応じてユーザーに割り込みを許可するために、スクリプトが実行しているすべてのことを詳細に記述します。コマンドラインでスクリプトを実行するようなもので、各ステップが詳細に記述されています。


AJAXを使用していますが、サーバーが応答を完了するのを待ってから、Webブラウザーに何かを出力します。src属性とコンテンツをjavascriptで操作できないため、iFrameも機能しません。

では、コマンドシェルの出力をどのように「シミュレート」できるでしょうか。正しい方向のヒントをいただければ幸いです。

注:スクリプトは常に「localhost」で使用され、リモートアクセスは必要ありません。


解決

推測に基づいて、私はさらに簡単なことをすることになりました:

  • フォーム($ _POST)の内容をセッション変数$_SESSION['FORM']にダンプしました。
  • ユーザーが「ビルド」ボタンをクリックしたときにtrueに設定される$_SESSION[form-complete]フラグを作成しました。
  • $ _SESSION [form-complete]がtrueの場合、サーバーは、引数が以前にダンプされたセッション変数である「CLISCRIPT」を指すiframeを表示します。
  • CLIスクリプトにはob_implicit_flush(true); ob_end_flush();、出力がキャッシュされないようにする機能もあります。
  • スクリプトの最後で、$ _ SESSION変数はクリーンであり、セッションは破棄されています
4

3 に答える 3

3

src属性とコンテンツをjavascriptで操作できないため、iFrameも機能しません。

iframeが親ページと同じホスト上にある場合は可能です(例localhost)。AJAXは当然クロスドメインリクエストもサポートしていないため、AJAXが機能している場合は、iframeもそれに続きます。

最も簡単な方法は、出力を一時ファイルにパイプしてから、「個別のスレッド」を出力を取得するiframe/AJAX呼び出しにすることです。ローカルホストで実行されている場合、これに対する帯域幅の最適化は少し無意味になります(ログが非常に長くならない限り)。


ちょっとした例:

を実行したいとします./long_script。これが私たちのやり方です。

  1. system('./long_script > /tmp/file 2>&1 &');(すべての出力を/ tmp / fileにパイプしてから、バックグラウンドで実行します)

  2. このようなことを行うPHPスクリプトを作成します(ファイル名、できればセッション変数、またはサニタイズされた変数を取得するための安全な$_GET方法が必要です)。

    <pre><?php echo file_get_contents('/tmp/file'); ?></pre><script>setTimeout("window.location.reload()", 1000);</script>

  3. そのPHPスクリプトをiframeに入れます。Javascriptにより、1秒ごとに自動リロードが発生します。


別:

popenを使用してプロセスハンドルを設定し、データをフレッドしてからブラウザにフラッシュすることができますob_implicit_flush(true)(したがって、プロセスからすべての出力を取得するのを待たずに、すべてを一度にプッシュします)。

于 2012-06-30T19:17:36.123 に答える
1

ステップ2は、次のようなページにすることができます。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title></title>
</head>
<body>

<button onclick="javasctipt:ajaxCall('stop')">Stop</button>
<button onclick="javasctipt:ajaxCall('pause')">Pause</button>
...
<iframe src="step2cli.php">Output of cli here</iframe>

</body>
</html>

(PHPへの)ajaxの呼び出しは、コマンド(stop、pause)またはいくつかの新しい情報(例:新しい情報ファイル)を「制御」ファイルに書き込みます。

step2cli.phpは定期的に「制御」ファイルをチェックします。存在する場合は、それを解析して削除してから、もちろん新しい情報を適用します。

于 2012-06-30T19:31:24.613 に答える
0

このコードはbashで動作します

url="google.com"
content=$(curl -L $url)
echo $content
于 2021-05-29T15:35:01.040 に答える