0

ユーザーがリンクを公開できるサイトがあります。ユーザーはフォームに次の 2 つのフィールドを入力します。

  • 題名
  • URL

ユーザーが「送信」をクリックすると、提供されたリンクの画像を探してサムネイルを作成するクローラーがあります。

問題は、クローラーが通常、サムの読み込みとトリミングを完了するのに約 5 ~ 10 秒かかることです。

このようなajax呼び出しができると思いました。ご覧のとおり、ユーザーが最初にリンクを送信すると、その有効性 (最初の ajax 呼び出し) を確認し、成功した場合は別の ajax 呼び出しを実行して、このリンクの画像を見つけて保存しようとします。

私の考えは、ユーザーをlinks.phpページに移動している間にそれを行うことでしたが、このようにすると、AJAX呼び出しが中断され、関数がsave_image.php実行されないことがわかりました。

ユーザーがプロセスを待たないようにするにはどうすればよいsave_image.phpですか? このプロセスを実行する必要がありますが、返されるデータは必要ありません。

$.ajax({
                    url: 'publish/submit_link.php',
                    type: 'POST',
                    dataType: 'JSON',
                    data: {
                        link            : link,
                        title           : title,
                    },
                    success: function (data) {
                        if (data) 
                        {
                            $.ajax({
                                url: 'publish/save_image.php',                                      type: 'POST',
                                data: {
                                        id              : data.id,
                                        type            : data.type,
                                    url             : url,
                                        csrf_test_name  : csrf
                                }
                            });
                        }

                        //THIS NEXT LINE BREAKS SECOND AJAX CALL
                        window.location = 'links.php';

                    }   
});

前もって感謝します!

まとめ:ユーザーにリンクを送信してもらい、そのリンクのサムネイルが生成されている間にユーザーをリンク ページにリダイレクトするようにします。サムネイルをユーザーに表示したくありません。

4

4 に答える 4

3

離れるとユーザーリクエストが中止されるため、AJAXリクエストは失敗したようです。そのため、の実行save_image.phpが中断されます。

PHPを使用ignore_user_abortして、PHPプロセスをバックグラウンドで続行するように強制できます。上部に配置しsave_image.phpます:

<?php
    ignore_user_abort(true);

    // ... save image, etc.
?>

これを機能させるには、クライアントに出力を送信(およびフラッシュ)する必要があります。

PHPは、クライアントに情報を送信しようとするまで、ユーザーが接続を中止したことを検出しません。echoステートメントを使用するだけでは、情報が送信されることは保証されません。flush()を参照してください。

すべての出力が機能するはずです(例:「OK」)。フレームワークを使用していることを考えると、これは少し難しいかもしれませんが、不可能ではありません。これはうまくいくかもしれません:CodeIgniterでフラッシュする

PHP接続の処理について詳しくは、こちらをご覧ください。

于 2012-08-18T12:00:37.140 に答える
1

ユーザーに最初にURLを入力し、次にタイトルを入力するように強制します。ユーザーがタイトルフィールドに移動すると、データのクロールを開始し、タイトルを終了してsumbitを押すまで、時間がかかり、プロセスが明らかに速くなります。

于 2012-08-18T11:55:07.907 に答える
0

問題を理解するには、javascript の動作を理解する必要があります

あなたのコードは次のとおりです

$.ajax({
                    url: 'publish/submit_link.php',
                    type: 'POST',
                    dataType: 'JSON',
                    data: {
                        link            : link,
                        title           : title,
                    },
                    success: function (data) {
                        if (data) 
                        {
                            $.ajax({
                                url: 'publish/save_image.php',                                      type: 'POST',
                                data: {
                                        id              : data.id,
                                        type            : data.type,
                                    url             : url,
                                        csrf_test_name  : csrf
                                }
                            });
                        }

                        //THIS NEXT LINE BREAKS SECOND AJAX CALL
                        window.location = 'links.php';

                    }   
});

上記から、ajax リクエストが行われるとすぐに、応答に関係なく Java スクリプトが 2 行目を実行すると言えます。

次の例を見ることができます

$.ajax({
                    url: 'publish/submit_link.php',
                    type: 'POST',
                    dataType: 'JSON',
                    data: {
                        link            : link,
                        title           : title,
                    },
                    success: function (data) 
                    {
                         console.log(data);
                    }
});

for(var i = 0; i < 15000000; i++)
{
      console.log(i);
}

次のような出力が表示される場合があります

1
2
3
.
.
.
1000
data//response of ajax
.
.
14999999

そのため、 jQuery.when()の ajax 成功関数のいずれかを使用できることを回避できます。

うまくいけば、これはあなたを助けるでしょう

于 2012-08-20T05:24:07.953 に答える
0

データを返す必要がないのに、なぜ XHR を使用するのでしょうか? フォームにリンクを送信して、links.phpそこに画像を保存するだけです!

于 2012-08-18T11:43:55.243 に答える