0

完了するまでに約20分かかる手順を実行しますが、プロセスが完了するまでPHPが接続をアクティブに保つことができるかどうか疑問に思います。

明確にするために、このページにはボタンがあり、押すとphpページを呼び出してSQLクエリを実行します。メインページでは、成功メッセージを送信するためにHttpリクエストが完了するのを待つだけです。

4

4 に答える 4

3

時間がかかるように設定されているクエリの場合は、いくつかの自動化リクエストをミックスに移動する必要があります。Linuxサーバーにアクセスできる場合は、cronジョブを使用することをお勧めします。

cronjobsを使用すると、ユーザーにリンクされた特定の値のエントリをデータベースに作成できます。cronジョブは、たとえば、保留中のクエリが終了した場合にクエリを実行するために5分ごとに開始されます。これにより、ユーザーが完了するまでページに座る必要があるという事実を最小限に抑えることができます。知っておく必要があるので、2番目にユーザーがアクティブなページから移動します。すべてのアクティブな接続、クエリなどが停止します。

スクリプトが完了したら、最後にカスタムメッセージを作成して、プロセスが完了したことをユーザーに通知します。

また、PHPは1行目から最後までスクリプトを処理することも知っておく必要があります。たとえば、ハングが40行目にある場合。スクリプトは、クエリが完了するまでその行に配置され、その後処理を続行します。

編集:これは、例として、私が到達している方向にあなたを向けるためだけのものであり、あなたが見ているように使用されるべきではありません。これは単なるマークアップの例です

<?php
    if (isset($_POST['ButtonToExecute']))
    {
        // Query to update a table in your database which an external PHP script will work with
        // Example Table Structure:
        /*
            Username
            State

        */
        if ($state == 0)
        {
            // Then update state to 1 with username to the username for the query to take place on

        }
        else
        {
            // Warn user that their process will take longer to complete as their already is an active query in process
            // but add them to a secondry pipeline which will be picked up on the next cronjob interval
        }
    }
?>

cronジョブで、次のようになる可能性があります。

<?php

if ($state=='1')
{
    // Execute your script
    // After query execution update state to 2

    // if state == 2 then insert custom message/email to send
}

?>

crontabを編集します。

yourpreferrededitor /etc/crontab

^ yourpreferrededitorは、nanoかその他かを問わず、テキストエディタを意味します。

およびcronjob行:

* * * * *  root /usr/bin/php /var/www/cron.php 

^これは、私が毎日1分ごとに設定して実行している現在のcronジョブから取得したものです。

Cronjobを使用すると、ユーザーはページから移動できます。これは、前述のように、2番目にユーザーがスクリプトから移動するためです。進行中のすべてのプロセスが停止します。cronジョブは、ユーザーの操作を必要とせずに実行を継続します(最初の要求を行うことを除いて)

于 2012-12-22T00:47:34.967 に答える
1

タイムアウト制限を設定し、ユーザーの中止を無視すれば、通常のphpスクリプトでそれを行うことができますが、スクリプトが機能した場合、ユーザーはフィードバックを受け取らないため、これはお勧めできません。

私が働いている会社でも同じ問題がありました。

  1. 別のスクリプトでクエリを実行します。
  2. 結果を待たずにスクリプトを開始します
  3. クエリを複数の部分に分割します(制限とオフセットを使用)
  4. クエリスクリプトに一時ファイルにメッセージを書き込んでもらいます
  5. ajaxを介してログから現在の状態を取得するステータス画面を実装します

ところで、なぜそんなに時間がかかるのかを尋ねるすべての賢者のための例:

数百万のノードを持つツリーを処理する必要がある場合、推移的なハルを使用するとアプリケーションを大幅に高速化できますが、構築には数時間かかる場合があります。

于 2012-12-22T00:43:59.950 に答える
0

あなたは試すことができます:

set_time_limit(0);

制限時間の設定を確認することをお勧めします

于 2012-12-21T23:58:21.403 に答える
0

PHP iniでは、スクリプトの最大実行時間を設定できますが、ユーザーがページの読み込み画面に長時間座っていることは絶対に避けてください。

私が提案できることの1つは、最大実行時間を約30分に増やし、ページが既にレンダリングされた後にjavascriptでこれを呼び出すことです。これにより、ユーザーはスクリプトが何であるかを知らずに暗闇に置かれることはありません。やっています。

于 2012-12-22T00:08:43.963 に答える